/**
 * Axelor Business Solutions
 *
 * Copyright (C) 2015 Axelor (<http://axelor.com>).
 *
 * This program is free software: you can redistribute it and/or  modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.axelor.apps.account.service.invoice.generator.tax;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.axelor.apps.account.db.Invoice;
import com.axelor.apps.account.db.InvoiceLine;
import com.axelor.apps.account.db.InvoiceLineTax;
import com.axelor.apps.account.db.TaxLine;
import com.axelor.apps.account.service.invoice.generator.TaxGenerator;

public class TaxInvoiceLine extends TaxGenerator {

	private static final Logger LOG = LoggerFactory.getLogger(TaxInvoiceLine.class);

	public TaxInvoiceLine(Invoice invoice, List<InvoiceLine> invoiceLines) {

		super(invoice, invoiceLines);

	}

	/**
	 * Créer les lignes de TVA de la facure. La création des lignes de TVA se
	 * basent sur les lignes de factures
	 *
	 * @param invoice
	 *            La facture.
	 *
	 * @param invoiceLines
	 *            Les lignes de facture.
	 *
	 * @return La liste des lignes de TVA de la facture.
	 */
	@Override
	public List<InvoiceLineTax> creates() {

		List<InvoiceLineTax> invoiceLineTaxList = new ArrayList<InvoiceLineTax>();
		Map<TaxLine, InvoiceLineTax> map = new HashMap<TaxLine, InvoiceLineTax>();

		if (invoiceLines != null && !invoiceLines.isEmpty()) {

			LOG.debug("Création des lignes de tva pour les lignes de factures.");

			for (InvoiceLine invoiceLine : invoiceLines) {
				if(!invoiceLine.getIsTitleLine()){
					TaxLine taxLine = invoiceLine.getTaxLine();
					LOG.debug("TVA {}", taxLine);

					if (map.containsKey(taxLine)) {

						InvoiceLineTax invoiceLineTax = map.get(taxLine);

						// Dans la devise de la facture
						invoiceLineTax.setExTaxBase(invoiceLineTax.getExTaxBase().add(invoiceLine.getExTaxTotal()));

						// Dans la devise de la société
						invoiceLineTax.setCompanyExTaxBase(invoiceLineTax.getCompanyExTaxBase().add(invoiceLine.getCompanyExTaxTotal()));

					}
					else {

						InvoiceLineTax invoiceLineTax = new InvoiceLineTax();
						invoiceLineTax.setInvoice(invoice);

						// Dans la devise de la facture
						invoiceLineTax.setExTaxBase(invoiceLine.getExTaxTotal());

						// Dans la devise de la comptabilité du tiers
						invoiceLineTax.setCompanyExTaxBase(invoiceLine.getCompanyExTaxTotal());

						invoiceLineTax.setTaxLine(taxLine);
						map.put(taxLine, invoiceLineTax);

					}
				}
			}
		}

		for (InvoiceLineTax invoiceLineTax : map.values()) {

			// Dans la devise de la facture
			BigDecimal exTaxBase = invoiceLineTax.getExTaxBase();
			BigDecimal taxTotal = computeAmount(exTaxBase, invoiceLineTax.getTaxLine().getValue());
			invoiceLineTax.setTaxTotal(taxTotal);
			invoiceLineTax.setInTaxTotal(exTaxBase.add(taxTotal));

			// Dans la devise de la société
			BigDecimal companyExTaxBase = invoiceLineTax.getCompanyExTaxBase();
			BigDecimal companyTaxTotal = computeAmount(companyExTaxBase, invoiceLineTax.getTaxLine().getValue());
			invoiceLineTax.setCompanyTaxTotal(companyTaxTotal);
			invoiceLineTax.setCompanyInTaxTotal(companyExTaxBase.add(companyTaxTotal));

			invoiceLineTaxList.add(invoiceLineTax);

			LOG.debug("Ligne de TVA : Total TVA => {}, Total HT => {}", new Object[] {invoiceLineTax.getTaxTotal(), invoiceLineTax.getInTaxTotal()});

		}

		return invoiceLineTaxList;
	}

}
@@ -786,16 +786,47 @@
 ecimal;%0A
+import java.math.RoundingMode;%0A
 import j
@@ -2668,32 +2668,66 @@
 anyExTaxTotal())
+.setScale(2, RoundingMode.HALF_UP)
 );%0A%0A%09%09%09%09%09%7D%0A%09%09%09%09%09
@@ -3059,32 +3059,66 @@
 panyExTaxTotal()
+.setScale(2, RoundingMode.HALF_UP)
 );%0A%0A%09%09%09%09%09%09invoic

Fix issue with invoices Issue was numeric message error