package org.celllife.idart.integration.eKapa;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.manager.TemporaryRecordsManager;
import org.apache.log4j.Logger;
import org.celllife.idart.database.hibernate.tmp.AdherenceRecord;
import org.celllife.idart.database.hibernate.tmp.DeletedItem;
import org.celllife.idart.database.hibernate.tmp.PackageDrugInfo;
import org.celllife.idart.database.hibernate.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class EkapaSubmitJob implements Job {
private final Logger log = Logger.getLogger(EkapaSubmitJob.class.getName());
public static final String GROUP_NAME = "ekapa";
public static final String JOB_NAME = "ekapaJob";
private StoredProcs sp;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
log.info("ekapa submission job starting");
getStoredProcsConnection();
Transaction tx = null;
Session hSession = null;
try {
hSession = HibernateUtil.getNewSession();
if (TemporaryRecordsManager.hasUnsubmittedRecords(hSession)) {
if (getStoredProcsConnection()) {
tx = hSession.beginTransaction();
processPackagedDrugs(hSession);
processAdherenceRecords(hSession);
processDeletedItems(hSession);
hSession.flush();
tx.commit();
}
}
} catch (Exception e) {
log.error("Error submitting data to ekapa", e);
if (tx != null) {
tx.rollback();
}
} finally {
if (hSession != null) {
hSession.close();
}
if (sp != null) {
sp.closeConnection();
}
}
log.info("ekapa submission job completed");
}
private void processDeletedItems(Session hSession) {
List<DeletedItem> delList = TemporaryRecordsManager
.getUnsubmittedDeletedItems(hSession);
List<DeletedItem> submittedDeletedItems = new ArrayList<DeletedItem>();
for (DeletedItem del : delList) {
if (submitDeletedItem(del)) {
log.info("Successfully removed deleted item from eKapa. Record id: "
+ del.getDeletedItemId());
submittedDeletedItems.add(del);
}
}
TemporaryRecordsManager.deleteSubmittedDeletedItems(hSession,
submittedDeletedItems);
}
private void processAdherenceRecords(Session hSession) {
List<AdherenceRecord> adhList = TemporaryRecordsManager
.getUnsubmittedAdherenceRecords(hSession);
List<AdherenceRecord> submittedAdherenceRecords = new ArrayList<AdherenceRecord>();
for (AdherenceRecord adh : adhList) {
if (submitAdherenceRecord(adh)) {
log.info("Successfully saved adherence record to eKapa. Record id: "
+ adh.getId());
submittedAdherenceRecords.add(adh);
}
}
TemporaryRecordsManager.deleteSubmittedAdherenceRecords(hSession,
submittedAdherenceRecords);
}
private void processPackagedDrugs(Session hSession) {
List<PackageDrugInfo> pdiList = TemporaryRecordsManager
.getUnsubmittedPackageDrugInfos(hSession);
List<PackageDrugInfo> submittedPackageDrugInfos = new ArrayList<PackageDrugInfo>();
for (PackageDrugInfo pdi : pdiList) {
if (submitPackageDrugInfo(pdi)) {
log.info("Successfully saved dispensing record to eKapa. Record id: "
+ pdi.getId());
submittedPackageDrugInfos.add(pdi);
}
}
TemporaryRecordsManager.updateSubmittedPackageDrugInfos(hSession,
submittedPackageDrugInfos);
}
/**
* Method getStoredProcsConnection.
*
* @return boolean
*/
private boolean getStoredProcsConnection() {
try {
sp = new StoredProcs();
if (!sp.init()) {
sp.closeConnection();
sp = null;
return false;
} else
return true;
} catch (SQLException e) {
log.error("Could not create StoredProcs due to SQL Exception", e);
sp = null;
return false;
}
}
/**
* Method submitAdherenceRecord.
*
* @param adh
* AdherenceRecord
* @return boolean
*/
private boolean submitAdherenceRecord(AdherenceRecord adh) {
try {
log.info("Attempting to submit AdherenceRecordTmp: "
+ adh.getPillCountId() + "," + adh.getPawcNo() + ","
+ adh.getCountDate() + "," + adh.getDaysSinceVisit() + ","
+ adh.getDaysSinceVisit() + "," + adh.getDaysCarriedOver()
+ "," + adh.getDaysInHand() + "," + adh.getAdherence()
+ "," + "Not Available" + "," + adh.getCluser());
return sp.submitPillCount(adh);
} catch (SQLException e) {
log.error(
"SQLException while trying to submit temp records to eKapa",
e);
if ((e.getSQLState() != null)
&& (!e.getSQLState().startsWith("08"))) {
// not a connection error
log.error("Marking adherence record as invalid. Id:"
+ adh.getId());
return true;
}
return false;
}
}
/**
* Method submitPackageDrugInfo.
*
* @param pdi
* PackageDrugInfo
* @return boolean
*/
private boolean submitPackageDrugInfo(PackageDrugInfo pdi) {
try {
return sp.submitDispensingInfo(pdi);
} catch (SQLException e) {
log.error("SQLException while trying to submit temp records to eKapa");
log.error(e);
if ((e.getSQLState() != null)
&& (!e.getSQLState().startsWith("08"))) {
// not a connection error
pdi.setInvalid(true);
log.error("Marking pdi as invalid. Id:" + pdi.getId());
return true;
}
return false;
}
}
/**
* Method submitDeletedItem.
*
* @param del
* DeletedItem
* @return boolean
*/
private boolean submitDeletedItem(DeletedItem del) {
try {
if (del.getItemType().equals(DeletedItem.ITEM_ADHERANCE)) {
return sp.deleteAdherenceRecord(del);
} else if (del.getItemType().equals(DeletedItem.ITEM_PACKAGE_DRUG)) {
return sp.deleteDispensingRecord(del);
}
return false;
} catch (SQLException e) {
log.error(
"SQLException while trying to submit temp records to eKapa",
e);
if ((e.getSQLState() != null)
&& (!e.getSQLState().startsWith("08"))) {
// not a connection error
log.error("Marking deleted item record as invalid. Id:"
+ del.getId());
return true;
}
return false;
}
}
}