/* * Created by JFormDesigner on Tue Apr 23 14:41:58 CEST 2013 */ package op.care.med.structure; import com.jgoodies.forms.factories.CC; import com.jgoodies.forms.layout.FormLayout; import entity.prescription.MedStock; import entity.prescription.MedStockTools; import entity.prescription.TradeForm; import entity.prescription.TradeFormTools; import op.OPDE; import op.threads.DisplayManager; import op.threads.DisplayMessage; import op.tools.*; import org.apache.commons.collections.Closure; import javax.persistence.*; import javax.swing.*; import javax.swing.table.AbstractTableModel; import java.awt.*; import java.awt.event.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DateFormat; import java.util.ArrayList; import java.util.HashMap; /** * @author Torsten Löhr */ public class DlgUPREditor extends MyJDialog { private static final String internalClassID = "upreditor"; private TradeForm tradeForm; private ArrayList<MedStock> listStocks; private HashMap<MedStock, Pair<BigDecimal, BigDecimal>> mapEffectiveUPRs; private Closure afterAction; private JDialog currentEditor; public DlgUPREditor(TradeForm tradeForm, Closure afterAction) { super(false); this.tradeForm = tradeForm; this.afterAction = afterAction; initComponents(); initPanel(); } private void initPanel() { OPDE.getMainframe().setBlocked(true); OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100)); SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { int progress = 0; OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), progress, 100)); lblProduct.setText(tradeForm.getMedProduct().getText() + " " + TradeFormTools.toPrettyStringMedium(tradeForm)); mapEffectiveUPRs = new HashMap<MedStock, Pair<BigDecimal, BigDecimal>>(); rbUPRConst.setText(SYSTools.xx("upreditor.constant.upr")); rbUPRAuto.setText(SYSTools.xx("upreditor.calculated.upr")); // Query query = em.createQuery("SELECT m FROM DosageForm m ORDER BY m.preparation, m.usageText"); // cmbDosageForm.setModel(new DefaultComboBoxModel(query.getResultList().toArray(new DosageForm[]{}))); // cmbDosageForm.setRenderer(DosageFormTools.getRenderer(0)); if (tradeForm.getConstantUPRn() != null) { txtUPR.setText(SYSTools.formatBigDecimal(tradeForm.getConstantUPRn().setScale(2, RoundingMode.HALF_UP))); rbUPRConst.setSelected(true); } else { txtSetUPR.setText(SYSTools.formatBigDecimal(MedStockTools.getEstimatedUPR(tradeForm).setScale(2, RoundingMode.HALF_UP))); rbUPRAuto.setSelected(true); } EntityManager em = OPDE.createEM(); Query query = em.createQuery("SELECT s FROM MedStock s WHERE s.tradeform = :tf ORDER BY s.in "); query.setParameter("tf", tradeForm); listStocks = new ArrayList<MedStock>(query.getResultList()); em.close(); // calculate effective UPRs for every closed stock for that tradeform for (MedStock stock : listStocks) { progress++; OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), progress, listStocks.size())); if (stock.isClosed()) { mapEffectiveUPRs.put(stock, new Pair<BigDecimal, BigDecimal>(MedStockTools.getSumOfDosesInBHP(stock), MedStockTools.getEffectiveUPR(stock))); } } return null; } @Override protected void done() { tblStock.setModel(new MDLStock()); OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); setVisible(true); } }; worker.execute(); } private void btnCloseActionPerformed(ActionEvent e) { afterAction.execute(null); dispose(); } private void rbUPRConstItemStateChanged(ItemEvent e) { txtUPR.setEnabled(e.getStateChange() == ItemEvent.SELECTED); if (e.getStateChange() == ItemEvent.SELECTED) { if (txtUPR.getText().isEmpty()) { txtUPR.setText("10"); } } else { txtUPR.setText(null); } } private void txtUPRActionPerformed(ActionEvent e) { BigDecimal upr = checkUPR(txtUPR.getText()); txtUPR.setText(SYSTools.formatBigDecimal(upr.setScale(2, RoundingMode.HALF_UP))); } private BigDecimal checkUPR(String text) { BigDecimal upr = SYSTools.parseDecimal(text); if (upr == null || upr.compareTo(BigDecimal.ZERO) <= 0) { upr = BigDecimal.TEN; } return upr; } private void txtUPRFocusLost(FocusEvent e) { BigDecimal upr = checkUPR(txtUPR.getText()); txtUPR.setText(SYSTools.formatBigDecimal(upr.setScale(2, RoundingMode.HALF_UP))); } private void rbUPRAutoItemStateChanged(ItemEvent e) { txtSetUPR.setEnabled(e.getStateChange() == ItemEvent.SELECTED); if (e.getStateChange() == ItemEvent.SELECTED) { if (txtSetUPR.getText().isEmpty()) { txtSetUPR.setText("10"); } } else { txtSetUPR.setText(null); } } private void txtSetUPRActionPerformed(ActionEvent e) { BigDecimal upr = checkUPR(txtSetUPR.getText()); txtSetUPR.setText(SYSTools.formatBigDecimal(upr.setScale(2, RoundingMode.HALF_UP))); } private void txtSetUPRFocusLost(FocusEvent e) { BigDecimal upr = checkUPR(txtSetUPR.getText()); txtSetUPR.setText(SYSTools.formatBigDecimal(upr.setScale(2, RoundingMode.HALF_UP))); } private void btnSaveActionPerformed(ActionEvent e) { currentEditor = new DlgYesNo(SYSTools.xx("upreditor.changeupr.yesno"), SYSConst.icon48playerStop, answer -> { if (answer.equals(JOptionPane.YES_OPTION)) { SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { btnSave.setEnabled(false); btnClose.setEnabled(false); rbUPRAuto.setEnabled(false); rbUPRConst.setEnabled(false); txtUPR.setEnabled(false); txtSetUPR.setEnabled(false); EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); if (rbUPRAuto.isSelected()) { int progress = 0; OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), progress, 100)); BigDecimal upr = checkUPR(txtSetUPR.getText()); TradeForm mytf = em.merge(tradeForm); em.lock(mytf, LockModeType.OPTIMISTIC); mytf.setUPR(null); for (MedStock s : listStocks) { progress++; OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), progress, listStocks.size())); MedStock stock = em.merge(s); em.lock(stock, LockModeType.OPTIMISTIC); em.lock(stock.getInventory(), LockModeType.OPTIMISTIC_FORCE_INCREMENT); stock.setUPR(upr); stock.setUPRDummyMode(MedStockTools.ADD_TO_AVERAGES_UPR_WHEN_CLOSING); // no dummies after this has been set } } else { BigDecimal upr = checkUPR(txtUPR.getText()); TradeForm mytf = em.merge(tradeForm); em.lock(mytf, LockModeType.OPTIMISTIC); mytf.setUPR(upr); } em.getTransaction().commit(); } catch (OptimisticLockException ole) { OPDE.warn(ole); if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage()); } catch (RollbackException ole) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage()); } catch (Exception ex) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.fatal(ex); } finally { em.close(); } return null; } @Override protected void done() { OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); afterAction.execute(null); currentEditor = null; dispose(); } }; worker.execute(); } }); currentEditor.setVisible(true); } private void initComponents() { // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents lblProduct = new JLabel(); panel3 = new JPanel(); rbUPRAuto = new JRadioButton(); txtSetUPR = new JTextField(); scrollPane1 = new JScrollPane(); tblStock = new JTable(); panel1 = new JPanel(); rbUPRConst = new JRadioButton(); txtUPR = new JTextField(); panel2 = new JPanel(); panel4 = new JPanel(); btnClose = new JButton(); btnSave = new JButton(); //======== this ======== Container contentPane = getContentPane(); contentPane.setLayout(new FormLayout( "default, $lcgap, pref, $lcgap, default:grow, $lcgap, default", "6*(default, $lgap), default:grow, 2*($lgap, default)")); //---- lblProduct ---- lblProduct.setText("Product here"); lblProduct.setFont(lblProduct.getFont().deriveFont(lblProduct.getFont().getStyle() | Font.ITALIC, lblProduct.getFont().getSize() + 6f)); contentPane.add(lblProduct, CC.xywh(3, 3, 3, 1)); //======== panel3 ======== { panel3.setLayout(new BoxLayout(panel3, BoxLayout.PAGE_AXIS)); //---- rbUPRAuto ---- rbUPRAuto.setText("UPR automatic"); rbUPRAuto.addItemListener(e -> rbUPRAutoItemStateChanged(e)); panel3.add(rbUPRAuto); //---- txtSetUPR ---- txtSetUPR.addActionListener(e -> txtSetUPRActionPerformed(e)); txtSetUPR.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { txtSetUPRFocusLost(e); } }); panel3.add(txtSetUPR); } contentPane.add(panel3, CC.xy(3, 5)); //======== scrollPane1 ======== { //---- tblStock ---- tblStock.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); scrollPane1.setViewportView(tblStock); } contentPane.add(scrollPane1, CC.xywh(5, 5, 1, 9)); //======== panel1 ======== { panel1.setLayout(new BoxLayout(panel1, BoxLayout.PAGE_AXIS)); //---- rbUPRConst ---- rbUPRConst.setText("UPR constant"); rbUPRConst.addItemListener(e -> rbUPRConstItemStateChanged(e)); panel1.add(rbUPRConst); //---- txtUPR ---- txtUPR.addActionListener(e -> txtUPRActionPerformed(e)); txtUPR.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { txtUPRFocusLost(e); } }); panel1.add(txtUPR); } contentPane.add(panel1, CC.xy(3, 7)); //======== panel2 ======== { panel2.setLayout(new BoxLayout(panel2, BoxLayout.PAGE_AXIS)); } contentPane.add(panel2, CC.xy(3, 13)); //======== panel4 ======== { panel4.setLayout(new BoxLayout(panel4, BoxLayout.LINE_AXIS)); //---- btnClose ---- btnClose.setText(null); btnClose.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/cancel.png"))); btnClose.addActionListener(e -> btnCloseActionPerformed(e)); panel4.add(btnClose); //---- btnSave ---- btnSave.setText(null); btnSave.setIcon(new ImageIcon(getClass().getResource("/artwork/22x22/apply.png"))); btnSave.addActionListener(e -> btnSaveActionPerformed(e)); panel4.add(btnSave); } contentPane.add(panel4, CC.xy(5, 15, CC.RIGHT, CC.FILL)); setSize(970, 490); setLocationRelativeTo(getOwner()); //---- buttonGroup1 ---- ButtonGroup buttonGroup1 = new ButtonGroup(); buttonGroup1.add(rbUPRAuto); buttonGroup1.add(rbUPRConst); // JFormDesigner - End of component initialization //GEN-END:initComponents } private class MDLStock extends AbstractTableModel { String[] columnNames; private MDLStock() { columnNames = new String[]{SYSTools.xx("upreditor.col1"), SYSTools.xx("upreditor.col2"), SYSTools.xx("upreditor.col3"), SYSTools.xx("upreditor.col4"), SYSTools.xx("upreditor.col5"), SYSTools.xx("upreditor.col6"), SYSTools.xx("upreditor.col7")}; } @Override public int getRowCount() { return listStocks.size(); //To change body of implemented methods use File | Settings | File Templates. } @Override public int getColumnCount() { return 7; //To change body of implemented methods use File | Settings | File Templates. } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Object result = null; switch (columnIndex) { case 0: { result = listStocks.get(rowIndex).getID(); break; } case 1: { result = listStocks.get(rowIndex).getInventory().getResident().getRID(); break; } case 2: { result = SYSTools.formatBigDecimal(listStocks.get(rowIndex).getUPR().setScale(2, RoundingMode.HALF_UP)); break; } case 3: { result = DateFormat.getDateInstance().format(listStocks.get(rowIndex).getIN()); break; } case 4: { result = SYSTools.formatBigDecimal(MedStockTools.getStartTX(listStocks.get(rowIndex)).getAmount().setScale(2, RoundingMode.HALF_UP)); break; } case 5: { result = "OPEN"; if (mapEffectiveUPRs.containsKey(listStocks.get(rowIndex))) { result = SYSTools.formatBigDecimal(mapEffectiveUPRs.get(listStocks.get(rowIndex)).getFirst().setScale(2, RoundingMode.HALF_UP)); } break; } case 6: { result = "OPEN"; if (mapEffectiveUPRs.containsKey(listStocks.get(rowIndex))) { result = SYSTools.formatBigDecimal(mapEffectiveUPRs.get(listStocks.get(rowIndex)).getSecond().setScale(2, RoundingMode.HALF_UP)); } break; } default: { result = "Fuck it!"; } } return result; } } // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables private JLabel lblProduct; private JPanel panel3; private JRadioButton rbUPRAuto; private JTextField txtSetUPR; private JScrollPane scrollPane1; private JTable tblStock; private JPanel panel1; private JRadioButton rbUPRConst; private JTextField txtUPR; private JPanel panel2; private JPanel panel4; private JButton btnClose; private JButton btnSave; // JFormDesigner - End of variables declaration //GEN-END:variables }