use of org.eevolution.model.MPPForecastRunMaster in project adempiere by adempiere.
the class ForecastRunCreate method generateForecastRunMaster.
/**
* Generate Forecast Master based on sales history
*
* @param run
* Forecast Simulation
* @param fd
* Forecast Definition
* @param start
* Start Operational Period
* @param end
* End Operational Period
* @return no records processed
*/
private int generateForecastRunMaster(MPPForecastRun run, MPPForecastDefinition fd, MPPPeriod start, MPPPeriod end) {
int count = 0;
for (MPPForecastDefinitionLine fdl : fd.getLines(true)) {
final StringBuffer select = new StringBuffer("SELECT DISTINCT sh.M_Product_ID , sh.M_Warehouse_ID FROM C_SalesHistory sh LEFT JOIN PP_ForecastRunMaster m ON (m.M_Product_ID=sh.M_Product_ID AND ");
select.append(MPPForecastRunMaster.COLUMNNAME_PP_ForecastRun_ID);
select.append("=").append(run.get_ID()).append(" ) WHERE ");
select.append(fdl.getSQlWhere(run.getM_WarehouseSource_ID(), "sh"));
select.append(MSalesHistory.COLUMNNAME_DateInvoiced);
select.append(" BETWEEN ");
select.append(DB.TO_DATE(start.getStartDate()));
select.append(" AND ");
select.append(DB.TO_DATE(end.getEndDate()));
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = DB.prepareStatement(select.toString(), get_TrxName());
rs = pstmt.executeQuery();
while (rs.next()) {
count++;
int M_Product_ID = rs.getInt("M_Product_ID");
MPPForecastRunMaster master = MPPForecastRunMaster.getByProduct(getCtx(), run.getPP_ForecastRun_ID(), M_Product_ID, get_TrxName());
if (master != null)
continue;
master = new MPPForecastRunMaster(getCtx(), 0, get_TrxName());
master.setAD_Org_ID(run.getAD_Org_ID());
master.setPP_ForecastRun_ID(run.get_ID());
master.setPP_ForecastDefinitionLine_ID(fdl.getPP_ForecastDefinitionLine_ID());
master.setM_Product_ID(M_Product_ID);
master.setM_Warehouse_ID(run.getM_Warehouse_ID());
master.setFactorAlpha(fdl.getFactorAlpha());
master.setFactorGamma(fdl.getFactorGamma());
master.setFactorBeta(fdl.getFactorBeta());
master.setFactorMultiplier(fdl.getFactorMultiplier());
master.setFactorScale(fdl.getFactorScale());
master.setFactorUser(fdl.getFactorUser());
master.saveEx();
}
} catch (Exception e) {
log.log(Level.SEVERE, select.toString(), e);
getProcessInfo().addLog(getProcessInfo().getAD_PInstance_ID(), null, null, e.getLocalizedMessage());
} finally {
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
}
return count;
}
use of org.eevolution.model.MPPForecastRunMaster in project adempiere by adempiere.
the class ForecastRunCreate method generateForecastResult.
// doIt
/**
* Generate Forecast Result based on Forecast Detail and Forecast Definition
*
* @param M_Warehouse_ID
* @return no records processed
*/
private int generateForecastResult(int M_Warehouse_ID) {
// Preview Calculate Data
deleteData();
// Get Period Base
m_period_definition_base = new MPPPeriodDefinition(getCtx(), m_run.getRef_DefinitionPeriod_ID(), get_TrxName());
m_period_definition_target = new MPPPeriodDefinition(getCtx(), m_run.getPP_PeriodDefinition_ID(), get_TrxName());
m_forecast_rule = (MPPForecastRule) m_run.getPP_ForecastRule();
// Get Periods
List<MPPPeriod> m_period_history = m_period_definition_base.getPeriodsOfHistory(m_run.getPeriodHistory());
// Generate Forecast Run Master
int selection = generateForecastRunMaster(m_run, m_forecast_definition, m_period_history.get(m_period_history.size() - 1), m_period_history.get(0));
if (selection <= 0)
throw new IllegalArgumentException("@FindZeroRecords@");
for (MPPForecastRunMaster master : MPPForecastRunMaster.getLines(getCtx(), p_PP_ForecastRun_ID, get_TrxName())) {
// Generate Forecast Detail for each period
for (MPPPeriod period : m_period_history) {
// Create Forecast Run Detail
createForecastRunDetail(master, period);
}
}
// Create Forecast Run Entry based on Forecast Run Detail
return createForecastRunResult(M_Warehouse_ID);
}
use of org.eevolution.model.MPPForecastRunMaster in project adempiere by adempiere.
the class ForecastRunCreate method createForecastRunResult.
/**
* Create the Forecast Result
*
* @param M_Warehouse_ID
* @return no records processed
*/
private int createForecastRunResult(int M_Warehouse_ID) {
// total record processed
int records = 0;
ForecastEngine engine = ForecastFactory.getForecastEngine(getAD_Client_ID());
// Generate ForecastEntry based on forecast rule
for (MPPForecastRunMaster master : MPPForecastRunMaster.getLines(getCtx(), p_PP_ForecastRun_ID, get_TrxName())) {
DataSet series = new DataSet();
series.setPeriods(m_run.getPeriodHistory());
MProduct product = MProduct.get(getCtx(), master.getM_Product_ID());
List<MPPForecastRunDetail> details = MPPForecastRunMaster.getDetails(getCtx(), master.get_ID(), get_TrxName());
for (MPPForecastRunDetail detail : details) {
MPPPeriod period = (MPPPeriod) detail.getPP_Period();
DataElement data = new DataElement(master.get_ID(), period.getPeriodNo(), detail.getQtyCalculated(), null);
series.addDataElement(data);
}
DataSet results = engine.getForecast(m_forecast_rule.getCalculationClass(), master.get_ID(), series, master.getFactorAlpha().doubleValue(), master.getFactorGamma().doubleValue(), master.getFactorBeta().doubleValue(), master.getFactorMultiplier().doubleValue(), master.getFactorScale().doubleValue(), master.getFactorUser().doubleValue());
Enumeration<DataElement> elements = results.getDataElements();
while (elements.hasMoreElements()) {
DataElement element = elements.nextElement();
MUOM uom = (MUOM) product.getC_UOM();
MPPForecastRunResult result = new MPPForecastRunResult(getCtx(), 0, get_TrxName());
result.setPP_ForecastRun_ID(m_run.get_ID());
result.setPP_ForecastRunMaster_ID(element.getKey());
result.setDescription(element.getDescription());
BigDecimal qty = (BigDecimal) element.getValue();
result.setQtyCalculated(qty);
result.setQtyPlan(uom.round(qty, true));
result.setIsActive(true);
result.setPP_Period_ID(MPPPeriod.getIDByPeriodNo(m_period_definition_target, element.getPeriodNo()));
result.setPeriodNo(element.getPeriodNo());
result.saveEx();
records++;
}
}
// m_run.saveEx();
return records;
}
Aggregations