/// <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); }