diff --git a/src/org/openbravo/erpCommon/ad_forms/DocInvoice.java b/src/org/openbravo/erpCommon/ad_forms/DocInvoice.java
--- a/src/org/openbravo/erpCommon/ad_forms/DocInvoice.java
+++ b/src/org/openbravo/erpCommon/ad_forms/DocInvoice.java
@@ -121,6 +121,8 @@
       String C_Tax_ID = data[i].cTaxId;
       String name = data[i].name;
       String rate = data[i].rate;
+      int rateDeductable = Integer.parseInt(data[i].ratedeductable.equals(null) ? "0"
+          : data[i].ratedeductable);
 
       String taxBaseAmt = data[i].taxbaseamt;
       String amount = data[i].taxamt;
@@ -144,7 +146,7 @@
       }
 
       DocTax taxLine = new DocTax(C_Tax_ID, name, rate, taxBaseAmt, amount, isTaxUndeductable,
-          isTaxDeductable);
+          isTaxDeductable, rateDeductable);
       list.add(taxLine);
     }
     // Return Array
@@ -427,6 +429,18 @@
         if (m_taxes[i].m_isTaxUndeductable) {
           computeTaxUndeductableLine(conn, as, fact, docLine, Fact_Acct_Group_ID,
               m_taxes[i].m_C_Tax_ID, m_taxes[i].getAmount());
+        } else if (m_taxes[i].m_isTaxDeductable) {
+          BigDecimal deductableTaxAmount = new BigDecimal(m_taxes[i].getAmount())
+              .multiply(new BigDecimal(m_taxes[i].m_deductibleRate).divide(new BigDecimal(
+                  m_taxes[i].m_rate)));
+          BigDecimal expenseAmount = new BigDecimal(m_taxes[i].getAmount())
+              .subtract(deductableTaxAmount);
+
+          computeTaxUndeductableLine(conn, as, fact, docLine, Fact_Acct_Group_ID,
+              m_taxes[i].m_C_Tax_ID, expenseAmount.toPlainString());
+          fact.createLine(docLine, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as, conn),
+              this.C_Currency_ID, deductableTaxAmount.toPlainString(), "", Fact_Acct_Group_ID,
+              nextSeqNo(SeqNo), DocumentType, conn);
         } else {
           fact.createLine(docLine, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as, conn),
               this.C_Currency_ID, m_taxes[i].getAmount(), "", Fact_Acct_Group_ID, nextSeqNo(SeqNo),
@@ -485,7 +499,17 @@
         if (m_taxes[i].m_isTaxUndeductable) {
           computeTaxUndeductableLine(conn, as, fact, docLine, Fact_Acct_Group_ID,
               m_taxes[i].m_C_Tax_ID, m_taxes[i].getAmount());
-
+        } else if (m_taxes[i].m_isTaxDeductable) {
+          BigDecimal deductableTaxAmount = new BigDecimal(m_taxes[i].getAmount())
+              .multiply(new BigDecimal(m_taxes[i].m_deductibleRate).divide(new BigDecimal(
+                  m_taxes[i].m_rate)));
+          BigDecimal expenseAmount = new BigDecimal(m_taxes[i].getAmount())
+              .subtract(deductableTaxAmount);
+          computeTaxUndeductableLine(conn, as, fact, docLine, Fact_Acct_Group_ID,
+              m_taxes[i].m_C_Tax_ID, expenseAmount.toPlainString());
+          fact.createLine(docLine, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as, conn),
+              this.C_Currency_ID, "", deductableTaxAmount.toPlainString(), Fact_Acct_Group_ID,
+              nextSeqNo(SeqNo), DocumentType, conn);
         } else {
           fact.createLine(docLine, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as, conn),
               this.C_Currency_ID, "", m_taxes[i].getAmount(), Fact_Acct_Group_ID, nextSeqNo(SeqNo),
diff --git a/src/org/openbravo/erpCommon/ad_forms/DocInvoice_data.xsql b/src/org/openbravo/erpCommon/ad_forms/DocInvoice_data.xsql
--- a/src/org/openbravo/erpCommon/ad_forms/DocInvoice_data.xsql
+++ b/src/org/openbravo/erpCommon/ad_forms/DocInvoice_data.xsql
@@ -26,7 +26,7 @@
     <SqlMethodComment></SqlMethodComment>
     <Sql>
       <![CDATA[
-        SELECT t.IsTaxUndeductable as rateTaxUndeductable, (select IsTaxUndeductable from ad_orginfo o where o.ad_org_id=it.ad_org_id) as orgTaxUndeductable, it.C_Tax_ID, t.Name, t.Rate, t.IsTaxDeductable, it.TaxBaseAmt, it.TaxAmt, '' AS C_INVOICE_ID, '' AS AD_CLIENT_ID, '' AS AD_ORG_ID,
+        SELECT t.Deducpercent as rateDeductable, t.IsTaxUndeductable as rateTaxUndeductable, (select IsTaxUndeductable from ad_orginfo o where o.ad_org_id=it.ad_org_id) as orgTaxUndeductable, it.C_Tax_ID, t.Name, t.Rate, t.IsTaxDeductable, it.TaxBaseAmt, it.TaxAmt, '' AS C_INVOICE_ID, '' AS AD_CLIENT_ID, '' AS AD_ORG_ID,
         '' AS ISACTIVE, '' AS CREATED, '' AS CREATEDBY, '' AS UPDATED, '' AS UPDATEDBY, '' AS ISSOTRX, '' AS DOCUMENTNO,
         '' AS DOCSTATUS, '' AS DOCACTION, '' AS PROCESSING, '' AS PROCESSED, '' AS POSTED, '' AS C_DOCTYPE_ID, '' AS C_DOCTYPETARGET_ID,
         '' AS C_ORDER_ID, '' AS DESCRIPTION, '' AS ISTRANSFERRED, '' AS ISPRINTED, '' AS SALESREP_ID, '' AS DATEINVOICED,
diff --git a/src/org/openbravo/erpCommon/ad_forms/DocTax.java b/src/org/openbravo/erpCommon/ad_forms/DocTax.java
--- a/src/org/openbravo/erpCommon/ad_forms/DocTax.java
+++ b/src/org/openbravo/erpCommon/ad_forms/DocTax.java
@@ -25,17 +25,18 @@
   static Logger log4jDocTax = Logger.getLogger(DocTax.class);
 
   public DocTax(String C_Tax_ID, String name, String rate, String taxBaseAmt, String amount) {
-    this(C_Tax_ID, name, rate, taxBaseAmt, amount, false, false);
+    this(C_Tax_ID, name, rate, taxBaseAmt, amount, false, false, 0);
   } // DocTax
 
   public DocTax(String C_Tax_ID, String name, String rate, String taxBaseAmt, String amount,
-      boolean isUndeductable, boolean isTaxDeductable) {
+      boolean isUndeductable, boolean isTaxDeductable, int deductibleRate) {
     m_C_Tax_ID = C_Tax_ID;
     m_name = name;
     m_rate = rate;
     m_amount = amount;
     m_isTaxUndeductable = isUndeductable;
     m_isTaxDeductable = isTaxDeductable;
+    m_deductibleRate = deductibleRate;
   } // DocTax
 
   /** Tax ID */
@@ -47,6 +48,9 @@
   /** Name */
   public String m_name = "";
 
+  // m_deductibleRate - deductable tax rate
+  public int m_deductibleRate = 0;
+
   // m_isTaxUndeductable will be used for public organization.
   public boolean m_isTaxUndeductable = false;
   // m_isTaxDeductable will be used for commercial organization in intracommunity.

