/// <summary> /// Create Facts (the accounting logic) for /// PJI /// <pre> /// Issue /// ProjectWIP DR /// Inventory CR /// </pre> /// Project Account is either Asset or WIP depending on Project Type /// </summary> /// <param name="?"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); MProject project = new MProject(GetCtx(), _issue.GetC_Project_ID(), null); String ProjectCategory = project.GetProjectCategory(); MProduct product = MProduct.Get(GetCtx(), _issue.GetM_Product_ID()); // Line pointers FactLine dr = null; FactLine cr = null; // Issue Cost Decimal?cost = null; if (_issue.GetM_InOutLine_ID() != 0) { cost = GetPOCost(as1); } else if (_issue.GetS_TimeExpenseLine_ID() != 0) { cost = GetLaborCost(as1); } if (cost == null) // standard Product Costs { cost = _line.GetProductCosts(as1, GetAD_Org_ID(), false); } // Project DR int acctType = ACCTTYPE_ProjectWIP; if (MProject.PROJECTCATEGORY_AssetProject.Equals(ProjectCategory)) { acctType = ACCTTYPE_ProjectAsset; } dr = fact.CreateLine(_line, GetAccount(acctType, as1), as1.GetC_Currency_ID(), cost, null); dr.SetQty((Decimal?)Decimal.Negate(Utility.Util.GetValueOfDecimal(_line.GetQty()))); // Inventory CR acctType = ProductCost.ACCTTYPE_P_Asset; if (product.IsService()) { acctType = ProductCost.ACCTTYPE_P_Expense; } cr = fact.CreateLine(_line, _line.GetAccount(acctType, as1), as1.GetC_Currency_ID(), null, cost); cr.SetM_Locator_ID(_line.GetM_Locator_ID()); cr.SetLocationFromLocator(_line.GetM_Locator_ID(), true); // from Loc // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create and convert Fact Line. /// Used to create a DR and/or CR entry /// </summary> /// <param name="docLine">the document line or null</param> /// <param name="account">if null, line is not created</param> /// <param name="C_Currency_ID">the currency</param> /// <param name="debitAmt">debit amount, can be null</param> /// <param name="creditAmt">credit amount, can be null</param> /// <returns>Fact Line</returns> public FactLine CreateLine(DocLine docLine, MAccount account, int C_Currency_ID, Decimal?debitAmt, Decimal?creditAmt) { // Data Check if (account == null) { log.Info("No account for " + docLine + ": Amt=" + debitAmt + "/" + creditAmt + " - " + ToString()); return(null); } //Added By Bharat to Handle -ve entry if (debitAmt < 0) { creditAmt = Decimal.Negate(debitAmt.Value); debitAmt = 0; } else if (creditAmt < 0) { debitAmt = Decimal.Negate(creditAmt.Value); creditAmt = 0; } // FactLine line = new FactLine(_doc.GetCtx(), _doc.Get_Table_ID(), _doc.Get_ID(), docLine == null ? 0 : docLine.Get_ID(), _trx); // set accounting schema reference line.SetC_AcctSchema_ID(_acctSchema.GetC_AcctSchema_ID()); // Set Info & Account line.SetDocumentInfo(_doc, docLine); line.SetPostingType(_postingType); line.SetAccount(_acctSchema, account); // Amounts - one needs to not zero if (!line.SetAmtSource(C_Currency_ID, debitAmt, creditAmt)) { if (docLine == null || docLine.GetQty() == null || Env.Signum(Utility.Util.GetValueOfDecimal(docLine.GetQty())) == 0) { log.Fine("Both amounts & qty = 0/Null - " + docLine + " - " + ToString()); return(null); } log.Fine("Both amounts = 0/Null, Qty=" + docLine.GetQty() + " - " + docLine + " - " + ToString()); } // Convert line.Convert(); // Optionally overwrite Acct Amount if (docLine != null && (docLine.GetAmtAcctDr() != null || docLine.GetAmtAcctCr() != null)) { line.SetAmtAcct(docLine.GetAmtAcctDr(), docLine.GetAmtAcctCr()); } // log.Fine(line.ToString()); Add(line); return(line); }
/// <summary> /// Return Source Balance /// </summary> /// <returns>source balance</returns> public Decimal GetSourceBalance() { Decimal result = Env.ZERO; for (int i = 0; i < _lines.Count; i++) { FactLine line = (FactLine)_lines[i]; result = Decimal.Add(result, line.GetSourceBalance()); } return(result); }
/// <summary> /// Return Accounting Balance /// </summary> /// <returns>true if accounting lines are balanced</returns> public Decimal GetAcctBalance() { Decimal result = Env.ZERO; for (int i = 0; i < _lines.Count; i++) { FactLine line = (FactLine)_lines[i]; result = Decimal.Add(result, line.GetAcctBalance()); } // log.Fine(result.toString()); return(result); }
/// <summary> /// Create Accrual (flip CR/DR) of the line /// </summary> /// <param name="description">new description</param> /// <returns>accrual line</returns> public FactLine Accrue(String description) { FactLine accrual = new FactLine(GetCtx(), GetAD_Table_ID(), GetRecord_ID(), GetLine_ID(), Get_TrxName()); accrual.SetClientOrg(this); // needs to be set explicitly accrual.SetDocumentInfo(_doc, _docLine); accrual.SetAccount(_acctSchema, _acct); accrual.SetPostingType(GetPostingType()); accrual.SetAmtSource(GetC_Currency_ID(), GetAmtSourceCr(), GetAmtSourceDr()); accrual.Convert(); accrual.SetDescription(description); return(accrual); }
/// <summary> /// Save Fact /// </summary> /// <param name="trxName"></param> /// <returns>true if all lines were saved</returns> public bool Save(Trx trxName) { // save Lines for (int i = 0; i < _lines.Count; i++) { FactLine fl = (FactLine)_lines[i]; // log.Fine("save - " + fl); if (!fl.Save(trxName)) // abort on first error { return(false); } } return(true); }
/// <summary> /// Create and convert Fact Line. /// Used to create a DR and/or CR entry /// </summary> /// <param name="docLine">the document line or null</param> /// <param name="account">if null, line is not created</param> /// <param name="C_Currency_ID">the currency</param> /// <param name="debitAmt">debit amount, can be null</param> /// <param name="creditAmt">credit amount, can be null</param> /// <returns>Fact Line</returns> public FactLine CreateLine(DocLine docLine, MAccount account, int C_Currency_ID, Decimal?debitAmt, Decimal?creditAmt, int AD_Org_ID) { // Data Check if (account == null) { log.Info("No account for " + docLine + ": Amt=" + debitAmt + "/" + creditAmt + " - " + ToString()); return(null); } // FactLine line = new FactLine(_doc.GetCtx(), _doc.Get_Table_ID(), _doc.Get_ID(), docLine == null ? 0 : (docLine.GetPrimaryKeyValue != 0 ? docLine.GetPrimaryKeyValue : docLine.Get_ID()), _trx); // Set Info & Account line.SetDocumentInfo(_doc, docLine); line.SetPostingType(_postingType); line.SetAccount(_acctSchema, account); if (AD_Org_ID > 0) { line.SetAD_Org_ID(AD_Org_ID); } // Amounts - one needs to not zero if (!line.SetAmtSource(C_Currency_ID, debitAmt, creditAmt)) { if (docLine == null || docLine.GetQty() == null || Env.Signum(Utility.Util.GetValueOfDecimal(docLine.GetQty())) == 0) { log.Fine("Both amounts & qty = 0/Null - " + docLine + " - " + ToString()); return(null); } log.Fine("Both amounts = 0/Null, Qty=" + docLine.GetQty() + " - " + docLine + " - " + ToString()); } // Convert line.Convert(); // Optionally overwrite Acct Amount if (docLine != null && (docLine.GetAmtAcctDr() != null || docLine.GetAmtAcctCr() != null)) { line.SetAmtAcct(docLine.GetAmtAcctDr(), docLine.GetAmtAcctCr()); } // log.Fine(line.ToString()); Add(line); return(line); }
/// <summary> /// Create Source Line for Suspense Balancing. /// Only if Suspense Balancing is enabled and not a multi-currency document /// (double check as1 otherwise the rule should not have fired) /// If not balanced create balancing entry in currency of the document /// </summary> /// <returns>FactLine</returns> public FactLine BalanceSource() { if (!_acctSchema.IsSuspenseBalancing() || _doc.IsMultiCurrency()) { return(null); } Decimal diff = GetSourceBalance(); log.Finer("Diff=" + diff); // new line FactLine line = new FactLine(_doc.GetCtx(), _doc.Get_Table_ID(), _doc.Get_ID(), 0, _trx); line.SetDocumentInfo(_doc, null); line.SetPostingType(_postingType); // Amount if (Env.Signum(diff) < 0) // negative balance => DR { line.SetAmtSource(_doc.GetC_Currency_ID(), Math.Abs(diff), Env.ZERO); } else // positive balance => CR { line.SetAmtSource(_doc.GetC_Currency_ID(), Env.ZERO, diff); } // Account line.SetAccount(_acctSchema, _acctSchema.GetSuspenseBalancing_Acct()); // Conversion rate if (_lines != null && _lines.Count > 0 && _lines[0].GetConversionRate() > 0) { line.SetConversionRate(_lines[0].GetConversionRate()); } // Convert line.Convert(); // log.Fine(line.ToString()); _lines.Add(line); return(line); }
/// <summary> /// Check Accounts of Fact Lines /// </summary> /// <returns>true if success</returns> public bool CheckAccounts() { // no lines -> nothing to distribute if (_lines.Count == 0) { return(true); } // For all fact lines for (int i = 0; i < _lines.Count; i++) { FactLine line = (FactLine)_lines[i]; MAccount account = line.GetAccount(); if (account == null) { log.Warning("No Account for " + line); return(false); } MElementValue ev = account.GetAccount(); if (ev == null) { log.Warning("No Element Value for " + account + ": " + line); return(false); } if (ev.IsSummary()) { log.Warning("Cannot post to Summary Account " + ev + ": " + line); return(false); } if (!ev.IsActive()) { log.Warning("Cannot post to Inactive Account " + ev + ": " + line); return(false); } } // for all lines return(true); }
/// <summary> /// Create Facts (the accounting logic) for /// ARI, ARC, ARF, API, APC. /// <pre> /// ARI, ARF /// Receivables DR /// Charge CR /// TaxDue CR ///Revenue CR /// ARC /// Receivables CR /// Charge DR /// TaxDue DR /// Revenue RR /// /// API /// Payables CR /// Charge DR /// TaxCredit DR /// Expense DR /// /// APC /// Payables DR /// Charge CR /// TaxCredit CR /// Expense CR /// </pre> /// </summary> /// <param name="as1">accounting schema</param> /// <returns> Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // List <Fact> facts = new List <Fact>(); // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); // Cash based accounting if (!as1.IsAccrual()) { return(facts); } // ** ARI, ARF if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARINVOICE) || GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARPROFORMAINVOICE)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Header Charge CR Decimal amt = GetAmount(Doc.AMTTYPE_Charge).Value; if (Env.Signum(amt) != 0) { fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), null, amt); } // TaxDue CR for (int i = 0; i < _taxes.Length; i++) { amt = _taxes[i].GetAmount(); if (Env.Signum(amt) != 0) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(DocTax.ACCTTYPE_TaxDue, as1), GetC_Currency_ID(), null, amt); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } } // Revenue CR for (int i = 0; i < _lines.Length; i++) { amt = _lines[i].GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted()) { Decimal discount = _lines[i].GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(_lines[i], _lines[i].GetAccount(ProductCost.ACCTTYPE_P_Revenue, as1), GetC_Currency_ID(), dAmt, amt); if (!_lines[i].IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), true); // from Loc fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } } // Receivables DR int receivables_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable, as1); int receivablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable_Services, as1); if (_allLinesItem || !as1.IsPostServices() || receivables_ID == receivablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivables_ID), GetC_Currency_ID(), grossAmt, null); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivablesServices_ID), GetC_Currency_ID(), serviceAmt, null); } } // ARC else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARCREDITMEMO)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Header Charge DR Decimal amt = GetAmount(Doc.AMTTYPE_Charge).Value; if (Env.Signum(amt) != 0) { fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), amt, null); } // TaxDue DR for (int i = 0; i < _taxes.Length; i++) { amt = _taxes[i].GetAmount(); if (Env.Signum(amt) != 0) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(DocTax.ACCTTYPE_TaxDue, as1), GetC_Currency_ID(), amt, null); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } } // Revenue CR for (int i = 0; i < _lines.Length; i++) { amt = _lines[i].GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted()) { Decimal discount = _lines[i].GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(_lines[i], _lines[i].GetAccount(ProductCost.ACCTTYPE_P_Revenue, as1), GetC_Currency_ID(), amt, dAmt); if (!_lines[i].IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), true); // from Loc fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } } // Receivables CR int receivables_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable, as1); int receivablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable_Services, as1); if (_allLinesItem || !as1.IsPostServices() || receivables_ID == receivablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivables_ID), GetC_Currency_ID(), null, grossAmt); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivablesServices_ID), GetC_Currency_ID(), null, serviceAmt); } } // ** API else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APINVOICE)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Charge DR fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), GetAmount(Doc.AMTTYPE_Charge), null); // TaxCredit DR for (int i = 0; i < _taxes.Length; i++) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(_taxes[i].GetAPTaxType(), as1), GetC_Currency_ID(), _taxes[i].GetAmount(), null); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } // Expense DR for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; bool landedCost = LandedCost(as1, fact, line, true); if (landedCost && as1.IsExplicitCostAdjustment()) { fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), line.GetAmtSource(), null); // FactLine fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), null, line.GetAmtSource()); String desc = line.GetDescription(); if (desc == null) { desc = "100%"; } else { desc += " 100%"; } fl.SetDescription(desc); } if (!landedCost) { MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); if (line.IsItem()) { expense = line.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); } Decimal amt = line.GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted() && !line.IsItem()) { Decimal discount = line.GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(line, expense, GetC_Currency_ID(), amt, dAmt); if (!line.IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } // if (line.GetM_Product_ID() != 0 && line.GetProduct().IsService()) // otherwise Inv Matching { if (!IsPosted()) { MCostDetail.CreateInvoice(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, // No Cost Element line.GetAmtSource(), line.GetQty().Value, line.GetDescription(), GetTrx(), GetRectifyingProcess()); } } } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), false); // to Loc } } // Liability CR int payables_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability, as1); int payablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability_Services, as1); if (_allLinesItem || !as1.IsPostServices() || payables_ID == payablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payables_ID), GetC_Currency_ID(), null, grossAmt); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payablesServices_ID), GetC_Currency_ID(), null, serviceAmt); } // UpdateProductPO(as1); // Only API } // APC else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APCREDITMEMO)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Charge CR fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), null, GetAmount(Doc.AMTTYPE_Charge)); // TaxCredit CR for (int i = 0; i < _taxes.Length; i++) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(_taxes[i].GetAPTaxType(), as1), GetC_Currency_ID(), null, _taxes[i].GetAmount()); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } // Expense CR for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; bool landedCost = LandedCost(as1, fact, line, false); if (landedCost && as1.IsExplicitCostAdjustment()) { fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), null, line.GetAmtSource()); // FactLine fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), line.GetAmtSource(), null); String desc = line.GetDescription(); if (desc == null) { desc = "100%"; } else { desc += " 100%"; } fl.SetDescription(desc); } if (!landedCost) { MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); if (line.IsItem()) { expense = line.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); } Decimal amt = line.GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted() && !line.IsItem()) { Decimal discount = line.GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(line, expense, GetC_Currency_ID(), dAmt, amt); if (!line.IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } // if (line.GetM_Product_ID() != 0 && line.GetProduct().IsService()) // otherwise Inv Matching { if (!IsPosted()) { MCostDetail.CreateInvoice(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, // No Cost Element Decimal.Negate(line.GetAmtSource()), line.GetQty().Value, line.GetDescription(), GetTrx(), GetRectifyingProcess()); } } } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), false); // to Loc } } // Liability DR int payables_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability, as1); int payablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability_Services, as1); if (_allLinesItem || !as1.IsPostServices() || payables_ID == payablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payables_ID), GetC_Currency_ID(), grossAmt, null); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payablesServices_ID), GetC_Currency_ID(), serviceAmt, null); } } else { _error = "DocumentType unknown: " + GetDocumentType(); log.Log(Level.SEVERE, _error); fact = null; } // facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MMP. /// <pre> /// Production /// Inventory DR CR /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointer FactLine fl = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; // Calculate Costs Decimal?costs = null; if (line.IsProductionBOM()) { // Get BOM Cost - Sum of individual lines Decimal bomCost = Env.ZERO; for (int ii = 0; ii < _lines.Length; ii++) { DocLine line0 = _lines[ii]; if (line0.GetM_ProductionPlan_ID() != line.GetM_ProductionPlan_ID()) { continue; } if (!line0.IsProductionBOM()) { bomCost = Decimal.Add(bomCost, line0.GetProductCosts(as1, line.GetAD_Org_ID(), false)); } } costs = Decimal.Negate(bomCost); } else { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); } // Inventory DR CR fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs); if (fl == null) { _error = "No Costs for Line " + line.GetLine() + " - " + line; return(null); } fl.SetM_Locator_ID(line.GetM_Locator_ID()); fl.SetQty(line.GetQty()); // Cost Detail String description = line.GetDescription(); if (description == null) { description = ""; } if (line.IsProductionBOM()) { description += "(*)"; } if (!IsPosted()) { MCostDetail.CreateProduction(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, Utility.Util.GetValueOfInt(costs), line.GetQty().Value, description, GetTrx(), GetRectifyingProcess()); } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Get Lines /// </summary> /// <returns>FactLine Array</returns> public FactLine[] GetLines() { FactLine[] temp = new FactLine[_lines.Count]; temp = _lines.ToArray(); return(temp); }
/// <summary> /// GL Distribution of Fact Lines /// </summary> /// <returns>true if success</returns> public bool Distribute() { // no lines -> nothing to distribute if (_lines.Count == 0) { return(true); } List <FactLine> newLines = new List <FactLine>(); // For all fact lines for (int i = 0; i < _lines.Count; i++) { FactLine dLine = (FactLine)_lines[i]; MDistribution[] distributions = MDistribution.Get(dLine.GetAccount(), _postingType, _doc.GetC_DocType_ID()); // No Distribution for this line if (distributions == null || distributions.Length == 0) { continue; } // Just the first if (distributions.Length > 1) { log.Warning("More then one Distributiion for " + dLine.GetAccount()); } MDistribution distribution = distributions[0]; // Add Reversal FactLine reversal = dLine.Reverse(distribution.GetName()); log.Info("Reversal=" + reversal); newLines.Add(reversal); // saved in postCommit // Prepare distribution.Distribute(dLine.GetAccount(), dLine.GetSourceBalance(), dLine.GetC_Currency_ID()); MDistributionLine[] lines = distribution.GetLines(false); for (int j = 0; j < lines.Length; j++) { MDistributionLine dl = lines[j]; if (!dl.IsActive() || Env.Signum(dl.GetAmt()) == 0) { continue; } FactLine factLine = new FactLine(_doc.GetCtx(), _doc.Get_Table_ID(), _doc.Get_ID(), 0, _trx); // Set Info & Account factLine.SetDocumentInfo(_doc, dLine.GetDocLine()); factLine.SetAccount(_acctSchema, dl.GetAccount()); factLine.SetPostingType(_postingType); if (dl.IsOverwriteOrg()) // set Org explicitly { factLine.SetAD_Org_ID(dl.GetOrg_ID()); } // if (Env.Signum(dl.GetAmt()) < 0) { factLine.SetAmtSource(dLine.GetC_Currency_ID(), null, Math.Abs(dl.GetAmt())); } else { factLine.SetAmtSource(dLine.GetC_Currency_ID(), dl.GetAmt(), null); } // Convert factLine.Convert(); // String description = distribution.GetName() + " #" + dl.GetLine(); if (dl.GetDescription() != null) { description += " - " + dl.GetDescription(); } factLine.AddDescription(description); // log.Info(factLine.ToString()); newLines.Add(factLine); } } // for all lines // Add Lines for (int i = 0; i < newLines.Count; i++) { _lines.Add(newLines[i]); } return(true); }
public override List <Fact> CreateFacts(MAcctSchema as1) { List <Fact> facts = new List <Fact>(); MProductCategoryAcct pca = null; String costingMethodOfSchema = as1.GetCostingMethod(); String costingLevelOfSchema = as1.GetCostingLevel(); // Get the costing method and the costing level of the product Category for the current accounting schema. if (mpc != null) { pca = MProductCategoryAcct.Get(GetCtx(), mpc.GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), null); if (pca.GetCostingMethod() != null) { costingMethod = pca.GetCostingMethod(); } else { costingMethod = costingMethodOfSchema; } if (pca.GetCostingLevel() != null) { costingLevel = pca.GetCostingLevel(); } else { costingLevel = costingLevelOfSchema; } // proceed only if the costing method is standard if (!costingMethod.Equals(X_C_AcctSchema.COSTINGMETHOD_StandardCosting)) { return(facts); } } Fact fact = new Fact(this, as1, Fact.POST_Actual); FactLine dr = null; FactLine cr = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; if (mpc == null) { pca = MProductCategoryAcct.Get(GetCtx(), MProduct.Get(GetCtx(), line.GetM_Product_ID()). GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), null); if (pca.GetCostingMethod() != null) { costingMethod = pca.GetCostingMethod(); } else { costingMethod = costingMethodOfSchema; } if (pca.GetCostingLevel() != null) { costingLevel = pca.GetCostingLevel(); } else { costingLevel = costingLevelOfSchema; } // proceed only if the costing method is standard if (!costingMethod.Equals(X_C_AcctSchema.COSTINGMETHOD_StandardCosting)) { return(facts); } } Decimal currentCost = Env.ZERO; Decimal oldCost = Env.ZERO; Decimal Qty = Env.ZERO; String sql = " SELECT Sum(CurrentCostPrice), Sum(LastCostPrice), Sum(CurrentQty)" + " FROM M_Cost WHERE M_Product_ID = " + line.GetM_Product_ID() + " AND C_AcctSchema_ID = " + as1.GetC_AcctSchema_ID() + " AND M_CostElement_ID = " + m_ce.GetM_CostElement_ID() + " AND M_CostType_ID = " + as1.GetM_CostType_ID() + " AND AD_Client_ID = " + GetAD_Client_ID(); if (costingLevel.Equals(X_C_AcctSchema.COSTINGLEVEL_Client)) { sql += " AND AD_Org_ID = 0" + " AND M_AttributeSetInstance_ID = 0"; } else if (costingLevel.Equals(X_C_AcctSchema.COSTINGLEVEL_Organization)) { sql += " AND M_AttributeSetInstance_ID = 0"; } else if (costingLevel.Equals(X_C_AcctSchema.COSTINGLEVEL_BatchLot)) { sql += " AND AD_Org_ID = 0"; } IDataReader idr = null; try { idr = DB.ExecuteReader(sql, null, GetTrx()); while (idr.Read()) { currentCost = Util.GetValueOfDecimal(idr[0]); oldCost = Util.GetValueOfDecimal(idr[1]); Qty = Util.GetValueOfDecimal(idr[2]); line.SetQty(Qty, costupdate.IsSOTrx()); Decimal PriceCost = Decimal.Subtract(currentCost, oldCost); Decimal amt = Env.ZERO; if (Env.Signum(PriceCost) != 0) { amt = Decimal.Multiply(Qty, PriceCost); } line.SetAmount(amt); if (Env.Signum(amt) == 0) { continue; } MAccount db_acct, cr_acct; /* Decide the Credit and Debit Accounts */ if (Env.Signum(amt) == 1) { db_acct = line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1); cr_acct = line.GetAccount(ProductCost.ACCTTYPE_P_CostAdjustment, as1); } else { cr_acct = line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1); db_acct = line.GetAccount(ProductCost.ACCTTYPE_P_CostAdjustment, as1); } /* Create Credit and Debit lines*/ dr = fact.CreateLine(line, db_acct, as1.GetC_Currency_ID(), Math.Abs(amt), null); if (dr == null) { log.SaveError("NoProductCosts", "No Product Costs"); return(null); } cr = fact.CreateLine(line, cr_acct, as1.GetC_Currency_ID(), null, Math.Abs(amt)); if (cr == null) { log.SaveError("NoProductCosts", "No Product Costs"); return(null); } } idr.Close(); } catch (Exception e) { log.Log(Level.SEVERE, sql, e); } finally { if (idr != null) { idr.Close(); idr = null; } } } facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MXP. /// <pre> /// Product PPV <difference> /// PPV_Offset <difference> /// </pre> /// </summary> /// <param name="as1"></param> /// <returns></returns> public override List <Fact> CreateFacts(MAcctSchema as1) { List <Fact> facts = new List <Fact>(); // if (GetM_Product_ID() == 0 || // Nothing to do if no Product Env.Signum(Utility.Util.GetValueOfDecimal(GetQty())) == 0 || _M_InOutLine_ID == 0) // No posting if not matched to Shipment { log.Fine("No Product/Qty - M_Product_ID=" + GetM_Product_ID() + ",Qty=" + GetQty()); return(facts); } // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Purchase Order Line Decimal poCost = _oLine.GetPriceCost(); if (Env.Signum(poCost) == 0) { poCost = _oLine.GetPriceActual(); } poCost = Decimal.Multiply(poCost, Utility.Util.GetValueOfDecimal(GetQty())); // Delivered so far // Different currency if (_oLine.GetC_Currency_ID() != as1.GetC_Currency_ID()) { MOrder order = _oLine.GetParent(); Decimal rate = MConversionRate.GetRate( order.GetC_Currency_ID(), as1.GetC_Currency_ID(), order.GetDateAcct(), order.GetC_ConversionType_ID(), _oLine.GetAD_Client_ID(), _oLine.GetAD_Org_ID()); if (rate.ToString() == null) { _error = "Purchase Order not convertible - " + as1.GetName(); return(null); } poCost = Decimal.Multiply(poCost, rate); if (Env.Scale(poCost) > as1.GetCostingPrecision()) { poCost = Decimal.Round(poCost, as1.GetCostingPrecision(), MidpointRounding.AwayFromZero); } } MOrder order1 = _oLine.GetParent(); bool isReturnTrx = order1.IsReturnTrx(); log.Fine("Temp"); if (!IsPosted()) { // Create PO Cost Detail Record firs MCostDetail.CreateOrder(as1, _oLine.GetAD_Org_ID(), GetM_Product_ID(), _M_AttributeSetInstance_ID, _C_OrderLine_ID, 0, // no cost element isReturnTrx ? Decimal.Negate(poCost) : poCost, isReturnTrx ? Decimal.Negate(Utility.Util.GetValueOfDecimal(GetQty())) : Utility.Util.GetValueOfDecimal(GetQty()), // Delivered _oLine.GetDescription(), GetTrx(), GetRectifyingProcess()); } // Current Costs String costingMethod = as1.GetCostingMethod(); MProduct product = MProduct.Get(GetCtx(), GetM_Product_ID()); MProductCategoryAcct pca = MProductCategoryAcct.Get(GetCtx(), product.GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), GetTrx()); if (pca.GetCostingMethod() != null) { costingMethod = pca.GetCostingMethod(); } Decimal?costs = _pc.GetProductCosts(as1, GetAD_Org_ID(), costingMethod, _C_OrderLine_ID, false); // non-zero costs // No Costs yet - no PPV if (costs == null || Env.Signum(Utility.Util.GetValueOfDecimal(costs)) == 0) { _error = "Resubmit - No Costs for " + product.GetName(); log.Log(Level.SEVERE, _error); return(null); } // Difference Decimal difference = Decimal.Subtract(poCost, Utility.Util.GetValueOfDecimal(costs)); /***********************************************************************************/ //05,Sep,2011 //Special Check to restic Price varience posting in case of //AvarageInvoice Selected on product Category.Then Neglact the AverageInvoice Cost try { if (as1.IsNotPostPOVariance()) { difference = 0; } } catch (Exception ex) { log.SaveError("AccountSchemaColumnError", ex); } /***********************************************************************************/ // Nothing to post if (Env.Signum(difference) == 0) { log.Log(Level.FINE, "No Cost Difference for M_Product_ID=" + GetM_Product_ID()); facts.Add(fact); return(facts); } // Product PPV FactLine cr = fact.CreateLine(null, _pc.GetAccount(ProductCost.ACCTTYPE_P_PPV, as1), as1.GetC_Currency_ID(), difference); if (cr != null) { cr.SetQty(GetQty()); cr.SetC_BPartner_ID(_oLine.GetC_BPartner_ID()); cr.SetC_Activity_ID(_oLine.GetC_Activity_ID()); cr.SetC_Campaign_ID(_oLine.GetC_Campaign_ID()); cr.SetC_Project_ID(_oLine.GetC_Project_ID()); cr.SetC_UOM_ID(_oLine.GetC_UOM_ID()); cr.SetUser1_ID(_oLine.GetUser1_ID()); cr.SetUser2_ID(_oLine.GetUser2_ID()); } // PPV Offset FactLine dr = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_PPVOffset, as1), as1.GetC_Currency_ID(), Decimal.Negate(difference)); if (dr != null) { dr.SetQty((Decimal?)Decimal.Negate(Utility.Util.GetValueOfDecimal(GetQty()))); dr.SetC_BPartner_ID(_oLine.GetC_BPartner_ID()); dr.SetC_Activity_ID(_oLine.GetC_Activity_ID()); dr.SetC_Campaign_ID(_oLine.GetC_Campaign_ID()); dr.SetC_Project_ID(_oLine.GetC_Project_ID()); dr.SetC_UOM_ID(_oLine.GetC_UOM_ID()); dr.SetUser1_ID(_oLine.GetUser1_ID()); dr.SetUser2_ID(_oLine.GetUser2_ID()); } // facts.Add(fact); return(facts); }
/// <summary> /// Balance Source Segment /// </summary> /// <param name="elementType"> elementType segment element type</param> private void BalanceSegment(String elementType) { // no lines -> balanced if (_lines.Count == 0) { return; } log.Fine("(" + elementType + ") - " + ToString()); // Org if (elementType.Equals(X_C_AcctSchema_Element.ELEMENTTYPE_Organization)) { Dictionary <int, Balance> map = new Dictionary <int, Balance>(); // Add up values by key for (int i = 0; i < _lines.Count; i++) { FactLine line = (FactLine)_lines[i]; int key = Utility.Util.GetValueOfInt(line.GetAD_Org_ID()); // Decimal balance = line.getSourceBalance(); Balance oldBalance = null; if (map.TryGetValue(key, out oldBalance)) { oldBalance = map[key]; } if (oldBalance == null) { oldBalance = new Balance(line.GetAmtSourceDr(), line.GetAmtSourceCr()); if (!map.Keys.Contains(key)) { map.Add(key, oldBalance);//put(key, oldBalance); } map[key] = oldBalance; } else { oldBalance.Add(line.GetAmtSourceDr(), line.GetAmtSourceCr()); } } // Create entry for non-zero element //Iterator keys = map.keySet().iterator(); IEnumerator keys = map.Keys.GetEnumerator(); while (keys.MoveNext()) { int key = Utility.Util.GetValueOfInt(keys.Current); Balance difference = (Balance)map[key]; log.Info(elementType + "=" + key + ", " + difference); // if (!difference.IsZeroBalance()) { // Create Balancing Entry FactLine line = new FactLine(_doc.GetCtx(), _doc.Get_Table_ID(), _doc.Get_ID(), 0, _trx); line.SetDocumentInfo(_doc, null); line.SetPostingType(_postingType); // Amount & Account if (Env.Signum(difference.GetBalance()) < 0) { if (difference.IsReversal()) { line.SetAmtSource(_doc.GetC_Currency_ID(), Env.ZERO, difference.GetPostBalance()); line.SetAccount(_acctSchema, _acctSchema.GetDueTo_Acct(elementType)); } else { line.SetAmtSource(_doc.GetC_Currency_ID(), difference.GetPostBalance(), Env.ZERO); line.SetAccount(_acctSchema, _acctSchema.GetDueFrom_Acct(elementType)); } } else { if (difference.IsReversal()) { line.SetAmtSource(_doc.GetC_Currency_ID(), difference.GetPostBalance(), Env.ZERO); line.SetAccount(_acctSchema, _acctSchema.GetDueFrom_Acct(elementType)); } else { line.SetAmtSource(_doc.GetC_Currency_ID(), Env.ZERO, difference.GetPostBalance()); line.SetAccount(_acctSchema, _acctSchema.GetDueTo_Acct(elementType)); } } line.Convert(); line.SetAD_Org_ID(Utility.Util.GetValueOfInt(key)); // _lines.Add(line); log.Fine("(" + elementType + ") - " + line); } } map.Clear(); } }
/// <summary> /// Create Facts (the accounting logic) for /// MMI. /// <pre> /// Inventory /// Inventory DR CR /// InventoryDiff DR CR (or Charge) /// </pre> /// </summary> /// <param name="?"></param> /// <returns> Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointers FactLine dr = null; FactLine cr = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; Decimal costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); if (Env.Signum(costs) == 0) { _error = "No Costs for " + line.GetProduct().GetName(); return(null); } // Inventory DR CR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs); // may be zero difference - no line created. if (dr == null) { continue; } dr.SetM_Locator_ID(line.GetM_Locator_ID()); // InventoryDiff DR CR // or Charge MAccount invDiff = line.GetChargeAccount(as1, Decimal.Negate(costs)); if (invDiff == null) { invDiff = GetAccount(Doc.ACCTTYPE_InvDifferences, as1); } cr = fact.CreateLine(line, invDiff, as1.GetC_Currency_ID(), Decimal.Negate(costs)); if (cr == null) { continue; } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetQty(Decimal.Negate(line.GetQty().Value)); if (line.GetC_Charge_ID() != 0) // explicit overwrite for charge { cr.SetAD_Org_ID(line.GetAD_Org_ID()); } if (!IsPosted()) { // Cost Detail MCostDetail.CreateInventory(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, costs, line.GetQty().Value, line.GetDescription(), GetTrx(), GetRectifyingProcess()); } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MXI. /// (single line) /// <pre> /// NotInvoicedReceipts DR (Receipt Org) /// InventoryClearing CR /// InvoicePV DR CR (difference) /// Commitment /// Expense CR /// Offset DR /// </pre> /// </summary> /// <param name="as1"></param> /// <returns></returns> public override List <Fact> CreateFacts(MAcctSchema as1) { List <Fact> facts = new List <Fact>(); // Nothing to do if (GetM_Product_ID() == 0 || // no Product Env.Signum(GetQty().Value) == 0 || Env.Signum(_receiptLine.GetMovementQty()) == 0) // Qty = 0 { log.Fine("No Product/Qty - M_Product_ID=" + GetM_Product_ID() + ",Qty=" + GetQty() + ",InOutQty=" + _receiptLine.GetMovementQty()); return(facts); } MMatchInv matchInv = (MMatchInv)GetPO(); // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); /** Needs to be handeled in PO Matching as1 no Receipt info * if (_pc.isService()) * { * log.Fine("Service - skipped"); * return fact; * } **/ // NotInvoicedReceipt DR // From Receipt Decimal multiplier = Math.Abs(Decimal.Round(Decimal.Divide(GetQty().Value, _receiptLine.GetMovementQty()), 12, MidpointRounding.AwayFromZero)); FactLine dr = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as1), as1.GetC_Currency_ID(), Env.ONE, null); // updated below if (dr == null) { _error = "No Product Costs"; return(null); } dr.SetQty(GetQty()); // dr.setM_Locator_ID(_receiptLine.getM_Locator_ID()); // MInOut receipt = _receiptLine.getParent(); // dr.setLocationFromBPartner(receipt.getC_BPartner_Location_ID(), true); // from Loc // dr.setLocationFromLocator(_receiptLine.getM_Locator_ID(), false); // to Loc Decimal temp = dr.GetAcctBalance(); // Set AmtAcctCr/Dr from Receipt (sets also Project) if (!dr.UpdateReverseLine(MInOut.Table_ID, // Amt updated _receiptLine.GetM_InOut_ID(), _receiptLine.GetM_InOutLine_ID(), multiplier)) { _error = "Mat.Receipt not posted yet"; return(null); } log.Fine("CR - Amt(" + temp + "->" + dr.GetAcctBalance() + ") - " + dr.ToString()); // InventoryClearing CR // From Invoice MAccount expense = _pc.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); if (_pc.IsService()) { expense = _pc.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); } Decimal LineNetAmt = _invoiceLine.GetLineNetAmt(); multiplier = Math.Abs(Decimal.Round(Decimal.Divide(GetQty().Value, _invoiceLine.GetQtyInvoiced()), 12, MidpointRounding.AwayFromZero)); if (multiplier.CompareTo(Env.ONE) != 0) { LineNetAmt = Decimal.Multiply(LineNetAmt, multiplier); } if (_pc.IsService()) { LineNetAmt = dr.GetAcctBalance(); // book out exact receipt amt } FactLine cr = null; if (as1.IsAccrual()) { cr = fact.CreateLine(null, expense, as1.GetC_Currency_ID(), null, LineNetAmt); // updated below if (cr == null) { log.Fine("Line Net Amt=0 - M_Product_ID=" + GetM_Product_ID() + ",Qty=" + GetQty() + ",InOutQty=" + _receiptLine.GetMovementQty()); facts.Add(fact); return(facts); } cr.SetQty(Decimal.Negate(GetQty().Value)); temp = cr.GetAcctBalance(); // Set AmtAcctCr/Dr from Invoice (sets also Project) if (as1.IsAccrual() && !cr.UpdateReverseLine(MInvoice.Table_ID, // Amt updated _invoiceLine.GetC_Invoice_ID(), _invoiceLine.GetC_InvoiceLine_ID(), multiplier)) { _error = "Invoice not posted yet"; return(null); } log.Fine("DR - Amt(" + temp + "->" + cr.GetAcctBalance() + ") - " + cr.ToString()); } else // Cash Acct { MInvoice invoice = _invoiceLine.GetParent(); if (as1.GetC_Currency_ID() == invoice.GetC_Currency_ID()) { LineNetAmt = MConversionRate.Convert(GetCtx(), LineNetAmt, invoice.GetC_Currency_ID(), as1.GetC_Currency_ID(), invoice.GetDateAcct(), invoice.GetC_ConversionType_ID(), invoice.GetAD_Client_ID(), invoice.GetAD_Org_ID()); } cr = fact.CreateLine(null, expense, as1.GetC_Currency_ID(), null, LineNetAmt); cr.SetQty(Decimal.Negate(Decimal.Multiply(GetQty().Value, multiplier))); } cr.SetC_Activity_ID(_invoiceLine.GetC_Activity_ID()); cr.SetC_Campaign_ID(_invoiceLine.GetC_Campaign_ID()); cr.SetC_Project_ID(_invoiceLine.GetC_Project_ID()); cr.SetC_UOM_ID(_invoiceLine.GetC_UOM_ID()); cr.SetUser1_ID(_invoiceLine.GetUser1_ID()); cr.SetUser2_ID(_invoiceLine.GetUser2_ID()); // Invoice Price Variance difference Decimal ipv = Decimal.Negate(Decimal.Add(cr.GetAcctBalance(), dr.GetAcctBalance())); if (Env.Signum(ipv) != 0) { FactLine pv = fact.CreateLine(null, _pc.GetAccount(ProductCost.ACCTTYPE_P_IPV, as1), as1.GetC_Currency_ID(), ipv); pv.SetC_Activity_ID(_invoiceLine.GetC_Activity_ID()); pv.SetC_Campaign_ID(_invoiceLine.GetC_Campaign_ID()); pv.SetC_Project_ID(_invoiceLine.GetC_Project_ID()); pv.SetC_UOM_ID(_invoiceLine.GetC_UOM_ID()); pv.SetUser1_ID(_invoiceLine.GetUser1_ID()); pv.SetUser2_ID(_invoiceLine.GetUser2_ID()); } log.Fine("IPV=" + ipv + "; Balance=" + fact.GetSourceBalance()); MInOut inOut = _receiptLine.GetParent(); bool isReturnTrx = inOut.IsReturnTrx(); if (!IsPosted()) { // Cost Detail Record - data from Expense/IncClearing (CR) record MCostDetail.CreateInvoice(as1, GetAD_Org_ID(), GetM_Product_ID(), matchInv.GetM_AttributeSetInstance_ID(), _invoiceLine.GetC_InvoiceLine_ID(), 0, // No cost element Decimal.Negate(cr.GetAcctBalance()), isReturnTrx ? Decimal.Negate(Utility.Util.GetValueOfDecimal(GetQty())) : Utility.Util.GetValueOfDecimal(GetQty()), // correcting GetDescription(), GetTrx(), GetRectifyingProcess()); // Update Costing UpdateProductInfo(as1.GetC_AcctSchema_ID(), MAcctSchema.COSTINGMETHOD_StandardCosting.Equals(as1.GetCostingMethod())); } // facts.Add(fact); /** Commitment release ****/ if (as1.IsAccrual() && as1.IsCreateCommitment()) { fact = Doc_Order.GetCommitmentRelease(as1, this, Utility.Util.GetValueOfDecimal(GetQty()), _invoiceLine.GetC_InvoiceLine_ID(), Env.ONE); if (fact == null) { return(null); } facts.Add(fact); } // Commitment return(facts); }
/// <summary> /// Add Fact Line /// </summary> /// <param name="line">line fact line</param> void Add(FactLine line) { _lines.Add(line); }
/// <summary> /// Create Facts (the accounting logic) for /// MMS, MMR. /// <pre> /// Shipment /// CoGS (RevOrg) DR /// Inventory CR /// Shipment of Project Issue /// CoGS DR /// Project CR /// Receipt /// Inventory DR /// NotInvoicedReceipt CR /// </pre> /// </summary> /// <param name="as1">accounting schema</param> /// <returns>Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointers FactLine dr = null; FactLine cr = null; // *** Sales - Shipment if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_MATERIALDELIVERY)) { for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; MInOutLine sLine = new MInOutLine(GetCtx(), line.Get_ID(), null); Decimal costs = 0; if (sLine.GetA_Asset_ID() > 0) { costs = Util.GetValueOfDecimal(DB.ExecuteScalar(@"SELECT cost.CUrrentcostPrice FROM m_cost cost INNER JOIN A_Asset ass ON(ass.a_asset_ID=cost.a_asset_ID) INNER JOIN M_InOutLine IOL ON(IOL.A_Asset_ID =ass.A_Asset_ID) WHERE IOL.M_InOutLine_ID=" + sLine.GetM_InOutLine_ID() + @" ORDER By cost.created desc")); // Change if Cost not found against Asset then get Product Cost if (Env.Signum(costs) == 0) // zero costs OK { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), true); } } else { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), true); } if (Env.Signum(costs) == 0) // zero costs OK { MProduct product = line.GetProduct(); if (product.IsStocked()) { _error = "No Costs for " + line.GetProduct().GetName(); log.Log(Level.WARNING, _error); return(null); } else // ignore service { continue; } } if (!IsReturnTrx()) { // CoGS DR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Cogs, as1), as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "FactLine DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc dr.SetAD_Org_ID(line.GetOrder_Org_ID()); // Revenue X-Org dr.SetQty(Decimal.Negate(line.GetQty().Value)); // Inventory CR cr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "FactLine CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } else // Reverse accounting entries for returns { // CoGS CR cr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Cogs, as1), as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "FactLine CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc cr.SetAD_Org_ID(line.GetOrder_Org_ID()); // Revenue X-Org cr.SetQty(Decimal.Negate(line.GetQty().Value)); // Inventory DR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "FactLine DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } // if (line.GetM_Product_ID() != 0) { if (!IsPosted()) { MCostDetail.CreateShipment(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, costs, IsReturnTrx() ? Decimal.Negate(line.GetQty().Value) : line.GetQty().Value, line.GetDescription(), true, GetTrx(), GetRectifyingProcess()); } } } // for all lines if (!IsPosted()) { UpdateProductInfo(as1.GetC_AcctSchema_ID()); // only for SO! } } // Shipment // *** Purchasing - Receipt else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_MATERIALRECEIPT)) { for (int i = 0; i < _lines.Length; i++) { Decimal costs = 0; DocLine line = _lines[i]; MProduct product = line.GetProduct(); /***********************************************************/ //05,Sep,2011 //Special Check to restic Price varience posting in case of //AvarageInvoice Selected on product Category.Then Neglact the AverageInvoice Cost MProductCategoryAcct pca = MProductCategoryAcct.Get(product.GetCtx(), product.GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), null); try { if (as1.IsNotPostPOVariance() && line.GetC_OrderLine_ID() > 0) { MOrderLine oLine = new MOrderLine(product.GetCtx(), line.GetC_OrderLine_ID(), null); MOrder order = new MOrder(product.GetCtx(), oLine.GetC_Order_ID(), null); Decimal convertedCost = MConversionRate.Convert(product.GetCtx(), oLine.GetPriceEntered(), order.GetC_Currency_ID(), as1.GetC_Currency_ID(), line.GetDateAcct(), order.GetC_ConversionType_ID(), oLine.GetAD_Client_ID(), line.GetAD_Org_ID()); costs = Decimal.Multiply(convertedCost, oLine.GetQtyEntered()); } else { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // non-zero costs } } catch (Exception ex) { log.SaveError("AccountSchemaColumnError", ex); costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // non-zero costs } /***********************************************************/ //Decimal costs = costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // non-zero costs if (Env.Signum(costs) == 0) { _error = "Resubmit - No Costs for " + product.GetName(); log.Log(Level.WARNING, _error); return(null); } // Inventory/Asset DR MAccount assets = line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1); if (product.IsService()) { assets = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); } if (!IsReturnTrx()) { // Inventory/Asset DR dr = fact.CreateLine(line, assets, as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc dr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc // NotInvoicedReceipt CR cr = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as1), as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc cr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc cr.SetQty(Decimal.Negate(line.GetQty().Value)); } else // reverse accounting entries for returns { // Inventory/Asset CR cr = fact.CreateLine(line, assets, as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc cr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc // NotInvoicedReceipt DR dr = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as1), as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc dr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc dr.SetQty(Decimal.Negate(line.GetQty().Value)); } } } // Receipt else { _error = "DocumentType unknown: " + GetDocumentType(); log.Log(Level.SEVERE, _error); return(null); } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// ARP, APP. ///<pre> /// ARP /// BankInTransit DR /// UnallocatedCash CR /// or Charge/C_Prepayment /// APP /// PaymentSelect DR /// or Charge/V_Prepayment /// BankInTransit CR /// CashBankTransfer /// - /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); // Cash Transfer if ("X".Equals(_TenderType)) { List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); } int AD_Org_ID = GetBank_Org_ID(); // Bank Account Org if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARRECEIPT)) { // Work done by Bharat for the posting of ED008 Module bool addPost = false; //Check For Module Tuple <String, String, String> aInfo = null; if (Env.HasModulePrefix("ED008_", out aInfo)) { addPost = true; } else { addPost = false; } if (addPost == true) { // Tender Type RIBA if ("R".Equals(_TenderType)) { MAccount acct = null; MAccount portAcct = null; int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RIBA_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=" + GetC_BankAccount_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RIBA_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } FactLine fl = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); int ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_Portfolio_Acct FROM C_BP_Customer_Acct WHERE C_BPartner_ID=" + GetC_BPartner_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (ComID > 0) { portAcct = MAccount.Get(Env.GetCtx(), ComID); } if (portAcct == null) { ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_Portfolio_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); portAcct = MAccount.Get(Env.GetCtx(), ComID); } fl = fact.CreateLine(null, portAcct, GetC_Currency_ID(), null, GetAmount()); } // Tender Type MAV else if ("M".Equals(_TenderType)) { MAccount acct = null; MAccount portAcct = null; int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_MAV_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=" + GetC_BankAccount_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_MAV_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } FactLine fl = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); int ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_Portfolio_Acct FROM C_BP_Customer_Acct WHERE C_BPartner_ID=" + GetC_BPartner_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (ComID > 0) { portAcct = MAccount.Get(Env.GetCtx(), ComID); } if (portAcct == null) { ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_Portfolio_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); portAcct = MAccount.Get(Env.GetCtx(), ComID); } fl = fact.CreateLine(null, portAcct, GetC_Currency_ID(), null, GetAmount()); } // Tender Type BOE else if ("E".Equals(_TenderType)) { MAccount acct = null; MAccount portAcct = null; string boeType = Util.GetValueOfString(DB.ExecuteScalar(@"SELECT ED008_BOEType FROM C_Payment WHERE C_Payment_ID = " + Get_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); int boeID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED008_BOE_ID FROM C_Payment WHERE C_Payment_ID = " + Get_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if ("T".Equals(boeType)) { int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOE_Acct FROM ED008_BOEAccounting WHERE ED008_BOE_ID=" + boeID + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOE_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } FactLine fl = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); int ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOETransit_Acct FROM ED008_BOEAccounting WHERE ED008_BOE_ID=" + boeID + " AND AD_Client_ID = " + GetAD_Client_ID())); if (ComID > 0) { portAcct = MAccount.Get(Env.GetCtx(), ComID); } if (portAcct == null) { ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOETransit_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); portAcct = MAccount.Get(Env.GetCtx(), ComID); } fl = fact.CreateLine(null, portAcct, GetC_Currency_ID(), null, GetAmount()); } else if ("R".Equals(boeType)) { FactLine fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), GetAmount(), null); int ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOE_Acct FROM ED008_BOEAccounting WHERE ED008_BOE_ID=" + boeID + " AND AD_Client_ID = " + GetAD_Client_ID())); if (ComID > 0) { portAcct = MAccount.Get(Env.GetCtx(), ComID); } if (portAcct == null) { ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOE_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); portAcct = MAccount.Get(Env.GetCtx(), ComID); } fl = fact.CreateLine(null, portAcct, GetC_Currency_ID(), null, GetAmount()); } } // Tender Type RID else if ("I".Equals(_TenderType)) { MAccount acct = null; MAccount portAcct = null; int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RID_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=" + GetC_BankAccount_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RID_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } FactLine fl = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); int ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_Portfolio_Acct FROM C_BP_Customer_Acct WHERE C_BPartner_ID=" + GetC_BPartner_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (ComID > 0) { portAcct = MAccount.Get(Env.GetCtx(), ComID); } if (portAcct == null) { ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_Portfolio_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); portAcct = MAccount.Get(Env.GetCtx(), ComID); } fl = fact.CreateLine(null, portAcct, GetC_Currency_ID(), null, GetAmount()); } else { // Asset FactLine fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), GetAmount(), null); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } // MAccount acct = null; if (GetC_Charge_ID() != 0) { acct = MCharge.GetAccount(GetC_Charge_ID(), as1, GetAmount()); } else if (_Prepayment) { acct = GetAccount(Doc.ACCTTYPE_C_Prepayment, as1); } else { acct = GetAccount(Doc.ACCTTYPE_UnallocatedCash, as1); } fl = fact.CreateLine(null, acct, GetC_Currency_ID(), null, GetAmount()); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } } } // Default Posting Logic else { // Asset FactLine fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), GetAmount(), null); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } // MAccount acct = null; if (GetC_Charge_ID() != 0) { acct = MCharge.GetAccount(GetC_Charge_ID(), as1, GetAmount()); } else if (_Prepayment) { acct = GetAccount(Doc.ACCTTYPE_C_Prepayment, as1); } else { acct = GetAccount(Doc.ACCTTYPE_UnallocatedCash, as1); } fl = fact.CreateLine(null, acct, GetC_Currency_ID(), null, GetAmount()); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } } } // APP else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APPAYMENT)) { // Work Done For Ed008 Module bool addPost = false; //Check For Module Tuple <String, String, String> aInfo = null; if (Env.HasModulePrefix("ED008_", out aInfo) || Env.HasModulePrefix("ED010_", out aInfo)) { addPost = true; } if (addPost == true) { MAccount acct = null; MAccount portAcct = null; string boeType = Util.GetValueOfString(DB.ExecuteScalar(@"SELECT ED008_BOEType FROM C_Payment WHERE C_Payment_ID = " + Get_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); int boeID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED008_BOE_ID FROM C_Payment WHERE C_Payment_ID = " + Get_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if ("E".Equals(_TenderType)) { if ("T".Equals(boeType)) { int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOETransit_Acct FROM ED008_BOEAccounting WHERE ED008_BOE_ID=" + boeID + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOETransit_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } FactLine f2 = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); int ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOE_Acct FROM ED008_BOEAccounting WHERE ED008_BOE_ID=" + boeID + " AND AD_Client_ID = " + GetAD_Client_ID())); if (ComID > 0) { portAcct = MAccount.Get(Env.GetCtx(), ComID); } if (portAcct == null) { ComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_BOE_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); portAcct = MAccount.Get(Env.GetCtx(), ComID); } f2 = fact.CreateLine(null, portAcct, GetC_Currency_ID(), null, GetAmount()); } } else { FactLine fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), null, GetAmount()); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } DataSet ds = null; DataSet dsSSCode = null; decimal amount = 0, WithholdingAmt = 0, sscAmt = 0, payAmt = 0; payAmt = GetAmount(); string sql = @"SELECT cl.m_product_id, cl.linenetamt,prd.ed010_sscode_id,holddet.ed010_appliedpercentage,holddet.ed010_actualpercentage,withAcct.Withholding_Acct FROM C_Payment pay INNER JOIN c_invoice inv ON pay.c_invoice_id = inv.c_invoice_id inner join c_invoiceline cl on pay.c_invoice_id=cl.c_invoice_id inner join C_BPartner cb on pay.c_bpartner_id=cb.c_bpartner_id INNER JOIN m_product prd ON prd.m_product_ID = cl.m_product_ID LEFT JOIN c_withholding hold ON hold.C_WithHolding_Id = prd.c_withholding_id LEFT JOIN ed010_withholdingdetails holddet ON holddet.C_WithHolding_Id = hold.C_WithHolding_Id left join C_Withholding_Acct withAcct on hold.C_WithHolding_Id=withAcct.C_WithHolding_Id where cb.ED010_IsWithholding='Y' and cb.ED010_IsSSCode='Y' and pay.ED010_WithholdingAmt > 0 AND " + GlobalVariable.TO_DATE(DateTime.Now.ToLocalTime(), true) + @"BETWEEN holddet.ED010_FromDate AND holddet.ED010_ToDate and pay.AD_Org_ID = " + GetCtx().GetAD_Org_ID() + " and pay.c_payment_id = " + Get_ID(); ds = new DataSet(); ds = DB.ExecuteDataset(sql, null, null); if (ds.Tables.Count > 0) { if (ds.Tables[0].Rows.Count > 0) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { MAccount withAcct = null; int validID = 0; amount = (Decimal.Divide(Decimal.Multiply(Util.GetValueOfDecimal(ds.Tables[0].Rows[i]["linenetamt"]), Util.GetValueOfDecimal(ds.Tables[0].Rows[i]["ed010_appliedpercentage"])), 100)); WithholdingAmt = (Decimal.Divide(Decimal.Multiply(amount, Util.GetValueOfDecimal(ds.Tables[0].Rows[i]["ed010_actualpercentage"])), 100)); validID = Util.GetValueOfInt(ds.Tables[0].Rows[i]["Withholding_Acct"]); if (validID > 0) { withAcct = MAccount.Get(Env.GetCtx(), validID); } if (withAcct == null) { validID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT Withholding_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); withAcct = MAccount.Get(Env.GetCtx(), validID); } fl = fact.CreateLine(null, withAcct, GetC_Currency_ID(), null, Decimal.Round(WithholdingAmt, 2)); if (fl != null) { payAmt += Decimal.Round(WithholdingAmt, 2); } if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } } } } ds.Dispose(); sql = @"SELECT cl.m_product_id,cb.c_bpartner_id,cl.linenetamt,prd.ed010_sscode_id,sdet.ed010_percentagetype,sdet.ed010_maxamt,sdet.ed010_minamt,sdet.ed010_socialsecurityprcnt,sdet.ed010_orgpercentage, sdet.ed010_vendorpercentage,sscAcct.ED000_SecCodeAcct FROM C_Payment pay INNER JOIN c_invoice inv ON pay.c_invoice_id = inv.c_invoice_id inner join c_invoiceline cl on pay.c_invoice_id=cl.c_invoice_id inner join C_BPartner cb on pay.c_bpartner_id=cb.c_bpartner_id INNER JOIN m_product prd ON prd.m_product_ID = cl.m_product_ID LEFT JOIN ed010_sscode scode ON scode.ed010_sscode_ID = prd.ed010_sscode_id LEFT JOIN ed010_sscodedetails sdet ON sdet.ed010_sscode_ID = scode.ed010_sscode_ID left join ED010_SSCode_Acct sscAcct on scode.ED010_SSCode_ID=sscAcct.ED010_SSCode_ID where cb.ED010_IsWithholding='Y' and cb.ED010_IsSSCode='Y' and pay.ED010_WithholdingAmt > 0 AND " + GlobalVariable.TO_DATE(DateTime.Now.ToLocalTime(), true) + @"BETWEEN sdet.ED010_FromDate AND sdet.ED010_ToDate AND pay.AD_Org_ID = " + GetCtx().GetAD_Org_ID() + " and pay.c_payment_id = " + Get_ID(); dsSSCode = new DataSet(); dsSSCode = DB.ExecuteDataset(sql, null, null); if (dsSSCode.Tables.Count > 0) { if (dsSSCode.Tables[0].Rows.Count > 0) { for (int i = 0; i < dsSSCode.Tables[0].Rows.Count; i++) { MAccount sscAcct = null; int vlID = 0; sql = @"SELECT SUM(grandtotal) FROM c_invoice WHERE IsActive = 'Y' AND docstatus = 'CO' AND c_bpartner_Id = " + Util.GetValueOfInt(dsSSCode.Tables[0].Rows[i]["c_bpartner_id"]); decimal result = Util.GetValueOfDecimal(DB.ExecuteScalar(sql, null, null)); if (result <= Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["ed010_maxamt"]) && result >= Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["ed010_minamt"])) { if (Util.GetValueOfString(dsSSCode.Tables[0].Rows[i]["ed010_percentagetype"]) == "S") { sscAmt = (Decimal.Divide(Decimal.Multiply(Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["linenetamt"]), Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["ed010_socialsecurityprcnt"])), 100)); } else if (Util.GetValueOfString(dsSSCode.Tables[0].Rows[i]["ed010_percentagetype"]) == "M") { // amount = (Decimal.Divide(Decimal.Multiply(Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["linenetamt"]), Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["ed010_vendorpercentage"])), 100)); sscAmt = (Decimal.Divide(Decimal.Multiply(Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["linenetamt"]), Util.GetValueOfDecimal(dsSSCode.Tables[0].Rows[i]["ed010_orgpercentage"])), 100)); } } vlID = Util.GetValueOfInt(dsSSCode.Tables[0].Rows[i]["ED000_SecCodeAcct"]); if (vlID > 0) { sscAcct = MAccount.Get(Env.GetCtx(), vlID); } if (sscAcct == null) { vlID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_SecCodeAcct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); sscAcct = MAccount.Get(Env.GetCtx(), vlID); } fl = fact.CreateLine(null, sscAcct, GetC_Currency_ID(), null, Decimal.Round(sscAmt, 2)); if (fl != null) { payAmt += Decimal.Round(sscAmt, 2); } if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } } } } dsSSCode.Dispose(); fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_PaymentSelect, as1), GetC_Currency_ID(), payAmt, null); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } } } // Default Posting Logic else { MAccount acct = null; if (GetC_Charge_ID() != 0) { acct = MCharge.GetAccount(GetC_Charge_ID(), as1, GetAmount()); } else if (_Prepayment) { acct = GetAccount(Doc.ACCTTYPE_V_Prepayment, as1); } else { acct = GetAccount(Doc.ACCTTYPE_PaymentSelect, as1); } FactLine fl = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } // Asset fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), null, GetAmount()); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } } } else { _error = "DocumentType unknown: " + GetDocumentType(); log.Log(Level.SEVERE, _error); fact = null; } // List <Fact> facts1 = new List <Fact>(); facts1.Add(fact); return(facts1); }
/// <summary> /// Create Fact Cash Based (i.e. only revenue/expense) /// </summary> /// <param name="as1">accounting schema</param> /// <param name="fact">fact to add lines to</param> /// <param name="multiplier">source amount multiplier</param> /// <returns>accounted amount</returns> public Decimal CreateFactCash(MAcctSchema as1, Fact fact, Decimal multiplier) { bool creditMemo = GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARCREDITMEMO) || GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APCREDITMEMO); bool payables = GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APINVOICE) || GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APCREDITMEMO); Decimal acctAmt = Env.ZERO; FactLine fl = null; // Revenue/Cost for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; bool landedCost = false; if (payables) { landedCost = LandedCost(as1, fact, line, false); } if (landedCost && as1.IsExplicitCostAdjustment()) { fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), null, line.GetAmtSource()); // fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), line.GetAmtSource(), null); String desc = line.GetDescription(); if (desc == null) { desc = "100%"; } else { desc += " 100%"; } fl.SetDescription(desc); } if (!landedCost) { MAccount acct = line.GetAccount( payables ? ProductCost.ACCTTYPE_P_Expense : ProductCost.ACCTTYPE_P_Revenue, as1); if (payables) { // if Fixed Asset if (line.IsItem()) { acct = line.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); } } Decimal?amt = (Decimal?)Decimal.Multiply(line.GetAmtSource(), multiplier); Decimal?amt2 = null; if (creditMemo) { amt2 = amt; amt = null; } if (payables) // Vendor = DR { fl = fact.CreateLine(line, acct, GetC_Currency_ID(), amt, amt2); } else // Customer = CR { fl = fact.CreateLine(line, acct, GetC_Currency_ID(), amt2, amt); } if (fl != null) { acctAmt = Decimal.Add(acctAmt, fl.GetAcctBalance()); } } } // Tax for (int i = 0; i < _taxes.Length; i++) { Decimal?amt = (Decimal?)_taxes[i].GetAmount(); Decimal?amt2 = null; if (creditMemo) { amt2 = amt; amt = null; } FactLine tl = null; if (payables) { tl = fact.CreateLine(null, _taxes[i].GetAccount(_taxes[i].GetAPTaxType(), as1), GetC_Currency_ID(), amt, amt2); } else { tl = fact.CreateLine(null, _taxes[i].GetAccount(DocTax.ACCTTYPE_TaxDue, as1), GetC_Currency_ID(), amt2, amt); } if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { if (payables) { fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), false); // to Loc } else { fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), true); // from Loc fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } } } return(acctAmt); }
/// <summary> /// Create Facts (the accounting logic) for /// CMB. /// <pre> /// BankAsset DR CR (Statement) /// BankInTransit DR CR (Payment) /// Charge DR (Charge) /// Interest DR CR (Interest) /// </pre> /// </summary> /// <param name="as1"></param> /// <returns></returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); // Header -- there may be different currency amounts FactLine fl = null; int AD_Org_ID = GetBank_Org_ID(); // Bank Account Org // Lines for (int i = 0; i < _lines.Length; i++) { DocLine_Bank line = (DocLine_Bank)_lines[i]; int C_BPartner_ID = line.GetC_BPartner_ID(); // BankAsset DR CR (Statement) fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_BankAsset, as1), line.GetC_Currency_ID(), line.GetStmtAmt()); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // BankInTransit DR CR (Payment) fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetTrxAmt())); if (fl != null) { if (C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } if (AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } else { fl.SetAD_Org_ID(line.GetAD_Org_ID(true)); // from payment } } // Charge DR (Charge) fl = fact.CreateLine(line, line.GetChargeAccount(as1, Decimal.Negate(line.GetChargeAmt())), line.GetC_Currency_ID(), Decimal.Negate(line.GetChargeAmt()), null); if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // Interest DR CR (Interest) if (Env.Signum(line.GetInterestAmt()) < 0) { fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_InterestExp, as1), GetAccount(Doc.ACCTTYPE_InterestExp, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetInterestAmt())); } else { fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_InterestRev, as1), GetAccount(Doc.ACCTTYPE_InterestRev, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetInterestAmt())); } if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // // fact.createTaxCorrection(); } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Landed Cost accounting & Cost lines /// </summary> /// <param name="as1">accounting schema</param> /// <param name="fact">fact</param> /// <param name="line">document line</param> /// <param name="dr">DR entry (normal api)</param> /// <returns>true if landed costs were created</returns> private bool LandedCost(MAcctSchema as1, Fact fact, DocLine line, bool dr) { int C_InvoiceLine_ID = line.Get_ID(); MLandedCostAllocation[] lcas = MLandedCostAllocation.GetOfInvoiceLine( GetCtx(), C_InvoiceLine_ID, GetTrx()); if (lcas.Length == 0) { return(false); } // Delete Old String sql = "DELETE FROM M_CostDetail WHERE C_InvoiceLine_ID=" + C_InvoiceLine_ID; int no = DataBase.DB.ExecuteQuery(sql, null, GetTrx()); if (no != 0) { log.Config("CostDetail Deleted #" + no); } // Calculate Total Base double totalBase = 0; for (int i = 0; i < lcas.Length; i++) { totalBase += Convert.ToDouble(lcas[i].GetBase());//.doubleValue(); } // Create New MInvoiceLine il = new MInvoiceLine(GetCtx(), C_InvoiceLine_ID, GetTrx()); for (int i = 0; i < lcas.Length; i++) { MLandedCostAllocation lca = lcas[i]; if (Env.Signum(lca.GetBase()) == 0) { continue; } double percent = totalBase / Convert.ToDouble(lca.GetBase()); String desc = il.GetDescription(); if (desc == null) { desc = percent + "%"; } else { desc += " - " + percent + "%"; } if (line.GetDescription() != null) { desc += " - " + line.GetDescription(); } // Accounting ProductCost pc = new ProductCost(GetCtx(), lca.GetM_Product_ID(), lca.GetM_AttributeSetInstance_ID(), GetTrx()); Decimal?drAmt = null; Decimal?crAmt = null; if (dr) { drAmt = lca.GetAmt(); } else { crAmt = lca.GetAmt(); } FactLine fl = fact.CreateLine(line, pc.GetAccount(ProductCost.ACCTTYPE_P_CostAdjustment, as1), GetC_Currency_ID(), drAmt, crAmt); fl.SetDescription(desc); // Cost Detail - Convert to AcctCurrency Decimal allocationAmt = lca.GetAmt(); if (GetC_Currency_ID() != as1.GetC_Currency_ID()) { allocationAmt = MConversionRate.Convert(GetCtx(), allocationAmt, GetC_Currency_ID(), as1.GetC_Currency_ID(), GetDateAcct(), GetC_ConversionType_ID(), GetAD_Client_ID(), GetAD_Org_ID()); } if (Env.Scale(allocationAmt) > as1.GetCostingPrecision()) { allocationAmt = Decimal.Round(allocationAmt, as1.GetCostingPrecision(), MidpointRounding.AwayFromZero); } if (!dr) { allocationAmt = Decimal.Negate(allocationAmt); } if (!IsPosted()) { MCostDetail cd = new MCostDetail(as1, lca.GetAD_Org_ID(), lca.GetM_Product_ID(), lca.GetM_AttributeSetInstance_ID(), lca.GetM_CostElement_ID(), allocationAmt, lca.GetQty(), // Qty desc, GetTrx()); cd.SetC_InvoiceLine_ID(C_InvoiceLine_ID); bool ok = cd.Save(); if (ok && !cd.IsProcessed()) { MClient client = MClient.Get(as1.GetCtx(), as1.GetAD_Client_ID()); if (client.IsCostImmediate()) { cd.Process(); } } } } log.Config("Created #" + lcas.Length); return(true); }
/// <summary> /// Balance Accounting Currency. /// If the accounting currency is not balanced, /// if Currency balancing is enabled /// create a new line using the currency balancing account with zero source balance /// or /// adjust the line with the largest balance sheet account /// or if no balance sheet account exist, the line with the largest amount /// </summary> /// <returns>FactLine</returns> public FactLine BalanceAccounting() { Decimal diff = GetAcctBalance(); // DR-CR log.Fine("Balance=" + diff + ", CurrBal=" + _acctSchema.IsCurrencyBalancing() + " - " + ToString()); FactLine line = null; Decimal BSamount = Env.ZERO; FactLine BSline = null; Decimal PLamount = Env.ZERO; FactLine PLline = null; // Find line biggest BalanceSheet or P&L line for (int i = 0; i < _lines.Count; i++) { FactLine l = (FactLine)_lines[i]; Decimal amt = Math.Abs(l.GetAcctBalance()); if (l.IsBalanceSheet() && amt.CompareTo(BSamount) > 0) { BSamount = amt; BSline = l; } else if (!l.IsBalanceSheet() && amt.CompareTo(PLamount) > 0) { PLamount = amt; PLline = l; } } // Create Currency Balancing Entry if (_acctSchema.IsCurrencyBalancing()) { line = new FactLine(_doc.GetCtx(), _doc.Get_Table_ID(), _doc.Get_ID(), 0, _trx); line.SetDocumentInfo(_doc, null); line.SetPostingType(_postingType); line.SetAccount(_acctSchema, _acctSchema.GetCurrencyBalancing_Acct()); // Amount line.SetAmtSource(_doc.GetC_Currency_ID(), Env.ZERO, Env.ZERO); line.Convert(); // Accounted Decimal drAmt = Env.ZERO; Decimal crAmt = Env.ZERO; bool isDR = Env.Signum(diff) < 0; Decimal difference = Math.Abs(diff); if (isDR) { drAmt = difference; } else { crAmt = difference; } // Switch sides bool switchIt = BSline != null && ((BSline.IsDrSourceBalance() && isDR) || (!BSline.IsDrSourceBalance() && !isDR)); if (switchIt) { drAmt = Env.ZERO; crAmt = Env.ZERO; if (isDR) { crAmt = Decimal.Negate(difference); } else { drAmt = Decimal.Negate(difference); } } line.SetAmtAcct(drAmt, crAmt); log.Fine(line.ToString()); _lines.Add(line); } else // Adjust biggest (Balance Sheet) line amount { if (BSline != null) { line = BSline; } else { line = PLline; } if (line == null) { log.Severe("No Line found"); } else { log.Fine("Adjusting Amt=" + diff + "; Line=" + line); line.CurrencyCorrect(diff); log.Fine(line.ToString()); } } // correct biggest amount return(line); }
/// <summary> /// Create Facts (the accounting logic) for /// CMB. /// <pre> /// BankAsset DR CR (Statement) /// BankInTransit DR CR (Payment) /// Charge DR (Charge) /// Interest DR CR (Interest) /// </pre> /// </summary> /// <param name="as1"></param> /// <returns></returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); // Header -- there may be different currency amounts FactLine fl = null; int AD_Org_ID = GetBank_Org_ID(); // Bank Account Org bool addPost = false; //Check For Module Tuple <String, String, String> aInfo = null; if (Env.HasModulePrefix("ED008_", out aInfo)) { addPost = true; } else { addPost = false; } // Posting Work Done For ED008 Module if (addPost == true) { for (int i = 0; i < _lines.Length; i++) { DocLine_Bank line = (DocLine_Bank)_lines[i]; int C_BPartner_ID = line.GetC_BPartner_ID(); int C_Payment_ID = line.GetC_Payment_ID(); // BankAsset DR CR (Statement) fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_BankAsset, as1), line.GetC_Currency_ID(), line.GetStmtAmt()); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // BankInTransit DR CR (Payment) MAccount acct = null; string tenderType = Util.GetValueOfString(DB.ExecuteScalar("SELECT tendertype FROM C_Payment WHERE C_Payment_ID=" + C_Payment_ID + " AND AD_Client_ID = " + GetAD_Client_ID())); // Tender Type RIBA if ("R".Equals(tenderType)) { int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RIBA_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=" + GetC_BankAccount_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RIBA_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } } // Tender Type MAV else if ("M".Equals(tenderType)) { int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_MAV_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=" + GetC_BankAccount_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_MAV_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } } // Tender Type RID else if ("I".Equals(tenderType)) { int validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RID_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=" + GetC_BankAccount_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); if (validComID > 0) { acct = MAccount.Get(Env.GetCtx(), validComID); } if (acct == null) { validComID = Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT ED000_RID_Acct FROM C_AcctSchema_Default WHERE C_AcctSchema_ID=" + as1.GetC_AcctSchema_ID() + " AND AD_Client_ID = " + GetAD_Client_ID())); acct = MAccount.Get(Env.GetCtx(), validComID); } } else { acct = GetAccount(Doc.ACCTTYPE_BankInTransit, as1); } fl = fact.CreateLine(line, acct, line.GetC_Currency_ID(), Decimal.Negate(line.GetTrxAmt())); if (fl != null) { if (C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } if (AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } else { fl.SetAD_Org_ID(line.GetAD_Org_ID(true)); // from payment } } // Charge DR (Charge) fl = fact.CreateLine(line, line.GetChargeAccount(as1, Decimal.Negate(line.GetChargeAmt())), line.GetC_Currency_ID(), Decimal.Negate(line.GetChargeAmt()), null); if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // Interest DR CR (Interest) if (Env.Signum(line.GetInterestAmt()) < 0) { fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_InterestExp, as1), GetAccount(Doc.ACCTTYPE_InterestExp, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetInterestAmt())); } else { fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_InterestRev, as1), GetAccount(Doc.ACCTTYPE_InterestRev, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetInterestAmt())); } if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } } } // Default Posting Logic else { // Lines for (int i = 0; i < _lines.Length; i++) { DocLine_Bank line = (DocLine_Bank)_lines[i]; int C_BPartner_ID = line.GetC_BPartner_ID(); // BankAsset DR CR (Statement) fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_BankAsset, as1), line.GetC_Currency_ID(), line.GetStmtAmt()); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // BankInTransit DR CR (Payment) fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetTrxAmt())); if (fl != null) { if (C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } if (AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } else { fl.SetAD_Org_ID(line.GetAD_Org_ID(true)); // from payment } } // Charge DR (Charge) fl = fact.CreateLine(line, line.GetChargeAccount(as1, Decimal.Negate(line.GetChargeAmt())), line.GetC_Currency_ID(), Decimal.Negate(line.GetChargeAmt()), null); if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // Interest DR CR (Interest) if (Env.Signum(line.GetInterestAmt()) < 0) { fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_InterestExp, as1), GetAccount(Doc.ACCTTYPE_InterestExp, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetInterestAmt())); } else { fl = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_InterestRev, as1), GetAccount(Doc.ACCTTYPE_InterestRev, as1), line.GetC_Currency_ID(), Decimal.Negate(line.GetInterestAmt())); } if (fl != null && C_BPartner_ID != 0) { fl.SetC_BPartner_ID(C_BPartner_ID); } // // fact.createTaxCorrection(); } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// ARP, APP. ///<pre> /// ARP /// BankInTransit DR /// UnallocatedCash CR /// or Charge/C_Prepayment /// APP /// PaymentSelect DR /// or Charge/V_Prepayment /// BankInTransit CR /// CashBankTransfer /// - /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); // Cash Transfer if ("X".Equals(_TenderType)) { List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); } int AD_Org_ID = GetBank_Org_ID(); // Bank Account Org if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARRECEIPT)) { // Asset FactLine fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), GetAmount(), null); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } // MAccount acct = null; if (GetC_Charge_ID() != 0) { acct = MCharge.GetAccount(GetC_Charge_ID(), as1, GetAmount()); } else if (_Prepayment) { acct = GetAccount(Doc.ACCTTYPE_C_Prepayment, as1); } else { acct = GetAccount(Doc.ACCTTYPE_UnallocatedCash, as1); } fl = fact.CreateLine(null, acct, GetC_Currency_ID(), null, GetAmount()); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } } // APP else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APPAYMENT)) { MAccount acct = null; if (GetC_Charge_ID() != 0) { acct = MCharge.GetAccount(GetC_Charge_ID(), as1, GetAmount()); } else if (_Prepayment) { acct = GetAccount(Doc.ACCTTYPE_V_Prepayment, as1); } else { acct = GetAccount(Doc.ACCTTYPE_PaymentSelect, as1); } FactLine fl = fact.CreateLine(null, acct, GetC_Currency_ID(), GetAmount(), null); if (fl != null && AD_Org_ID != 0 && GetC_Charge_ID() == 0) // don't overwrite charge { fl.SetAD_Org_ID(AD_Org_ID); } // Asset fl = fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_BankInTransit, as1), GetC_Currency_ID(), null, GetAmount()); if (fl != null && AD_Org_ID != 0) { fl.SetAD_Org_ID(AD_Org_ID); } } else { _error = "DocumentType unknown: " + GetDocumentType(); log.Log(Level.SEVERE, _error); fact = null; } // List <Fact> facts1 = new List <Fact>(); facts1.Add(fact); return(facts1); }
/// <summary> /// Create Facts (the accounting logic) for /// MMM. /// <pre> /// Movement /// Inventory DR CR /// InventoryTo DR CR /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointers FactLine dr = null; FactLine cr = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; Decimal costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // ** Inventory DR CR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), Decimal.Negate(costs)); // from (-) CR if (dr == null) { continue; } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetQty(Decimal.Negate(line.GetQty().Value)); // outgoing // ** InventoryTo DR CR cr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs); // to (+) DR if (cr == null) { continue; } cr.SetM_Locator_ID(line.GetM_LocatorTo_ID()); cr.SetQty(line.GetQty()); // Only for between-org movements if (dr.GetAD_Org_ID() != cr.GetAD_Org_ID()) { String costingLevel = as1.GetCostingLevel(); MProductCategoryAcct pca = MProductCategoryAcct.Get(GetCtx(), line.GetProduct().GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), GetTrx()); if (pca.GetCostingLevel() != null) { costingLevel = pca.GetCostingLevel(); } if (!MAcctSchema.COSTINGLEVEL_Organization.Equals(costingLevel)) { continue; } // String description = line.GetDescription(); if (description == null) { description = ""; } if (!IsPosted()) { // Cost Detail From MCostDetail.CreateMovement(as1, dr.GetAD_Org_ID(), // locator org line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, Decimal.Negate(costs), Decimal.Negate(line.GetQty().Value), true, description + "(|->)", GetTrx(), GetRectifyingProcess()); // Cost Detail To MCostDetail.CreateMovement(as1, cr.GetAD_Org_ID(), // locator org line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, costs, line.GetQty().Value, false, description + "(|<-)", GetTrx(), GetRectifyingProcess()); } } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Is Source Segment balanced. /// Implemented only for Org /// Other sensible candidates are Project, User1/2 /// </summary> /// <param name="segmentType"></param> /// <returns>true if segments are balanced</returns> public bool IsSegmentBalanced(String segmentType) { if (segmentType.Equals(X_C_AcctSchema_Element.ELEMENTTYPE_Organization)) { Dictionary <int, Decimal?> map = new Dictionary <int, Decimal?>(); // Add up values by key for (int i = 0; i < _lines.Count; i++) { //FactLine line = (FactLine)_lines[i]; //int key = Utility.Util.GetValueOfInt(line.GetAD_Org_ID()); //Decimal bal = line.GetSourceBalance(); //Decimal oldBal; //if (map.TryGetValue(key, out oldBal)) //{ // oldBal = map[key]; // bal = Decimal.Add(bal, oldBal); // map[key] = bal;//put(key, bal); //} //map.Add(key, bal);//put(key, bal); try { FactLine line = (FactLine)_lines[i]; int key = Utility.Util.GetValueOfInt(line.GetAD_Org_ID()); Decimal? bal = line.GetSourceBalance(); Decimal? oldBal = null; if (map.TryGetValue(key, out oldBal)) { oldBal = map[key]; } if (oldBal != null) { bal = Decimal.Add(bal.Value, oldBal.Value); } if (!map.Keys.Contains(key)) { map.Add(key, bal); } else { map[key] = bal; } } catch { } } // check if all keys are zero //Iterator values = map.values().iterator(); IEnumerator values = map.Values.GetEnumerator(); while (values.MoveNext()) { Decimal bal = (Decimal)values.Current; if (Env.Signum(bal) != 0) { map.Clear(); log.Warning("(" + segmentType + ") NO - " + ToString() + ", Balance=" + bal); return(false); } } map.Clear(); log.Finer("(" + segmentType + ") - " + ToString()); return(true); } log.Finer("(" + segmentType + ") (not checked) - " + ToString()); return(true); }