Treat DGII authorizations as independent imports
Publicar paquete PyPI / publish (push) Successful in 1m14s
Publicar paquete PyPI / publish (push) Successful in 1m14s
This commit is contained in:
+4
-2
@@ -49,8 +49,10 @@ Importing DGII authorizations
|
|||||||
Use **NCF Manager → Import DGII Authorization** to load an authorization
|
Use **NCF Manager → Import DGII Authorization** to load an authorization
|
||||||
downloaded from the DGII Virtual Office. XML, CSV and the HTML table exported
|
downloaded from the DGII Virtual Office. XML, CSV and the HTML table exported
|
||||||
with an ``.xls`` extension are supported and detected from their content.
|
with an ``.xls`` extension are supported and detected from their content.
|
||||||
The importer groups lines by ``NUM_SOL`` and identifies each authorization by
|
The importer creates an independent workflow record for every ``NUM_AUTOR``.
|
||||||
``NUM_AUTOR``; file names are not used as fiscal identifiers. It validates
|
The same ``NUM_SOL`` may therefore appear in several records without modifying
|
||||||
|
an authorization that is already active; file names are not used as fiscal
|
||||||
|
identifiers. It validates
|
||||||
approval status, company name, NCF type, prefix, range and approved quantity,
|
approval status, company name, NCF type, prefix, range and approved quantity,
|
||||||
and stores the original file, SHA-256, user and import date for audit.
|
and stores the original file, SHA-256, user and import date for audit.
|
||||||
|
|
||||||
|
|||||||
+15
-24
@@ -232,24 +232,6 @@ def import_dgii_authorizations(company, data, filename, activate=False):
|
|||||||
managers_to_activate = []
|
managers_to_activate = []
|
||||||
imported_lines = []
|
imported_lines = []
|
||||||
for row in normalized_rows:
|
for row in normalized_rows:
|
||||||
managers = Manager.search([
|
|
||||||
('company', '=', company.id),
|
|
||||||
('app_number', '=', row['application_number']),
|
|
||||||
], limit=1)
|
|
||||||
if managers:
|
|
||||||
manager = managers[0]
|
|
||||||
else:
|
|
||||||
manager, = Manager.create([{
|
|
||||||
'company': company.id,
|
|
||||||
'app_number': row['application_number'],
|
|
||||||
'app_date': row['application_date'].date(),
|
|
||||||
'source_filename': filename,
|
|
||||||
'source_hash': file_hash,
|
|
||||||
'source_file': data,
|
|
||||||
'imported_by': Transaction().user,
|
|
||||||
'imported_at': datetime.datetime.now(),
|
|
||||||
}])
|
|
||||||
|
|
||||||
duplicates = Line.search([
|
duplicates = Line.search([
|
||||||
('pos.company', '=', company.id),
|
('pos.company', '=', company.id),
|
||||||
('auth_number', '=', row['authorization_number']),
|
('auth_number', '=', row['authorization_number']),
|
||||||
@@ -260,10 +242,20 @@ def import_dgii_authorizations(company, data, filename, activate=False):
|
|||||||
'ncf_manager.msg_dgii_import_conflict',
|
'ncf_manager.msg_dgii_import_conflict',
|
||||||
authorization=row['authorization_number']))
|
authorization=row['authorization_number']))
|
||||||
continue
|
continue
|
||||||
if manager.state != 'draft':
|
|
||||||
raise UserError(gettext(
|
# A DGII request number may appear in more than one downloaded
|
||||||
'ncf_manager.msg_dgii_import_closed_request',
|
# authorization. Keep every NUM_AUTOR in its own workflow record so
|
||||||
request=manager.app_number))
|
# importing a later authorization never mutates an active one.
|
||||||
|
manager, = Manager.create([{
|
||||||
|
'company': company.id,
|
||||||
|
'app_number': row['application_number'],
|
||||||
|
'app_date': row['application_date'].date(),
|
||||||
|
'source_filename': filename,
|
||||||
|
'source_hash': file_hash,
|
||||||
|
'source_file': data,
|
||||||
|
'imported_by': Transaction().user,
|
||||||
|
'imported_at': datetime.datetime.now(),
|
||||||
|
}])
|
||||||
line, = Line.create([{
|
line, = Line.create([{
|
||||||
'pos': manager.id,
|
'pos': manager.id,
|
||||||
'auth_number': row['authorization_number'],
|
'auth_number': row['authorization_number'],
|
||||||
@@ -288,8 +280,7 @@ def import_dgii_authorizations(company, data, filename, activate=False):
|
|||||||
'imported_at': datetime.datetime.now(),
|
'imported_at': datetime.datetime.now(),
|
||||||
}])
|
}])
|
||||||
imported_lines.append(line)
|
imported_lines.append(line)
|
||||||
if manager not in managers_to_activate:
|
managers_to_activate.append(manager)
|
||||||
managers_to_activate.append(manager)
|
|
||||||
|
|
||||||
if activate and managers_to_activate:
|
if activate and managers_to_activate:
|
||||||
Manager.activate(managers_to_activate)
|
Manager.activate(managers_to_activate)
|
||||||
|
|||||||
@@ -313,6 +313,46 @@ class NcfManagerTestCase(ModuleTestCase):
|
|||||||
self.assertEqual(Manager.search_count([
|
self.assertEqual(Manager.search_count([
|
||||||
('app_number', '=', '6009912073')]), 1)
|
('app_number', '=', '6009912073')]), 1)
|
||||||
|
|
||||||
|
@with_transaction()
|
||||||
|
def test_import_new_authorization_for_active_request(self):
|
||||||
|
'A new NUM_AUTOR may reuse NUM_SOL without reopening the active one'
|
||||||
|
pool = Pool()
|
||||||
|
Manager = pool.get('ncf.manager')
|
||||||
|
Line = pool.get('ncf.manager.sequence')
|
||||||
|
company = self._create_company()
|
||||||
|
|
||||||
|
first_data = self._dgii_xml()
|
||||||
|
first_managers, _ = import_dgii_authorizations(
|
||||||
|
company, first_data, 'authorization-31.xml', activate=True)
|
||||||
|
first_manager, = first_managers
|
||||||
|
self.assertEqual(Manager(first_manager.id).state, 'active')
|
||||||
|
|
||||||
|
second_data = self._dgii_xml(
|
||||||
|
ncf_type='34', authorization='6005423852',
|
||||||
|
start='E340000000001', end='E340000001000', quantity='1000')
|
||||||
|
second_managers, second_lines = import_dgii_authorizations(
|
||||||
|
company, second_data, 'authorization-34.xml')
|
||||||
|
|
||||||
|
self.assertEqual(len(second_managers), 1)
|
||||||
|
self.assertEqual(len(second_lines), 1)
|
||||||
|
self.assertNotEqual(second_managers[0].id, first_manager.id)
|
||||||
|
self.assertEqual(second_managers[0].state, 'draft')
|
||||||
|
self.assertEqual(second_lines[0].auth_number, '6005423852')
|
||||||
|
self.assertEqual(Manager(first_manager.id).state, 'active')
|
||||||
|
self.assertEqual(Manager.search_count([
|
||||||
|
('company', '=', company.id),
|
||||||
|
('app_number', '=', '6009912073'),
|
||||||
|
]), 2)
|
||||||
|
self.assertEqual(Line.search_count([
|
||||||
|
('pos.company', '=', company.id),
|
||||||
|
('auth_number', 'in', ['6005423851', '6005423852']),
|
||||||
|
]), 2)
|
||||||
|
|
||||||
|
managers, lines = import_dgii_authorizations(
|
||||||
|
company, second_data, 'authorization-34-again.xml')
|
||||||
|
self.assertEqual(managers, [])
|
||||||
|
self.assertEqual(lines, [])
|
||||||
|
|
||||||
|
|
||||||
del ModuleTestCase
|
del ModuleTestCase
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user