Odoo18-Base/addons/account_edi_ubl_cii/tests/test_autopost_bills.py
2025-01-06 10:57:38 +07:00

136 lines
6.1 KiB
Python

import base64
from datetime import datetime
from odoo import fields
from odoo.tests import tagged
from odoo.tools import file_open
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
@tagged('post_install', '-at_install')
class TestAutoPostBills(AccountTestInvoicingCommon):
def import_facturx(self, filename='facturx_out_invoice.xml'):
self.env.cr._now = datetime.now() # reset transaction's NOW, otherwise all move will have the same create_date
with file_open(f"account_edi_ubl_cii/tests/test_files/{filename}", 'rb', filter_ext=('.xml',)) as file:
attachment = self.env['ir.attachment'].create({
'name': 'test_file.xml',
'datas': base64.encodebytes(file.read()),
})
return self.company_data['default_journal_purchase'].with_context(disable_abnormal_invoice_detection=False)._create_document_from_attachment(attachment.id)
def assert_wizard(self, post_result, expected_nb_bills):
self.assertEqual(post_result.get('res_model'), 'account.autopost.bills.wizard')
wizard = self.env[post_result.get('res_model')].browse(post_result.get('res_id'))
self.assertEqual(wizard.nb_unmodified_bills, expected_nb_bills)
return wizard
def test_autopost_bills(self):
"""
When invoices from a same vendor are input thrice in a row without changing anything,
so for invoice coming from OCR or e-Invoicing, we should show a banner to the user
and allow him to automatically post future invoices from this vendor.
- If there is a significant difference (see abnormal_amount), don't autopost and show the banner !
- Not applicable to hashed journals
"""
# Create 1st bill ever for this partner, should NOT show popup
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
self.assertFalse(autopost_bills_wizard)
self.assertFalse(move.is_manually_modified)
# Create 2nd bill without changes for this partner, should NOT show popup
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
self.assertFalse(autopost_bills_wizard)
self.assertFalse(move.is_manually_modified)
# Create 3rd bill without changes for this partner, should show popup on posting
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
self.assertFalse(move.is_manually_modified)
wizard = self.assert_wizard(autopost_bills_wizard, 3)
wizard.action_ask_later() # Nothing changes, we should still show the popup
# Create 4th bill without changes for this partner, should show popup on posting
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
self.assertFalse(move.is_manually_modified)
wizard = self.assert_wizard(autopost_bills_wizard, 4)
wizard.action_ask_later() # Nothing changes, we should still show the popup
# Create 5th bill with changes, should NOT show popup on posting
move = self.import_facturx()
move.invoice_date_due = fields.Date.today()
autopost_bills_wizard = move.action_post()
self.assertFalse(autopost_bills_wizard)
self.assertTrue(move.is_manually_modified)
# Create again 3 bills without any changes
for _ in range(3):
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
wizard = self.assert_wizard(autopost_bills_wizard, 3)
wizard.action_automate_partner()
# Create 4th bill without changes with automation enabled => should automatically post, no popup
move = self.import_facturx()
self.assertEqual(move.state, 'posted')
# Reset
move.partner_id.autopost_bills = 'ask'
# Create 5th bill without changes, should show popup on posting
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
wizard = self.assert_wizard(autopost_bills_wizard, 5)
wizard.action_never_automate_partner()
# Create 6th bill without changes, should not show popup, and move should stay in draft
move = self.import_facturx()
self.assertEqual(move.state, 'draft')
autopost_bills_wizard = move.action_post()
self.assertFalse(autopost_bills_wizard)
# Reset
move.partner_id.autopost_bills = 'ask'
# Create 7th bill without changes, should show popup on posting
move = self.import_facturx()
autopost_bills_wizard = move.action_post()
wizard = self.assert_wizard(autopost_bills_wizard, 7)
wizard.action_ask_later()
# Deactivate the feature fully from the settings
# => Should never show popup, nor autopost (even if partner is on 'always')
move.company_id.autopost_bills = False
move.partner_id.autopost_bills = 'always'
move = self.import_facturx()
self.assertEqual(move.state, 'draft')
autopost_bills_wizard = move.action_post()
self.assertFalse(autopost_bills_wizard)
# Reset
move.company_id.autopost_bills = True
move.partner_id.autopost_bills = 'always'
# If there is a significant difference (see abnormal_amount), don't autopost even if 'always' is set
for _ in range(10): # See test_unexpected_invoice
move = self.import_facturx() # automatically posted
self.assertEqual(move.state, "posted")
move = self.import_facturx(filename='facturx_out_invoice_abnormal.xml') # amounts * 100 here, a bit abnormal...
self.assertEqual(move.state, "draft") # even if partner's autopost is always
res = move.action_post()
self.assertEqual(res.get('res_model'), 'validate.account.move')
wizard = self.env[res.get('res_model')].browse(res.get('res_id'))
self.assertEqual(wizard.move_ids, move)
# Not applicable to hashed journals
self.company_data['default_journal_purchase'].restrict_mode_hash_table = True
move = self.import_facturx()
self.assertEqual(move.state, "draft")
res = move.action_post()
self.assertFalse(res)