/* * iDART: The Intelligent Dispensing of Antiretroviral Treatment * Copyright (C) 2006 Cell-Life * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 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 version * 2 for more details. * * You should have received a copy of the GNU General Public License version 2 * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package org.celllife.idart.gui.stockArrives; import java.math.BigDecimal; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Currency; import java.util.Date; import model.manager.AdministrationManager; import model.manager.DrugManager; import model.manager.StockManager; import org.apache.log4j.Logger; import org.celllife.idart.commonobjects.CommonObjects; import org.celllife.idart.commonobjects.iDartProperties; import org.celllife.idart.database.hibernate.Drug; import org.celllife.idart.database.hibernate.Stock; import org.celllife.idart.database.hibernate.util.HibernateUtil; import org.celllife.idart.gui.misc.iDARTChangeListener; import org.celllife.idart.gui.platform.GenericFormGui; import org.celllife.idart.gui.search.Search; import org.celllife.idart.gui.utils.InputVerificationUtils; import org.celllife.idart.gui.utils.ResourceUtils; import org.celllife.idart.gui.utils.iDartColor; import org.celllife.idart.gui.utils.iDartFont; import org.celllife.idart.gui.utils.iDartImage; import org.celllife.idart.gui.widget.DateButton; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; /** */ public class DeliveryDetails extends GenericFormGui { private CCombo cmbStockCenter; private Group grpDrugDetails; private Text txtDrugName; private Text txtManufacturer; private Text txtDescription; private Text txtPackSize; private Group grpBatchDetails; private Text txtBatchNumber; private Combo cmbExpiryMonth; private Combo cmbExpiryYear; private Text txtUnitsReceived; private TableItem tableItem; private iDARTChangeListener changeListener; private Drug theDrug; private Text txtShelfNo; private Button btnDrugSearch; private DateButton btnArrivalDatePicker; private Text txtUnitPrice; private final StockArrives parentStockScreen; /** * Constructor method * * @param parent * Shell * @param ti * TableItem */ public DeliveryDetails(StockArrives parentStockScreen, TableItem ti) { super(parentStockScreen.getShell(), HibernateUtil.getNewSession()); this.tableItem = ti; this.parentStockScreen = parentStockScreen; Search drugSearch = new Search(getHSession(), getShell(), CommonObjects.DRUG); if (drugSearch.getValueSelected() != null) { btnDrugSearch.setEnabled(false); loadDrugDetails(drugSearch.getValueSelected()[0]); txtDescription.setEnabled(false); txtPackSize.setEnabled(false); } else { enableFields(false); } } /** * This method initializes newDeliveryDetails */ @Override protected void createShell() { String shellTxt = "Delivery Details"; Rectangle bounds = new Rectangle(200, 100, 600, 630); buildShell(shellTxt, bounds); getShell().addListener(SWT.Close, new Listener() { @Override public void handleEvent(Event e) { cmdCancelWidgetSelected(); } }); } /** * This method initializes compHeader */ @Override protected void createCompHeader() { String headerTxt = "Delivery Details"; iDartImage icoImage = iDartImage.PACKAGESARRIVE; buildCompHeader(headerTxt, icoImage); } @Override protected void createContents() { createGrpDrugDetails(); createGrpBatchDetails(); enableFields(false); } /** * This method initializes grpDrugDetails * */ private void createGrpDrugDetails() { grpDrugDetails = new Group(getShell(), SWT.NONE); grpDrugDetails.setText("Drug Details"); grpDrugDetails.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); grpDrugDetails.setBounds(new Rectangle(75, 100, 450, 108)); Label lblDrugName = new Label(grpDrugDetails, SWT.NONE); lblDrugName.setBounds(new org.eclipse.swt.graphics.Rectangle(20, 25, 90, 20)); lblDrugName.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblDrugName.setText("Drug Name"); txtDrugName = new Text(grpDrugDetails, SWT.BORDER); txtDrugName.setBounds(new org.eclipse.swt.graphics.Rectangle(135, 25, 185, 20)); txtDrugName.setEditable(false); txtDrugName.setEnabled(false); txtDrugName.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); btnDrugSearch = new Button(grpDrugDetails, SWT.NONE); btnDrugSearch.setBounds(new org.eclipse.swt.graphics.Rectangle(340, 22, 100, 26)); btnDrugSearch.setText("Drug Search"); btnDrugSearch.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); btnDrugSearch .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { @Override public void widgetSelected( org.eclipse.swt.events.SelectionEvent e) { cmdSearchWidgetSelected(); } }); Label lblForm = new Label(grpDrugDetails, SWT.NONE); lblForm.setBounds(new Rectangle(20, 50, 90, 20)); lblForm.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblForm.setText("Form"); txtDescription = new Text(grpDrugDetails, SWT.BORDER); txtDescription.setBounds(new Rectangle(135, 50, 90, 20)); txtDescription.setEditable(false); txtDescription.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); Label lblPackSize = new Label(grpDrugDetails, SWT.NONE); lblPackSize.setBounds(new Rectangle(20, 75, 90, 20)); lblPackSize.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblPackSize.setText("Pack Size"); txtPackSize = new Text(grpDrugDetails, SWT.BORDER); txtPackSize.setBounds(new Rectangle(135, 75, 60, 20)); txtPackSize.setEditable(false); txtPackSize.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); } /** * This method initializes grpBatchDetails * */ private void createGrpBatchDetails() { grpBatchDetails = new Group(getShell(), SWT.NONE); grpBatchDetails.setText("Batch Details"); grpBatchDetails.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); grpBatchDetails.setBounds(new Rectangle(75, 226, 450, 280)); // Manufacturer Label lblManufacturer = new Label(grpBatchDetails, SWT.NONE); lblManufacturer.setBounds(new Rectangle(20, 30, 90, 20)); lblManufacturer.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblManufacturer.setText("Manufacturer"); txtManufacturer = new Text(grpBatchDetails, SWT.BORDER); txtManufacturer.setBounds(new Rectangle(135, 30, 185, 20)); txtManufacturer.setEditable(true); txtManufacturer.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); txtManufacturer.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); // Batch number Label lblBatchNumber = new Label(grpBatchDetails, SWT.NONE); lblBatchNumber.setBounds(new Rectangle(20, 60, 100, 20)); lblBatchNumber.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblBatchNumber.setText("Batch Number"); txtBatchNumber = new Text(grpBatchDetails, SWT.BORDER); txtBatchNumber.setBounds(new Rectangle(135, 59, 90, 20)); txtBatchNumber.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); txtBatchNumber.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); Label lblExpiryDate = new Label(grpBatchDetails, SWT.NONE); lblExpiryDate.setBounds(new Rectangle(20, 90, 90, 20)); lblExpiryDate.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblExpiryDate.setText("*Expiry Date"); cmbExpiryMonth = new Combo(grpBatchDetails, SWT.BORDER); cmbExpiryMonth.setBounds(new Rectangle(135, 85, 106, 13)); cmbExpiryMonth.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); cmbExpiryMonth.setVisibleItemCount(13); cmbExpiryMonth.setBackground(ResourceUtils.getColor(iDartColor.WHITE)); cmbExpiryMonth.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { String theText = cmbExpiryMonth.getText(); if (theText.length() > 2) { String s = theText.substring(0, 1); String t = theText.substring(1, theText.length()); theText = s.toUpperCase() + t; String[] items = cmbExpiryMonth.getItems(); for (int i = 0; i < items.length; i++) { if (items[i].substring(0, 3).equalsIgnoreCase(theText)) { cmbExpiryMonth.setText(items[i]); cmbExpiryYear.setFocus(); } } } if (e.character == SWT.CR) { btnSave.setFocus(); } } }); String months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; for (int i = 0; i < 12; i++) { cmbExpiryMonth.add(months[i]); } cmbExpiryYear = new Combo(grpBatchDetails, SWT.BORDER); cmbExpiryYear.setBounds(new Rectangle(255, 85, 65, 20)); cmbExpiryYear.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); cmbExpiryYear.setVisibleItemCount(10); // get the current date Calendar rightNow = Calendar.getInstance(); final int currentYear = rightNow.get(Calendar.YEAR); cmbExpiryYear.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { String theText = cmbExpiryYear.getText(); if ((cmbExpiryYear.indexOf(theText) == -1) && (theText.length() >= 4)) { cmbExpiryYear.setText(String.valueOf(currentYear)); } } }); for (int i = 0; i < 50; i++) { cmbExpiryYear.add(Integer.toString(currentYear - 1 + i)); } cmbExpiryYear.setBackground(ResourceUtils.getColor(iDartColor.WHITE)); cmbExpiryYear.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); cmbExpiryYear.setVisibleItemCount(15); // Units Received Label lblUnitsReceived = new Label(grpBatchDetails, SWT.NONE); lblUnitsReceived.setBounds(new Rectangle(20, 120, 100, 20)); lblUnitsReceived.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblUnitsReceived.setText("*Units Received"); txtUnitsReceived = new Text(grpBatchDetails, SWT.BORDER); txtUnitsReceived.setBounds(new Rectangle(135, 119, 90, 20)); txtUnitsReceived.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); // put enter shortcut here txtUnitsReceived.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); // Shelf Number Label lblShelfNo = new Label(grpBatchDetails, SWT.NONE); lblShelfNo.setBounds(new Rectangle(20, 150, 90, 20)); lblShelfNo.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblShelfNo.setText("Shelf Number"); txtShelfNo = new Text(grpBatchDetails, SWT.BORDER); txtShelfNo.setBounds(new Rectangle(135, 149, 90, 20)); txtShelfNo.setText("0"); txtShelfNo.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); txtShelfNo.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); // Stock Center Label lblStockCenter = new Label(grpBatchDetails, SWT.NONE); lblStockCenter.setText("Pharmacy"); lblStockCenter.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblStockCenter.setBounds(new Rectangle(20, 180, 110, 20)); cmbStockCenter = new CCombo(grpBatchDetails, SWT.BORDER | SWT.READ_ONLY); cmbStockCenter.setBounds(new Rectangle(135, 175, 220, 20)); cmbStockCenter.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); cmbStockCenter.setBackground(ResourceUtils.getColor(iDartColor.WHITE)); CommonObjects.populateStockCenters(getHSession(), cmbStockCenter); cmbStockCenter.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); // Capture Date Label lblCaptureDate = new Label(grpBatchDetails, SWT.NONE); lblCaptureDate.setBounds(new Rectangle(20, 210, 84, 20)); lblCaptureDate.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblCaptureDate.setText("Arrival Date"); btnArrivalDatePicker = new DateButton(grpBatchDetails, DateButton.ZERO_TIMESTAMP, null); btnArrivalDatePicker.setFont(ResourceUtils .getFont(iDartFont.VERASANS_8)); btnArrivalDatePicker.setBounds(new Rectangle(135, 208, 210, 26)); btnArrivalDatePicker.setDate(new Date()); // Unit Price Label lblUnitPrice = new Label(grpBatchDetails, SWT.NONE); lblUnitPrice.setBounds(new Rectangle(20, 242, 84, 20)); lblUnitPrice.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblUnitPrice.setText("Price Per Unit"); Label lblCurrency = new Label(grpBatchDetails, SWT.RIGHT); lblCurrency.setBounds(new Rectangle(110, 242, 23, 20)); lblCurrency.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); lblCurrency.setText(Currency.getInstance(iDartProperties.currentLocale) .getSymbol()); txtUnitPrice = new Text(grpBatchDetails, SWT.BORDER); txtUnitPrice.setBounds(new Rectangle(135, 239, 90, 20)); txtUnitPrice.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); txtUnitPrice.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == SWT.CR) { btnSave.setFocus(); } } }); } /** * This method initializes compButtons * */ @Override protected void createCompButtons() { buildCompButtons(); btnSave.setText("Add This Drug"); btnSave.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8)); } /** * This method loads information of the drug * (stoResourceUtils.getColor(iDartColor.RED) in the global 'theDrug' * variable) * * @param drugName * String */ private void loadDrugDetails(String drugName) { // Load the item theDrug = DrugManager.getDrug(getHSession(), drugName); if (theDrug == null) { MessageBox feedback = new MessageBox(getShell(), SWT.OK); feedback .setMessage("Drug '" .concat(drugName) .concat( "' was not found in the database. Please add this drug to the database, using the 'General Admin' page.")); feedback.setText("Drug Not Found"); feedback.open(); } else { txtDrugName.setText(theDrug.getName()); txtDescription.setText(theDrug.getForm().getForm()); txtPackSize.setText(String.valueOf(theDrug.getPackSize())); txtUnitPrice.setText(getPreviousUnitPrice(theDrug)); enableFields(true); String manu = getPreviousManufacturer(theDrug); if (manu == null) { txtManufacturer.setFocus(); } else { txtBatchNumber.setFocus(); txtManufacturer.setText(manu); } } } /** * This method looks for a previously entered unit price. It does this by * first looking in the current table and then by searching the database * * @param drug * @return */ private String getPreviousUnitPrice(Drug drug) { BigDecimal unitPrice = null; // first, check any unsaved stock batches the user has just added for (Stock s : parentStockScreen.getStockBatches()) { if ((s.getDrug().getId() == drug.getId()) && s.getStockCenter().getStockCenterName() .equalsIgnoreCase(cmbStockCenter.getText()) && (s.getUnitPrice() != null)) { unitPrice = s.getUnitPrice(); } } // if not found, check the database if (unitPrice == null) { unitPrice = StockManager.getLastUnitPriceForDrug(getHSession(), drug, cmbStockCenter.getText()); } String unitPriceStr = ""; if (unitPrice != null) { try { NumberFormat currencyNumberFormatter = NumberFormat .getNumberInstance(iDartProperties.currentLocale); unitPriceStr = currencyNumberFormatter.format(unitPrice); } catch (NumberFormatException ne) { getLog().warn( "Autocomplete unit price found but could not format", ne); unitPriceStr = ""; } } return unitPriceStr; } /** * This method looks for a previously entered manufacturer. It does this by * first looking in the current table and then by searching the database * * @param drug * @return */ private String getPreviousManufacturer(Drug drug) { String manufacturer = ""; // first, check any unsaved stock batches the user has just added for (Stock s : parentStockScreen.getStockBatches()) { if ((s.getDrug().getId() == drug.getId()) && s.getStockCenter().getStockCenterName() .equalsIgnoreCase(cmbStockCenter.getText()) && (s.getManufacturer() != null) || "".equalsIgnoreCase(s.getManufacturer())) { manufacturer = s.getManufacturer(); } } // if not found, check the database if ("".equals(manufacturer)) { manufacturer = DrugManager.getLatestDrugManufacturer(getHSession(), drug.getName(), cmbStockCenter.getText()); } return manufacturer; } /** * Check if the form is completed before proceeding * * @return true if all fields are correctly filled in */ @Override protected boolean fieldsOk() { boolean result = true; if (txtDrugName.getText().equals("")) { MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_WARNING); m .setMessage("Please load a drug by either searching for the drug (using the 'Drug Search' button), or \nby entering a valid drug barcode into the space provided (followed by 'Enter')."); m.setText("Missing Information"); m.open(); txtDrugName.setFocus(); result = false; } else if (cmbExpiryMonth.getText().equals("")) { MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_WARNING); m.setMessage("Please enter an expiry month."); m.setText("Missing Information"); m.open(); cmbExpiryMonth.setFocus(); result = false; } else if (cmbExpiryYear.getText().equals("")) { MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_WARNING); m.setMessage("Please enter an expiry year."); m.setText("Missing Information"); m.open(); cmbExpiryYear.setFocus(); result = false; } else if (txtUnitsReceived.getText().equals("")) { MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_WARNING); m.setMessage("Please enter number of units."); m.setText("Missing Information"); m.open(); txtUnitsReceived.setFocus(); result = false; } else if (!InputVerificationUtils .checkPositiveIntegerValue(txtUnitsReceived)) { MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_WARNING); m .setMessage("The number of units needs to be a positive whole number (e.g. '1000')."); m.setText("Incorrect Information"); m.open(); txtUnitsReceived.setText(""); txtUnitsReceived.setFocus(); result = false; } else if ((!txtUnitPrice.getText().trim().equals("")) && (!InputVerificationUtils .checkPositiveNumericValue(txtUnitPrice))) { MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_WARNING); m .setMessage("The unit price needs to be a positive number (e.g. '2.50'). Or, if you do not wish to store the unit price, you can leave this box empty."); m.setText("Incorrect Information"); m.open(); txtUnitPrice.setText(""); txtUnitPrice.setFocus(); result = false; } else { result = checkExpiryDate(); } return result; } /** * This method is invoked when user presses cancel button It closes the * newPatientAdmin */ @Override protected void cmdCancelWidgetSelected() { tableItem.dispose(); fireChangeEvent("Cancel"); closeShell(false); } @Override protected void cmdClearWidgetSelected() { clearForm(); } /** * Clears the patientForm and sets the default values */ @Override public void clearForm() { // txtBarcode.setText(""); txtDrugName.setText(""); txtManufacturer.setText(""); txtDescription.setText(""); txtPackSize.setText(""); txtBatchNumber.setText(""); cmbExpiryMonth.setText(""); cmbExpiryYear.setText(""); txtUnitsReceived.setText(""); txtShelfNo.setText(""); txtUnitPrice.setText(""); enableFields(false); btnDrugSearch.setEnabled(true); btnArrivalDatePicker.setDate(new Date()); } /* * This method called a "Search" GUI. Upon successful selection from the * user, the PackageManager loads the selected patient's information */ private void cmdSearchWidgetSelected() { Search drugSearch = new Search(getHSession(), getShell(), CommonObjects.DRUG); if (drugSearch.getValueSelected() != null) { btnDrugSearch.setEnabled(false); String manu = getPreviousManufacturer(DrugManager.getDrug( getHSession(), drugSearch.getValueSelected()[0])); if (manu == null) { txtManufacturer.setFocus(); } else { txtManufacturer.setText(manu); txtBatchNumber.setFocus(); } txtUnitPrice.setText(getPreviousUnitPrice(DrugManager.getDrug( getHSession(), drugSearch.getValueSelected()[0]))); loadDrugDetails(drugSearch.getValueSelected()[0]); } } /** * Method enableFields. * * @param enable * boolean */ @Override protected void enableFields(boolean enable) { txtDescription.setEnabled(enable); txtPackSize.setEnabled(enable); txtManufacturer.setEnabled(enable); txtBatchNumber.setEnabled(enable); cmbExpiryMonth.setEnabled(enable); cmbExpiryYear.setEnabled(enable); txtUnitsReceived.setEnabled(enable); txtShelfNo.setEnabled(enable); txtUnitPrice.setEnabled(enable); cmbStockCenter.setBackground(ResourceUtils.getColor(iDartColor.WHITE)); cmbStockCenter.setEnabled(enable); btnArrivalDatePicker.setEnabled(enable); cmbExpiryMonth.setBackground(enable ? ResourceUtils .getColor(iDartColor.WHITE) : ResourceUtils .getColor(iDartColor.GRAY)); cmbExpiryYear.setBackground(enable ? ResourceUtils .getColor(iDartColor.WHITE) : ResourceUtils .getColor(iDartColor.GRAY)); cmbStockCenter.setBackground(enable ? ResourceUtils .getColor(iDartColor.WHITE) : ResourceUtils .getColor(iDartColor.GRAY)); btnSave.setEnabled(enable); } /** * @param tableItem * The tableItem to set. */ public void setTableItem(TableItem tableItem) { this.tableItem = tableItem; } /** * Method checkExpiryDate. * * @return boolean */ private boolean checkExpiryDate() { boolean expiryDateOkay = false; boolean match = false; // checks that data is entered correctly for (int i = 0; i < cmbExpiryMonth.getItemCount(); i++) { if (cmbExpiryMonth.getText().equals(cmbExpiryMonth.getItem(i))) { match = true; } } if (!match) { MessageBox feedback = new MessageBox(getShell(), SWT.OK); feedback.setMessage("Expiry Date is invalid."); feedback.setText("Invalid Expiry Date"); feedback.open(); expiryDateOkay = false; return expiryDateOkay; } else { Calendar expiryDate = Calendar.getInstance(); try { expiryDate.setTime(new SimpleDateFormat("dd MMMM yyyy") .parse("01 " + cmbExpiryMonth.getText() + " " + cmbExpiryYear.getText())); Calendar today = Calendar.getInstance(); today.setTime(new Date()); Calendar sixMonthsFromNow = Calendar.getInstance(); sixMonthsFromNow.setTime(new Date()); sixMonthsFromNow.add(Calendar.MONTH, 6); if (expiryDate.before(today)) { MessageBox m = new MessageBox(getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO); m.setText("Stock Has Already Expired"); m .setMessage("This stock has already expired. Are you sure you want to add this stock to the system?"); switch (m.open()) { case SWT.YES: expiryDateOkay = true; break; case SWT.NO: expiryDateOkay = false; cmbExpiryMonth.setFocus(); break; } } else if (expiryDate.before(sixMonthsFromNow)) { MessageBox m = new MessageBox(getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO); m.setText("Stock Will Expire Soon"); m .setMessage("This stock will expire within the next 6 months. Are you sure you want to add this stock to the system?"); switch (m.open()) { case SWT.YES: expiryDateOkay = true; break; case SWT.NO: expiryDateOkay = false; cmbExpiryMonth.setFocus(); break; } } else { expiryDateOkay = true; } } catch (ParseException p) { getLog().error("Expiry date did not parse.", p); MessageBox feedback = new MessageBox(getShell(), SWT.OK); feedback.setMessage("Expiry Date is invalid."); feedback.setText("Invalid Expiry Date"); feedback.open(); expiryDateOkay = false; } return expiryDateOkay; } } @Override protected void cmdSaveWidgetSelected() { if (fieldsOk()) { if (submitForm()) { closeShell(false); } else { MessageBox m = new MessageBox(getShell(), SWT.ICON_ERROR | SWT.OK); m.setText("Error recording stock arrival"); m.setMessage("Could not save stock batch. Please try again."); clearForm(); } } } /** * Method submitForm. * * @return boolean */ @Override protected boolean submitForm() { // create the table item Stock newStock = new Stock(); tableItem.setData(newStock); newStock.setDrug(DrugManager.getDrug(getHSession(), txtDrugName .getText())); tableItem.setText(1, newStock.getDrug().getName()); tableItem.setText(2, txtPackSize.getText()); tableItem.setText(3, txtDescription.getText()); newStock.setUnitsReceived(Integer.parseInt(txtUnitsReceived.getText())); tableItem.setText(4, newStock.getUnitsReceived() + ""); newStock.setStockCenter(AdministrationManager.getStockCenter( getHSession(), cmbStockCenter.getText())); tableItem.setText(5, newStock.getStockCenter().getStockCenterName()); newStock.setManufacturer(txtManufacturer.getText()); tableItem.setText(6, newStock.getManufacturer()); newStock.setBatchNumber(txtBatchNumber.getText()); tableItem.setText(7, newStock.getBatchNumber()); Date arrivalDate = btnArrivalDatePicker.getDate(); newStock .setDateReceived(arrivalDate == null ? new Date() : arrivalDate); try { newStock.setExpiryDate(new SimpleDateFormat("dd MMMM yyyy") .parse("01 " + cmbExpiryMonth.getText() + " " + cmbExpiryYear.getText())); tableItem.setText(8, new SimpleDateFormat("MMMM yyyy") .format(newStock.getExpiryDate())); } catch (ParseException p) { getLog().warn("Parse Exception setting stock expiry date.", p); return false; } newStock.setShelfNumber(txtShelfNo.getText()); tableItem.setText(9, newStock.getShelfNumber()); newStock.setModified('T'); newStock.setHasUnitsRemaining('T'); try { Double unitPrice = Double.parseDouble(txtUnitPrice.getText()); newStock.setUnitPrice(new BigDecimal(unitPrice.doubleValue())); NumberFormat currencyFormatter = NumberFormat .getCurrencyInstance(iDartProperties.currentLocale); tableItem.setText(10, currencyFormatter.format(unitPrice)); } catch (NumberFormatException ne) { getLog().debug("unit price is null"); tableItem.setText(10, ""); newStock.setUnitPrice(null); } return true; } /** * Method addChangeListener. * * @param listener * iDARTChangeListener */ public void addChangeListener(iDARTChangeListener listener) { this.changeListener = listener; } /** * Method fireChangeEvent. * * @param o * Object */ private void fireChangeEvent(Object o) { if (changeListener != null) { changeListener.changed(o); } } @Override protected void setLogger() { setLog(Logger.getLogger(this.getClass())); } }