/*
* 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.packaging;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import model.manager.AdherenceManager;
import model.manager.AdministrationManager;
import model.manager.DrugManager;
import model.manager.PackageManager;
import model.manager.PatientManager;
import model.manager.reports.PackageProcessingReport;
import model.manager.reports.PatientHistoryReport;
import org.apache.log4j.Logger;
import org.celllife.function.DateRuleFactory;
import org.celllife.function.IRule;
import org.celllife.idart.commonobjects.CommonObjects;
import org.celllife.idart.commonobjects.iDartProperties;
import org.celllife.idart.database.hibernate.AccumulatedDrugs;
import org.celllife.idart.database.hibernate.Clinic;
import org.celllife.idart.database.hibernate.Drug;
import org.celllife.idart.database.hibernate.Episode;
import org.celllife.idart.database.hibernate.PackagedDrugs;
import org.celllife.idart.database.hibernate.Packages;
import org.celllife.idart.database.hibernate.Patient;
import org.celllife.idart.database.hibernate.PatientAttribute;
import org.celllife.idart.database.hibernate.PillCount;
import org.celllife.idart.database.hibernate.util.HibernateUtil;
import org.celllife.idart.events.AdherenceEvent;
import org.celllife.idart.events.PackageEvent;
import org.celllife.idart.gui.misc.iDARTChangeListener;
import org.celllife.idart.gui.platform.GenericFormGui;
import org.celllife.idart.gui.reportParameters.PatientHistory;
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.celllife.idart.gui.widget.DateChangedEvent;
import org.celllife.idart.gui.widget.DateChangedListener;
import org.celllife.idart.gui.widget.DateInputValidator;
import org.celllife.idart.misc.DateFieldComparator;
import org.celllife.idart.misc.PatientBarcodeParser;
import org.celllife.idart.misc.iDARTUtil;
import org.celllife.idart.model.utils.PackageLifeStage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import com.adamtaft.eb.EventBusService;
/**
* @author Sarah
*
* Created on Jul 27, 2005
*
*/
public class PackagesToPatients extends GenericFormGui implements
iDARTChangeListener {
private Group grpClinicSelection;
private Group grpPackageLists;
private Group grpScanPackageId;
private Group grpLastPackageInfo;
private Group grpPatientDetails;
private Group grpThisPackageInfo;
private Group grpNextAppointment;
private Label lblInstructions;
private Label lblClinic;
private Label lblFolderNo;
private Label lblName;
private Label lblDOB;
private Label lblAge;
private Label lblLastPackageDate;
private Label lblDaysSinceLastPickup;
private Text searchBar;
private Text txtFolderNo;
private Text txtName;
private Text txtDOB;
private Text txtAge;
private Text txtLastPackageDate;
private Label lblContentsDaysSinceLastPickup;
private CCombo cmbClinic;
private DateButton btnCaptureDate;
private Button btnPatientHistoryReport;
private Button btnPackagesReport;
private DateButton btnCollectionDateForNextPackage;
private Label lblAwaiting;
private List lstAwaiting;
private java.util.List<Packages> packageList;
private Text txtPackageIdScan;
private Label lblScanned;
private List lstScanned;
private Table tblThisPackage;
private Table tblLastPackage;
private SimpleDateFormat dateFormatter;
private TableEditor editorTblLastPackage;
private TableEditor editorTblThisPackage;
private Packages previousPack;
private int index = -1;
private boolean packageLoaded;
private Packages scannedPack;
private boolean isAtRemoteClinic;
private String appointmentErrorMsg = "";
/**
* Constructor
*
* @param parent
* Shell
*/
public PackagesToPatients(Shell parent) {
super(parent, HibernateUtil.getNewSession());
}
/**
* This method initializes getShell()
*/
@Override
protected void createShell() {
dateFormatter = new SimpleDateFormat("dd MMM yyyy");
String shellTxt = "Scan Out Packages To Patients";
Rectangle bounds = new Rectangle(25, 0, 900, 700);
buildShell(shellTxt, bounds);
createClinicSelection();
createGrpPackageLists();
createGrpLastPackageInfo();
createGrpPatientDetails();
createGrpThisPackageInfo();
createGrpNextAppointment();
createGrpScanPackageId();
txtPackageIdScan.setFocus();
}
/**
* This method initializes compHeader
*/
@Override
protected void createCompHeader() {
String txt = "Scan Out Packages To Patients";
iDartImage icoImage = iDartImage.PATIENTARRIVES;
buildCompHeader(txt, icoImage);
}
/**
* This method initializes compClinicSelection
*/
private void createClinicSelection() {
isAtRemoteClinic = (Boolean) getInitialisationOption("isAtRemoteClinic");
grpClinicSelection = new Group(getShell(), SWT.NONE);
grpClinicSelection.setBounds(new Rectangle(160, 62, 579, 80));
if (iDartProperties.downReferralMode
.equalsIgnoreCase(iDartProperties.ONLINE_DOWNREFERRAL_MODE)
&& !isAtRemoteClinic) {
lblInstructions = new Label(grpClinicSelection, SWT.CENTER
| SWT.WRAP);
lblInstructions
.setText("Use this screen for recording packages which are collected by patients at the Main Clinic. If the patient is collecting their drugs at a down referral clinic, you will need to log out of iDART, and log in to the down referral clinic. ");
lblInstructions.setBounds(new Rectangle(2, 5, 575, 30));
lblInstructions.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8_ITALIC));
}
lblClinic = new Label(grpClinicSelection, SWT.NONE);
lblClinic.setBounds(new Rectangle(90, 45, 90, 20));
lblClinic.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblClinic.setText("Collections at ");
cmbClinic = new CCombo(grpClinicSelection, SWT.BORDER);
cmbClinic.setBounds(new Rectangle(185, 45, 180, 20));
cmbClinic.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
cmbClinic.setEditable(false);
cmbClinic.setBackground(ResourceUtils.getColor(iDartColor.WHITE));
cmbClinic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
cmbClinicWidgetSelected();
}
});
if (iDartProperties.downReferralMode
.equalsIgnoreCase(iDartProperties.OFFLINE_DOWNREFERRAL_MODE)) {
CommonObjects.populateClinics(getHSession(), cmbClinic, true);
} else {
CommonObjects.populateClinics(getHSession(), cmbClinic,
!isAtRemoteClinic);
if (!isAtRemoteClinic) {
cmbClinic.setEnabled(false);
}
}
if (cmbClinic.getEnabled()) {
cmbClinic.setFocus();
}
lblClinic = new Label(grpClinicSelection, SWT.NONE);
lblClinic.setBounds(new Rectangle(375, 45, 20, 20));
lblClinic.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblClinic.setText(" on ");
btnCaptureDate = new DateButton(
grpClinicSelection,
DateButton.NONE,
new DateInputValidator(DateRuleFactory.beforeNowInclusive(true)));
btnCaptureDate.setDate(new Date());
btnCaptureDate.setBounds(new Rectangle(400, 40, 100, 28));
btnCaptureDate.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
btnCaptureDate.setText(dateFormatter.format(btnCaptureDate.getDate()));
btnCaptureDate.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setDateExpectedFields();
}
});
btnCaptureDate.addDateChangedListener(new DateChangedListener() {
@Override
public void dateChanged(DateChangedEvent event) {
fireChangeEvent();
}
});
}
/**
* This method initializes grpPackageLists
*/
private void createGrpPackageLists() {
grpPackageLists = new Group(getShell(), SWT.NONE);
grpPackageLists.setText("Package Details");
grpPackageLists.setBounds(new Rectangle(20, 141, 860, 475));
grpPackageLists.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblAwaiting = new Label(grpPackageLists, SWT.CENTER | SWT.BORDER
| SWT.V_SCROLL);
lblAwaiting.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
if (iDartProperties.downReferralMode
.equalsIgnoreCase(iDartProperties.OFFLINE_DOWNREFERRAL_MODE)) {
lblAwaiting.setText("Packages Awaiting Collection");
} else {
lblAwaiting.setText("Packages Awaiting Dispatch");
}
lblAwaiting.setBounds(new Rectangle(10, 23, 180, 20));
lstAwaiting = new List(grpPackageLists, SWT.BORDER | SWT.V_SCROLL);
lstAwaiting.setBounds(new Rectangle(10, 63, 180, 406));
// lstAwaiting.isFocusControl();
searchBar = new Text(grpPackageLists, SWT.BORDER);
searchBar.setText("patient search");
searchBar.setBounds(new Rectangle(10, 43, 180, 20));
searchBar.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
searchBar.setFocus();
searchBar.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if (e.character == SWT.CR) {
searchBarEnter();
}
}
});
addSearchBarFocusListener();
updatePackagesAwaitingDispatchListForClinic(cmbClinic.getText());
addSearchBarKeyListener();
lblScanned = new Label(grpPackageLists, SWT.BORDER | SWT.CENTER);
lblScanned.setBounds(new Rectangle(670, 23, 180, 20));
lblScanned.setText("Scanned Packages");
lblScanned.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lstScanned = new List(grpPackageLists, SWT.BORDER | SWT.V_SCROLL);
lstScanned.setBounds(new Rectangle(670, 43, 180, 426));
}
/**
* This method initializes grpScanPackageId
*/
private void createGrpScanPackageId() {
grpScanPackageId = new Group(grpPackageLists, SWT.NONE);
grpScanPackageId.setBounds(new Rectangle(200, 16, 180, 42));
grpScanPackageId.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
grpScanPackageId.setText("1. Scan Package ID");
txtPackageIdScan = new Text(grpScanPackageId, SWT.BORDER);
txtPackageIdScan.setBounds(new Rectangle(5, 15, 170, 20));
txtPackageIdScan.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
/*
* txtPackageIdScan.addKeyListener(new KeyAdapter() {
*
* @Override public void keyPressed(KeyEvent evt) { if (evt.character ==
* SWT.CR) { cmdEnterPressed(); } } });
*/
txtPackageIdScan.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if (e.character == SWT.CR) {
cmdEnterPressed();
}
}
});
txtPackageIdScan.setEnabled(true);
txtPackageIdScan.selectAll();
}
/**
* This method initializes grpScanPackageId
*/
private void createGrpPatientDetails() {
grpPatientDetails = new Group(grpPackageLists, SWT.NONE);
grpPatientDetails.setBounds(200, 146, 460, 97); // must end at 637
grpPatientDetails.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
grpPatientDetails.setText("Patient Details");
lblFolderNo = new Label(grpPatientDetails, SWT.NONE);
lblFolderNo.setBounds(new Rectangle(15, 13, 72, 18));
lblFolderNo.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblFolderNo.setText("Folder No:");
txtFolderNo = new Text(grpPatientDetails, SWT.BORDER);
txtFolderNo.setBounds(new Rectangle(15, 31, 105, 20));
txtFolderNo.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
txtFolderNo.setEnabled(false);
txtFolderNo.setEditable(false);
lblName = new Label(grpPatientDetails, SWT.NONE);
lblName.setBounds(new Rectangle(132, 13, 72, 18));
lblName.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblName.setText("Name:");
txtName = new Text(grpPatientDetails, SWT.BORDER);
txtName.setBounds(new Rectangle(130, 31, 205, 20));
txtName.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
txtName.setEnabled(false);
txtName.setEditable(false);
lblDOB = new Label(grpPatientDetails, SWT.NONE);
lblDOB.setBounds(new Rectangle(342, 13, 72, 18));
lblDOB.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblDOB.setText("Date of Birth:");
txtDOB = new Text(grpPatientDetails, SWT.BORDER);
txtDOB.setBounds(new Rectangle(342, 31, 105, 20));
txtDOB.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
txtDOB.setEnabled(false);
txtDOB.setEditable(false);
lblAge = new Label(grpPatientDetails, SWT.NONE);
lblAge.setBounds(new Rectangle(15, 53, 72, 15));
lblAge.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblAge.setText("Age:");
txtAge = new Text(grpPatientDetails, SWT.BORDER);
txtAge.setBounds(new Rectangle(15, 70, 105, 20));
txtAge.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
txtAge.setEnabled(false);
txtAge.setEditable(false);
lblLastPackageDate = new Label(grpPatientDetails, SWT.NONE);
lblLastPackageDate.setBounds(new Rectangle(130, 53, 78, 15));
lblLastPackageDate.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
lblLastPackageDate.setText("Last Pickup:");
txtLastPackageDate = new Text(grpPatientDetails, SWT.BORDER);
txtLastPackageDate.setBounds(new Rectangle(130, 70, 155, 20));
txtLastPackageDate.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
txtLastPackageDate.setEnabled(false);
txtLastPackageDate.setEditable(false);
lblDaysSinceLastPickup = new Label(grpPatientDetails, SWT.RIGHT);
lblDaysSinceLastPickup.setBounds(new Rectangle(230, 52, 122, 15));
lblDaysSinceLastPickup.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8_ITALIC));
lblDaysSinceLastPickup.setText("days ago:");
lblContentsDaysSinceLastPickup = new Label(grpPatientDetails,
SWT.BORDER);
lblContentsDaysSinceLastPickup
.setBounds(new Rectangle(292, 70, 155, 20));
lblContentsDaysSinceLastPickup.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8));
}
/**
* This method initializes grpScanPackageId
*/
private void createGrpLastPackageInfo() {
grpLastPackageInfo = new Group(grpPackageLists, SWT.NONE);
grpLastPackageInfo.setBounds(new Rectangle(410, 16, 250, 130));
grpLastPackageInfo.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
grpLastPackageInfo.setText("2. Returned from Last Package");
tblLastPackage = new Table(grpLastPackageInfo, SWT.FULL_SELECTION
| SWT.BORDER);
tblLastPackage.setHeaderVisible(true);
tblLastPackage.setLinesVisible(true);
tblLastPackage.setBounds(5, 20, 240, 100);
tblLastPackage.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
TableColumn clmDrugName = new TableColumn(tblLastPackage, SWT.NONE);
clmDrugName.setText("Drug Name");
clmDrugName
.setWidth(((tblLastPackage.getBounds().width - 20) * 65 / 100) - 10);
clmDrugName.setResizable(true);
TableColumn clmInHand = new TableColumn(tblLastPackage, SWT.NONE);
clmInHand.setText("Accum");
clmInHand
.setWidth(((tblLastPackage.getBounds().width - 20) * 20 / 100) + 5);
clmInHand.setResizable(true);
TableColumn clmPercent = new TableColumn(tblLastPackage, SWT.NONE);
clmPercent.setText("%");
clmPercent.setWidth((tblLastPackage.getBounds().width - 20) * 15 / 100);
clmPercent.setResizable(true);
attachLastPackageTableEditor();
}
/**
* This method initializes grpScanPackageId
*/
private void createGrpThisPackageInfo() {
grpThisPackageInfo = new Group(grpPackageLists, SWT.NONE);
grpThisPackageInfo.setBounds(new Rectangle(200, 251, 460, 140));
grpThisPackageInfo.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
grpThisPackageInfo.setText("3. Drugs In This Package");
tblThisPackage = new Table(grpThisPackageInfo, SWT.FULL_SELECTION
| SWT.BORDER);
tblThisPackage.setBounds(new Rectangle(10, 20, 440, 110));
tblThisPackage.setHeaderVisible(true);
tblThisPackage.setLinesVisible(true);
tblThisPackage.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
TableColumn clmName = new TableColumn(tblThisPackage, SWT.NONE);
clmName.setText("Drug Name");
clmName.setWidth(160);
clmName.setResizable(true);
TableColumn clmQuantity = new TableColumn(tblThisPackage, SWT.NONE);
clmQuantity.setText("Qty Disp");
clmQuantity.setWidth(80);
clmQuantity.setResizable(true);
TableColumn clmAccum = new TableColumn(tblThisPackage, SWT.NONE);
clmAccum.setText("Qty Accum");
clmAccum.setWidth(80);
clmAccum.setResizable(true);
TableColumn clmInHand = new TableColumn(tblThisPackage, SWT.NONE);
clmInHand.setText("In Hand on Exit");
clmInHand.setWidth(120);
clmInHand.setResizable(true);
attachThisPackageTableEditor();
}
private void attachThisPackageTableEditor() {
// add a editor for the labels and inHand columns, otherwise open
// batchinformation when col clicked
editorTblThisPackage = new TableEditor(tblThisPackage);
editorTblThisPackage.horizontalAlignment = SWT.LEFT;
editorTblThisPackage.grabHorizontal = true;
tblThisPackage.addMouseListener(new MouseAdapter() {
@SuppressWarnings("unchecked")
@Override
public void mouseDown(MouseEvent event) {
// Dispose any existing editor
Control old = editorTblThisPackage.getEditor();
if (old != null) {
old.dispose();
}
// Determine where the mouse was clicked
Point pt = new Point(event.x, event.y);
// Determine which row was selected
final TableItem item = tblThisPackage.getItem(pt);
if (item != null) {
// Determine which column was selected
int column = -1;
for (int i = 0, n = tblThisPackage.getColumnCount(); i < n; i++) {
Rectangle rect = item.getBounds(i);
if (rect.contains(pt)) {
// This is the selected column
column = i;
break;
}
}
if (column == 2) {
// Create the combo box for the in hand column
final CCombo combo = new CCombo(tblThisPackage,
SWT.NONE);
combo.setForeground(item.getForeground());
combo.setBackground(ResourceUtils
.getColor(iDartColor.GRAY));
combo.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8));
combo.setText(item.getText(column));
combo.setForeground(item.getForeground());
combo.setFocus();
combo.setEditable(false);
editorTblThisPackage.minimumWidth = combo.getBounds().width;
// Set the control into the editor
editorTblThisPackage.setEditor(combo, item, column);
final int col = column;
String[] possibleValues = getPossibleAccumValues((java.util.List<PackagedDrugs>) item
.getData());
for (String s : possibleValues) {
combo.add(s);
}
combo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event1) {
item.setText(col, combo.getText());
try {
item
.setText(
3,
""
+ (Integer
.parseInt(item
.getText(1)) + Integer
.parseInt(item
.getText(2))));
} catch (NumberFormatException ne) {
item.setText(3, item.getText(1));
}
}
});
combo.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent event1) {
}
@Override
public void focusLost(FocusEvent event1) {
item.setText(col, combo.getText());
combo.dispose();
}
});
}
}
}
});
}
public void attachLastPackageTableEditor() { // add a editor for the
// accum column
// add a editor for the accum column
editorTblLastPackage = new TableEditor(tblLastPackage);
editorTblLastPackage.horizontalAlignment = SWT.LEFT;
editorTblLastPackage.grabHorizontal = true;
tblLastPackage.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent event) {
// Dispose any existing editor
Control old = editorTblLastPackage.getEditor();
if (old != null) {
old.dispose();
}
// Determine where the mouse was clicked
Point pt = new Point(event.x, event.y);
// Determine which row was selected
final TableItem item = tblLastPackage.getItem(pt);
if (item != null) {
// Determine which column was selected
int column = -1;
for (int i = 0, n = tblLastPackage.getColumnCount(); i < n; i++) {
Rectangle rect = item.getBounds(i);
if (rect.contains(pt)) {
// This is the selected column
column = i;
break;
}
}
if ((column == 1) && (item.getData() != null)) {
// Create the Text object for our editor
final Text text = new Text(tblLastPackage, SWT.NONE);
text.setForeground(item.getForeground());
text.setBackground(ResourceUtils
.getColor(iDartColor.GRAY));
text.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8));
text.setText(item.getText(column));
text.setForeground(item.getForeground());
text.selectAll();
text.setFocus();
editorTblLastPackage.minimumWidth = text.getBounds().width;
// Set the control into the editor
editorTblLastPackage.setEditor(text, item, column);
final int col = column;
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event1) {
String oldValue = item.getText(col);
item.setText(col, text.getText());
// check user input
if ((!text.getText().trim().equals(""))
&& (!text.getText().trim().equals(
oldValue))) {
try {
int accum = Integer.parseInt(text
.getText());
int adherencePercent = AdherenceManager
.getAdherencePercent(
getHSession(), accum,
((PillCount) item
.getData()));
item.setText(col + 1, ""
+ adherencePercent);
if (adherencePercent >= 95) {
item
.setBackground(
col + 1,
ResourceUtils
.getColor(iDartColor.GREEN));
} else if (adherencePercent >= 90) {
item
.setBackground(
col + 1,
ResourceUtils
.getColor(iDartColor.YELLOW));
} else {
item
.setBackground(
col + 1,
ResourceUtils
.getColor(iDartColor.RED));
}
((PillCount) item.getData())
.setAccum(accum);
updateThisPackageAccumColumn((PillCount) item
.getData());
setInHandOnExit(((PillCount) item
.getData()));
} catch (NumberFormatException e) {
java.awt.Toolkit.getDefaultToolkit()
.beep();
text.setText("");
item.setText(col, "");
((PillCount) item.getData())
.setAccum(-1);
item
.setBackground(
col + 1,
ResourceUtils
.getColor(iDartColor.LIST_BACKGROUND));
}
} else if (!text.getText().trim().equals(
oldValue))
{
((PillCount) item.getData()).setAccum(-1);
}
}
});
text.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent event1) {
tblLastPackage.setSelection(tblLastPackage
.getItemCount());
text.dispose();
}
@Override
public void focusGained(FocusEvent event1) {
}
});
}
}
}
});
}
/**
* Update the accum column for the packageddrug in this package that has the
* same drug as the pillcount returned from the previous package
*
* @param pc
*/
@SuppressWarnings("unchecked")
private void updateThisPackageAccumColumn(PillCount pc) {
Drug theDrug = pc.getDrug();
for (int i = 0; i < tblThisPackage.getItemCount(); i++) {
if ((tblThisPackage.getItem(i).getData() != null)
&& (theDrug.getId() == ((java.util.List<PackagedDrugs>) tblThisPackage
.getItem(i).getData()).get(0).getStock().getDrug()
.getId())) {
try {
if (pc.getAccum() == -1) {
tblThisPackage.getItem(i).setText(2, "0");
} else {
if (iDartProperties.accumByDefault) {
tblThisPackage.getItem(i).setText(2,
"" + pc.getAccum());
} else {
tblThisPackage.getItem(i).setText(2, "0");
}
}
} catch (NumberFormatException e) {
getLog().error(
"NumberFormatException parsing qty to dispense");
tblThisPackage.getItem(i).setText(2, "0");
}
}
}
}
/**
* For this package drug, get the possible accum values (usually {0, qty
* accum from last package}, or {-} if this drug is side treatment or was
* not in the last package)
*
* @param pdList
* java.util.List<PackagedDrugs>
* @return String[]
*/
private String[] getPossibleAccumValues(java.util.List<PackagedDrugs> pdList) {
int disp = 0;
String[] returnString = new String[2];
for (TableItem ti : tblLastPackage.getItems()) {
if (ti.getData() != null) {
Drug lastPackDrug = ((PillCount) ti.getData()).getDrug();
if (lastPackDrug.equals(pdList.get(0).getStock().getDrug())) {
try {
int accum = Double.valueOf(ti.getText(1)).intValue();
if (accum != -1) {
returnString[0] = "" + (disp + accum);
returnString[1] = "0";
}
} catch (NumberFormatException e) {
getLog().error(
"qty to dispense entered is Not a number");
}
}
}
}
if (returnString[0] == null) {
returnString = new String[1];
returnString[0] = "-";
}
return returnString;
}
/**
* This method initializes grpScanPackageId
*/
private void createGrpNextAppointment() {
grpNextAppointment = new Group(grpPackageLists, SWT.NONE);
grpNextAppointment.setBounds(new Rectangle(200, 400, 273, 60));
grpNextAppointment.setFont(ResourceUtils.getFont(iDartFont.VERASANS_8));
String text = "4. Next Collection Date";
grpNextAppointment.setText(text);
// Construction of SWTCalenda
IRule<Date> rule = DateRuleFactory.afterInclusive(btnCaptureDate.getDate(), true);
String errorMessage = "Patient "+ txtFolderNo.getText() + " is collecting their current package on " +
btnCaptureDate.getText() + ".\n\nTheir next appointment date must be after this date.";
rule.setDescription(errorMessage);
DateInputValidator dateValidator = new DateInputValidator(rule);
btnCollectionDateForNextPackage = new DateButton(grpNextAppointment,
DateButton.ZERO_TIMESTAMP, dateValidator);
btnCollectionDateForNextPackage.setErrorMessageTitle("Invalid Appointment Date");
btnCollectionDateForNextPackage.setDate(new Date());
btnCollectionDateForNextPackage.setBounds(33, 20, 200, 30);
btnCollectionDateForNextPackage.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8));
btnCollectionDateForNextPackage.setVisible(false);
// lblPicPatientHistoryReport
btnPatientHistoryReport = new Button(grpPackageLists, SWT.NONE);
btnPatientHistoryReport.setBounds(new Rectangle(503, 415, 50, 43));
btnPatientHistoryReport
.setToolTipText("Press this button to view and / or print reports \nof patients' Prescription History.");
btnPatientHistoryReport.setImage(ResourceUtils
.getImage(iDartImage.REPORT_PATIENTHISTORY));
btnPatientHistoryReport.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent dc) {
}
@Override
public void mouseDown(MouseEvent md) {
}
@Override
public void mouseUp(MouseEvent mu) {
cmdPatientHistoryWidgetSelected();
}
});
// lblPicPackagesReport
btnPackagesReport = new Button(grpPackageLists, SWT.NONE);
btnPackagesReport.setBounds(new Rectangle(568, 415, 50, 43));
btnPackagesReport
.setToolTipText("Press this button to view and / or print Scanned Out Packages Report.");
btnPackagesReport.setImage(ResourceUtils.getImage(iDartImage.REPORTS));
btnPackagesReport.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent mu) {
cmdPackagesReportWidgetSelected();
}
});
}
/*
* Sets the in hand on exit column in a current package table
*
* theCurrentPackageTableToUpdate must have PackagedDrugs as the data of its
* TableItems
*
* @param accum @param pc
*/
/**
* Method setInHandOnExit.
*
* @param pc
* PillCount
*/
@SuppressWarnings("unchecked")
public void setInHandOnExit(PillCount pc) {
if (tblThisPackage != null) {
Drug theDrug = pc.getDrug();
for (int i = 0; i < tblThisPackage.getItemCount(); i++) {
TableItem ti = tblThisPackage.getItem(i);
if (theDrug.equals((((java.util.List<PackagedDrugs>) ti
.getData()).get(0)).getStock().getDrug())) {
try {
int qty = Integer.parseInt(tblThisPackage.getItem(i)
.getText(1));
if (pc.getAccum() == -1) {
tblThisPackage.getItem(i).setText(2, "");
tblThisPackage.getItem(i).setText(3, "" + qty);
} else {
if (iDartProperties.accumByDefault) {
tblThisPackage.getItem(i).setText(2,
"" + pc.getAccum());
tblThisPackage.getItem(i).setText(3,
"" + (pc.getAccum() + qty));
} else {
tblThisPackage.getItem(i).setText(2, "");
tblThisPackage.getItem(i).setText(3, "" + qty);
}
}
} catch (NumberFormatException e) {
getLog()
.error(
"NumberFormatException parsing qty to dispense");
tblThisPackage.getItem(i).setText(2, "");
}
}
}
}
}
/**
* This method initializes compButtons
*/
@Override
protected void createCompButtons() {
buildCompButtons();
btnSave.setEnabled(false);
}
/**
* This method is called when the user when anything is entered into the
* text field for the package id. If that key press is "Enter" and all error
* checks are passed, the package is updated in the database, and so are the
* 2 lists on the GUI
*
* This screen is for scanning packages to patients, so when the package is
* scanned, all dates are updated.
*
*/
private void cmdEnterPressed() {
try {
txtPackageIdScan.setText(txtPackageIdScan.getText().toUpperCase());
index = lstAwaiting.indexOf(txtPackageIdScan.getText());
if (index != -1) {
packageLoaded = true;
Runnable longJob = new Runnable() {
@Override
public void run() {
scannedPack = packageList.get(lstAwaiting
.indexOf(txtPackageIdScan.getText()
.toUpperCase()));
populatePatientDetails(scannedPack);
populateLastPackageDetails(scannedPack
.getPrescription().getPatient());
populateThisPackageDetails(scannedPack);
// enable the fields
enableFields(true);
SimpleDateFormat sdf = new SimpleDateFormat(
"dd MMM yyyy");
Date tmpBtnDate = null;
try {
tmpBtnDate = sdf.parse(btnCaptureDate.getText());
} catch (ParseException e) {
getLog().error("Problem parsing pack date", e);
}
if (tmpBtnDate != null) {
btnCaptureDate.setDate(tmpBtnDate);
} else {
btnCaptureDate.setDate(new Date());
}
setDateExpectedFields();
}
};
BusyIndicator.showWhile(getShell().getDisplay(), longJob);
txtPackageIdScan.setEnabled(false);
} else {
MessageBox m = new MessageBox(getShell(), SWT.OK
| SWT.ICON_ERROR);
m.setText("Package Not Found");
m
.setMessage("Package '"
+ txtPackageIdScan.getText()
+ "' was not found in the list of packages awaiting dispatch.");
m.open();
txtPackageIdScan.setFocus();
txtPackageIdScan.selectAll();
}
} catch (Exception e) {
getLog().error(
"Problem when setting dates after patient selection.", e);
}
}
/**
* This method is called when the user chooses a clinic from the drop down
* list. Doing this, updates the list of packages awaiting to be dispatched
* from the pharmacy.
*
*/
private void cmbClinicWidgetSelected() {
updatePackagesAwaitingDispatchListForClinic(cmbClinic.getText());
txtPackageIdScan.setEnabled(true);
txtPackageIdScan.setFocus();
}
/**
* Method populateTblLastPackage.
*
* @param previousPack
* Packages
*/
private void populateTblLastPackage() {
if (tblLastPackage != null) {
tblLastPackage.clearAll();
tblLastPackage.removeAll();
}
java.util.Set<PillCount> previousPackPillCounts = previousPack
.getPillCounts();
java.util.List<PackagedDrugs> packagedDrugsList = previousPack
.getPackagedDrugs();
Iterator<PackagedDrugs> packDrugIt = packagedDrugsList.iterator();
tblLastPackage.removeAll();
// keep track of all drugs already in the list
java.util.List<Drug> usedDrugs = new ArrayList<Drug>();
while (packDrugIt.hasNext()) {
PackagedDrugs pd = packDrugIt.next();
if (pd != null) {
Drug d = pd.getStock().getDrug();
if ((d.getSideTreatment() == 'F') && (!usedDrugs.contains(d))) {
TableItem ti = new TableItem(tblLastPackage, SWT.NONE);
if (tblLastPackage.getBounds().width < 300) {
ti.setText(0, DrugManager.getShortGenericDrugName(d, true));
} else {
ti.setText(0, d.getName());
}
ti.setData("drugName", d.getName());
// search for existing pillcounts
Iterator<PillCount> previousPackPillCountsItr = previousPackPillCounts
.iterator();
while (previousPackPillCountsItr.hasNext()) {
PillCount pc = previousPackPillCountsItr.next();
if (pc.getDrug().equals(d)) {
pc.setDateOfCount(new Date());
ti.setData(pc);
ti.setText(1, "" + pc.getAccum());
}
}
if (ti.getData() == null) // didn't find a
// previous
// pillcount
{
ti.setData(new PillCount(-1, previousPack, new Date(),
d));
}
usedDrugs.add(d);
} else if ((d.getSideTreatment() == 'T')
&& (!usedDrugs.contains(d))) {
TableItem ti = new TableItem(tblLastPackage, SWT.NONE);
ti.setText(0, d.getName());
ti.setFont(ResourceUtils
.getFont(iDartFont.VERASANS_8_ITALIC));
ti.setData(null);
usedDrugs.add(d);
}
}
}
}
/**
* This method is called when the user pressed the "Close" button. It closes
* the active window
*
*/
@Override
protected void cmdCancelWidgetSelected() {
closeShell(true);
}
@Override
protected void cmdSaveWidgetSelected() {
if (submitForm()) {
// set focus to the packageIDScan textField so that the user can
// scan in another package immediately
scannedPack = null;
// txtPackageIdScan = null;
// txtPackageIdScan = new Text(grpScanPackageId, SWT.BORDER);
// txtPackageIdScan.setBounds(new Rectangle(5, 15, 170, 20));
// txtPackageIdScan.setFont(ResourceUtils
// .getFont(iDartFont.VERASANS_8));
// // txtPackageIdScan.addListener(SWT.KeyDown, new KeyAdapter(){});
//
// txtPackageIdScan.addKeyListener(new KeyAdapter() {
// @Override
// public void keyPressed(KeyEvent evt) {
// if (evt.character == SWT.CR) {
// cmdEnterPressed();
// }
// }
// });
txtPackageIdScan.setFocus();
txtPackageIdScan.setEnabled(true);
txtPackageIdScan.selectAll();
}
}
/**
* This method updates the two lists: - packages waiting to be dispatched,
* and - packages that have been scanned out of the pharmacy
*
* @param index
* int
*/
private void updateLists() {
String move = lstAwaiting.getItem(index);
lstScanned.add(move);
lstAwaiting.remove(index);
// Hack to synchronise the 2 lists.
packageList.remove(scannedPack);
}
/**
* This method populates the package details
*
* @param pack
* Packages
*/
private void populatePatientDetails(Packages pack) {
Patient pat = pack.getPrescription().getPatient();
txtFolderNo.setText(pat.getPatientId());
txtName.setText(pat.getLastname() + ", " + pat.getFirstNames());
txtDOB.setText(dateFormatter.format(pat.getDateOfBirth()));
txtAge.setText(pat.getAge() + " years");
txtLastPackageDate.setText("");
}
/**
* Method populateLastPackageDetails.
*
* @param pat
* Patient
*/
private void populateLastPackageDetails(Patient pat) {
previousPack = PackageManager
.getLastPackagePickedUp(getHSession(), pat);
if (previousPack != null) {
// Check if package was created but not picked up
if (previousPack.getPickupDate() == null) {
MessageBox m = new MessageBox(getShell(), SWT.OK
| SWT.ICON_INFORMATION);
m.setText("Cannot Dispense to Patient");
m
.setMessage("You cannot dispense to patient "
+ previousPack.getPrescription().getPatient()
.getPatientId()
+ " since a package has already been made on "
+ dateFormatter.format(previousPack
.getPackDate())
+ " for this patient. "
+ "\nThis package has not yet been collected by the "
+ "patient. \n\n If this package is correct, please scan "
+ "it out to the patient using the 'Scan Out Packages "
+ "to Patients' screen. \n\nIf this package is NOT correct, "
+ "please delete it using the 'Stock, Prescription & "
+ "Package Deletions' screen.");
m.open();
}
else {
btnCaptureDate.setDate(new Date());
adjustDaysSince();
populateTblLastPackage();
}
} else {
txtLastPackageDate.setText("initial pickup");
lblContentsDaysSinceLastPickup.setText("");
lblContentsDaysSinceLastPickup.setForeground(ResourceUtils
.getColor(iDartColor.BLACK));
}
}
/**
* Method populateThisPackageDetails.
*
* @param pack
* Packages
*/
@SuppressWarnings("unchecked")
private void populateThisPackageDetails(Packages pack) {
java.util.List<Drug> usedDrugs = new ArrayList<Drug>();
for (PackagedDrugs pd : pack.getPackagedDrugs()) {
if (!usedDrugs.contains(pd.getStock().getDrug())) {
TableItem ti = new TableItem(tblThisPackage, SWT.NONE);
ti.setText(0, pd.getStock().getDrug().getName());
ti.setText(1, pd.getAmount() + "");
ti.setText(3, pd.getAmount() + "");
java.util.List<PackagedDrugs> pdList = new ArrayList<PackagedDrugs>();
pdList.add(pd);
ti.setData(pdList);
if (pd.getStock().getDrug().getSideTreatment() == 'F') {
boolean drugWasInLastPack = false;
for (TableItem pillcountTi : tblLastPackage.getItems()) {
if ((pillcountTi.getData() != null)
&& ((((PillCount) pillcountTi.getData())
.getDrug()).equals(pd.getStock()
.getDrug()))) {
drugWasInLastPack = true;
break;
}
}
if (!drugWasInLastPack) {
ti.setText(2, "-");
ti.setText(3, pd.getAmount() + "");
}
}
}
else {
for (TableItem ti : tblThisPackage.getItems()) {
if (((java.util.List<PackagedDrugs>) ti.getData()).get(0)
.getStock().getDrug().equals(
pd.getStock().getDrug())) {
try {
int currentDisp = Integer.parseInt(ti.getText(1));
currentDisp += pd.getAmount();
ti.setText(1, currentDisp + "");
((java.util.List<PackagedDrugs>) ti.getData())
.add(pd);
} catch (NumberFormatException ne) {
}
}
}
}
}
}
/**
* This method gets all the packages that are awaiting dispatch for a given
* clinic, and adds these packages to the GUI-list.
*
*
* @param clinic
*/
private void updatePackagesAwaitingDispatchListForClinic(String clinic) {
this.lstAwaiting.removeAll();
if (iDartProperties.downReferralMode
.equalsIgnoreCase(iDartProperties.OFFLINE_DOWNREFERRAL_MODE)) {
packageList = PackageManager.getPackagesAwaitingCollection(
getHSession(), clinic);
}
else {
if (isAtRemoteClinic) {
packageList = PackageManager.getPackagesAwaitingCollection(
getHSession(), clinic);
} else {
packageList = PackageManager.getPackagesAwaitingScanOut(
getHSession(), clinic);
}
}
for (int i = 0; i < packageList.size(); i++) {
Packages p = packageList.get(i);
lstAwaiting.add(p.getPackageId());
}
}
private void updatePackagesAwaitingDispatchListForPatient(String patientId){
this.lstAwaiting.removeAll();
packageList = PackageManager.getAllWaitingPackagesForPatientWithIdLike(getHSession(), patientId);
for (int i = 0; i < packageList.size(); i++) {
Packages p = packageList.get(i);
lstAwaiting.add(p.getPackageId());
}
}
/**
* Method enableFields.
*
* @param enable
* boolean
*/
@Override
protected void enableFields(boolean enable) {
// cmbYear.setVisible(enable);
// cmbMonth.setVisible(enable);
// cmbDay.setVisible(enable);
btnCollectionDateForNextPackage.setVisible(enable);
// txtFolderNo.setEnabled(enable);
// txtName.setEnabled(enable);
// txtDOB.setEnabled(enable);
// txtAge.setEnabled(enable);
// txtLastPackageDate.setEnabled(enable);
btnSave.setEnabled(enable);
}
@Override
protected void cmdClearWidgetSelected() {
enableFields(false);
packageLoaded = false;
btnCaptureDate.setDate(null);
btnCollectionDateForNextPackage.setDate(null);
previousPack = null;
// clear tables and table editors
tblLastPackage.clearAll();
tblThisPackage.clearAll();
tblLastPackage.removeAll();
tblThisPackage.removeAll();
txtPackageIdScan.setText("");
txtFolderNo.setText("");
txtName.setText("");
txtDOB.setText("");
txtAge.setText("");
txtLastPackageDate.setText("");
lblContentsDaysSinceLastPickup.setText("");
txtPackageIdScan.setEnabled(true);
Control old = editorTblLastPackage.getEditor();
if (old != null) {
old.dispose();
}
Control old2 = editorTblThisPackage.getEditor();
if (old2 != null) {
old2.dispose();
}
txtPackageIdScan.setFocus();
}
/**
* Method getPillCountsForLastPackage.
*
* @return Set<PillCount>
*/
private Set<PillCount> getPillCountsForLastPackage() {
if (previousPack == null)
return null;
Set<PillCount> pcsToSave = new HashSet<PillCount>();
previousPack.getPillCounts().clear();
for (int i = 0; i < tblLastPackage.getItemCount(); i++) {
if (tblLastPackage.getItem(i).getData() != null) {
PillCount pc = (PillCount) tblLastPackage.getItem(i).getData();
if (pc.getAccum() != -1) {
pc.setDateOfCount(btnCaptureDate.getDate());
pc.setPreviousPackage(previousPack);
pcsToSave.add(pc);
}
}
}
previousPack.getPillCounts().addAll(pcsToSave);
return previousPack.getPillCounts();
}
private void setDateExpectedFields() {
// set the colours for all the active fields
if (!packageLoaded || txtPackageIdScan.getText().trim().length() == 0)
return; // cos the following line cant be done...
int numPeriods = PackageManager.getPackage(getHSession(),
txtPackageIdScan.getText()).getWeekssupply();
Calendar theCal = Calendar.getInstance();
theCal.setTime(btnCaptureDate.getDate());
theCal.add(Calendar.DATE, numPeriods * 7);
adjustForNewDispDate(btnCaptureDate.getDate(), theCal.getTime());
adjustDaysSince();
}
/**
* Change the pill count dates, package dates and next appointment date when
* the user changes the dispense date
*
* @param theDispDate
* @param theNextAppDate
*/
private void adjustForNewDispDate(Date theDispDate, Date theNextAppDate) {
btnCollectionDateForNextPackage.setDate(theNextAppDate);
// go through the pill counts and set the date to the new date
if ((theDispDate != null)) {
for (int i = 0; i < tblLastPackage.getItemCount(); i++) {
TableItem theItem = tblLastPackage.getItem(i);
if (theItem.getData() != null) {
((PillCount) theItem.getData()).setDateOfCount(theDispDate);
}
}
}
if (previousPack != null) {
Date lastPickupDate = previousPack.getPickupDate();
Calendar calDispDate = Calendar.getInstance();
Calendar lastPickup = Calendar.getInstance();
lastPickup.setTime(lastPickupDate);
calDispDate.setTime(theDispDate);
}
else {
lblContentsDaysSinceLastPickup.setText("Initial Pickup");
}
if (tblLastPackage != null) {
// update pill counts
for (int i = 0; i < tblLastPackage.getItemCount(); i++) {
TableItem item = tblLastPackage.getItem(i);
if (item.getData() != null) {
((PillCount) item.getData()).setDateOfCount(btnCaptureDate
.getDate());
if (!item.getText(1).trim().equals("")) {
try {
int accum = Integer.parseInt(item.getText(1));
int adherencePercent = AdherenceManager
.getAdherencePercent(getHSession(), accum,
((PillCount) item.getData()));
item.setText(2, "" + adherencePercent);
setColourForAdherencePercentCell(item, 2,
adherencePercent);
} catch (NumberFormatException e) {
java.awt.Toolkit.getDefaultToolkit().beep();
item.setText(1, "");
item.setText(1, "");
item.setBackground(2, ResourceUtils
.getColor(iDartColor.LIST_BACKGROUND));
}
}
}
}
}
}
/**
* Method setColourForAdherencePercentCell.
*
* @param item
* TableItem
* @param cell
* int
* @param adherencePercent
* int
*/
private void setColourForAdherencePercentCell(TableItem item, int cell,
int adherencePercent) {
if (adherencePercent >= 95) {
item.setBackground(cell, ResourceUtils.getColor(iDartColor.GREEN));
} else if (adherencePercent >= 90) {
item.setBackground(cell, ResourceUtils.getColor(iDartColor.YELLOW));
} else {
item.setBackground(cell, ResourceUtils.getColor(iDartColor.RED));
}
}
private void adjustDaysSince() {
if (previousPack != null) {
Date lastPickupDate = previousPack.getPickupDate();
Calendar dateOfPickup = Calendar.getInstance();
Calendar lastPickup = Calendar.getInstance();
dateOfPickup.setTime(btnCaptureDate.getDate());
lastPickup.setTime(lastPickupDate);
long numOfDays = iDARTUtil.getDaysBetween(dateOfPickup.getTime(),
lastPickupDate);
txtLastPackageDate.setText(dateFormatter.format(lastPickupDate));
lblContentsDaysSinceLastPickup.setText(numOfDays + " days");
if (numOfDays > ((previousPack.getWeekssupply() * 7) + 3)) {
lblContentsDaysSinceLastPickup.setForeground(ResourceUtils
.getColor(iDartColor.RED));
} else {
lblContentsDaysSinceLastPickup.setForeground(ResourceUtils
.getColor(iDartColor.BLACK));
}
} else {
txtLastPackageDate.setText("Initial Pickup");
}
}
/**
* View the patient history report, or show a patient selection report
* parameters screen if no patient is selected
*/
private void cmdPatientHistoryWidgetSelected() {
getLog().info(
"New Patient Packaging: User chose 'Patient History Report'");
if (scannedPack != null) {
PatientHistoryReport report = new PatientHistoryReport(getShell(),
scannedPack.getPrescription().getPatient());
viewReport(report);
} else {
PatientHistory patHistory = new PatientHistory(getShell(), true);
patHistory.openShell();
}
}
/**
* View the Scanned Packages report
*/
private void cmdPackagesReportWidgetSelected() {
getLog().info(
"Packages To Patients: User chose 'Scanned Packages Report'");
Clinic c = AdministrationManager.getClinic(getHSession(), cmbClinic
.getText().trim());
if (btnCaptureDate.getDate() == null) {
btnCaptureDate.setDate(new Date());
}
PackageProcessingReport report = new PackageProcessingReport(
getShell(), c, btnCaptureDate.getDate(), btnCaptureDate
.getDate(), PackageLifeStage.PICKED_UP);
viewReport(report);
}
/**
* Method getAccumDrugsToSave.
*
* @param p
* Packages
* @return Set<AccumulatedDrugs>
*/
private Set<AccumulatedDrugs> getAccumDrugsToSave(Packages p) {
java.util.Set<AccumulatedDrugs> adsToSave = new HashSet<AccumulatedDrugs>();
for (int i = 0; i < tblThisPackage.getItemCount(); i++) {
TableItem item = tblThisPackage.getItem(i);
try {
int inHand = Integer.parseInt(item.getText(3));
int disp = Integer.parseInt(item.getText(1));
if (inHand > disp) {
AccumulatedDrugs ad = new AccumulatedDrugs();
ad.setWithPackage(p);
// find the pillcount
String drugName = item.getText(0);
for (int j = 0; j < tblLastPackage.getItemCount(); j++) {
String lastPackDrugName = (String) tblLastPackage
.getItem(j).getData("drugName");
if (lastPackDrugName != null && lastPackDrugName.equals(drugName)) {
ad.setPillCount((PillCount) tblLastPackage.getItem(
j).getData());
}
}
if (ad.getPillCount() == null) {
getLog().error(
"Did not save accumulated drug " + drugName
+ " because it had no pillcount");
} else {
adsToSave.add(ad);
}
}
} catch (NumberFormatException ne) {
getLog().error(
"NumberFormatError saving accumulated drug for "
+ item.getText(0));
}
}
return adsToSave;
}
@Override
protected void clearForm() {
}
@Override
protected void createContents() {
}
/**
* Method fieldsOk.
*
* @return boolean
*/
@Override
protected boolean fieldsOk() {
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");
// If the scannedPack happens to be null.
if (scannedPack == null)
return false;
// Checking dates
Date packDate = scannedPack.getPackDate();
Date receivedDate = scannedPack.getDateReceived();
if (btnCaptureDate.getDate().after(new Date())) {
MessageBox mb = new MessageBox(getShell(), SWT.OK | SWT.ICON_ERROR);
mb.setText("Incorrect Date");
mb
.setMessage("The Capture Date for this package cannot be later than today's date");
mb.open();
return false;
}
if (previousPack != null
&& (DateFieldComparator.compare(btnCaptureDate.getDate(),
previousPack.getPickupDate(), Calendar.DAY_OF_MONTH) < 0)) {
MessageBox m = new MessageBox(getShell(), SWT.OK | SWT.ICON_ERROR);
m.setText("Incorrect Date");
m.setMessage("The patient picked up their last package ("
+ previousPack.getPackageId() + ")on "
+ sdf.format(previousPack.getPickupDate())
+ ".\nThe Capture Date for this package cannot "
+ "be before this date.");
m.open();
return false;
}
if (receivedDate == null
&& DateFieldComparator.compare(btnCaptureDate.getDate(),
packDate, Calendar.DAY_OF_MONTH) < 0) {
MessageBox error = new MessageBox(getShell(), SWT.ICON_ERROR);
error.setText("Incorrect Date");
error.setMessage("Package '" + scannedPack.getPackageId()
+ "' was created on " + sdf.format(packDate)
+ ". \n\nThe date that this package leaves "
+ "the pharmacy must be after this date.");
error.open();
return false;
}
if (receivedDate != null
&& DateFieldComparator.compare(btnCaptureDate.getDate(),
receivedDate, Calendar.DAY_OF_MONTH) < 0) {
MessageBox error = new MessageBox(getShell(), SWT.OK
| SWT.ICON_ERROR);
error.setText("Incorrect Date");
error.setMessage("Package '" + scannedPack.getPackageId()
+ "' was scanned in at the clinic on "
+ sdf.format(receivedDate)
+ ". \n\nThe date that this package is collected "
+ "by the patient must be after this date.");
error.open();
return false;
}
// If there has been no failure then return true.
return true;
}
/**
* Method submitForm.
*
* @return boolean
*/
@Override
protected boolean submitForm() {
if (fieldsOk()) {
Transaction tx = null;
try {
tx = getHSession().beginTransaction();
Packages pack = PackageManager.getPackage(getHSession(),
txtPackageIdScan.getText());
// Save dates associated with this package
if (AdministrationManager.getDefaultClinicName(getHSession())
.equalsIgnoreCase(cmbClinic.getText())) {
pack.setDateLeft(btnCaptureDate.getDate());
pack.setDateReceived(btnCaptureDate.getDate());
}
// if collection date is today, store the time too, else store
// 12am
if (iDARTUtil.dateIsToday(btnCaptureDate.getDate())) {
pack.setPickupDate(new Date());
} else {
pack.setPickupDate(btnCaptureDate.getDate());
}
Patient aPatient = pack.getPrescription().getPatient();
PatientManager.setNextAppointmentDateAtVisit(getHSession(),
aPatient, btnCaptureDate.getDate(),
btnCollectionDateForNextPackage.getDate());
Set<PillCount> pcs = getPillCountsForLastPackage();
if (pcs != null) {
AdherenceManager.save(getHSession(), pcs);
EventBusService.publish(new AdherenceEvent(pcs));
}
Set<AccumulatedDrugs> accums = pack.getAccumulatedDrugs();
if (accums != null) {
accums.clear();
accums.addAll(getAccumDrugsToSave(pack));
} else {
pack.setAccumulatedDrugs(getAccumDrugsToSave(pack));
}
PackageManager.savePackage(getHSession(), pack);
if (pack.hasARVDrug()
&& aPatient.getAttributeByName(PatientAttribute.ARV_START_DATE) == null) {
Packages firstArvPacks = PackageManager
.getFirstPackageWithARVs(PackageManager
.getAllPackagesForPatient(getHSession(),
aPatient));
if (firstArvPacks.getId() == pack.getId()) {
// If this is the first ARV pack then get
// the first episode.
Episode firstEpisode = PatientManager
.getFirstEpisode(aPatient);
String epiStartReason = firstEpisode.getStartReason();
if (epiStartReason.equalsIgnoreCase("NEW PATIENT")) {
MessageBox mbox = new MessageBox(getShell(), SWT.YES
| SWT.NO | SWT.ICON_QUESTION);
mbox.setText("ART Start Date Not Set");
mbox
.setMessage("The ARV start date has not yet been set and this is the first time patient '"
+ txtFolderNo.getText()
+ "' is receiving ARV drugs. \n\nWould you like to set the ARV start date to "
+ btnCaptureDate.getText()
+ " now?");
switch (mbox.open()) {
case SWT.YES:
PatientManager.addPatientAttributeToPatient(
getHSession(), aPatient,
setARVStartDate(btnCaptureDate
.getText(), aPatient));
getLog().info("ARV start date has been set");
PatientManager.savePatient(getHSession(),
aPatient);
break;
}
}
}
}
getHSession().flush();
tx.commit();
EventBusService.publish(new PackageEvent(PackageEvent.Type.PICKUP_ONLY, pack));
updateLists();
MessageBox m = new MessageBox(getShell(), SWT.ICON_INFORMATION
| SWT.OK);
m.setMessage("Package successfully saved.");
m.setText("Package Saved Successfully");
m.open();
} catch (HibernateException he) {
getLog().error("couldn't save scanned out packages");
MessageBox cantSave = new MessageBox(getShell(), SWT.ICON_ERROR
| SWT.OK);
cantSave.setText("Cannot Save Scanned Out Packages");
cantSave
.setMessage("Unable to save scanned out packages and recorded pill counts. Please try again");
cantSave.open();
he.printStackTrace();
if (tx != null) {
tx.rollback();
}
}
cmdClearWidgetSelected();
return true;
} else {
getLog().info(
"Information could not be saved "
+ "due to invalid input fields.");
}
return false;
}
@Override
protected void setLogger() {
setLog(Logger.getLogger(this.getClass()));
}
/*
* (non-Javadoc)
*
* @see
* org.celllife.idart.gui.misc.iDARTChangeListner#changed(java.lang.Object)
*/
@Override
public void changed(Object o) {
if (o instanceof Date) {
}
}
/**
* Method setARVStartDate.
*
* @param startDate
* String
* @param localPatient
* Patient
* @return PatientAttribute
*/
private PatientAttribute setARVStartDate(String startDate,
Patient localPatient) {
PatientAttribute pa = localPatient
.getAttributeByName(PatientAttribute.ARV_START_DATE);
if (pa == null) {
pa = new PatientAttribute();
pa.setType(PatientManager.getAttributeTypeObject(getHSession(),
PatientAttribute.ARV_START_DATE));
pa.setPatient(localPatient);
}
pa.setValue(startDate);
return pa;
}
private void setAppointmentErrorMsg(String patientId, String date) {
appointmentErrorMsg = "Patient "+ patientId + " is collecting their current package on " +
date + ".\n\nTheir next appointment date must be after this date.";
}
private String getAppointmentErrorMsg(){
return appointmentErrorMsg;
}
private void fireChangeEvent() {
setAppointmentErrorMsg(txtFolderNo.getText(), btnCaptureDate.getText());
IRule<Date> rule = DateRuleFactory.afterInclusive(btnCaptureDate.getDate(), true);
rule.setDescription(getAppointmentErrorMsg());
DateInputValidator dateValidator = new DateInputValidator(rule);
btnCollectionDateForNextPackage.setValidator(dateValidator);
}
private void addSearchBarFocusListener(){
searchBar.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
String text = searchBar.getText().trim();
if(text.equalsIgnoreCase("patient search")){
searchBar.setText("");
}
}
@Override
public void focusLost(FocusEvent e) {
String text = searchBar.getText().trim();
if(text.equalsIgnoreCase("")){
searchBar.setText("patient search");
updatePackagesAwaitingDispatchListForClinic(cmbClinic.getText());
}
}
});
}
private void addSearchBarKeyListener(){
searchBar.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
String currentText = searchBar.getText().trim();
if(!currentText.isEmpty() && !currentText.equalsIgnoreCase("")){
// first, parse the text in txtPatientId
String patientId = PatientBarcodeParser
.getPatientId(currentText);
if (!patientId.isEmpty() && !patientId.equalsIgnoreCase("")) {
updatePackagesAwaitingDispatchListForPatient(patientId);
}
}
}
});
}
private void searchBarEnter(){
if(lstAwaiting.getItemCount() == 1 ){
txtPackageIdScan.setText(lstAwaiting.getItem(0));
cmdEnterPressed();
}
}
}