package com.ese.model.dao;
import com.ese.model.view.ReceivingReportView;
import com.ese.utils.FacesUtil;
import com.ese.utils.Utils;
import org.hibernate.SQLQuery;
import org.hibernate.type.DateType;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;
import org.springframework.stereotype.Repository;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
@Repository
public class ReceivingReportDAO extends GenericDAO<ReceivingReportView, Integer>{
public List<ReceivingReportView> findReceivingReport(String startDate, String endDate){
log.debug("Date. {} : {}", startDate, endDate);
List<ReceivingReportView> receivingReportViewList = new ArrayList<ReceivingReportView>();
StringBuilder queryInvOnhandView = new StringBuilder();
queryInvOnhandView.append(" SELECT ");
queryInvOnhandView.append(" CONVERT(CHAR(10), ").append(getPrefix()).append(".inv_onhand_view.receiving_date,120) AS RECEIVING_DATE,");
queryInvOnhandView.append(" ").append(getPrefix()).append(".inv_onhand_view.warehouse_code AS WAREHOUSE_CODE,");
queryInvOnhandView.append(" ").append(getPrefix()).append(".inv_onhand_view.name AS CONVEYOR_LINE,");
queryInvOnhandView.append(" ").append(getPrefix()).append(".inv_onhand_view.itemid AS ITEM_NAME,");
queryInvOnhandView.append(" ").append(getPrefix()).append(".inv_onhand_view.item_description AS ITEM_DESC,");
queryInvOnhandView.append(" ").append(getPrefix()).append(".inv_onhand_view.grade AS GRADE,");
queryInvOnhandView.append(" (SELECT COUNT(inv1.id) FROM ").append(getPrefix()).append(".inv_onhand_view inv1 ");
queryInvOnhandView.append(" WHERE inv1.status = 1 and (CONVERT(CHAR(10), inv1.receiving_date, 120) = ");
queryInvOnhandView.append(" CONVERT(CHAR(10), ").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120) ");
queryInvOnhandView.append(" AND inv1.ItemId = ").append(getPrefix()).append(".inv_onhand_view.itemid)) AS RECEIVE,");
queryInvOnhandView.append(" COUNT(").append(getPrefix()).append(".inv_onhand_view.id) - (SELECT COUNT(inv1.id) FROM ");
queryInvOnhandView.append(" ").append(getPrefix()).append(".inv_onhand_view inv1 WHERE inv1.status = 1 AND (CONVERT(CHAR(10), inv1.receiving_date, 120) =");
queryInvOnhandView.append(" CONVERT(CHAR(10) ,").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120) ");
queryInvOnhandView.append(" AND inv1.ItemId = ").append(getPrefix()).append(".inv_onhand_view.itemid)) AS LOCATED,");
queryInvOnhandView.append(" COUNT(").append(getPrefix()).append(".inv_onhand_view.id) AS QTY ");
queryInvOnhandView.append(" FROM ").append(getPrefix()).append(".inv_onhand_view");
if (Utils.isZero(startDate.trim()) && Utils.isZero(endDate.trim())){
queryInvOnhandView.append(" WHERE CONVERT(CHAR(10), ").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120) >= CONVERT(CHAR(10), GETDATE(), 120)");
queryInvOnhandView.append(" AND CONVERT(CHAR(10), ").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120) < CONVERT(CHAR(10), GETDATE()+1, 120)");
} else {
queryInvOnhandView.append(" WHERE CONVERT(CHAR(16), ").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120) >= ");
queryInvOnhandView.append(" CONVERT(CHAR(16), '").append(startDate).append("', 120)");
queryInvOnhandView.append(" AND CONVERT(CHAR(16), ").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120) <= ");
queryInvOnhandView.append(" CONVERT(CHAR(16), '").append(endDate).append("', 120)");
}
queryInvOnhandView.append(" GROUP BY ").append(getPrefix()).append(".inv_onhand_view.name, ").append(getPrefix()).append(".inv_onhand_view.ItemId, ")
.append(getPrefix()).append(".inv_onhand_view.warehouse_code, ").append(getPrefix()).append(".inv_onhand_view.grade, ").append(getPrefix()).append(".inv_onhand_view.item_description, ")
.append(" CONVERT(CHAR(10), ").append(getPrefix()).append(".inv_onhand_view.receiving_date, 120)");
queryInvOnhandView.append(" ORDER BY ").append(getPrefix()).append(".inv_onhand_view.warehouse_code, ").append(getPrefix()).append(".inv_onhand_view.name, ")
.append(getPrefix()).append(".inv_onhand_view.ItemId");
log.debug("findReceivingReport : {}", queryInvOnhandView.toString());
try {
SQLQuery query = getSession().createSQLQuery(queryInvOnhandView.toString())
.addScalar("RECEIVING_DATE", DateType.INSTANCE)
.addScalar("WAREHOUSE_CODE", StringType.INSTANCE)
.addScalar("CONVEYOR_LINE", StringType.INSTANCE)
.addScalar("ITEM_NAME", StringType.INSTANCE)
.addScalar("ITEM_DESC", StringType.INSTANCE)
.addScalar("GRADE", StringType.INSTANCE)
.addScalar("RECEIVE", IntegerType.INSTANCE)
.addScalar("LOCATED", IntegerType.INSTANCE)
.addScalar("QTY", IntegerType.INSTANCE);
List<Object[]> objects = query.list();
int sum = 0;
for (Object[] entity : objects){
ReceivingReportView reportView = new ReceivingReportView();
reportView.setReceivingDate(Utils.convertDateToString(Utils.parseDate(entity[0], null)));
reportView.setWarehouseCode(Utils.parseString(entity[1]));
reportView.setConveyorLine(Utils.parseString(entity[2]));
reportView.setItemName(Utils.parseString(entity[3]));
reportView.setItemDesc(Utils.parseString(entity[4]));
reportView.setGrade(Utils.parseString(entity[5]));
reportView.setReceive(Utils.parseInt(entity[6]));
reportView.setLocated(Utils.parseInt(entity[7]));
reportView.setQty(Utils.parseInt(entity[8]));
sum += Utils.parseInt(entity[8]);
receivingReportViewList.add(reportView);
}
HttpSession session = FacesUtil.getSession(true);
session.setAttribute("summary", sum);
} catch (Exception e) {
log.debug("Exception error findReceivingReport : ", e);
}
return receivingReportViewList;
}
}