diff options
| author | fw-bot <otis@odoo.com> | 2020-08-10 10:59:17 +0000 |
|---|---|---|
| committer | Josse Colpaert <jco@odoo.com> | 2020-08-10 13:48:57 +0000 |
| commit | 600a1da6c327064e83feed122092c5d0ce1e7894 (patch) | |
| tree | d01535cca0237e9233257e85229823d0afdeada2 /addons/l10n_ar/models | |
| parent | be63b448450772f161ba95aefeb40aa3d8cea334 (diff) | |
[ADD] l10n_ar: add moved methods from l10n_ar_edi
This method will be change to generic and to be use for both
l10n_ar_edi and l10n_ar_reports modules
fw-port of 50882
closes odoo/odoo#55687
Related: odoo/enterprise#12329
Signed-off-by: Josse Colpaert <jco@openerp.com>
Diffstat (limited to 'addons/l10n_ar/models')
| -rw-r--r-- | addons/l10n_ar/models/account_move.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/addons/l10n_ar/models/account_move.py b/addons/l10n_ar/models/account_move.py index 19894f44911..c6617ee81a7 100644 --- a/addons/l10n_ar/models/account_move.py +++ b/addons/l10n_ar/models/account_move.py @@ -212,3 +212,70 @@ class AccountMove(models.Model): param['l10n_latam_document_type_ids'] = tuple(self.l10n_latam_document_type_id.search( [('l10n_ar_letter', '=', self.l10n_latam_document_type_id.l10n_ar_letter)]).ids) return where_string, param + + def _get_name_invoice_report(self, report_xml_id): + self.ensure_one() + if self.l10n_latam_use_documents and self.company_id.country_id.code == 'AR': + custom_report = { + 'account.report_invoice_document_with_payments': 'l10n_ar.report_invoice_document_with_payments', + 'account.report_invoice_document': 'l10n_ar.report_invoice_document', + } + return custom_report.get(report_xml_id) or report_xml_id + return super()._get_name_invoice_report(report_xml_id) + + def _l10n_ar_get_amounts(self, company_currency=False): + """ Method used to prepare data to present amounts and taxes related amounts when creating an + electronic invoice for argentinian and the txt files for digital VAT books. Only take into account the argentinian taxes """ + self.ensure_one() + amount_field = company_currency and 'balance' or 'price_subtotal' + # if we use balance we need to correct sign (on price_subtotal is positive for refunds and invoices) + sign = -1 if (company_currency and self.is_inbound()) else 1 + tax_lines = self.line_ids.filtered('tax_line_id') + vat_taxes = tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_vat_afip_code) + + vat_taxable = self.env['account.move.line'] + for line in self.invoice_line_ids: + if any(tax.tax_group_id.l10n_ar_vat_afip_code and tax.tax_group_id.l10n_ar_vat_afip_code not in ['0', '1', '2'] for tax in line.tax_ids): + vat_taxable |= line + + profits_tax_group = self.env.ref('l10n_ar.tax_group_percepcion_ganancias') + return {'vat_amount': sign * sum(vat_taxes.mapped(amount_field)), + # For invoices of letter C should not pass VAT + 'vat_taxable_amount': sign * sum(vat_taxable.mapped(amount_field)) if self.l10n_latam_document_type_id.l10n_ar_letter != 'C' else self.amount_untaxed, + 'vat_exempt_base_amount': sign * sum(self.invoice_line_ids.filtered(lambda x: x.tax_ids.filtered(lambda y: y.tax_group_id.l10n_ar_vat_afip_code == '2')).mapped(amount_field)), + 'vat_untaxed_base_amount': sign * sum(self.invoice_line_ids.filtered(lambda x: x.tax_ids.filtered(lambda y: y.tax_group_id.l10n_ar_vat_afip_code == '1')).mapped(amount_field)), + # used on FE + 'not_vat_taxes_amount': sign * sum((tax_lines - vat_taxes).mapped(amount_field)), + # used on BFE + TXT + 'iibb_perc_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_tribute_afip_code == '07').mapped(amount_field)), + 'mun_perc_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_tribute_afip_code == '08').mapped(amount_field)), + 'intern_tax_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_tribute_afip_code == '04').mapped(amount_field)), + 'other_taxes_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_tribute_afip_code == '99').mapped(amount_field)), + 'profits_perc_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id == profits_tax_group).mapped(amount_field)), + 'vat_perc_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_tribute_afip_code == '06').mapped(amount_field)), + 'other_perc_amount': sign * sum(tax_lines.filtered(lambda r: r.tax_line_id.tax_group_id.l10n_ar_tribute_afip_code == '09' and r.tax_line_id.tax_group_id != profits_tax_group).mapped(amount_field)), + } + + def _get_vat(self, company_currency=False): + """ Applies on wsfe web service and in the VAT digital books """ + amount_field = company_currency and 'balance' or 'price_subtotal' + # if we use balance we need to correct sign (on price_subtotal is positive for refunds and invoices) + sign = -1 if (company_currency and self.is_inbound()) else 1 + res = [] + vat_taxable = self.env['account.move.line'] + # get all invoice lines that are vat taxable + for line in self.line_ids: + if any(tax.tax_group_id.l10n_ar_vat_afip_code and tax.tax_group_id.l10n_ar_vat_afip_code not in ['0', '1', '2'] for tax in line.tax_line_id) and line[amount_field]: + vat_taxable |= line + for vat in vat_taxable: + base_imp = sum(self.invoice_line_ids.filtered(lambda x: x.tax_ids.filtered(lambda y: y.tax_group_id.l10n_ar_vat_afip_code == vat.tax_line_id.tax_group_id.l10n_ar_vat_afip_code)).mapped(amount_field)) + res += [{'Id': vat.tax_line_id.tax_group_id.l10n_ar_vat_afip_code, + 'BaseImp': sign * base_imp, + 'Importe': sign * vat[amount_field]}] + + # Report vat 0% + vat_base_0 = sign * sum(self.invoice_line_ids.filtered(lambda x: x.tax_ids.filtered(lambda y: y.tax_group_id.l10n_ar_vat_afip_code == '3')).mapped(amount_field)) + if vat_base_0: + res += [{'Id': '3', 'BaseImp': vat_base_0, 'Importe': 0.0}] + + return res if res else [] |
