Files
enterprise-addons/l10n_es_reports_pos/tests/common.py
T

131 lines
5.5 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from contextlib import contextmanager
from unittest.mock import patch
from odoo import Command
from odoo.addons.account_reports.tests.common import TestAccountReportsCommon
from odoo.addons.point_of_sale.tests.common import TestPoSCommon
class TestL10nEsVATBooksPosCommon(TestPoSCommon, TestAccountReportsCommon):
"""Common test class for VAT Books with POS orders."""
@classmethod
@TestAccountReportsCommon.setup_chart_template('es_pymes')
def setUpClass(cls):
super().setUpClass()
cls.maxDiff = None
cls.company.sudo().write({
'country_id': cls.env.ref('base.es').id,
'l10n_es_reports_iae_group': 'A036533',
})
company_id = cls.company.id
cls.tax21_goods = cls.env.ref(f'account.{company_id}_account_tax_template_s_iva21b')
cls.tax10_goods = cls.env.ref(f'account.{company_id}_account_tax_template_s_iva10b')
cls.partner_spanish = cls.env['res.partner'].create({
'country_id': cls.env.ref('base.es').id,
'name': 'Spanish Partner',
'vat': 'ES59962470K',
})
cls.partner_eu = cls.env['res.partner'].create({
'country_id': cls.env.ref('base.fr').id,
'name': 'French Partner',
'vat': 'FR23334175221',
})
cls.partner_intl = cls.env['res.partner'].create({
'country_id': cls.env.ref('base.us').id,
'name': 'US Company',
'vat': 'US66655598K',
})
cls.partner_no_vat = cls.env['res.partner'].create({
'country_id': cls.env.ref('base.es').id,
'name': 'Spanish Partner No VAT',
})
cls.product_10 = cls.env['product.product'].create({
'name': 'vat_books_pos_product_10',
'default_code': 'product_vat_books_10',
'lst_price': 100.0,
'property_account_income_id': cls.company_data['default_account_revenue'].id,
'property_account_expense_id': cls.company_data['default_account_expense'].id,
'taxes_id': [Command.set(cls.tax10_goods.ids)],
'company_id': cls.company.id,
'available_in_pos': True,
})
cls.product = cls.env['product.product'].create({
'name': 'vat_books_pos_product',
'default_code': 'product_vat_books',
'lst_price': 100.0,
'property_account_income_id': cls.company_data['default_account_revenue'].id,
'property_account_expense_id': cls.company_data['default_account_expense'].id,
'taxes_id': [Command.set(cls.tax21_goods.ids)],
'company_id': cls.company.id,
'available_in_pos': True,
})
@contextmanager
def with_pos_session(self):
session = self.open_new_session(0.0)
yield session
session.post_closing_cash_details(0.0)
session.close_session_from_ui()
@contextmanager
def with_pos_edi_mode(self, mode='tbai'):
company_model = self.env.registry['res.company']
def _l10n_es_get_pos_edi_mode(company):
company.ensure_one()
return mode
with patch.object(company_model, '_l10n_es_get_pos_edi_mode', _l10n_es_get_pos_edi_mode):
yield
def get_vat_book_sheet_line_vals(self, date_from='2024-01-01', date_to='2024-12-31'):
options = {'date': {'date_from': date_from, 'date_to': date_to}}
with self.with_pos_edi_mode():
return self.get_pos_sheet_line_vals(options)
def get_pos_sheet_line_vals(self, options):
if not self.env.company._l10n_es_get_pos_edi_mode():
return []
report = self.env['l10n_es.vat.books.report.handler']
return [
line_vals
for pos_order_ids in report._l10n_es_libros_iter_pos_order_batches(options)
for pos_order in self.env['pos.order'].browse(pos_order_ids)
for line_vals in report._l10n_es_libros_get_pos_order_sheet_line_vals(pos_order)
]
def get_pos_closing_sheet_line_vals(self, date_from='2024-01-01', date_to='2024-12-31'):
report_obj = self.env.ref('account.generic_tax_report')
options = self._generate_options(report_obj, date_from, date_to)
domain = report_obj._get_options_domain(options, 'strict_range') + [
('move_id.move_type', '=', 'entry'),
('move_id.pos_session_ids', '!=', False),
]
lines = self.env['account.move.line'].search(domain)
handler = self.env['l10n_es.vat.books.report.handler']
inc_line_vals, _exp = handler._l10n_es_libros_get_sheet_line_vals(lines)
return [lv for move_vals in inc_line_vals.values() for lv in move_vals.values()]
def _create_pos_order(self, **kwargs):
"""Create a single POS order inside a new session and return it."""
with self.with_pos_session():
order_data = self.create_ui_order_data(**kwargs)
results = self.env['pos.order'].sync_from_ui([order_data])
return self.env['pos.order'].browse(results['pos.order'][0]['id'])
def _create_pos_orders(self, orders_data):
"""Create multiple POS orders in a single session and return them."""
with self.with_pos_session():
results = self.env['pos.order'].sync_from_ui([
self.create_ui_order_data(**od)
for od in orders_data
])
return self.env['pos.order'].browse([r['id'] for r in results['pos.order']])