KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openbravo > erpCommon > ad_forms > FactLine


1 /*
2  ******************************************************************************
3  * The contents of this file are subject to the Compiere License Version 1.1
4  * ("License"); You may not use this file except in compliance with the License
5  * You may obtain a copy of the License at http://www.compiere.org/license.html
6  * Software distributed under the License is distributed on an "AS IS" basis,
7  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
8  * the specific language governing rights and limitations under the License.
9  * The Original Code is Compiere ERP & CRM Business Solution
10  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
11  * Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke, parts
12  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
13  * Contributor(s): Openbravo SL
14  * Contributions are Copyright (C) 2001-2006 Openbravo S.L.
15  ******************************************************************************
16 */

17 package org.openbravo.erpCommon.ad_forms;
18
19 import org.openbravo.erpCommon.utility.SequenceIdData;
20 import org.openbravo.base.secureApp.VariablesSecureApp;
21 import org.openbravo.exception.*;
22 import java.math.*;
23 import java.sql.*;
24 import javax.servlet.*;
25 import org.apache.log4j.Logger ;
26 // imports for transactions
27
import org.openbravo.database.ConnectionProvider;
28 import java.sql.Connection JavaDoc;
29
30
31
32 public class FactLine {
33   static Logger log4jFactLine = Logger.getLogger(FactLine.class);
34
35   public final BigDecimal ZERO = new BigDecimal("0");
36
37   private AcctServer m_docVO = null;
38   private DocLine m_docLine = null;
39   private Account m_acct = null;
40
41   // Account
42
private String JavaDoc m_C_AcctSchema_ID = "";
43   private AcctSchema m_acctSchema = null;
44
45   private String JavaDoc m_C_Currency_ID = "";
46   private String JavaDoc m_AmtSourceDr = "";
47   private String JavaDoc m_AmtSourceCr = "";
48   // Acct Amt
49
private String JavaDoc m_AmtAcctDr = "";
50   private String JavaDoc m_AmtAcctCr = "";
51   // Journal Info
52
private String JavaDoc m_GL_Budget_ID = "";
53   private String JavaDoc m_GL_Category_ID = "";
54   private String JavaDoc m_PostingType = "";
55   // Direstly set
56
private String JavaDoc m_M_Locator_ID = "";
57   private String JavaDoc m_C_LocFrom_ID = "";
58   private String JavaDoc m_C_LocTo_ID = "";
59   // Balancing Segments
60
private String JavaDoc m_AD_Org_ID = "";
61   // Doc ID
62
private String JavaDoc m_AD_Table_ID;
63   private String JavaDoc m_Record_ID;
64   private String JavaDoc m_Line_ID;
65   /**
66    * Public variables are set by Fact.createLine
67    */

68   private String JavaDoc m_Fact_Acct_ID;
69   public String JavaDoc m_Fact_Acct_Group_ID;
70   public String JavaDoc m_SeqNo;
71   public String JavaDoc m_DocBaseType;
72
73
74   /**
75    * Constructor
76    *
77    * @param AD_Table_ID - Table of Document Source
78    * @param Record_ID - Record of document
79    * @param Line_ID - Optional line id
80    */

81   public FactLine (String JavaDoc AD_Table_ID, String JavaDoc Record_ID, String JavaDoc Line_ID, String JavaDoc Fact_Acct_Group_ID, String JavaDoc SeqNo, String JavaDoc DocBaseType){
82     m_AD_Table_ID = AD_Table_ID;
83     m_Record_ID = Record_ID;
84     m_Line_ID = Line_ID;
85     m_Fact_Acct_Group_ID = Fact_Acct_Group_ID;
86     m_SeqNo = SeqNo;
87     m_DocBaseType = DocBaseType;
88   } // FactLine
89

90   /**
91    * Constructor
92    *
93    * @param AD_Table_ID - Table of Document Source
94    * @param Record_ID - Record of document
95    * @param Line_ID - Optional line id
96    */

97   public FactLine (String JavaDoc AD_Table_ID, String JavaDoc Record_ID, String JavaDoc Line_ID){
98     m_AD_Table_ID = AD_Table_ID;
99     m_Record_ID = Record_ID;
100     m_Line_ID = Line_ID;
101   } // FactLine
102

103   /**
104    * Dispose
105    */

106   public void dispose(){
107     m_docVO = null;
108     m_docLine = null;
109     m_acct = null;
110   } // dispose
111

112   /**
113    * Set Source Amounts
114    * @param C_Currency_ID currency
115    * @param AmtSourceDr source amount dr
116    * @param AmtSourceCr source amount cr
117    * @return true, if any if the amount is not zero
118    */

119   public boolean setAmtSource (String JavaDoc C_Currency_ID, String JavaDoc AmtSourceDr, String JavaDoc AmtSourceCr){
120     m_C_Currency_ID = C_Currency_ID;
121     m_AmtSourceDr = AmtSourceDr;
122     if (m_AmtSourceDr.equals(""))
123       m_AmtSourceDr = "0";
124     m_AmtSourceCr = AmtSourceCr;
125     if (m_AmtSourceCr.equals(""))
126       m_AmtSourceCr = "0";
127     // one needs to be non zero
128
if (m_AmtSourceDr.equals("0") && m_AmtSourceCr.equals("0"))
129       return false;
130     return true;
131   } // setAmtSource
132

133   /**
134    * Set Account Info
135    * @param acctSchema account schema
136    * @param acct account
137    */

138   public void setAccount (AcctSchema acctSchema, Account acct) {
139     m_acctSchema = acctSchema;
140     m_C_AcctSchema_ID = acctSchema.getC_AcctSchema_ID();
141     m_acct = acct;
142   } // setAccount
143

144   /**
145    * Set Accounted Amounts (alternative: call convert)
146    * @param AmtAcctDr acct amount dr
147    * @param AmtAcctCr acct amount cr
148    */

149   public void setAmtAcct(String JavaDoc AmtAcctDr, String JavaDoc AmtAcctCr){
150     m_AmtAcctDr = AmtAcctDr;
151     m_AmtAcctCr = AmtAcctCr;
152   } // setAmtAcct
153

154   /**
155    * Set Journal Info
156    * @param GL_Budget_ID budget
157    * @param GL_Category_ID category
158    */

159   public void setJournalInfo(String JavaDoc GL_Budget_ID, String JavaDoc GL_Category_ID){
160     m_GL_Budget_ID = GL_Budget_ID;
161     m_GL_Category_ID = GL_Category_ID;
162   } // setJournalInfo
163

164     /**
165    * Set Posting Type
166    * @param PostingType posting type
167    */

168   public void setPostingType(String JavaDoc PostingType){
169     m_PostingType = PostingType;
170   } // setPostingType
171

172   /**
173    * Set Document Info
174    * @param docVO document value object
175    * @param docLine doc line
176    */

177   public void setDocumentInfo(AcctServer docVO, DocLine docLine){
178     m_docVO = docVO;
179     m_docLine = docLine;
180   } // setDocumentInfo
181

182
183
184   /**
185    * Convert to Accounted Currency
186    *
187    * @param Acct_Currency_ID acct currency
188    * @param ConversionDate conversion date
189    * @param CurrencyRateType rate type
190    * @return true if converted
191    */

192   public boolean convert (String JavaDoc Acct_Currency_ID, String JavaDoc ConversionDate, String JavaDoc CurrencyRateType,ConnectionProvider conn){
193     // Document has no currency
194
log4jFactLine.debug("convert - beginning");
195     log4jFactLine.debug("convert - m_C_Currency_ID : " + m_C_Currency_ID);
196     if (m_C_Currency_ID==null || m_C_Currency_ID.equals(AcctServer.NO_CURRENCY))
197       m_C_Currency_ID = Acct_Currency_ID;
198     log4jFactLine.debug("convert - Acct_Currency_ID : " + Acct_Currency_ID);
199     if (Acct_Currency_ID.equals(m_C_Currency_ID)){
200       m_AmtAcctDr = m_AmtSourceDr;
201       m_AmtAcctCr = m_AmtSourceCr;
202       return true;
203     }
204     if (m_docVO == null){
205       log4jFactLine.warn("convert - No Document VO");
206       return false;
207     }
208     m_AmtAcctDr = AcctServer.getConvertedAmt (m_AmtSourceDr, m_C_Currency_ID, Acct_Currency_ID,
209       ConversionDate, CurrencyRateType, m_docVO.AD_Client_ID, m_docVO.AD_Org_ID,conn);
210     if (m_AmtAcctDr == null || m_AmtAcctDr.equals(""))return false;
211     m_AmtAcctCr = AcctServer.getConvertedAmt (m_AmtSourceCr, m_C_Currency_ID, Acct_Currency_ID,
212       ConversionDate, CurrencyRateType, m_docVO.AD_Client_ID, m_docVO.AD_Org_ID,conn);
213     return true;
214   } // convert
215

216   /**
217    * Set Location from Organization
218    * @param AD_Org_ID org
219    * @param isFrom from
220    */

221   public void setLocationFromOrg (String JavaDoc AD_Org_ID, boolean isFrom,ConnectionProvider conn){
222     if (AD_Org_ID.equals(""))return;
223     String JavaDoc C_Location_ID = "";
224     FactLineData [] data = null;
225     try{
226       data = FactLineData.select(conn,AD_Org_ID);
227     }catch(ServletException e){
228       log4jFactLine.warn(e);
229     }
230     if(data.length>0)C_Location_ID = data[0].location;
231     if (!C_Location_ID.equals(""))
232       setLocation (C_Location_ID, isFrom);
233   } // setLocationFromOrg
234

235   /**
236    * Set Location
237    * @param C_Location_ID location
238    * @param isFrom from
239    */

240   public void setLocation (String JavaDoc C_Location_ID, boolean isFrom){
241     if (isFrom)
242       m_C_LocFrom_ID = C_Location_ID;
243     else
244       m_C_LocTo_ID = C_Location_ID;
245   } // setLocator
246

247   /**
248    * Get AD_Org_ID (balancing segment).
249    * (if not set directly - from document line, document, account, locator)
250    * <p>
251    * Note that Locator needs to be set before - otherwise
252    * segment balancing might produce the wrong results
253    * @return AD_Org_ID
254    */

255   public String JavaDoc getAD_Org_ID (ConnectionProvider conn){
256     if (m_AD_Org_ID!=null && !m_AD_Org_ID.equals("")) // set earlier
257
return m_AD_Org_ID;
258     // Prio 1 - get from locator - if exist
259
if (m_M_Locator_ID!=null && !m_M_Locator_ID.equals("")){
260       FactLineData [] data = null;
261       try{
262         data = FactLineData.selectOrg(conn,m_M_Locator_ID,m_docVO.AD_Client_ID);
263       }catch(ServletException e){
264         log4jFactLine.warn(e);
265       }
266       if (data!=null && data.length>0){
267         m_AD_Org_ID = data[0].org;
268         log4jFactLine.debug("setAD_Org_ID=" + m_AD_Org_ID + " (1 from M_Locator_ID=" + m_M_Locator_ID + ")");
269       }else log4jFactLine.warn("getAD_Org_ID - Did not find M_Locator_ID=" + m_M_Locator_ID);
270     } // M_Locator_ID != 0
271

272     // Prio 2 - get from doc line - if exists (document context overwrites)
273
if ((m_AD_Org_ID==null || m_AD_Org_ID.equals("")||m_AD_Org_ID.equals("0")) && m_docLine != null){
274       m_AD_Org_ID = m_docLine.m_AD_Org_ID;
275       log4jFactLine.debug ("setAD_Org_ID=" + m_AD_Org_ID + " (2 from DocumentLine)");
276     }
277     // Prio 3 - get from doc - if not GL
278
if (m_AD_Org_ID==null || m_AD_Org_ID.equals("")||m_AD_Org_ID.equals("0")){
279       if (AcctServer.DOCTYPE_GLJournal.equals (m_docVO.DocumentType)){
280         m_AD_Org_ID = m_acct.getAD_Org_ID (); // inter-company GL
281
log4jFactLine.debug ("setAD_Org_ID=" + m_AD_Org_ID + " (3 from Acct)");
282       }
283       else{
284         m_AD_Org_ID = m_docVO.AD_Org_ID;
285         log4jFactLine.debug("setAD_Org_ID=" + m_AD_Org_ID + " (3 from Document)");
286       }
287     }
288     // Prio 4 - get from account - if not GL
289
if (m_AD_Org_ID==null || m_AD_Org_ID.equals("")||m_AD_Org_ID.equals("0")){
290       if (AcctServer.DOCTYPE_GLJournal.equals (m_docVO.DocumentType)){
291         m_AD_Org_ID = m_docVO.AD_Org_ID;
292         log4jFactLine.debug("setAD_Org_ID=" + m_AD_Org_ID + " (4 from Document)");
293       }
294       else{
295         m_AD_Org_ID = m_acct.getAD_Org_ID ();
296         log4jFactLine.debug ("setAD_Org_ID=" + m_AD_Org_ID + " (4 from Acct)");
297       }
298     }
299     //
300
return (m_AD_Org_ID==null)?"":m_AD_Org_ID;
301   } // getAD_Org_ID
302

303   /**
304    * Set AD_Org_ID (balancing segment)
305    * @param AD_Org_ID org
306    */

307   public void setAD_Org_ID (String JavaDoc AD_Org_ID){
308     if (!AD_Org_ID.equals(""))
309       m_AD_Org_ID = AD_Org_ID;
310   } // setAD_Org_ID
311

312   /**
313    * Set Warehouse Locator.
314    * - will overwrite Organization -
315    * @param M_Locator_ID locator
316    */

317   public void setM_Locator_ID (String JavaDoc M_Locator_ID)
318   {
319     m_M_Locator_ID = M_Locator_ID;
320     // should not happen - consequence is potentially screwed Org segment balancing
321
if (!m_AD_Org_ID.equals(""))
322       log4jFactLine.warn("setM_Locator_ID - Organization already calculated");
323   } // setM_Locator_ID
324

325
326   /**
327    * Returns Source Balance of line
328    * @return source balance
329    */

330   public BigDecimal getSourceBalance(){
331     if (m_AmtSourceDr.equals(""))
332       m_AmtSourceDr = "0";
333     if (m_AmtSourceCr.equals(""))
334       m_AmtSourceCr = "0";
335     BigDecimal AmtSourceDr = new BigDecimal(m_AmtSourceDr);
336     BigDecimal AmtSourceCr = new BigDecimal(m_AmtSourceCr);
337     //
338
return AmtSourceDr.subtract(AmtSourceCr);
339   } // getSourceBalance
340

341
342   /**
343    * Set Location from Busoness Partner Location
344    * @param C_BPartner_Location_ID bp location
345    * @param isFrom from
346    */

347   public void setLocationFromBPartner (String JavaDoc C_BPartner_Location_ID, boolean isFrom,ConnectionProvider conn){
348     if (C_BPartner_Location_ID.equals(""))
349       return;
350     String JavaDoc C_Location_ID = "";
351     FactLineData[] data =null;
352     try{
353       data = FactLineData.selectLocation(conn,C_BPartner_Location_ID);
354     }catch(ServletException e){
355       log4jFactLine.warn(e);
356     }
357     if (data.length>0){
358     C_Location_ID = data[0].location;
359     }
360     if (!C_Location_ID.equals(""))
361       setLocation (C_Location_ID, isFrom);
362   } // setLocationFromBPartner
363

364   /**
365    * Set Location from Locator
366    * @param M_Locator_ID locator
367    * @param isFrom from
368    */

369   public void setLocationFromLocator (String JavaDoc M_Locator_ID, boolean isFrom, ConnectionProvider conn){
370     if (M_Locator_ID.equals(""))
371       return;
372     String JavaDoc C_Location_ID = "";
373     FactLineData [] data = null;
374     try{
375       data = FactLineData.selectLocationFromLocator(conn, M_Locator_ID);
376     }catch(ServletException e){
377       log4jFactLine.debug(e);
378     }
379     C_Location_ID = data[0].location;
380     if (!C_Location_ID.equals(""))
381       setLocation (C_Location_ID, isFrom);
382   } // setLocationFromLocator
383

384
385   /**
386    * Save to Disk.
387    * Get Info from this, doc-line, document, account
388    * Optionally create Revenue Recognition Plan
389    * @param con connection
390    * @return true if saved
391    */

392   public boolean save (Connection JavaDoc con,ConnectionProvider conn,VariablesSecureApp vars)throws ServletException{
393     /**
394      * Fill variables
395      */

396     String JavaDoc AD_Client_ID = getAD_Client_ID();
397     String JavaDoc AD_Org_ID = getAD_Org_ID(conn);
398
399     // Set Account
400
String JavaDoc Account_ID = m_acct.Account_ID;
401     if (Account_ID == null) Account_ID="";
402     // Doc Dates
403
String JavaDoc DateDoc = "";
404     if (m_docLine != null)
405       DateDoc = m_docLine.m_DateDoc;
406     if (DateDoc == null || DateDoc.equals(""))
407       DateDoc = m_docVO.DateDoc;
408     String JavaDoc DateAcct = "";
409     if (m_docLine != null)
410       DateAcct = m_docLine.m_DateAcct;
411     if (DateAcct == null || DateAcct.equals(""))
412       DateAcct = m_docVO.DateAcct;
413     log4jFactLine.debug("FactLine - save - antes de Record_ID2 " + m_Record_ID);
414     String JavaDoc Record_ID2 = "";
415     if (m_docLine != null)
416       Record_ID2 = m_docLine.m_Record_Id2;
417     log4jFactLine.debug("FactLine - save - despues de Record_ID2 = " + Record_ID2);
418     String JavaDoc C_Period_ID = "";
419     if (m_docLine != null)
420       C_Period_ID = setC_Period_ID(m_docVO,m_docLine.m_DateAcct, conn);
421     if (C_Period_ID == null || C_Period_ID.equals(""))
422       C_Period_ID = m_docVO.C_Period_ID;
423
424     // Set Line Optional Info
425
String JavaDoc C_UOM_ID = "";
426     String JavaDoc Qty = m_docVO.Qty;
427     String JavaDoc C_Tax_ID = "";
428     if (m_docLine != null){
429       C_UOM_ID = m_docLine.m_C_UOM_ID;
430       Qty = m_docLine.m_qty;
431       C_Tax_ID = m_docLine.m_C_Tax_ID;
432     }
433     log4jFactLine.debug("FactLine - save - despues de line optional info");
434     // Set Account Info
435
String JavaDoc M_Product_ID = "";
436     if (m_docLine != null)
437       M_Product_ID = m_docLine.m_M_Product_ID;
438     if (M_Product_ID==null) M_Product_ID="";
439     if (M_Product_ID.equals(""))
440       M_Product_ID = m_docVO.M_Product_ID;
441     if (M_Product_ID==null) M_Product_ID="";
442     if (M_Product_ID.equals(""))
443       M_Product_ID = m_acct.M_Product_ID;
444     if (M_Product_ID==null) M_Product_ID="";
445
446     String JavaDoc C_LocFrom_ID = m_C_LocFrom_ID;
447     if (C_LocFrom_ID==null) C_LocFrom_ID="";
448     if (C_LocFrom_ID.equals("") && m_docLine != null)
449       C_LocFrom_ID = m_docLine.m_C_LocFrom_ID;
450     if (C_LocFrom_ID==null) C_LocFrom_ID="";
451     if (C_LocFrom_ID.equals(""))
452       C_LocFrom_ID = m_docVO.C_LocFrom_ID;
453     if (C_LocFrom_ID==null) C_LocFrom_ID="";
454     if (C_LocFrom_ID.equals(""))
455       C_LocFrom_ID = m_acct.C_LocFrom_ID;
456     if (C_LocFrom_ID==null) C_LocFrom_ID="";
457
458     String JavaDoc C_LocTo_ID = m_C_LocFrom_ID;//Here Compiere was wrong, they had locFrom
459
if (C_LocTo_ID==null) C_LocTo_ID="";
460     if (C_LocTo_ID.equals("") && m_docLine != null)
461       C_LocTo_ID = m_docLine.m_C_LocTo_ID;
462     if (C_LocTo_ID==null) C_LocTo_ID="";
463     if (C_LocTo_ID.equals(""))
464       C_LocTo_ID = m_docVO.C_LocTo_ID;
465     if (C_LocTo_ID==null) C_LocTo_ID="";
466     if (C_LocTo_ID.equals(""))
467       C_LocTo_ID = m_acct.C_LocTo_ID;
468     if (C_LocTo_ID==null) C_LocTo_ID="";
469
470     String JavaDoc C_BPartner_ID = "";
471     if (m_docLine != null)
472       C_BPartner_ID = m_docLine.m_C_BPartner_ID;
473     if (C_BPartner_ID==null) C_BPartner_ID="";
474     if (C_BPartner_ID.equals(""))
475       C_BPartner_ID = m_docVO.C_BPartner_ID;
476     if (C_BPartner_ID==null) C_BPartner_ID="";
477     if (C_BPartner_ID.equals(""))
478       C_BPartner_ID = m_acct.C_BPartner_ID;
479     if (C_BPartner_ID==null) C_BPartner_ID="";
480
481     String JavaDoc AD_OrgTrx_ID = "";
482     if (m_docLine != null)
483       AD_OrgTrx_ID = m_docLine.m_AD_OrgTrx_ID;
484     if (AD_OrgTrx_ID==null) AD_OrgTrx_ID="";
485     if (AD_OrgTrx_ID.equals(""))
486       AD_OrgTrx_ID = m_docVO.AD_OrgTrx_ID;
487     if (AD_OrgTrx_ID==null) AD_OrgTrx_ID="";
488     if (AD_OrgTrx_ID.equals(""))
489       AD_OrgTrx_ID = m_acct.AD_OrgTrx_ID;
490     if (AD_OrgTrx_ID==null) AD_OrgTrx_ID="";
491
492     String JavaDoc C_SalesRegion_ID = getC_SalesRegion_ID(conn);
493
494     String JavaDoc C_Project_ID = "";
495     if (m_docLine != null)
496       C_Project_ID = m_docLine.m_C_Project_ID;
497     if (C_Project_ID==null) C_Project_ID="";
498     if (C_Project_ID.equals(""))
499       C_Project_ID = m_docVO.C_Project_ID;
500     if (C_Project_ID==null) C_Project_ID="";
501     if (C_Project_ID.equals(""))
502       C_Project_ID = m_acct.C_Project_ID;
503     if (C_Project_ID==null) C_Project_ID="";
504
505     String JavaDoc C_Campaign_ID = "";
506     if (m_docLine != null)
507       C_Campaign_ID = m_docLine.m_C_Campaign_ID;
508     if (C_Campaign_ID==null) C_Campaign_ID="";
509     if (C_Campaign_ID.equals(""))
510       C_Campaign_ID = m_docVO.C_Campaign_ID;
511     if (C_Campaign_ID==null) C_Campaign_ID="";
512     if (C_Campaign_ID.equals(""))
513       C_Campaign_ID = m_acct.C_Campaign_ID;
514     if (C_Campaign_ID==null) C_Campaign_ID="";
515
516     String JavaDoc C_Activity_ID = "";
517     if (m_docLine != null)
518       C_Activity_ID = m_docLine.m_C_Activity_ID;
519     if (C_Activity_ID==null) C_Activity_ID="";
520     if (C_Activity_ID.equals(""))
521       C_Activity_ID = m_docVO.C_Activity_ID;
522     if (C_Activity_ID==null) C_Activity_ID="";
523     if (C_Activity_ID.equals(""))
524       C_Activity_ID = m_acct.C_Activity_ID;
525     if (C_Activity_ID==null) C_Activity_ID="";
526
527     String JavaDoc User1_ID = "";
528     if (m_docLine != null)
529       User1_ID = m_docLine.m_User1_ID;
530     if (User1_ID==null) User1_ID="";
531     if (User1_ID.equals(""))
532       User1_ID = m_docVO.User1_ID;
533     if (User1_ID==null) User1_ID="";
534     if (User1_ID.equals(""))
535       User1_ID = m_acct.User1_ID;
536     if (User1_ID==null) User1_ID="";
537
538     String JavaDoc User2_ID = "";
539     if (m_docLine != null)
540       User2_ID = m_docLine.m_User2_ID;
541     if (User2_ID==null) User2_ID="";
542     if (User2_ID.equals(""))
543       User2_ID = m_docVO.User2_ID;
544     if (User2_ID==null) User2_ID="";
545     if (User2_ID.equals(""))
546       User2_ID = m_acct.User2_ID;
547     if (User2_ID==null) User2_ID="";
548
549     log4jFactLine.debug("FactLine - save - antes de Revenue Recognition for AR Invoices");
550
551     // Revenue Recognition for AR Invoices
552
if (m_docVO.DocumentType.equals(AcctServer.DOCTYPE_ARInvoice) &&
553       m_docLine != null && m_docLine.p_productInfo!=null && m_docLine.getC_RevenueRecognition_ID() != null && !m_docLine.getC_RevenueRecognition_ID().equals("")){
554       Account_ID = createRevenueRecognition(con,conn,m_docLine.getC_RevenueRecognition_ID(), m_docLine.m_TrxLine_ID,AD_Client_ID, AD_Org_ID, "0", Account_ID,
555         M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID,C_LocFrom_ID, C_LocTo_ID, C_SalesRegion_ID, C_Project_ID,C_Campaign_ID, C_Activity_ID, User1_ID, User2_ID, vars);
556     }
557     log4jFactLine.debug("FactLine - save - despues de Revenue Recognition for AR Invoices");
558     // Description
559
StringBuffer JavaDoc description = new StringBuffer JavaDoc();
560     description = getDescription(conn , C_BPartner_ID,m_C_AcctSchema_ID,m_AD_Table_ID, m_Record_ID, (m_docLine!=null?m_docLine.m_TrxLine_ID:null));
561     int no =0;
562     try{
563       /**
564        * Create SQL Statement
565        */

566       m_Fact_Acct_ID = SequenceIdData.getSequence(conn, "Fact_Acct", vars.getClient());
567       /**
568        * Save to DB
569        */

570       log4jFactLine.debug("FactLine - save - m_Record_ID = " + m_Record_ID + " - Account_ID = " + Account_ID + " - m_Fact_Acct_Group_ID = " + m_Fact_Acct_Group_ID + " - m_SeqNo = " + m_SeqNo);
571       FactLineData [] cuenta = FactLineData.selectAccountValue(conn, Account_ID);
572       BigDecimal zero = new BigDecimal("0.0");
573       if(zero.compareTo(new BigDecimal(m_AmtSourceDr))==0 && zero.compareTo(new BigDecimal(m_AmtSourceCr))==0 && zero.compareTo(new BigDecimal(m_AmtAcctDr))==0 && zero.compareTo(new BigDecimal(m_AmtAcctCr))==0) return true;
574       else no = FactLineData.insertFactAct(con,conn,m_Fact_Acct_ID,AD_Client_ID,AD_Org_ID,m_C_AcctSchema_ID,Account_ID, cuenta[0].value,
575         cuenta[0].description,DateDoc,DateAcct,C_Period_ID,m_AD_Table_ID,m_Record_ID,m_Line_ID,m_GL_Category_ID,m_GL_Budget_ID,C_Tax_ID,
576         m_PostingType,m_C_Currency_ID,m_AmtSourceDr,m_AmtSourceCr,m_AmtAcctDr,m_AmtAcctCr,C_UOM_ID,Qty,m_M_Locator_ID,
577         M_Product_ID,C_BPartner_ID,AD_OrgTrx_ID,C_LocFrom_ID,C_LocTo_ID,C_SalesRegion_ID,C_Project_ID,C_Campaign_ID,
578         C_Activity_ID,User1_ID,User2_ID,description.toString(), m_Fact_Acct_Group_ID, m_SeqNo, m_DocBaseType, Record_ID2);
579       if(m_docVO.m_IsOpening.equals("Y")) FactLineData.updateFactAcct(con,conn,m_AD_Table_ID,m_Record_ID);
580     }catch(ServletException e){
581       log4jFactLine.warn(e);
582     }
583     return no==1;
584   } // save
585

586   /**
587    * Get AD_Client
588    * @return AD_Client_ID
589    */

590   private String JavaDoc getAD_Client_ID(){
591     String JavaDoc AD_Client_ID = m_docVO.AD_Client_ID;
592     if (AD_Client_ID==null || AD_Client_ID.equals(""))
593       AD_Client_ID = m_acct.AD_Client_ID;
594     return (AD_Client_ID==null)?"":AD_Client_ID;
595   } // getAD_Client_ID
596

597   /**
598    * Get/derive Sales Region
599    * @return Sales Region
600    */

601   private String JavaDoc getC_SalesRegion_ID (ConnectionProvider conn){
602     String JavaDoc C_SalesRegion_ID = "";
603     if (m_docLine != null)
604       C_SalesRegion_ID = m_docLine.m_C_SalesRegion_ID;
605     if (C_SalesRegion_ID==null) C_SalesRegion_ID="";
606     if (C_SalesRegion_ID.equals(""))
607       C_SalesRegion_ID = m_docVO.C_SalesRegion_ID;
608     if (C_SalesRegion_ID==null) C_SalesRegion_ID="";
609     if (C_SalesRegion_ID.equals("") && !m_docVO.BP_C_SalesRegion_ID.equals(""))
610       C_SalesRegion_ID = m_docVO.BP_C_SalesRegion_ID;
611     if (C_SalesRegion_ID==null) C_SalesRegion_ID="";
612     // derive SalesRegion if AcctSegment
613
if (C_SalesRegion_ID.equals("") && !m_docVO.C_BPartner_Location_ID.equals("") && m_docVO.BP_C_SalesRegion_ID.equals("")// never tried
614
&& m_acctSchema.isAcctSchemaElement(AcctSchemaElement.SEGMENT_SalesRegion)){
615       FactLineData [] data = null;
616       try{
617         data = FactLineData.selectSalesRegion(conn,m_docVO.C_BPartner_Location_ID);
618       }catch(ServletException e){
619         log4jFactLine.warn(e);
620       }
621       if (data.length>0){
622       C_SalesRegion_ID = data[0].salesregion;
623       }
624       if (C_SalesRegion_ID!=null && !C_SalesRegion_ID.equals(""))m_docVO.BP_C_SalesRegion_ID = C_SalesRegion_ID;// save
625
else m_docVO.BP_C_SalesRegion_ID = ""; // don't try again
626
log4jFactLine.debug("getC_SalesRegion_ID=" + C_SalesRegion_ID + " (from BPL)" );
627     }
628     if (C_SalesRegion_ID==null || C_SalesRegion_ID.equals(""))
629       C_SalesRegion_ID = m_acct.C_SalesRegion_ID;
630     //
631
return (C_SalesRegion_ID==null)?"":C_SalesRegion_ID;
632   } // getC_SalesRegion_ID
633

634   /**
635    * Revenue Recognition.
636    * Called from FactLine.save
637    * <p>
638    * Create Revenue recognition plan and return Unearned Revenue account
639    * to be used instead of Revenue Account. If not found, it returns
640    * the revenue account.
641    *
642    * @param con connection
643    * @param C_RevenueRecognition_ID revenue recognition
644    * @param C_InvoiceLine_ID invoice line
645    * @param AD_Client_ID client
646    * @param AD_Org_ID org
647    * @param AD_User_ID user
648    * @param Account_ID of Revenue Account
649    * @param M_Product_ID product
650    * @param C_BPartner_ID bpartner
651    * @param AD_OrgTrx_ID trx org
652    * @param C_LocFrom_ID loc from
653    * @param C_LocTo_ID loc to
654    * @param C_SRegion_ID sales region
655    * @param C_Project_ID project
656    * @param C_Campaign_ID campaign
657    * @param C_Activity_ID activity
658    * @param User1_ID user1
659    * @param User2_ID user2
660    * @return Account_ID for Unearned Revenue or Revenue Account if not found
661    */

662   private String JavaDoc createRevenueRecognition (Connection JavaDoc con,ConnectionProvider conn,
663     String JavaDoc C_RevenueRecognition_ID, String JavaDoc C_InvoiceLine_ID,
664     String JavaDoc AD_Client_ID, String JavaDoc AD_Org_ID, String JavaDoc AD_User_ID, String JavaDoc Account_ID,
665     String JavaDoc M_Product_ID, String JavaDoc C_BPartner_ID, String JavaDoc AD_OrgTrx_ID,
666     String JavaDoc C_LocFrom_ID, String JavaDoc C_LocTo_ID, String JavaDoc C_SRegion_ID, String JavaDoc C_Project_ID,
667     String JavaDoc C_Campaign_ID, String JavaDoc C_Activity_ID, String JavaDoc User1_ID, String JavaDoc User2_ID,VariablesSecureApp vars){
668     // get VC for P_Revenue (from Product)
669
log4jFactLine.debug("FactLine - createRevenueRecognition START");
670     String JavaDoc P_Revenue_Acct = AcctServer.getValidCombination(AD_Client_ID, AD_Org_ID,
671       m_C_AcctSchema_ID, Account_ID,"0", "", AD_User_ID,
672       M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID,
673       C_LocFrom_ID, C_LocTo_ID, C_SRegion_ID, C_Project_ID,
674       C_Campaign_ID, C_Activity_ID, User1_ID, User2_ID,conn);
675     log4jFactLine.debug("FactLine - createRevenueRecognition end");
676     if (P_Revenue_Acct.equals("")){
677       log4jFactLine.warn("FactLine - createRevenueRecognition - Revenue_Acct not found");
678       return Account_ID;
679     }
680
681     // get Unearned Revenue Acct from BPartner Group
682
String JavaDoc UnearnedRevenue_Acct = "";
683     String JavaDoc new_Account_ID = "";
684     FactLineData[] data = null;
685     try{
686       data = FactLineData.selectUnearnedRevenue(conn, m_C_AcctSchema_ID, C_BPartner_ID);
687
688       if (data.length>0){
689         UnearnedRevenue_Acct = data[0].unearnedrevenue;
690         new_Account_ID = data[0].account;
691       }
692       if (new_Account_ID.equals("")){
693         log4jFactLine.warn ("createRevenueRecognition - UnearnedRevenue_Acct not found");
694         return Account_ID;
695       }
696
697       // Insert record in C_RevenueRecognition_Plan to start batch process generation
698
String JavaDoc C_RevenueRecognition_Plan_ID = SequenceIdData.getSequence(conn, "C_RevenueRecognition_Plan", vars.getClient());
699       int no = FactLineData.insertRevenueRecognitionPlan(con,conn, C_RevenueRecognition_Plan_ID, C_RevenueRecognition_ID,
700       m_C_AcctSchema_ID, AD_Client_ID, AD_Org_ID, AD_User_ID, C_InvoiceLine_ID, UnearnedRevenue_Acct, P_Revenue_Acct, m_C_Currency_ID,
701       getAcctBalance());
702       if (no != 1){
703         log4jFactLine.warn ("createRevenueRecognition - Plan NOT created");
704         return Account_ID;
705       }
706     }catch(ServletException e){
707       log4jFactLine.warn(e);
708     }
709     log4jFactLine.debug ("createRevenueRecognition From Acctount_ID=" + Account_ID + " to " + new_Account_ID
710       + " - Plan from UnearnedRevenue_Acct=" + UnearnedRevenue_Acct + " to Revenue_Acct=" + P_Revenue_Acct);
711     return new_Account_ID;
712   } // createRevenueRecognition
713

714   /**
715    * Get Accounted Balance
716    * @return accounting balance
717    */

718   public String JavaDoc getAcctBalance(){
719     if (m_AmtAcctDr.equals(""))
720       m_AmtAcctDr = "0";
721     if (m_AmtAcctCr.equals(""))
722       m_AmtAcctCr = "0";
723     BigDecimal AmtAcctDr = new BigDecimal(m_AmtAcctDr);
724     BigDecimal AmtAcctCr = new BigDecimal(m_AmtAcctCr);
725     return AmtAcctDr.subtract(AmtAcctCr).toString();
726   } // getAcctBalance
727

728   /**
729    * Is Account on Balance Sheet
730    * @return true if account is a balance sheet account
731    */

732   public boolean isBalanceSheet(){
733     return m_acct.isBalanceSheet();
734   } // isBalanceSheet
735

736   /**
737    * Currect Accounting Amount.
738    * <pre>
739    * Example: 1 -1 1 -1
740    * Old 100/0 100/0 0/100 0/100
741    * New 101/0 99/0 0/99 0/101
742    * </pre>
743    * @param deltaAmount delta amount
744    */

745   public void currencyCorrect (BigDecimal deltaAmount){
746     boolean negative = deltaAmount.compareTo(ZERO) < 0;
747     BigDecimal AmtAcctDr = new BigDecimal(m_AmtAcctDr);
748     BigDecimal AmtAcctCr = new BigDecimal(m_AmtAcctCr);
749     boolean adjustDr = AmtAcctDr.compareTo(AmtAcctCr) > 0;
750
751     log4jFactLine.debug ("currencyCorrect - " + deltaAmount.toString()
752       + "; Old-AcctDr=" + m_AmtAcctDr + ",AcctCr=" + m_AmtAcctCr
753       + "; Negative=" + negative + "; AdjustDr=" + adjustDr);
754     if (adjustDr)
755       if (negative) m_AmtAcctDr = AmtAcctDr.subtract(deltaAmount).toString();
756       else m_AmtAcctDr = AmtAcctDr.add(deltaAmount).toString();
757     else
758       if (negative) m_AmtAcctCr = AmtAcctCr.add(deltaAmount).toString();
759       else m_AmtAcctCr = AmtAcctCr.subtract(deltaAmount).toString();
760     log4jFactLine.debug("currencyCorrect - New-AcctDr=" + m_AmtAcctDr + ",AcctCr=" + m_AmtAcctCr);
761   } // currencyCorrect
762

763     public String JavaDoc setC_Period_ID(AcctServer m_docVO,String JavaDoc strDateAcct, ConnectionProvider conn){
764         AcctServerData [] data=null;
765         try{
766           data = AcctServerData.periodOpen(conn,m_docVO.AD_Client_ID,m_docVO.DocumentType,strDateAcct);
767         }catch (ServletException e){
768             log4jFactLine.warn(e);
769         }
770         return data[0].period;
771     } // setC_Period_ID
772

773     public StringBuffer JavaDoc getDescription(ConnectionProvider connectionProvider,String JavaDoc strC_Bpartner_ID,String JavaDoc strC_AcctSchema_ID, String JavaDoc strAD_Table_ID, String JavaDoc strRecord_ID, String JavaDoc strLine)throws ServletException{
774       StringBuffer JavaDoc description = new StringBuffer JavaDoc();
775       String JavaDoc strSql = AcctServerData.selectDescription(connectionProvider, strAD_Table_ID, strC_AcctSchema_ID);
776       try {
777         if (!strSql.equals("")/* && strLine!=null && !strLine.equals("")*/){
778           strSql = strSql.replaceAll("@RecordId@",strRecord_ID);
779           if(strLine==null || strLine.equals("")) strLine = "NULL";
780           strSql = strSql.replaceAll("@Line@",strLine);
781           Statement st = connectionProvider.getStatement();
782           ResultSet result;
783           boolean executed = false;
784           try{
785             if (st.execute(strSql)) {
786                 result = st.getResultSet();
787                 while(result.next()) {
788                   description.append(result.getString(1));
789                 }
790                 result.close();
791             }
792           }catch (SQLException e){
793             log4jFactLine.error("SQL error in query: " + strSql + "Exception:"+ e);
794             throw new ServletException(Integer.toString(e.getErrorCode()));
795           } finally {
796             try {
797               connectionProvider.releaseStatement(st);
798             } catch (Exception JavaDoc ignored) {}
799           }
800         }
801         if(description.length()==0){
802           description.append(m_docVO.DocumentNo);
803           if (!strC_Bpartner_ID.equals("")) description.append(" # ").append(AcctServerData.selectBpartnerName(connectionProvider,strC_Bpartner_ID));
804           // ... line
805
if (m_docLine != null){
806             if (m_docLine.m_Line!=null && !m_docLine.m_Line.equals(""))
807               description.append(" # ").append(m_docLine.m_Line);
808             if (m_docLine.m_description!=null && !m_docLine.m_description.equals(""))
809               description.append(" (").append(m_docLine.m_description).append(")");
810           }
811           // ... cannot distinguish between header and tax
812
}
813         if (description.length() > 255) description = new StringBuffer JavaDoc(description.substring(0,254));
814       } catch (NoConnectionAvailableException ex) {
815         throw new ServletException("@CODE=NoConnectionAvailable");
816       } catch (SQLException ex2) {
817         throw new ServletException("@CODE=" + Integer.toString(ex2.getErrorCode()) + "@" + ex2.getMessage());
818       } catch (Exception JavaDoc ex3) {
819         throw new ServletException("@CODE=@" + ex3.getMessage());
820       }
821       if (description.length() > 255) description = new StringBuffer JavaDoc(description.substring(0,254));
822       return description;
823     }
824
825 }
826
Popular Tags