package org.celllife.idart.start;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import model.manager.StockManager;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.celllife.idart.commonobjects.iDartProperties;
import org.celllife.idart.database.hibernate.StockAdjustment;
import org.celllife.idart.database.hibernate.StockTake;
import org.celllife.idart.database.hibernate.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class FixStockLevels {
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Logger log = Logger.getRootLogger();
DOMConfigurator.configure("log4j.xml");
// load encrypted system properties
log.info("Loading Encrypted System Properties");
iDartProperties.setiDartProperties();
Session session = HibernateUtil.getNewSession();
Transaction tx = session.beginTransaction();
/*
* This Query gets all stock batches which have negative balances remaining
*/
List<Object[]> obj = session.createSQLQuery("select * " +
"from (select COALESCE(a.received - COALESCE(b.issued, 0) - COALESCE(c.adjusted, 0), 0) as bal, a.id " +
"from (select (sum(s.unitsreceived)*d.packsize) as received, s.id from stock as s, drug as d " +
"where s.drug = d.id group by s.id, d.packsize order by s.id ) as a " +
"left outer join (select sum(pd.amount) as issued, s.id from stock as s, packageddrugs as pd, package as p " +
"where pd.stock = s.id and pd.parentpackage = p.id and p.stockReturned = false " +
"group by s.id order by s.id ) as b on a.id = b.id " +
"left outer join (select sum(sa.adjustedValue) as adjusted, s.id from stock as s, " +
"stockAdjustment as sa where sa.stock = s.id group by s.id order by s.id ) as c " +
"on a.id = c.id ) as d where d.bal < 0 group by id, bal order by id").list();
if(obj != null && obj.size() > 0) {
StockTake stockTake = new StockTake();
stockTake.setOpen(true);
stockTake.setStartDate(new Date());
stockTake.setStockTakeNumber("Update Stock Levels " + new Date());
session.save(stockTake);
session.flush();
for (Object[] objects : obj) {
StockAdjustment st = new StockAdjustment();
st.setAdjustedValue(((BigInteger)objects[0]).intValue());
st.setCaptureDate(new Date());
st.setNotes("Updated Negative Stock Levels");
st.setStock(StockManager.getStock(session, ((Integer)objects[1]).intValue()));
st.setStockCount(0);
st.setStockTake(stockTake);
session.save(st);
}
// Close stock Take
stockTake.setEndDate(new Date());
stockTake.setOpen(false);
session.saveOrUpdate(stockTake);
session.flush();
}
tx.commit();
tx = null;
session.close();
log.error("We have lift off");
}
}