⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doc_invoice.java

📁 Java写的ERP系统
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	 *      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>
	 *  @param as accounting schema
	 *  @return Fact
	 */
	public Fact createFact (AcctSchema as)
	{
		//  create Fact Header
		Fact fact = new Fact(this, as, Fact.POST_Actual);

		//  Cash based accounting
		if (!as.isAccrual())
		{
			p_vo.Error = "Not Accrual";
			log.error("createFact - " + p_vo.Error);
			return null;
		}

		/** @todo Assumes TaxIncluded = N */

		//  ARI, ARF
		if (p_vo.DocumentType.equals(DocVO.DOCTYPE_ARInvoice) || p_vo.DocumentType.equals(DocVO.DOCTYPE_ARProForma))
		{
			//  Receivables     DR
			fact.createLine(null, getAccount(Doc.ACCTTYPE_C_Receivable, as),
				p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Gross), null);
			//  Charge                  CR
			fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as),
				p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Charge));
			//  TaxDue                  CR
			for (int i = 0; i < m_taxes.length; i++)
			{
				fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as),
					p_vo.C_Currency_ID, null, m_taxes[i].getAmount());
			}
			//  Revenue                 CR
			for (int i = 0; i < p_lines.length; i++)
				fact.createLine(p_lines[i],
					((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Revenue, as),
					p_vo.C_Currency_ID, null, p_lines[i].getAmount());
			//  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(C_BPartner_Location_ID, false);  //  to Loc
				}
			}
		}
		//  ARC
		else if (p_vo.DocumentType.equals(DocVO.DOCTYPE_ARCredit))
		{
			//  Receivables             CR
			fact.createLine(null, getAccount(Doc.ACCTTYPE_C_Receivable, as),
				p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Gross));
			//  Charge          DR
			fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as),
				p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Charge), null);
			//  TaxDue          DR
			for (int i = 0; i < m_taxes.length; i++)
				fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as),
					p_vo.C_Currency_ID, m_taxes[i].getAmount(), null);
			//  Revenue         CR
			for (int i = 0; i < p_lines.length; i++)
				fact.createLine(p_lines[i],
					((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Revenue, as),
					p_vo.C_Currency_ID, p_lines[i].getAmount(), null);
			//  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(C_BPartner_Location_ID, false);  //  to Loc
				}
			}
		}
		//  API
		else if (p_vo.DocumentType.equals(DocVO.DOCTYPE_APInvoice))
		{
			//  Liability               CR
			fact.createLine(null, getAccount(Doc.ACCTTYPE_V_Liability, as),
				p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Gross));
			//  Charge          DR
			fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as),
				p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Charge), null);
			//  TaxCredit       DR
			for (int i = 0; i < m_taxes.length; i++)
				fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as),
					p_vo.C_Currency_ID, m_taxes[i].getAmount(), null);
			//  Expense         DR
			for (int i = 0; i < p_lines.length; i++)
				fact.createLine(p_lines[i],
					((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Expense, as),
					p_vo.C_Currency_ID, p_lines[i].getAmount(), null);
			//  Set Locations
			FactLine[] fLines = fact.getLines();
			for (int i = 0; i < fLines.length; i++)
			{
				if (fLines[i] != null)
				{
					fLines[i].setLocationFromBPartner(C_BPartner_Location_ID, true);  //  from Loc
					fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false);    //  to Loc
				}
			}
			updateProductInfo (as.getC_AcctSchema_ID());    //  only API
		}
		//  APC
		else if (p_vo.DocumentType.equals(DocVO.DOCTYPE_APCredit))
		{
			//  Liability       DR
			fact.createLine (null, getAccount(Doc.ACCTTYPE_V_Liability, as),
				p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Gross), null);
			//  Charge                  CR
			fact.createLine (null, getAccount(Doc.ACCTTYPE_Charge, as),
				p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Charge));
			//  TaxCredit               CR
			for (int i = 0; i < m_taxes.length; i++)
				fact.createLine (null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as),
					p_vo.C_Currency_ID, null, m_taxes[i].getAmount());
			//  Expense                 CR
			for (int i = 0; i < p_lines.length; i++)
				fact.createLine (p_lines[i],
					((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Expense, as),
					p_vo.C_Currency_ID, null, p_lines[i].getAmount());
			//  Set Locations
			FactLine[] fLines = fact.getLines();
			for (int i = 0; i < fLines.length; i++)
			{
				if (fLines[i] != null)
				{
					fLines[i].setLocationFromBPartner(C_BPartner_Location_ID, true);  //  from Loc
					fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false);    //  to Loc
				}
			}
		}
		else
		{
			p_vo.Error = "DocumentType unknown: " + p_vo.DocumentType;
			log.error("createFact - " + p_vo.Error);
			fact = null;
		}
		return fact;
	}   //  createFact

	/**
	 *  Update Product Info.
	 *  - Costing (PriceLastInv)
	 *  - PO (PriceLastInv)
	 *  @param C_AcctSchema_ID accounting schema
	 */
	private void updateProductInfo (int C_AcctSchema_ID)
	{
		log.debug("updateProductInfo - C_Invoice_ID=" + p_vo.Record_ID);

		/** @todo Last.. would need to compare document/last updated date
		 *  would need to maintain LastPriceUpdateDate on _PO and _Costing */

		//  update Product PO info
		//  should only be once, but here for every AcctSchema
		//  ignores multiple lines with same product - just uses first
		StringBuffer sql = new StringBuffer (
			"UPDATE M_Product_PO po "
			+ "SET PriceLastInv = "
			//	select
			+ "(SELECT C_Currency_Convert(il.PriceActual,i.C_Currency_ID,po.C_Currency_ID,i.DateInvoiced,null,i.AD_Client_ID,i.AD_Org_ID) "
			+ "FROM C_Invoice i, C_InvoiceLine il "
			+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
			+ " AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID"
			+ " AND ROWNUM=1 AND i.C_Invoice_ID=").append(p_vo.Record_ID).append(") ")
			//	update
			.append("WHERE EXISTS (SELECT * "
			+ "FROM C_Invoice i, C_InvoiceLine il "
			+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
			+ " AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID"
			+ " AND i.C_Invoice_ID=").append(p_vo.Record_ID).append(")");
		int no = DB.executeUpdate(sql.toString());
		log.debug("M_Product_PO - Updated=" + no);

		//  update Product Costing
		//  requires existence of currency conversion !!
		//  if there are multiple lines of the same product last price uses first
		sql = new StringBuffer (
			"UPDATE M_Product_Costing pc "
			+ "SET (PriceLastInv, TotalInvAmt,TotalInvQty) = "
			//	select
			+ "(SELECT C_Currency_Convert(il.PriceActual,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,null,i.AD_Client_ID,i.AD_Org_ID),"
			+ " C_Currency_Convert(il.LineNetAmt,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,null),il.QtyInvoiced "
			+ "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a "
			+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
			+ " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID"
			+ " AND ROWNUM=1"
			+ " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=")
			.append(p_vo.Record_ID).append(") ")
			//	update
			.append("WHERE EXISTS (SELECT * "
			+ "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a "
			+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
			+ " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID"
			+ " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=").append(p_vo.Record_ID).append(")");
		no = DB.executeUpdate(sql.toString());
		log.debug("M_Product_Costing - Updated=" + no);
	}   //  updateProductInfo

}   //  Doc_Invoice

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -