1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/l10n_ar_reports/tests/test_reports.py
2024-12-10 09:04:09 +07:00

388 lines
20 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields
from odoo.addons.l10n_ar.tests.common import TestAr
from odoo.addons.account_reports.tests.common import TestAccountReportsCommon
from odoo.tests.common import Form
from odoo.tests import tagged
from odoo.tools import file_open
import logging
_logger = logging.getLogger(__name__)
@tagged('post_install_l10n', 'post_install', '-at_install')
class TestReports(TestAr, TestAccountReportsCommon):
def _create_test_credit_notes_like_demo(self):
""" Create in the unit tests the same credit notes created in demo data """
credit_notes = {
"demo_refund_invoice_3": {
# "ref": "demo_refund_invoice_3: Create draft refund for invoice 3",
"reason": "Mercadería defectuosa",
"is_refund": True,
"move_ids": self.demo_invoices['test_invoice_3'],
"date": '2021-03-01',
},
"demo_refund_invoice_4": {
# "ref": "demo_refund_invoice_4: Create draft refund for invoice 4",
"reason": "Venta cancelada",
"is_refund": False,
"move_ids": self.demo_invoices['test_invoice_4'],
"date": '2021-03-01',
},
"demo_refund_invoice_16": {
# "ref": "demo_refund_invoice_16: Create cancel refund for expo invoice 16 (las nc/nd expo invoice no requiere parametro permiso existennte, por eso agregamos este ejemplo)",
"reason": "Venta cancelada",
"is_refund": False,
"move_ids": self.demo_invoices['test_invoice_16'],
"date": '2021-03-01',
},
"demo_refund_bill_1": {
"reason": "demo_sup_refund_invoice_5: liquido producto bill refund (credit note)",
"is_refund": False,
"move_ids": self.demo_bills['test_vendor_bill_8'],
"date": '2021-03-27',
"l10n_latam_document_number": "00011-00000012",
"l10n_latam_document_type_id": self.document_type['liq_pro_doc'].id,
}
}
refund_wizard = self.env['account.move.reversal']
for key, values in credit_notes.items():
origin_move = values.get("move_ids")
is_refund = values.pop("is_refund")
values.update({
'date': fields.Date.from_string(values.get('date')),
'journal_id': origin_move.journal_id.id,
})
move_reversal = refund_wizard.with_context(
active_model="account.move",
active_ids=origin_move.ids).create(values)
reversal = move_reversal.refund_moves() if is_refund else move_reversal.modify_moves()
reverse_move = self.env['account.move'].browse(reversal['res_id'])
self.demo_credit_notes[key] = reverse_move
def _create_test_vendor_bill_invoice_demo(self):
""" Create in the unit tests the same vendor bills created in demo data """
payment_term_id = self.env.ref("account.account_payment_term_end_following_month")
purchase_journal = self.env["account.journal"].search([('type', '=', 'purchase'), ('company_id', '=', self.env.company.id)])
vendor_bills = {
"test_vendor_bill_1": {
"ref": "demo_sup_invoice_1: Invoice from Gritti support service, auto fiscal position set VAT Not Applicable",
"l10n_latam_document_number": "0001-00000008",
"partner_id": self.res_partner_gritti_mono,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-01',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.service_iva_21, 'price_unit': 642.0, 'quantity': 1},
{'product_id': self.product_iva_105, 'price_unit': 642.0, 'quantity': 5},
{'product_id': self.service_iva_27, 'price_unit': 250.0, 'quantity': 1},
{'product_id': self.product_no_gravado, 'price_unit': 50.0, 'quantity': 10},
{'product_id': self.product_iva_cero, 'price_unit': 200.0, 'quantity': 1},
{'product_id': self.product_iva_exento, 'price_unit': 100.0, 'quantity': 1},
],
}, "test_vendor_bill_2": {
"ref": "demo_sup_invoice_2: Invoice from Foreign with vat 21, 27 and 10,5",
"l10n_latam_document_number": "0002-00000123",
"partner_id": self.res_partner_barcelona_food,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-01',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.product_iva_105, 'price_unit': 642.0, 'quantity': 5},
{'product_id': self.service_iva_27, 'price_unit': 250.0, 'quantity': 1},
{'product_id': self.product_iva_105_perc, 'price_unit': 3245.0, 'quantity': 2},
],
}, "test_vendor_bill_3": {
"ref": "demo_sup_invoice_3: Invoice from Foreign with vat zero and 21",
"l10n_latam_document_number": "0003-00000312",
"partner_id": self.res_partner_barcelona_food,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-01',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.product_iva_105, 'price_unit': 642.0, 'quantity': 5},
{'product_id': self.product_iva_cero, 'price_unit': 200.0, 'quantity': 1},
],
}, "test_vendor_bill_4": {
"ref": "demo_sup_invoice_4: Invoice to Foreign with vat exempt and 21",
"l10n_latam_document_number": "0001-00000200",
"partner_id": self.res_partner_barcelona_food,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-15',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.product_iva_105, 'price_unit': 642.0, 'quantity': 5},
{'product_id': self.product_iva_exento, 'price_unit': 100.0, 'quantity': 1},
],
}, "test_vendor_bill_5": {
"ref": "demo_sup_invoice_5: Invoice to Foreign with all type of taxes",
"l10n_latam_document_number": "0001-00000222",
"partner_id": self.res_partner_barcelona_food,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-18',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.product_iva_105, 'price_unit': 642.0, 'quantity': 5},
{'product_id': self.service_iva_27, 'price_unit': 250.0, 'quantity': 1},
{'product_id': self.product_iva_105_perc, 'price_unit': 3245.0, 'quantity': 2},
{'product_id': self.product_no_gravado, 'price_unit': 50.0, 'quantity': 10},
{'product_id': self.product_iva_cero, 'price_unit': 200.0, 'quantity': 1},
{'product_id': self.product_iva_exento, 'price_unit': 100.0, 'quantity': 1},
],
}, "test_vendor_bill_6": {
"ref": "demo_sup_invoice_6: Service Import to Odoo, fiscal position changes tax not correspond",
"l10n_latam_document_number": "0001-00000333",
"partner_id": self.res_partner_barcelona_food,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-26',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.service_iva_21, 'price_unit': 1642.0, 'quantity': 1},
],
}, "test_vendor_bill_7": {
"ref": "demo_sup_invoice_7: Similar to last one but with line that have tax not correspond with negative amount",
"l10n_latam_document_number": "0001-00000334",
"partner_id": self.res_partner_barcelona_food,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-27',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.service_iva_21, 'price_unit': 1642.0, 'quantity': 1},
{'product_id': self.product_no_gravado, 'price_unit': -50.0, 'quantity': 10},
],
}, "test_vendor_bill_8": {
"ref": "demo_sup_invoice_8: Invoice to ADHOC with multiple taxes and perceptions",
"l10n_latam_document_number": "0001-00000335",
"partner_id": self.res_partner_adhoc,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-01',
"company_id": self.env.company,
"invoice_line_ids": [
{'product_id': self.product_iva_105, 'price_unit': 642.0, 'quantity': 5},
{'product_id': self.service_iva_27, 'price_unit': 250.0, 'quantity': 1},
{'product_id': self.product_iva_105_perc, 'price_unit': 3245.0, 'quantity': 2},
],
}, "demo_despacho_1": {
"ref": "demo_despacho_1: Import Cleareance ",
"l10n_latam_document_number": "16052IC04000605L",
"partner_id": self.partner_afip,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-13',
"company_id": self.env.company,
# as we create lines separatelly we need to set journal, if not, misc journal is selected
"journal_id": purchase_journal,
"invoice_line_ids": [
{'product_id': self.service_wo_tax, "name": "[AFIP_DESPACHO] Despacho de importación", 'price_unit': 5064.98, 'quantity': 1,
"tax_ids": [(6, 0, self.tax_21_purchase.ids)]},
{'product_id': self.service_wo_tax, "name": "[AFIP_TASA_EST] Tasa Estadística", 'price_unit': 152.08, 'quantity': 1,
"tax_ids": [(6, 0, self.tax_21_purchase.ids)]},
{'product_id': self.service_iva_no_gravado, "name": "[AFIP_ARANCEL] Arancel", 'price_unit': 10.0, 'quantity': 1,
"tax_ids": [(6, 0, self.tax_no_gravado_purchase.ids)]},
],
},
"test_vendor_bill_9": {
"ref": " demo_liquido_producto_1: Vendor bill liquido producto (document type 186)",
"l10n_latam_document_type_id": self.document_type['liq_pro_doc'],
"l10n_latam_document_number": "00077-00000077",
"partner_id": self.res_partner_adhoc,
"invoice_payment_term_id": payment_term_id,
"move_type": "in_invoice",
"invoice_date": '2021-03-25',
"company_id": self.env.company,
# as we create lines separatelly we need to set journal, if not, misc journal is selected
"journal_id": purchase_journal,
"invoice_line_ids": [
{'product_id': self.service_wo_tax, "name": "[AFIP_DESPACHO] Despacho de importación", 'price_unit': 5064.98, 'quantity': 1,
"tax_ids": [(6, 0, self.tax_21_purchase.ids)]},
{'product_id': self.service_wo_tax, "name": "[AFIP_TASA_EST] Tasa Estadística", 'price_unit': 152.08, 'quantity': 1,
"tax_ids": [(6, 0, self.tax_21_purchase.ids)]},
{'product_id': self.service_iva_no_gravado, "name": "[AFIP_ARANCEL] Arancel", 'price_unit': 10.0, 'quantity': 1,
"tax_ids": [(6, 0, self.tax_no_gravado_purchase.ids)]},
],
}
}
for key, values in vendor_bills.items():
with Form(self.env['account.move'].with_context(default_move_type=values['move_type'])) as invoice_form:
invoice_form.ref = values['ref']
invoice_form.partner_id = values['partner_id']
invoice_form.invoice_payment_term_id = values['invoice_payment_term_id']
invoice_form.invoice_date = values['invoice_date']
if values.get('l10n_latam_document_type_id'):
invoice_form.l10n_latam_document_type_id = values['l10n_latam_document_type_id']
invoice_form.l10n_latam_document_number = values['l10n_latam_document_number']
if values.get('invoice_incoterm_id'):
invoice_form.invoice_incoterm_id = values['invoice_incoterm_id']
for line in values['invoice_line_ids']:
with invoice_form.invoice_line_ids.new() as line_form:
line_form.product_id = line.get('product_id')
line_form.price_unit = line.get('price_unit')
line_form.quantity = line.get('quantity')
# TODO: check this lines, should not be necessary to add
line_form.name = 'xxxx'
line_form.account_id = self.company_data['default_account_revenue']
invoice = invoice_form.save()
self.demo_bills[key] = invoice
def _vat_book_report_create_test_data(self):
purchase_journal = self.env["account.journal"].search([('type', '=', 'purchase'), ('company_id', '=', self.env.company.id)])
ar_partner = self.env['res.partner'].create({
'name': 'BEST PARTNER',
'vat': '30714295698',
'l10n_latam_identification_type_id': self.env.ref('l10n_ar.it_cuit').id
})
test_tax_group = self.env['account.tax.group'].create({
'name': "test tax group",
'l10n_ar_vat_afip_code': '5',
})
test_tax_21 = self.env['account.tax'].create({
'name': "test tax",
'amount_type': 'percent',
'amount': 21,
'tax_group_id': test_tax_group.id,
})
test_product = self.env['product.product'].create({
'name': "Test Product",
'categ_id': self.env.ref("product.product_category_all").id,
'lst_price': 100.0,
'standard_price': 10.0,
'property_account_income_id': self.company_data["default_account_revenue"].id,
'property_account_expense_id': self.company_data["default_account_expense"].id,
})
invoices = self.env['account.move'].create([
{
'move_type': 'in_invoice',
'partner_id': ar_partner.id,
'invoice_date': '2022-03-01',
"journal_id": purchase_journal.id,
"l10n_latam_document_number": "0001-00000001000",
'invoice_line_ids': [(0, 0, {
'product_id': test_product.id,
'price_unit': 1000.0,
'tax_ids': [(6, 0, [test_tax_21.id])],
})],
},
{
'move_type': 'in_invoice',
'partner_id': ar_partner.id,
'invoice_date': '2022-03-10',
"journal_id": purchase_journal.id,
"l10n_latam_document_number": "0001-00000002000",
'invoice_line_ids': [(0, 0, {
'product_id': test_product.id,
'price_unit': 500.0,
'tax_ids': [(6, 0, [test_tax_21.id])],
})],
},
{
'move_type': 'in_invoice',
'partner_id': ar_partner.id,
'invoice_date': '2022-03-31',
"journal_id": purchase_journal.id,
"l10n_latam_document_number": "0001-00000003000",
'invoice_line_ids': [(0, 0, {
'product_id': test_product.id,
'price_unit': 800.0,
'tax_ids': [(6, 0, [test_tax_21.id])],
})],
},
])
invoices.action_post()
@classmethod
def setUpClass(cls, chart_template_ref='ar_ri'):
super().setUpClass(chart_template_ref=chart_template_ref)
cls.journal = cls._create_journal(cls, 'preprinted', data={'l10n_ar_afip_pos_number': 37928})
cls.maxDiff = None
cls.report = cls.env.ref('l10n_ar_reports.l10n_ar_vat_book_report')
# Login to (AR) Responsable Inscripto company
context = dict(cls.env.context, allowed_company_ids=[cls.company_ri.id])
cls.env = cls.env(context=context)
cls.env.user.write({'company_ids': [(4, cls.company_ri.id)]})
# ==== Document Types ====
cls.document_type.update({
'liq_pro_doc': cls.env.ref('l10n_ar.dc_liq_cd_sp_a'),
})
# ==== Create VAT BOOK demo data ====
cls._create_test_invoices_like_demo(cls, use_current_date=False)
for _key, inv in cls.demo_invoices.items():
inv.action_post()
cls._create_test_vendor_bill_invoice_demo(cls)
for _key, inv in cls.demo_bills.items():
inv.action_post()
# demo_credit_notes are automatically posted thanks to the refund type
cls._create_test_credit_notes_like_demo(cls)
cls.options = cls._generate_options(cls.report, fields.Date.from_string('2021-03-01'), fields.Date.from_string('2021-03-31'))
cls._vat_book_report_create_test_data(cls)
def _test_txt_file(self, filename, journal_type):
filetype = 1 if 'IVA' in filename else 0
out_txt = self.env['l10n_ar.tax.report.handler']._vat_book_get_txt_files(self.options, journal_type)[filetype].decode('ISO-8859-1')
res_file = file_open('l10n_ar_reports/tests/' + filename, 'rb').read().decode('ISO-8859-1')
self.assertEqual(out_txt, res_file)
def test_01_sale_vat_book_vouchers(self):
self.options['ar_vat_book_tax_type_selected'] = 'sale'
self.options['txt_type'] = 'sale'
self._test_txt_file('Ventas.txt', 'sale')
def test_02_sale_vat_book_aliquots(self):
self.options['ar_vat_book_tax_type_selected'] = 'sale'
self.options['txt_type'] = 'sale'
self._test_txt_file('IVA_Ventas.txt', 'sale')
def test_03_purchase_vat_book_purchases_voucher(self):
self.options['ar_vat_book_tax_type_selected'] = 'purchase'
self.options['txt_type'] = 'purchases'
self._test_txt_file('Compras.txt', 'purchase')
def test_04_purchase_vat_book_purchases_aliquots(self):
self.options['ar_vat_book_tax_type_selected'] = 'purchase'
self.options['txt_type'] = 'purchases'
self._test_txt_file('IVA_Compras.txt', 'purchase')
def test_05_purchase_vat_book_goods_import_voucher(self):
self.options['ar_vat_book_tax_type_selected'] = 'purchase'
self.options['txt_type'] = 'goods_import'
self._test_txt_file('Importaciones_de_Bienes.txt', 'purchase')
def test_06_purchase_vat_book_goods_import_aliquots(self):
self.options['ar_vat_book_tax_type_selected'] = 'purchase'
self.options['txt_type'] = 'goods_import'
self._test_txt_file('IVA_Importaciones_de_Bienes.txt', 'purchase')
def test_vat_book_report(self):
options = self._generate_options(self.report, date_from=fields.Date.from_string('2022-03-01'), date_to=fields.Date.from_string('2022-03-31'))
lines = self.report._get_lines(options)
self.assertLinesValues(
# pylint: disable=C0326
lines,
# Move Name Partner Name VAT Taxed VAT 21% Total
[ 0, 2, 4, 5, 8, 15],
[
('DI 0001-00000001000', 'BEST PARTNER', '30714295698', -1000, -210, -1210),
('DI 0001-00000002000', 'BEST PARTNER', '30714295698', -500, -105, -605),
('DI 0001-00000003000', 'BEST PARTNER', '30714295698', -800, -168, -968),
],
options,
)