# HG changeset patch
# User David Alsasua <david.alsasua@openbravo.com>
# Date 1311088178 -7200
# Node ID e24365955ab0f134647c2a4fa38aeb1a3a1b9837
# Parent  b0d4cb84321c797b6e1060de99f39c857199d0c6
Fixes issue 18032. Exchange rate difference is not posted

diff --git a/src/org/openbravo/erpCommon/ad_forms/DocPayment.java b/src/org/openbravo/erpCommon/ad_forms/DocPayment.java
--- a/src/org/openbravo/erpCommon/ad_forms/DocPayment.java
+++ b/src/org/openbravo/erpCommon/ad_forms/DocPayment.java
@@ -268,7 +268,8 @@
                 (lineAux.isReceipt.equals("Y") ? data[0].creditAcct : data[0].debitAcct)),
                 C_Currency_ID, (lineAux.isReceipt.equals("Y") ? transitoryAmount.abs().toString()
                     : "0"), (lineAux.isReceipt.equals("Y") ? "0" : transitoryAmount.abs()
-                    .toString()), Fact_Acct_Group_ID, nextSeqNo(SeqNo), DocumentType, conn);
+                    .toString()), Fact_Acct_Group_ID, nextSeqNo(SeqNo), DocumentType, conn,
+                line.conversionDate);
             if ((!changeGenerate && line.isReceipt.equals("N"))
                 || (changeGenerate && line.isReceipt.equals("Y")))
               amount = amount.negate();
@@ -277,7 +278,8 @@
                 (lineAux.isReceipt.equals("Y") ? data[0].creditAcct : data[0].debitAcct)),
                 C_Currency_ID, (lineAux.isReceipt.equals("Y") ? "0" : transitoryAmount.abs()
                     .toString()), (lineAux.isReceipt.equals("Y") ? transitoryAmount.abs()
-                    .toString() : "0"), Fact_Acct_Group_ID, nextSeqNo(SeqNo), DocumentType, conn);
+                    .toString() : "0"), Fact_Acct_Group_ID, nextSeqNo(SeqNo), DocumentType, conn,
+                line.conversionDate);
             if ((!changeGenerate && line.isReceipt.equals("Y"))
                 || (changeGenerate && line.isReceipt.equals("N")))
               amount = amount.negate();
@@ -395,11 +397,11 @@
                   (line.isReceipt.equals("Y") ? "" : finalAmtTo), Fact_Acct_Group_ID, "999999",
                   DocumentType, conn);
             }// else if(line.C_CASHLINE_ID!=null &&
-            // !line.C_CASHLINE_ID.equals("")) fact.createLine(line,
-            // getAccountCashLine(line.C_CASHLINE_ID,
-            // as,conn),strcCurrencyId,
-            // (line.isReceipt.equals("Y")?finalAmtTo:""),(line.isReceipt.equals("Y")?"":finalAmtTo),
-            // Fact_Acct_Group_ID, "999999", DocumentType,conn);
+             // !line.C_CASHLINE_ID.equals("")) fact.createLine(line,
+             // getAccountCashLine(line.C_CASHLINE_ID,
+             // as,conn),strcCurrencyId,
+             // (line.isReceipt.equals("Y")?finalAmtTo:""),(line.isReceipt.equals("Y")?"":finalAmtTo),
+             // Fact_Acct_Group_ID, "999999", DocumentType,conn);
             else
               fact.createLine(line, getAccount(AcctServer.ACCTTYPE_BankInTransitDefault, as, conn),
                   strcCurrencyId, (line.isReceipt.equals("Y") ? finalAmtTo : ""), (line.isReceipt
diff --git a/src/org/openbravo/erpCommon/ad_forms/Fact.java b/src/org/openbravo/erpCommon/ad_forms/Fact.java
--- a/src/org/openbravo/erpCommon/ad_forms/Fact.java
+++ b/src/org/openbravo/erpCommon/ad_forms/Fact.java
@@ -100,7 +100,35 @@
   public FactLine createLine(DocLine docLine, Account account, String C_Currency_ID,
       String debitAmt, String creditAmt, String Fact_Acct_Group_ID, String SeqNo,
       String DocBaseType, ConnectionProvider conn) {
+    return createLine(docLine, account, C_Currency_ID, debitAmt, creditAmt, Fact_Acct_Group_ID,
+        SeqNo, DocBaseType, conn, null);
+  }
 
+  /**
+   * Create and convert Fact Line. Used to create a DR and/or CR entry
+   * 
+   * @param docLine
+   *          the document line or null
+   * @param account
+   *          if null, line is not created
+   * @param C_Currency_ID
+   *          the currency
+   * @param debitAmt
+   *          debit amount, can be null
+   * @param creditAmt
+   *          credit amount, can be null
+   * @param conversionDate
+   *          if different from accounting date, a conversion date can be provided (if null,
+   *          m_doc.DateAcct will be used)
+   * @return Fact Line
+   */
+  public FactLine createLine(DocLine docLine, Account account, String C_Currency_ID,
+      String debitAmt, String creditAmt, String Fact_Acct_Group_ID, String SeqNo,
+      String DocBaseType, ConnectionProvider conn, String conversionDate) {
+
+    String convDate = conversionDate;
+    if (convDate == null)
+      convDate = m_doc.DateAcct;
     String strNegate = "";
     try {
       strNegate = AcctServerData.selectNegate(conn, m_acctSchema.m_C_AcctSchema_ID, DocBaseType);
@@ -145,11 +173,11 @@
     // Amounts - one needs to be both not zero
     if (!line.setAmtSource(C_Currency_ID, debitAmt, creditAmt))
       return null;
-    log4jFact.debug("C_Currency_ID: " + m_acctSchema.getC_Currency_ID() + " - DateAcct: "
-        + m_doc.DateAcct + " - CurrencyRateType: " + m_acctSchema.getCurrencyRateType());
+    log4jFact.debug("C_Currency_ID: " + m_acctSchema.getC_Currency_ID() + " - ConversionDate: "
+        + convDate + " - CurrencyRateType: " + m_acctSchema.getCurrencyRateType());
     // Convert
-    line.convert(m_acctSchema.getC_Currency_ID(), m_doc.DateAcct, m_acctSchema
-        .getCurrencyRateType(), conn);
+    line.convert(m_acctSchema.getC_Currency_ID(), convDate, m_acctSchema.getCurrencyRateType(),
+        conn);
     // Optionally overwrite Acct Amount
     if (docLine != null && !docLine.m_AmtAcctDr.equals("") && !docLine.m_AmtAcctCr.equals(""))
       line.setAmtAcct(docLine.m_AmtAcctDr, docLine.m_AmtAcctCr);
