/*
* OffenePflege
* Copyright (C) 2006-2012 Torsten Löhr
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License V2 as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not, write to
* the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
* www.offene-pflege.de
* ------------------------
* Auf deutsch (freie Übersetzung. Rechtlich gilt die englische Version)
* Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License,
* wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, gemäß Version 2 der Lizenz.
*
* Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber
* OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
* BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
*
* Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht,
* schreiben Sie an die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.
*
*/
package op.care.med.inventory;
import com.jgoodies.forms.factories.CC;
import com.jgoodies.forms.layout.FormLayout;
import com.jidesoft.popup.JidePopup;
import com.jidesoft.swing.*;
import com.jidesoft.wizard.WizardDialog;
import entity.info.Resident;
import entity.prescription.*;
import entity.system.SYSPropsTools;
import gui.GUITools;
import op.OPDE;
import op.care.med.prodassistant.MedProductWizard;
import op.system.LogicalPrinter;
import op.system.PrinterForm;
import op.threads.DisplayManager;
import op.threads.DisplayMessage;
import op.tools.*;
import org.apache.commons.collections.Closure;
import org.jdesktop.swingx.JXSearchField;
import org.joda.time.DateTime;
import javax.persistence.*;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author tloehr
*/
public class DlgNewStocks extends MyJDialog {
private boolean ignoreEvent;
private BigDecimal amount, weight;
private MedPackage aPackage;
private TradeForm tradeForm;
private Resident resident;
private MedInventory inventory;
private Date expiry;
private OverlayComboBox cmbVorrat, cmbBW;
private DefaultOverlayable ovrVorrat, ovrBW;
private JLabel attentionIconVorrat, infoIconVorrat, correctIconVorrat, questionIconVorrat;
private JLabel attentionIconBW;
private OverlayTextField txtMenge;
private DefaultOverlayable ovrMenge;
private JLabel attentionIconMenge, correctIconMenge;
private LogicalPrinter logicalPrinter;
private PrinterForm printForm;
public static final String internalClassID = "newstocks";
// private CaretListener weightListener;
public DlgNewStocks(Resident resident) {
super(false);
this.resident = resident;
initComponents();
initDialog();
}
private void txtMedSucheActionPerformed(ActionEvent evt) {
if (ignoreEvent) {
return;
}
txtMenge.setText("");
if (txtMedSuche.getText().trim().isEmpty()) {
cmbMProdukt.setModel(new DefaultComboBoxModel());
cmbPackung.setModel(new DefaultComboBoxModel());
tradeForm = null;
aPackage = null;
txtWeightControl.setVisible(false);
lblWeightControl.setVisible(false);
initCmbVorrat();
} else {
String pzn = null;
try {
pzn = MedPackageTools.parsePZN(txtMedSuche.getText());
} catch (NumberFormatException nfe) {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(nfe.getMessage(), DisplayMessage.WARNING));
pzn = null;
}
if (pzn != null) { // Hier sucht man nach einer PZN. Im Barcode ist das führende 'ß' enthalten.
EntityManager em = OPDE.createEM();
Query query = em.createQuery("SELECT m FROM MedPackage m WHERE m.pzn = :pzn");
query.setParameter("pzn", pzn);
try {
aPackage = (MedPackage) query.getSingleResult();
tradeForm = aPackage.getTradeForm();
cmbMProdukt.setModel(new DefaultComboBoxModel(new TradeForm[]{tradeForm}));
cmbMProdukt.getModel().setSelectedItem(tradeForm);
} catch (NoResultException nre) {
cmbMProdukt.setModel(new DefaultComboBoxModel());
OPDE.debug(nre);
} catch (Exception e) {
OPDE.fatal(e);
} finally {
em.close();
}
} else { // Falls die Suche NICHT nur aus Zahlen besteht, dann nach Namen suchen.
List<TradeForm> list = TradeFormTools.findDarreichungByMedProduktText(txtMedSuche.getText());
cmbMProdukt.setModel(new DefaultComboBoxModel(list.toArray()));
}
cmbMProduktItemStateChanged(null);
}
setApply();
}
private void btnPrintItemStateChanged(ItemEvent e) {
if (ignoreEvent) return;
SYSPropsTools.storeState(this.getClass().getName() + "::btnPrint", btnPrint);
}
private void txtExpiresFocusGained(FocusEvent e) {
txtExpires.selectAll();
}
private void txtExpiresFocusLost(FocusEvent e) {
try {
DateTime myExpiry = SYSCalendar.parseExpiryDate(txtExpires.getText());
if (myExpiry.isBeforeNow()) {
throw new Exception("date must not be in the past");
}
expiry = myExpiry.toDate();
txtExpires.setText(DateFormat.getDateInstance().format(expiry));
} catch (Exception ex) {
expiry = null;
txtExpires.setText(null);
}
}
private void txtExpiresActionPerformed(ActionEvent e) {
txtExpiresFocusLost(null);
}
private void initDialog() {
ignoreEvent = true;
expiry = null;
logicalPrinter = OPDE.getPrintProcessor().getSelectedLogicalPrinter();
printForm = OPDE.getPrintProcessor().getSelectedForm();
if (logicalPrinter != null && printForm != null) {
btnPrint.setEnabled(true);
SYSPropsTools.restoreState(this.getClass().getName() + "::btnPrint", btnPrint);
} else {
btnPrint.setSelected(false);
}
lblPZN.setText(SYSTools.xx("newstocks.lblPZN"));
lblProd.setText(SYSTools.xx("newstocks.lblProd"));
lblPack.setText(SYSTools.xx("newstocks.lblPack"));
lblAmount.setText(SYSTools.xx("newstocks.lblAmount"));
lblInventory.setText(SYSTools.xx("newstocks.lblInventory"));
lblRemark.setText(SYSTools.xx("misc.msg.comment"));
lblExpires.setText(SYSTools.xx("misc.msg.expires"));
lblResident.setText(SYSTools.xx("misc.msg.resident"));
amount = null;
cmbMProdukt.setRenderer(TradeFormTools.getRenderer(TradeFormTools.LONG));
attentionIconVorrat = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.ATTENTION));
infoIconVorrat = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.INFO));
correctIconVorrat = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.CORRECT));
questionIconVorrat = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.QUESTION));
cmbVorrat = new OverlayComboBox();
cmbVorrat.addItemListener(itemEvent -> inventory = (MedInventory) itemEvent.getItem());
cmbVorrat.setFont(SYSConst.ARIAL14);
ovrVorrat = new DefaultOverlayable(cmbVorrat);
mainPane.add(ovrVorrat, CC.xywh(5, 13, 4, 1));
attentionIconBW = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.ATTENTION));
cmbBW = new OverlayComboBox();
cmbBW.addItemListener(itemEvent -> cmbBWItemStateChanged(itemEvent));
cmbBW.setFont(SYSConst.ARIAL14);
ovrBW = new DefaultOverlayable(cmbBW);
mainPane.add(ovrBW, CC.xywh(7, 17, 2, 1));
if (resident == null) {
ovrBW.addOverlayComponent(attentionIconBW, DefaultOverlayable.SOUTH_EAST);
attentionIconBW.setToolTipText(SYSTools.xx("misc.msg.emptyselection"));
} else {
txtBWSuche.setEnabled(false);
cmbBW.setModel(new DefaultComboBoxModel(new Resident[]{resident}));
}
attentionIconMenge = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.ATTENTION));
correctIconMenge = new JLabel(OverlayableUtils.getPredefinedOverlayIcon(OverlayableIconsFactory.CORRECT));
txtMenge = new OverlayTextField();
// txtMenge.addCaretListener(new CaretListener() {
// @Override
// public void caretUpdate(CaretEvent caretEvent) {
// txtMengeCaretUpdate(caretEvent);
// }
// });
txtMenge.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent focusEvent) {
txtMengeFocusGained(focusEvent);
}
@Override
public void focusLost(FocusEvent focusEvent) {
txtMengeFocusLost(focusEvent);
}
});
txtMenge.setFont(SYSConst.ARIAL14);
ovrMenge = new DefaultOverlayable(txtMenge);
mainPane.add(ovrMenge, CC.xy(5, 11));
lblWeightControl.setText(SYSTools.xx("opde.medication.tx.controlWeight"));
lblWeightControl.setToolTipText(SYSTools.xx("opde.medication.controlWeight.newBottle.bottle.only"));
weight = null;
txtWeightControl.setVisible(false);
txtWeightControl.setText("");
lblWeightControl.setVisible(false);
ignoreEvent = false;
// setVisible(true);
}
private void txtWeightControlCaretUpdate(CaretEvent evt) {
weight = SYSTools.checkBigDecimal(evt);
}
private void txtWeightControlFocusGained(FocusEvent e) {
txtWeightControl.selectAll();
}
boolean isWeightOk() {
if (!txtWeightControl.isVisible()) return true;
boolean weightOK = weight != null && weight.compareTo(BigDecimal.ZERO) > 0;
return weightOK;
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the PrinterForm Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Erzeugter Quelltext ">//GEN-BEGIN:initComponents
private void initComponents() {
mainPane = new JPanel();
lblPZN = new JLabel();
panel2 = new JPanel();
txtMedSuche = new JXSearchField();
hSpacer1 = new JPanel(null);
btnMed = new JButton();
lblProd = new JLabel();
cmbMProdukt = new JComboBox<>();
lblInventory = new JLabel();
lblResident = new JLabel();
txtBWSuche = new JTextField();
lblAmount = new JLabel();
lblPack = new JLabel();
cmbPackung = new JComboBox<>();
lblExpires = new JLabel();
txtExpires = new JTextField();
panel3 = new JPanel();
lblWeightControl = new JLabel();
txtWeightControl = new JTextField();
lblRemark = new JLabel();
txtBemerkung = new JTextField();
btnPrint = new JToggleButton();
panel1 = new JPanel();
btnClose = new JButton();
btnApply = new JButton();
//======== this ========
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Medikamente einbuchen");
setMinimumSize(new Dimension(640, 300));
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
//======== mainPane ========
{
mainPane.setLayout(new FormLayout(
"14dlu, $lcgap, default, $lcgap, 39dlu:grow, $lcgap, default:grow, $lcgap, 14dlu",
"14dlu, 2*($lgap, fill:17dlu), $lgap, fill:default, $lgap, 17dlu, 4*($lgap, fill:17dlu), 10dlu, fill:default, $lgap, 14dlu"));
//---- lblPZN ----
lblPZN.setText("PZN oder Suchbegriff");
lblPZN.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblPZN, CC.xy(3, 3));
//======== panel2 ========
{
panel2.setLayout(new BoxLayout(panel2, BoxLayout.LINE_AXIS));
//---- txtMedSuche ----
txtMedSuche.setFont(new Font("Arial", Font.PLAIN, 14));
txtMedSuche.addActionListener(e -> txtMedSucheActionPerformed(e));
panel2.add(txtMedSuche);
panel2.add(hSpacer1);
//---- btnMed ----
btnMed.setBackground(Color.white);
btnMed.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/bw/add.png")));
btnMed.setToolTipText("Medikamente bearbeiten");
btnMed.setBorder(null);
btnMed.setSelectedIcon(new ImageIcon(getClass().getResource("/artwork/22x22/bw/add-pressed.png")));
btnMed.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnMed.addActionListener(e -> btnMedActionPerformed(e));
panel2.add(btnMed);
}
mainPane.add(panel2, CC.xywh(5, 3, 4, 1));
//---- lblProd ----
lblProd.setText("Produkt");
lblProd.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblProd, CC.xy(3, 5));
//---- cmbMProdukt ----
cmbMProdukt.setModel(new DefaultComboBoxModel<>(new String[] {
}));
cmbMProdukt.setFont(new Font("Arial", Font.PLAIN, 14));
cmbMProdukt.addItemListener(e -> cmbMProduktItemStateChanged(e));
mainPane.add(cmbMProdukt, CC.xywh(5, 5, 4, 1));
//---- lblInventory ----
lblInventory.setText("vorhandene Vorr\u00e4te");
lblInventory.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblInventory, CC.xy(3, 13));
//---- lblResident ----
lblResident.setText("Zuordnung zu Bewohner");
lblResident.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblResident, CC.xy(3, 17));
//---- txtBWSuche ----
txtBWSuche.setFont(new Font("Arial", Font.PLAIN, 14));
txtBWSuche.addCaretListener(e -> txtBWSucheCaretUpdate(e));
mainPane.add(txtBWSuche, CC.xy(5, 17));
//---- lblAmount ----
lblAmount.setText("Buchungsmenge");
lblAmount.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblAmount, CC.xy(3, 11));
//---- lblPack ----
lblPack.setText("Packung");
lblPack.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblPack, CC.xy(3, 7));
//---- cmbPackung ----
cmbPackung.setModel(new DefaultComboBoxModel<>(new String[] {
}));
cmbPackung.setFont(new Font("Arial", Font.PLAIN, 14));
cmbPackung.addItemListener(e -> cmbPackungItemStateChanged(e));
mainPane.add(cmbPackung, CC.xywh(5, 7, 4, 1));
//---- lblExpires ----
lblExpires.setText("expires");
lblExpires.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblExpires, CC.xy(3, 9));
//---- txtExpires ----
txtExpires.setFont(new Font("Arial", Font.PLAIN, 14));
txtExpires.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
txtExpiresFocusGained(e);
}
@Override
public void focusLost(FocusEvent e) {
txtExpiresFocusLost(e);
}
});
txtExpires.addActionListener(e -> txtExpiresActionPerformed(e));
mainPane.add(txtExpires, CC.xywh(5, 9, 3, 1, CC.DEFAULT, CC.FILL));
//======== panel3 ========
{
panel3.setLayout(new FormLayout(
"pref, $lcgap, default:grow",
"fill:17dlu"));
//---- lblWeightControl ----
lblWeightControl.setText("weightcontrol");
lblWeightControl.setFont(new Font("Arial", Font.PLAIN, 14));
lblWeightControl.setBackground(Color.pink);
panel3.add(lblWeightControl, CC.xy(1, 1));
//---- txtWeightControl ----
txtWeightControl.setFont(new Font("Arial", Font.PLAIN, 14));
txtWeightControl.setBackground(Color.pink);
txtWeightControl.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
txtWeightControlFocusGained(e);
}
});
txtWeightControl.addCaretListener(e -> txtWeightControlCaretUpdate(e));
panel3.add(txtWeightControl, CC.xy(3, 1, CC.DEFAULT, CC.FILL));
}
mainPane.add(panel3, CC.xy(7, 11));
//---- lblRemark ----
lblRemark.setText("Bemerkung");
lblRemark.setFont(new Font("Arial", Font.PLAIN, 14));
mainPane.add(lblRemark, CC.xy(3, 15));
//---- txtBemerkung ----
txtBemerkung.setFont(new Font("Arial", Font.PLAIN, 14));
txtBemerkung.addCaretListener(e -> txtBemerkungCaretUpdate(e));
mainPane.add(txtBemerkung, CC.xywh(5, 15, 4, 1));
//---- btnPrint ----
btnPrint.setSelectedIcon(new ImageIcon(getClass().getResource("/artwork/22x22/bw/printer-on.png")));
btnPrint.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/bw/printer-off.png")));
btnPrint.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnPrint.setEnabled(false);
btnPrint.addItemListener(e -> btnPrintItemStateChanged(e));
mainPane.add(btnPrint, CC.xy(3, 19, CC.RIGHT, CC.DEFAULT));
//======== panel1 ========
{
panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS));
//---- btnClose ----
btnClose.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/cancel.png")));
btnClose.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnClose.addActionListener(e -> btnCloseActionPerformed(e));
panel1.add(btnClose);
//---- btnApply ----
btnApply.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/apply.png")));
btnApply.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnApply.addActionListener(e -> btnApplyActionPerformed(e));
panel1.add(btnApply);
}
mainPane.add(panel1, CC.xywh(7, 19, 2, 1, CC.RIGHT, CC.DEFAULT));
}
contentPane.add(mainPane);
pack();
setLocationRelativeTo(getOwner());
}// </editor-fold>//GEN-END:initComponents
private void txtMengeFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMengeFocusGained
SYSTools.markAllTxt((JTextField) evt.getSource());
}//GEN-LAST:event_txtMengeFocusGained
private void txtBemerkungCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_txtBemerkungCaretUpdate
setApply();
}//GEN-LAST:event_txtBemerkungCaretUpdate
private void cmbBWItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbBWItemStateChanged
if (ignoreEvent || (evt != null && evt.getStateChange() != ItemEvent.SELECTED)) {
return;
}
resident = (Resident) cmbBW.getSelectedItem();
OPDE.debug("cmbPackungItemStateChanged: " + cmbBW.getSelectedItem());
initCmbVorrat();
setApply();
}//GEN-LAST:event_cmbBWItemStateChanged
private void btnApplyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnApplyActionPerformed
String text = "";
if (resident == null) {
text += "Keine(n) BewohnerIn ausgewählt. ";
}
if (tradeForm == null) {
text += "Kein Medikament ausgewählt. ";
}
if (amount == null && aPackage == null) {
text += "Keine korrekte Mengenangabe. ";
}
if (inventory == null) {
text += "Keinen Vorrat ausgewählt. ";
}
if (!isWeightOk()) {
text += "Kontrollgewicht falsch. ";
}
if (text.isEmpty()) {
save();
txtMenge.setText(null);
txtBemerkung.setText(null);
txtMedSuche.setText(null);
txtExpires.setText(null);
txtMedSuche.requestFocus();
} else {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("newstocks.registration.failed") + ": " + text, DisplayMessage.WARNING));
}
}//GEN-LAST:event_btnApplyActionPerformed
private void save() {
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
em.lock(em.merge(resident), LockModeType.OPTIMISTIC);
// Wenn die aPackage null ist, dann ist eine Sonderpackung
if (aPackage != null) {
aPackage = em.merge(aPackage);
if (amount == null) {
amount = aPackage.getContent();
}
}
tradeForm = em.merge(tradeForm);
inventory = em.merge(inventory);
if (inventory.getID() == null) { // create a new MedInvetory.
inventory.setText(TradeFormTools.toPrettyString(tradeForm) + "; " + ACMETools.toPrettyStringShort(tradeForm.getMedProduct().getACME()));
}
// https://github.com/tloehr/Offene-Pflege.de/issues/16
BigDecimal estimatedUPR = BigDecimal.ONE;
int dummyMode = MedStockTools.DONT_REPLACE_UPR;
if (tradeForm.getDosageForm().isUPRn()) {
if (tradeForm.getMedStocks().isEmpty()) {
// first of its kind. will calculate real UPR when it's closed
dummyMode = MedStockTools.REPLACE_WITH_EFFECTIVE_UPR_WHEN_CLOSING;
} else if (MedStockTools.stillWorkingOnTheFirstOneToCalculateUPRn(tradeForm)) {
dummyMode = MedStockTools.REPLACE_WITH_EFFECTIVE_UPR_WHEN_FIRST_STOCK_OF_THIS_KIND_IS_CLOSING;
} else {
dummyMode = MedStockTools.ADD_TO_AVERAGES_UPR_WHEN_CLOSING;
estimatedUPR = MedStockTools.getEstimatedUPR(tradeForm);
}
}
MedStock newStock = em.merge(new MedStock(inventory, tradeForm, aPackage, txtBemerkung.getText(), estimatedUPR, dummyMode));
newStock.setExpires(expiry);
MedStockTransaction tx = em.merge(new MedStockTransaction(newStock, amount));
tx.setWeight(weight);
em.getTransaction().commit();
amount = null;
aPackage = null;
tradeForm = null;
inventory = null;
expiry = null;
weight = null;
if (btnPrint.isSelected()) {
OPDE.getPrintProcessor().addPrintJob(new PrintListElement(newStock, logicalPrinter, printForm, OPDE.getProps().getProperty(SYSPropsTools.KEY_PHYSICAL_PRINTER)));
}
// if the label printer is not used, the new number is shown until the next message, so the user has time to write the number down manually.
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("newstocks.registration.success.1") + " <b>" + newStock.getID() + "</b> " + SYSTools.xx("newstocks.registration.success.2"), btnPrint.isSelected() ? 2 : 0));
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception ex) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(ex);
} finally {
em.close();
}
}
private void btnMedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMedActionPerformed
// String pzn = MedPackageTools.parsePZN(txtMedSuche.getText());
final JidePopup popup = new JidePopup();
WizardDialog wizard = new MedProductWizard(o -> {
if (o != null) {
MedPackage aPackage1 = (MedPackage) o;
txtMedSuche.setText(aPackage1.getPzn());
}
popup.hidePopup();
}).getWizard();
popup.setMovable(false);
popup.setPreferredSize((new Dimension(800, 450)));
popup.setResizable(false);
popup.getContentPane().setLayout(new BoxLayout(popup.getContentPane(), BoxLayout.LINE_AXIS));
popup.getContentPane().add(wizard.getContentPane());
popup.setOwner(btnMed);
popup.removeExcludedComponent(btnMed);
popup.setTransient(true);
popup.setDefaultFocusComponent(wizard.getContentPane());
popup.addPropertyChangeListener("visible", propertyChangeEvent -> {
OPDE.debug("popup property: " + propertyChangeEvent.getPropertyName() + " value: " + propertyChangeEvent.getNewValue() + " compCount: " + popup.getContentPane().getComponentCount());
popup.getContentPane().getComponentCount();
});
GUITools.showPopup(popup, SwingConstants.WEST);
// popup.showPopup(new Insets(-5, wizard.getPreferredSize().width * -1 - 200, -5, -100), btnMed);
}//GEN-LAST:event_btnMedActionPerformed
@Override
public void dispose() {
SYSTools.unregisterListeners(this);
super.dispose();
}
private void txtMengeFocusLost(FocusEvent evt) {//GEN-FIRST:event_txtMengeCaretUpdate
if (ovrMenge.getOverlayComponents().length > 0) {
ovrMenge.removeOverlayComponent(ovrMenge.getOverlayComponents()[0]);
}
amount = SYSTools.parseDecimal(txtMenge.getText().trim());
if (amount != null) {
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
// lblMenge.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/bw/editdelete.png")));
ovrMenge.addOverlayComponent(attentionIconMenge, DefaultOverlayable.SOUTH_EAST);
attentionIconMenge.setToolTipText(SYSTools.toHTML("<i>Mengen müssen größer 0 sein.</i>"));
amount = null;
} else if (aPackage != null && amount.compareTo(aPackage.getContent()) > 0) {
ovrMenge.addOverlayComponent(attentionIconMenge, DefaultOverlayable.SOUTH_EAST);
attentionIconMenge.setToolTipText(SYSTools.toHTML("<i>Mengen dürfen nicht größer als der Packungsinhalt sein.</i>"));
amount = aPackage.getContent();
} else {
ovrMenge.addOverlayComponent(correctIconMenge, DefaultOverlayable.SOUTH_EAST);
}
} else {
ovrMenge.addOverlayComponent(attentionIconMenge, DefaultOverlayable.SOUTH_EAST);
attentionIconMenge.setToolTipText(SYSTools.toHTML("<i>Die Mengenangabe ist falsch.</i>"));
}
txtMenge.setText(SYSTools.formatBigDecimal(amount));
}//GEN-LAST:event_txtMengeCaretUpdate
private void txtBWSucheCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_txtBWSucheCaretUpdate
if (ignoreEvent || !txtBWSuche.isEnabled()) {
return;
}
if (txtBWSuche.getText().isEmpty()) {
cmbBW.setModel(new DefaultComboBoxModel());
resident = null;
} else {
DefaultComboBoxModel dcbm = new DefaultComboBoxModel();
EntityManager em = OPDE.createEM();
if (txtBWSuche.getText().trim().length() == 3) { // Könnte eine Suche nach der Kennung sein
resident = em.find(Resident.class, txtBWSuche.getText().trim());
if (resident != null) {
dcbm = new DefaultComboBoxModel(new Resident[]{resident});
}
}
if (dcbm.getSize() == 0) { // Vielleicht Suche nach Nachname
Query query = em.createQuery(" SELECT b FROM Resident b WHERE b.station IS NOT NULL AND b.name like :nachname ORDER BY b.name, b.firstname ");
query.setParameter("nachname", txtBWSuche.getText().trim() + "%");
java.util.List<Resident> listbw = query.getResultList();
dcbm = new DefaultComboBoxModel(listbw.toArray());
}
if (dcbm.getSize() > 0) {
cmbBW.setModel(dcbm);
cmbBW.setSelectedIndex(0);
resident = (Resident) cmbBW.getSelectedItem();
} else {
cmbBW.setModel(new DefaultComboBoxModel());
resident = null;
}
em.close();
}
if (ovrBW.getOverlayComponents().length > 0) {
ovrBW.removeOverlayComponent(ovrBW.getOverlayComponents()[0]);
}
if (resident == null) {
ovrBW.addOverlayComponent(attentionIconBW, DefaultOverlayable.SOUTH_EAST);
attentionIconBW.setToolTipText("<html>Keine(n) BewohnerIn ausgewählt.<html>");
}
initCmbVorrat();
}//GEN-LAST:event_txtBWSucheCaretUpdate
private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseActionPerformed
dispose();
}//GEN-LAST:event_btnCloseActionPerformed
private void cmbPackungItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbPackungItemStateChanged
if (ignoreEvent || (evt != null && evt.getStateChange() != ItemEvent.SELECTED)) {
return;
}
OPDE.debug("cmbPackungItemStateChanged: " + cmbPackung.getSelectedItem());
if (cmbPackung.getSelectedItem() instanceof MedPackage) {
aPackage = (MedPackage) cmbPackung.getSelectedItem();
} else {
aPackage = null;
}
txtMenge.setText("");
}//GEN-LAST:event_cmbPackungItemStateChanged
private void initCmbVorrat() {
if (ovrVorrat.getOverlayComponents().length > 0) {
ovrVorrat.removeOverlayComponent(ovrVorrat.getOverlayComponents()[0]);
}
if (resident != null) {
// ovrVorrat.removeOverlayComponent(ovrVorrat.getOverlayComponents()[0]);
// ovrVorrat.addOverlayComponent(questionIconVorrat, DefaultOverlayable.SOUTH_EAST);
//
cmbVorrat.setRenderer(MedInventoryTools.getInventoryRenderer());
if (tradeForm == null) {
cmbVorrat.setModel(new DefaultComboBoxModel());
inventory = null;
} else {
List<MedInventory> vorraete = new ArrayList<MedInventory>();
inventory = TradeFormTools.getInventory4TradeForm(resident, tradeForm);
if (inventory == null) {
vorraete = TradeFormTools.getSuitableInventoriesForThisTradeForm(resident, tradeForm);
} else {
vorraete.add(inventory);
}
cmbVorrat.setModel(new DefaultComboBoxModel(vorraete.toArray()));
}
// ovrVorrat.removeOverlayComponent(ovrVorrat.getOverlayComponents()[0]);
if (tradeForm != null) {
if (inventory == null) {
DefaultComboBoxModel dcbm = (DefaultComboBoxModel) cmbVorrat.getModel();
dcbm.insertElementAt(new MedInventory(resident, "<AUTOMATISCH>"), 0);
cmbVorrat.setSelectedIndex(0);
if (dcbm.getSize() > 1) {
ovrVorrat.addOverlayComponent(attentionIconVorrat, DefaultOverlayable.SOUTH_EAST);
attentionIconVorrat.setToolTipText("<html>Keinen <b>exakt</b> passender Vorrat gefunden. Wählen Sie selbst einen passenden aus oder verwenden Sie <b>automatisch</b>.<html>");
cmbVorrat.showPopup();
} else {
ovrVorrat.addOverlayComponent(infoIconVorrat, DefaultOverlayable.SOUTH_EAST);
infoIconVorrat.setToolTipText("<html>Ein neuer Vorrat wird <b>automatisch</b> erstellt.</html>");
}
} else {
correctIconVorrat.setToolTipText(null);
ovrVorrat.addOverlayComponent(correctIconVorrat, DefaultOverlayable.SOUTH_EAST);
}
} else {
ovrVorrat.addOverlayComponent(questionIconVorrat, DefaultOverlayable.SOUTH_EAST);
questionIconVorrat.setToolTipText("<html>Kein Medikament ausgewählt.<html>");
}
}
}
private void cmbMProduktItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbMProduktItemStateChanged
if (ignoreEvent || (evt != null && evt.getStateChange() != ItemEvent.SELECTED)) {
return;
}
tradeForm = (TradeForm) cmbMProdukt.getSelectedItem();
if (tradeForm != null) {
DefaultComboBoxModel dcbm = new DefaultComboBoxModel(tradeForm.getPackages().toArray());
txtWeightControl.setVisible(tradeForm.isWeightControlled());
lblWeightControl.setVisible(tradeForm.isWeightControlled());
dcbm.insertElementAt("<Sonderpackung>", 0);
cmbPackung.setModel(dcbm);
cmbPackung.setRenderer(MedPackageTools.getMedPackungRenderer());
if (aPackage == null) {
cmbPackung.setSelectedIndex(cmbPackung.getModel().getSize() - 1);
} else {
cmbPackung.setSelectedItem(aPackage);
}
cmbPackungItemStateChanged(null);
} else {
cmbPackung.setModel(new DefaultComboBoxModel());
aPackage = null;
txtWeightControl.setVisible(false);
lblWeightControl.setVisible(false);
}
initCmbVorrat();
}//GEN-LAST:event_cmbMProduktItemStateChanged
private void setApply() {
// boolean txtEntry = true;
// if (cmbPackung.getSelectedIndex() < 0) {
// txtEntry = !txtBemerkung.getText().isEmpty();
// }
//
// btnApply.setEnabled(medEingegeben && (mengeEingegeben || packungEingegeben) && bwEingegeben && txtEntry);
}
// Variablendeklaration - nicht modifizieren//GEN-BEGIN:variables
private JPanel mainPane;
private JLabel lblPZN;
private JPanel panel2;
private JXSearchField txtMedSuche;
private JPanel hSpacer1;
private JButton btnMed;
private JLabel lblProd;
private JComboBox<String> cmbMProdukt;
private JLabel lblInventory;
private JLabel lblResident;
private JTextField txtBWSuche;
private JLabel lblAmount;
private JLabel lblPack;
private JComboBox<String> cmbPackung;
private JLabel lblExpires;
private JTextField txtExpires;
private JPanel panel3;
private JLabel lblWeightControl;
private JTextField txtWeightControl;
private JLabel lblRemark;
private JTextField txtBemerkung;
private JToggleButton btnPrint;
private JPanel panel1;
private JButton btnClose;
private JButton btnApply;
// Ende der Variablendeklaration//GEN-END:variables
}