PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/compiere-330/base/src/org/compiere/report/FinBalance.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 438 lines | 311 code | 29 blank | 98 comment | 59 complexity | 5492e1a38f91c088bff96cca9acd7ff0 MD5 | raw file
  1. /******************************************************************************
  2. * Product: Compiere ERP & CRM Smart Business Solution *
  3. * Copyright (C) 1999-2007 ComPiere, Inc. All Rights Reserved. *
  4. * This program is free software, you can redistribute it and/or modify it *
  5. * under the terms version 2 of the GNU General Public License as published *
  6. * by the Free Software Foundation. This program is distributed in the hope *
  7. * that it will be useful, but WITHOUT ANY WARRANTY, without even the implied *
  8. * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
  9. * See the GNU General Public License for more details. *
  10. * You should have received a copy of the GNU General Public License along *
  11. * with this program, if not, write to the Free Software Foundation, Inc., *
  12. * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
  13. * For the text or an alternative of this public license, you may reach us *
  14. * ComPiere, Inc., 3600 Bridge Parkway #102, Redwood City, CA 94065, USA *
  15. * or via info@compiere.org or http://www.compiere.org/license.html *
  16. *****************************************************************************/
  17. package org.compiere.report;
  18. import java.math.*;
  19. import java.sql.*;
  20. import java.text.*;
  21. import java.util.*;
  22. import java.util.logging.*;
  23. import org.compiere.model.*;
  24. import org.compiere.process.*;
  25. import org.compiere.util.*;
  26. /**
  27. * Financial Balance Maintenance Engine
  28. *
  29. * @author Jorg Janke
  30. * @version $Id: FinBalance.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $
  31. */
  32. public class FinBalance extends SvrProcess
  33. {
  34. /** Logger */
  35. protected static final CLogger s_log = CLogger.getCLogger (FinBalance.class);
  36. /** Acct Schema */
  37. private int p_C_AcctSchema_ID = 0;
  38. /** Full recreate */
  39. private boolean p_IsRecreate = false;
  40. /** Date From */
  41. private Timestamp p_DateFrom = null;
  42. /**
  43. * Prepare - e.g., get Parameters.
  44. */
  45. @Override
  46. protected void prepare()
  47. {
  48. // Parameter
  49. ProcessInfoParameter[] para = getParameter();
  50. for (ProcessInfoParameter element : para) {
  51. String name = element.getParameterName();
  52. if (element.getParameter() == null)
  53. ;
  54. else if (name.equals("C_AcctSchema_ID"))
  55. p_C_AcctSchema_ID = ((BigDecimal)element.getParameter()).intValue();
  56. else if (name.equals("IsRecreate"))
  57. p_IsRecreate = "Y".equals(element.getParameter());
  58. else if (name.equals("DateFrom"))
  59. p_DateFrom = (Timestamp)element.getParameter();
  60. else
  61. log.log(Level.SEVERE, "Unknown Parameter: " + name);
  62. }
  63. } // prepare
  64. /**
  65. * Perform process.
  66. * @return Message to be translated
  67. * @throws Exception
  68. */
  69. @Override
  70. protected String doIt() throws java.lang.Exception
  71. {
  72. log.fine("C_AcctSchema_ID=" + p_C_AcctSchema_ID
  73. + ",IsRecreate=" + p_IsRecreate
  74. + ",DateFrom=" + p_DateFrom);
  75. String msg = "";
  76. if (p_C_AcctSchema_ID != 0)
  77. msg = updateBalance(getCtx(), p_C_AcctSchema_ID,
  78. p_IsRecreate, p_DateFrom, get_TrxName(), this);
  79. else
  80. msg = updateBalanceClient(getCtx(),
  81. p_IsRecreate, p_DateFrom, get_TrxName(), this);
  82. return msg;
  83. } // doIt
  84. /**
  85. * Delete Balances
  86. * @param AD_Client_ID client
  87. * @param C_AcctSchema_ID accounting schema 0 for all
  88. * @param dateFrom null for all or first date to delete
  89. * @param trx transaction
  90. * @param svrPrc optional server process
  91. * @return Message to be translated
  92. */
  93. public static String deleteBalance (int AD_Client_ID, int C_AcctSchema_ID,
  94. Timestamp dateFrom, Trx trx, SvrProcess svrPrc)
  95. {
  96. ArrayList<Object> params = new ArrayList<Object>();
  97. StringBuffer sql = new StringBuffer ("DELETE FROM Fact_Acct_Balance WHERE AD_Client_ID=?");
  98. params.add(new Integer(AD_Client_ID));
  99. if (C_AcctSchema_ID != 0)
  100. {
  101. sql.append (" AND C_AcctSchema_ID=?");
  102. params.add(new Integer(C_AcctSchema_ID));
  103. }
  104. if (dateFrom != null)
  105. {
  106. sql.append(" AND DateAcct>=?");
  107. params.add(dateFrom);
  108. }
  109. //
  110. int no = DB.executeUpdate(sql.toString(), params, false, trx);
  111. String msg = "@Deleted@=" + no;
  112. s_log.info("C_AcctSchema_ID=" + C_AcctSchema_ID
  113. + ",DateAcct=" + dateFrom
  114. + " #=" + no);
  115. if (svrPrc != null)
  116. svrPrc.addLog(0, dateFrom, new BigDecimal(no), "Deleted");
  117. //
  118. return msg;
  119. } // deleteBalance
  120. /**
  121. * Update / Create Balances.
  122. * Called from FinReport, FactAcctReset (indirect)
  123. * @param AD_Client_ID client
  124. * @param C_AcctSchema_ID accounting schema 0 for all
  125. * @param deleteFirst delete balances first
  126. * @param dateFrom null for all or first date to delete/calculate
  127. * @param trx transaction
  128. * @param svrPrc optional server process
  129. * @return Message to be translated
  130. */
  131. public static String updateBalance (Ctx ctx, int C_AcctSchema_ID,
  132. boolean deleteFirst, Timestamp dateFrom, Trx trx,
  133. SvrProcess svrPrc)
  134. {
  135. s_log.info("C_AcctSchema_ID=" + C_AcctSchema_ID
  136. + ",DeleteFirst=" + deleteFirst
  137. + "DateFrom=" + dateFrom);
  138. long start = System.currentTimeMillis();
  139. ArrayList<MFactAccumulation> accums = MFactAccumulation.getAll(ctx, C_AcctSchema_ID);
  140. dateFrom = MFactAccumulation.getDateFrom(accums, dateFrom);
  141. // Potentially updating accumulated History - need to delete it.
  142. if (!deleteFirst && (accums.size() > 0))
  143. deleteFirst = true;
  144. if (deleteFirst)
  145. deleteBalance(ctx.getAD_Client_ID(), C_AcctSchema_ID,
  146. dateFrom, trx, svrPrc);
  147. // Update existing
  148. ArrayList<Object> params = new ArrayList<Object>();
  149. String sql = "UPDATE Fact_Acct_Balance ab "
  150. + "SET (AmtAcctDr, AmtAcctCr, Qty)= "
  151. + "(SELECT COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0) "
  152. + "FROM Fact_Acct a "
  153. + "WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID"
  154. + " AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)"
  155. + " AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType"
  156. + " AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)"
  157. + " AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)"
  158. + " AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)"
  159. + " AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)"
  160. + " AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0) "
  161. + "GROUP BY AD_Client_ID,AD_Org_ID, C_AcctSchema_ID, TRUNC(DateAcct),"
  162. + " Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  163. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID, C_Activity_ID,"
  164. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID) "
  165. + "WHERE C_AcctSchema_ID=?";
  166. params.add(new Integer(C_AcctSchema_ID));
  167. if (dateFrom != null)
  168. {
  169. sql += " AND DateAcct>=?";
  170. params.add(dateFrom);
  171. }
  172. sql += " AND EXISTS (SELECT 1 FROM Fact_Acct a "
  173. + "WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID"
  174. + " AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)"
  175. + " AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType"
  176. + " AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)"
  177. + " AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)"
  178. + " AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)"
  179. + " AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)"
  180. + " AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0) "
  181. /* maybe redundant
  182. + "GROUP BY AD_Client_ID,AD_Org_ID,"
  183. + " C_AcctSchema_ID, TRUNC(DateAcct,'DD'),"
  184. + " Account_ID, PostingType,"
  185. + " M_Product_ID, C_BPartner_ID,"
  186. + " C_Project_ID, AD_OrgTrx_ID,"
  187. + " C_SalesRegion_ID, C_Activity_ID,"
  188. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,"
  189. + " User1_ID, User2_ID, GL_Budget_ID
  190. */
  191. + ")";
  192. if (!deleteFirst)
  193. {
  194. int no = DB.executeUpdate(sql, params, false, trx);
  195. s_log.config("Updates=" + no);
  196. if (svrPrc != null)
  197. svrPrc.addLog(0, dateFrom, new BigDecimal(no), "Updates");
  198. }
  199. /** Insert **/
  200. params = new ArrayList<Object>();
  201. sql = "INSERT INTO Fact_Acct_Balance "
  202. + "(AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, DateAcct,"
  203. + " Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  204. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID,C_Activity_ID,"
  205. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID,"
  206. + " AmtAcctDr, AmtAcctCr, Qty) "
  207. //
  208. + "SELECT AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, TRUNC(DateAcct),"
  209. + " Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  210. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID,C_Activity_ID,"
  211. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID,"
  212. + " COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0) "
  213. + "FROM Fact_Acct a "
  214. + "WHERE C_AcctSchema_ID=?";
  215. params.add(new Integer(C_AcctSchema_ID));
  216. if (dateFrom != null)
  217. {
  218. sql += " AND DateAcct>=?";
  219. params.add(dateFrom);
  220. }
  221. if (!deleteFirst)
  222. sql += " AND NOT EXISTS (SELECT 1 FROM Fact_Acct_Balance x "
  223. + "WHERE a.AD_Client_ID=x.AD_Client_ID AND a.AD_Org_ID=x.AD_Org_ID"
  224. + " AND a.C_AcctSchema_ID=x.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(x.DateAcct)"
  225. + " AND a.Account_ID=x.Account_ID AND a.PostingType=x.PostingType"
  226. + " AND COALESCE(a.M_Product_ID,0)=COALESCE(x.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(x.C_BPartner_ID,0)"
  227. + " AND COALESCE(a.C_Project_ID,0)=COALESCE(x.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(x.AD_OrgTrx_ID,0)"
  228. + " AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(x.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(x.C_Activity_ID,0)"
  229. + " AND COALESCE(a.C_Campaign_ID,0)=COALESCE(x.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(x.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(x.C_LocFrom_ID,0)"
  230. + " AND COALESCE(a.User1_ID,0)=COALESCE(x.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(x.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(x.GL_Budget_ID,0) )";
  231. sql += " GROUP BY AD_Client_ID,AD_Org_ID, C_AcctSchema_ID, TRUNC(DateAcct),"
  232. + " Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  233. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID, C_Activity_ID,"
  234. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID";
  235. int no = DB.executeUpdate(sql, params, false, trx);
  236. s_log.config("Inserts=" + no);
  237. if (svrPrc != null)
  238. svrPrc.addLog(0, dateFrom, new BigDecimal(no), "Inserts");
  239. // Accumulation
  240. Timestamp acctToDate = null;
  241. Timestamp acctFromDate = dateFrom; // greater than (dateTo is LE)
  242. for (MFactAccumulation accum : accums)
  243. {
  244. String type = accum.getBalanceAccumulation();
  245. boolean ok = true;
  246. if (X_Fact_Accumulation.BALANCEACCUMULATION_Daily.equals(type))
  247. ;
  248. else if (X_Fact_Accumulation.BALANCEACCUMULATION_CalendarWeek.equals(type))
  249. {
  250. acctToDate = accum.getDateTo();
  251. ok = summarizeBalance(TimeUtil.TRUNC_WEEK, C_AcctSchema_ID,
  252. acctFromDate, acctToDate, trx, svrPrc);
  253. acctFromDate = accum.getDateTo();
  254. }
  255. else if (X_Fact_Accumulation.BALANCEACCUMULATION_CalendarMonth.equals(type))
  256. {
  257. acctToDate = accum.getDateTo();
  258. ok = summarizeBalance(TimeUtil.TRUNC_MONTH, C_AcctSchema_ID,
  259. acctFromDate, acctToDate, trx,svrPrc);
  260. acctFromDate = accum.getDateTo();
  261. }
  262. else if (X_Fact_Accumulation.BALANCEACCUMULATION_PeriodOfACompiereCalendar.equals(type))
  263. {
  264. int C_Calendar_ID = accum.getC_Calendar_ID();
  265. if (C_Calendar_ID != 0)
  266. {
  267. acctToDate = accum.getDateTo();
  268. acctFromDate = accum.getDateTo();
  269. }
  270. }
  271. if (!ok)
  272. {
  273. s_log.warning("Check Errors and re-run");
  274. }
  275. }
  276. start = System.currentTimeMillis() - start;
  277. s_log.info((start/1000) + " sec");
  278. return "#" + no;
  279. } // updateBalance
  280. /**
  281. * Update Balances based on Truncate Function
  282. * @param trunc TimeUtil.TRUNC_ (Oracle function)
  283. * @param C_AcctSchema_ID acct schema
  284. * @param acctFromDate optional from
  285. * @param acctToDate to
  286. * @param p_trx transaction name
  287. * @param svrPrc optional server process
  288. * @return true if no error
  289. */
  290. private static boolean summarizeBalance(String trunc, int C_AcctSchema_ID,
  291. Timestamp acctFromDate, Timestamp acctToDate, Trx trx,
  292. SvrProcess svrPrc)
  293. {
  294. SimpleDateFormat format = DisplayType.getDateFormat();
  295. String toDate = "\u2264" + format.format(acctToDate) + ": ";
  296. String whereTrunc = "TRUNC(DateAcct,'" + trunc + "')";
  297. StringBuffer whereRange = new StringBuffer("WHERE ");
  298. if (acctFromDate != null)
  299. whereRange.append("DateAcct>=").append(DB.TO_DATE(acctFromDate, true))
  300. .append(" AND ");
  301. whereRange.append("DateAcct<=").append(DB.TO_DATE(acctToDate, true));
  302. // Insert zeroes if not exists
  303. String sql = "INSERT INTO Fact_Acct_Balance"
  304. + " (AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, DateAcct,"
  305. + " Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  306. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID,C_Activity_ID,"
  307. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID,"
  308. + " AmtAcctDr, AmtAcctCr, Qty) "
  309. // Insert
  310. + "SELECT AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, " + whereTrunc
  311. + ", Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  312. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID,C_Activity_ID,"
  313. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID,"
  314. + " 0,0,0 "
  315. + "FROM Fact_Acct_Balance a "
  316. + whereRange
  317. + " AND C_AcctSchema_ID=" + C_AcctSchema_ID
  318. //
  319. + " AND NOT EXISTS (SELECT 1 FROM Fact_Acct_Balance x "
  320. + "WHERE a.AD_Client_ID=x.AD_Client_ID AND a.AD_Org_ID=x.AD_Org_ID"
  321. + " AND a.C_AcctSchema_ID=x.C_AcctSchema_ID AND TRUNC(a.DateAcct,'" + trunc + "')=TRUNC(x.DateAcct)"
  322. + " AND a.Account_ID=x.Account_ID AND a.PostingType=x.PostingType"
  323. + " AND COALESCE(a.M_Product_ID,0)=COALESCE(x.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(x.C_BPartner_ID,0)"
  324. + " AND COALESCE(a.C_Project_ID,0)=COALESCE(x.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(x.AD_OrgTrx_ID,0)"
  325. + " AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(x.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(x.C_Activity_ID,0)"
  326. + " AND COALESCE(a.C_Campaign_ID,0)=COALESCE(x.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(x.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(x.C_LocFrom_ID,0)"
  327. + " AND COALESCE(a.User1_ID,0)=COALESCE(x.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(x.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(x.GL_Budget_ID,0) )"
  328. //
  329. + " GROUP BY AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, " + whereTrunc
  330. + ", Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  331. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID,C_Activity_ID,"
  332. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID";
  333. int noInsert = DB.executeUpdate(sql, trx);
  334. s_log.config("Insert " + trunc + " #" + noInsert);
  335. if (svrPrc != null)
  336. svrPrc.addLog(0, acctFromDate, new BigDecimal(noInsert), toDate + "Accumulation Insert");
  337. // Update
  338. sql = "UPDATE Fact_Acct_Balance a SET (AmtAcctDr, AmtAcctCr, Qty) = "
  339. + "(SELECT COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0) "
  340. + "FROM Fact_Acct_Balance x "
  341. + whereRange
  342. + " AND TRUNC(a.DateAcct,'" + trunc + "')=TRUNC(x.DateAcct,'" + trunc + "')"
  343. + " AND a.AD_Client_ID=x.AD_Client_ID AND a.AD_Org_ID=x.AD_Org_ID"
  344. + " AND a.C_AcctSchema_ID=x.C_AcctSchema_ID"
  345. + " AND a.Account_ID=x.Account_ID AND a.PostingType=x.PostingType"
  346. + " AND COALESCE(a.M_Product_ID,0)=COALESCE(x.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(x.C_BPartner_ID,0)"
  347. + " AND COALESCE(a.C_Project_ID,0)=COALESCE(x.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(x.AD_OrgTrx_ID,0)"
  348. + " AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(x.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(x.C_Activity_ID,0)"
  349. + " AND COALESCE(a.C_Campaign_ID,0)=COALESCE(x.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(x.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(x.C_LocFrom_ID,0)"
  350. + " AND COALESCE(a.User1_ID,0)=COALESCE(x.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(x.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(x.GL_Budget_ID,0) "
  351. + "GROUP BY AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, " + whereTrunc
  352. + ", Account_ID, PostingType, M_Product_ID, C_BPartner_ID,"
  353. + " C_Project_ID, AD_OrgTrx_ID, C_SalesRegion_ID,C_Activity_ID,"
  354. + " C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID, GL_Budget_ID"
  355. + ") "
  356. // Update WHERE
  357. + whereRange
  358. + " AND C_AcctSchema_ID=" + C_AcctSchema_ID
  359. + " AND DateAcct=" + whereTrunc;
  360. s_log.finest(sql);
  361. int noUpdate = DB.executeUpdate(sql, trx);
  362. s_log.config("Update " + trunc + " #" + noUpdate);
  363. if (svrPrc != null)
  364. svrPrc.addLog(0, acctFromDate, new BigDecimal(noUpdate), toDate + "Accumulation Update");
  365. if (noUpdate == 0) // nothing to delete if nothing summarized
  366. return true;
  367. // Delete
  368. sql = "DELETE FROM Fact_Acct_Balance "
  369. + whereRange
  370. + " AND C_AcctSchema_ID=" + C_AcctSchema_ID
  371. + " AND DateAcct<>" + whereTrunc;
  372. s_log.finest(sql);
  373. int noDelete = DB.executeUpdate(sql, trx);
  374. float factor = 1;
  375. if (noInsert != 0)
  376. factor = noDelete / noInsert;
  377. else if (noUpdate != 0)
  378. factor = noDelete / noUpdate;
  379. s_log.config("Delete " + trunc + " #" + noDelete + " - Factor=" + factor);
  380. if (svrPrc != null)
  381. svrPrc.addLog(0, acctFromDate, new BigDecimal(noDelete), toDate + "Accumulation Delete - Factor=" + factor);
  382. return (noUpdate >= 0) && (noDelete >= 0);
  383. } // summarizeBalance
  384. /**
  385. * Update Balance of Client
  386. * @param ctx context
  387. * @param deleteFirst delete first
  388. * @param dateFrom null for all or first date to delete/calculate
  389. * @param trx transaction
  390. * @param svrPrc optional server process
  391. * @return info
  392. */
  393. public static String updateBalanceClient (Ctx ctx,
  394. boolean deleteFirst, Timestamp dateFrom, Trx trx, SvrProcess svrPrc)
  395. {
  396. int AD_Client_ID = ctx.getAD_Client_ID();
  397. StringBuffer info = new StringBuffer();
  398. MAcctSchema[] ass = MAcctSchema.getClientAcctSchema(ctx, AD_Client_ID);
  399. for (MAcctSchema as : ass)
  400. {
  401. if (info.length() > 0)
  402. info.append(" - ");
  403. String msg = updateBalance(ctx, as.getC_AcctSchema_ID(),
  404. deleteFirst, dateFrom, trx, svrPrc);
  405. info.append(as.getName()).append(":").append(msg);
  406. }
  407. return info.toString();
  408. } // updateBalanceClient
  409. } // FinBalance