/* * 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 entity.prescription.DosageFormTools; import entity.prescription.MedStock; import entity.prescription.MedStockTools; import entity.prescription.MedStockTransactionTools; import op.OPDE; import op.threads.DisplayManager; import op.tools.MyJDialog; import op.tools.SYSConst; import op.tools.SYSTools; import org.apache.commons.collections.Closure; import javax.persistence.EntityManager; import javax.persistence.LockModeType; import javax.persistence.Query; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.math.BigDecimal; /** * @author tloehr */ public class DlgCloseStock extends MyJDialog { private MedStock medStock; private Closure actionBlock; public static final String internalClassID = "nursingrecords.prescription.dlgCloseStock"; /** * Creates new form DlgBestandAnbruch */ public DlgCloseStock(MedStock medStock, Closure actionBlock) { super(false); this.actionBlock = actionBlock; this.medStock = medStock; initComponents(); initDialog(); // setVisible(true); } /** * 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel1 = new JPanel(); jScrollPane1 = new JScrollPane(); txtInfo = new JTextPane(); rbLeer = new JRadioButton(); rbStellen = new JRadioButton(); txtLetzte = new JTextField(); lblEinheiten = new JLabel(); rbAbgelaufen = new JRadioButton(); jSeparator1 = new JSeparator(); jLabel2 = new JLabel(); jLabel3 = new JLabel(); rbGefallen = new JRadioButton(); cmbBestID = new JComboBox<>(); panel1 = new JPanel(); btnClose = new JButton(); btnOk = new JButton(); //======== this ======== setResizable(false); setModalityType(Dialog.ModalityType.APPLICATION_MODAL); Container contentPane = getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); //======== jPanel1 ======== { jPanel1.setBorder(null); jPanel1.setLayout(new FormLayout( "14dlu, $lcgap, 145dlu, $lcgap, 41dlu, $lcgap, 93dlu, $lcgap, 14dlu", "14dlu, $lgap, fill:70dlu:grow, 4*($lgap, fill:default), $lgap, $rgap, $lgap, fill:default, $lgap, $rgap, $lgap, default, $lgap, 14dlu")); //======== jScrollPane1 ======== { //---- txtInfo ---- txtInfo.setEditable(false); txtInfo.setFont(new Font("Arial", Font.PLAIN, 14)); jScrollPane1.setViewportView(txtInfo); } jPanel1.add(jScrollPane1, CC.xywh(3, 3, 5, 1)); //---- rbLeer ---- rbLeer.setSelected(true); rbLeer.setText("Die Packung ist nun leer"); rbLeer.setFont(new Font("Arial", Font.PLAIN, 14)); rbLeer.addActionListener(e -> rbLeerActionPerformed(e)); jPanel1.add(rbLeer, CC.xy(3, 5)); //---- rbStellen ---- rbStellen.setText("Beim Vorab Stellen haben Sie die letzten "); rbStellen.setFont(new Font("Arial", Font.PLAIN, 14)); rbStellen.addActionListener(e -> rbStellenActionPerformed(e)); jPanel1.add(rbStellen, CC.xywh(3, 7, 2, 1)); //---- txtLetzte ---- txtLetzte.setText("jTextField1"); txtLetzte.setFont(new Font("Arial", Font.PLAIN, 14)); txtLetzte.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { txtLetzteFocusLost(e); } }); jPanel1.add(txtLetzte, CC.xy(5, 7)); //---- lblEinheiten ---- lblEinheiten.setText("Einheiten verbraucht."); lblEinheiten.setFont(new Font("Arial", Font.PLAIN, 14)); jPanel1.add(lblEinheiten, CC.xy(7, 7)); //---- rbAbgelaufen ---- rbAbgelaufen.setText("Die Packung ist abgelaufen oder wird nicht mehr ben\u00f6tigt. Bereit zur Entsorgung."); rbAbgelaufen.setFont(new Font("Arial", Font.PLAIN, 14)); rbAbgelaufen.addActionListener(e -> rbAbgelaufenActionPerformed(e)); jPanel1.add(rbAbgelaufen, CC.xywh(3, 9, 5, 1)); jPanel1.add(jSeparator1, CC.xywh(3, 13, 5, 1)); //---- jLabel2 ---- jLabel2.setText("Als n\u00e4chstes Packung soll die Nummer"); jLabel2.setFont(new Font("Arial", Font.PLAIN, 14)); jLabel2.setHorizontalAlignment(SwingConstants.TRAILING); jPanel1.add(jLabel2, CC.xy(3, 15)); //---- jLabel3 ---- jLabel3.setText("angebrochen werden."); jLabel3.setFont(new Font("Arial", Font.PLAIN, 14)); jPanel1.add(jLabel3, CC.xy(7, 15)); //---- rbGefallen ---- rbGefallen.setText("<html>Die Packung ist <font color=\"red\">runter gefallen</font> oder <font color=\"red\">verschwunden</font> und muss ausgebucht werden.</html>"); rbGefallen.setFont(new Font("Arial", Font.PLAIN, 14)); rbGefallen.addActionListener(e -> rbGefallenActionPerformed(e)); jPanel1.add(rbGefallen, CC.xywh(3, 11, 5, 1)); //---- cmbBestID ---- cmbBestID.setModel(new DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); cmbBestID.setFont(new Font("Arial", Font.PLAIN, 14)); cmbBestID.addItemListener(e -> cmbBestIDItemStateChanged(e)); jPanel1.add(cmbBestID, CC.xy(5, 15)); //======== panel1 ======== { panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); //---- btnClose ---- btnClose.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/cancel.png"))); btnClose.setText(null); btnClose.addActionListener(e -> btnCloseActionPerformed(e)); panel1.add(btnClose); //---- btnOk ---- btnOk.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/apply.png"))); btnOk.setText(null); btnOk.addActionListener(e -> btnOkActionPerformed(e)); panel1.add(btnOk); } jPanel1.add(panel1, CC.xy(7, 19, CC.RIGHT, CC.DEFAULT)); } contentPane.add(jPanel1); pack(); setLocationRelativeTo(getOwner()); //---- buttonGroup1 ---- ButtonGroup buttonGroup1 = new ButtonGroup(); buttonGroup1.add(rbLeer); buttonGroup1.add(rbStellen); buttonGroup1.add(rbAbgelaufen); buttonGroup1.add(rbGefallen); }// </editor-fold>//GEN-END:initComponents private void rbAbgelaufenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbAbgelaufenActionPerformed txtLetzte.setEnabled(rbStellen.isSelected()); }//GEN-LAST:event_rbAbgelaufenActionPerformed private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseActionPerformed medStock = null; dispose(); }//GEN-LAST:event_btnCloseActionPerformed @Override public void dispose() { actionBlock.execute(medStock); SYSTools.unregisterListeners(this); super.dispose(); } private void initDialog() { String text = SYSTools.xx("nursingrecords.prescription.dlgCloseStock.youWantToClose1a") + medStock.getID() + SYSTools.xx("nursingrecords.prescription.dlgCloseStock.youWantToClose1b"); text += "<br/>" + MedStockTools.getTextASHTML(medStock) + "</br>"; text += "<br/>" + SYSTools.xx("nursingrecords.prescription.dlgCloseStock.chooseAReason") + ":"; txtInfo.setContentType("text/html"); txtInfo.setText(SYSTools.toHTML(SYSConst.html_div(text))); EntityManager em = OPDE.createEM(); Query query = em.createQuery(" " + " SELECT b FROM MedStock b " + " WHERE b.inventory = :inventory AND b.out = :out AND b.opened = :opened " + " ORDER BY b.in, b.id "); query.setParameter("inventory", medStock.getInventory()); query.setParameter("out", SYSConst.DATE_UNTIL_FURTHER_NOTICE); query.setParameter("opened", SYSConst.DATE_UNTIL_FURTHER_NOTICE); DefaultComboBoxModel dcbm = new DefaultComboBoxModel(query.getResultList().toArray()); dcbm.insertElementAt(SYSTools.xx("misc.msg.none"), 0); cmbBestID.setModel(dcbm); cmbBestID.setRenderer(new ListCellRenderer() { @Override public Component getListCellRendererComponent(JList jList, Object o, int i, boolean b, boolean b1) { String text = o instanceof MedStock ? ((MedStock) o).getID().toString() : o.toString(); return new JLabel(text); } }); em.close(); int index = Math.min(2, cmbBestID.getItemCount()); cmbBestID.setSelectedIndex(index - 1); lblEinheiten.setText(SYSConst.UNITS[medStock.getTradeForm().getDosageForm().getPackUnit()] + " " + SYSTools.xx("misc.msg.usedup")); txtLetzte.setText(""); txtLetzte.setEnabled(false); // Das mit dem Vorabstellen nur bei Formen, die auf Stück basieren also APV = 1 rbStellen.setEnabled(medStock.getTradeForm().getDosageForm().getUPRState() == DosageFormTools.STATE_UPR1); } private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed save();//GEN-LAST:event_btnOkActionPerformed } private void rbStellenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbStellenActionPerformed txtLetzte.setEnabled(true); txtLetzte.requestFocus(); }//GEN-LAST:event_rbStellenActionPerformed private void rbLeerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbLeerActionPerformed txtLetzte.setEnabled(rbStellen.isSelected()); }//GEN-LAST:event_rbLeerActionPerformed private void txtLetzteFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtLetzteFocusLost BigDecimal inhalt = SYSTools.parseDecimal(txtLetzte.getText()); if (inhalt == null && inhalt.compareTo(BigDecimal.ZERO) <= 0) { txtLetzte.setText("1"); } }//GEN-LAST:event_txtLetzteFocusLost private void cmbBestIDItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbBestIDItemStateChanged if (cmbBestID.getSelectedIndex() == 0) { cmbBestID.setToolTipText(null); } else { MedStock myBestand = (MedStock) cmbBestID.getSelectedItem(); cmbBestID.setToolTipText(SYSTools.toHTML(MedStockTools.getTextASHTML(myBestand))); } }//GEN-LAST:event_cmbBestIDItemStateChanged private void rbGefallenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbGefallenActionPerformed txtLetzte.setEnabled(rbStellen.isSelected()); }//GEN-LAST:event_rbGefallenActionPerformed private void save() { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); final MedStock myStock = em.merge(medStock); em.lock(myStock, LockModeType.OPTIMISTIC); em.lock(em.merge(myStock.getInventory().getResident()), LockModeType.OPTIMISTIC); em.lock(em.merge(myStock.getInventory()), LockModeType.OPTIMISTIC); OPDE.important("StockID: " + myStock.getID() + " " + SYSTools.xx("misc.msg.closed")); OPDE.important("UID: " + OPDE.getLogin().getUser().getUID()); MedStock nextBest = null; if (cmbBestID.getSelectedIndex() > 0) { nextBest = em.merge((MedStock) cmbBestID.getSelectedItem()); OPDE.important(SYSTools.xx("nursingrecords.prescription.dlgCloseStock.LOG.STATE_EDIT_EMPTY_SOON1") + ": " + nextBest.getID()); em.lock(nextBest, LockModeType.OPTIMISTIC); myStock.setNextStock(nextBest); } if (rbStellen.isSelected()) { BigDecimal inhalt = SYSTools.parseDecimal(txtLetzte.getText()); MedStockTools.setStockTo(em, myStock, inhalt, SYSTools.xx("nursingrecords.prescription.dlgCloseStock.TX.STATE_EDIT_EMPTY_SOON"), MedStockTransactionTools.STATE_EDIT_EMPTY_SOON); myStock.setState(MedStockTools.STATE_WILL_BE_CLOSED_SOON); OPDE.important(SYSTools.xx("nursingrecords.prescription.dlgCloseStock.LOG.STATE_EDIT_EMPTY_SOON1") + ": " + inhalt); } else { if (rbGefallen.isSelected()) { MedStockTools.close(em, myStock, SYSTools.xx("nursingrecords.prescription.dlgCloseStock.TX.STATE_EDIT_EMPTY_BROKEN_OR_LOST"), MedStockTransactionTools.STATE_EDIT_EMPTY_BROKEN_OR_LOST); OPDE.important(SYSTools.xx("nursingrecords.prescription.dlgCloseStock.LOG.STATE_EDIT_EMPTY_BROKEN_OR_LOST")); } else if (rbAbgelaufen.isSelected()) { MedStockTools.close(em, myStock, SYSTools.xx("nursingrecords.prescription.dlgCloseStock.TX.STATE_EDIT_EMPTY_PAST_EXPIRY"), MedStockTransactionTools.STATE_EDIT_EMPTY_PAST_EXPIRY); OPDE.important(SYSTools.xx("nursingrecords.prescription.dlgCloseStock.LOG.STATE_EDIT_EMPTY_PAST_EXPIRY")); } else { MedStockTools.close(em, myStock, SYSTools.xx("nursingrecords.prescription.dlgCloseStock.TX.STATE_EDIT_EMPTY_NOW"), MedStockTransactionTools.STATE_EDIT_EMPTY_NOW); OPDE.important(SYSTools.xx("nursingrecords.prescription.dlgCloseStock.LOG.STATE_EDIT_EMPTY_NOW")); } } em.getTransaction().commit(); medStock = myStock; } catch (javax.persistence.OptimisticLockException 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 e) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.fatal(e); } finally { em.close(); } dispose(); } // Variables declaration - do not modify//GEN-BEGIN:variables private JPanel jPanel1; private JScrollPane jScrollPane1; private JTextPane txtInfo; private JRadioButton rbLeer; private JRadioButton rbStellen; private JTextField txtLetzte; private JLabel lblEinheiten; private JRadioButton rbAbgelaufen; private JSeparator jSeparator1; private JLabel jLabel2; private JLabel jLabel3; private JRadioButton rbGefallen; private JComboBox<String> cmbBestID; private JPanel panel1; private JButton btnClose; private JButton btnOk; // End of variables declaration//GEN-END:variables }