Filtering by company when creating AEAT SII reports.

This commit refs #22764.
This commit is contained in:
José Antonio Díaz Miralles 2022-04-25 11:47:24 +02:00
parent a3862ad782
commit cba29200a8
1 changed files with 173 additions and 147 deletions

320
aeat.py
View File

@ -381,6 +381,15 @@ class SIIReport(Workflow, ModelSQL, ModelView):
def on_change_with_load_date_end(self, name=None):
return self.period.end_date if self.period else None
@classmethod
def get_allowed_companies(cls):
company_filter = Transaction().context.get('company_filter')
companies = Transaction().context.get('companies')
company = Transaction().context.get('company')
if company_filter == 'one':
companies = [company]
return companies
@classmethod
def copy(cls, records, default=None):
if default is None:
@ -899,72 +908,79 @@ class SIIReport(Workflow, ModelSQL, ModelView):
Invoice = pool.get('account.invoice')
SIIReportLine = pool.get('aeat.sii.report.lines')
issued_invoices = {
'A0': {}, # 'A0', 'Registration of invoices/records'
'A1': {}, # 'A1', 'Amendment of invoices/records
# (registration errors)'
'D0': {}, # 'D0', 'Delete Invoices'
}
companies = cls.get_allowed_companies()
issued_invoices = {}
for company in companies:
issued_invoices[company] = {
'A0': {}, # 'A0', 'Registration of invoices/records'
'A1': {}, # 'A1', 'Amendment of invoices/records
# (registration errors)'
'D0': {}, # 'D0', 'Delete Invoices'
}
issued_invs = Invoice.search([
('sii_pending_sending', '=', True),
('sii_state', '=', 'Correcto'),
('sii_header', '!=', None),
('type', '=', 'out'),
])
issued_invs = Invoice.search([
('company', '=', company),
('sii_pending_sending', '=', True),
('sii_state', '=', 'Correcto'),
('sii_header', '!=', None),
('type', '=', 'out'),
])
# search issued invoices [delete]
delete_issued_invoices = []
# search issued invoices [modify]
modify_issued_invoices = []
for issued_inv in issued_invs:
if not issued_inv.sii_records:
continue
sii_record_id = max([s.id for s in issued_inv.sii_records])
sii_record = SIIReportLine(sii_record_id)
if issued_inv.sii_header:
if (literal_eval(issued_inv.sii_header) ==
literal_eval(sii_record.sii_header)):
modify_issued_invoices.append(issued_inv)
# search issued invoices [delete]
delete_issued_invoices = []
# search issued invoices [modify]
modify_issued_invoices = []
for issued_inv in issued_invs:
if not issued_inv.sii_records:
continue
sii_record_id = max([s.id for s in issued_inv.sii_records])
sii_record = SIIReportLine(sii_record_id)
if issued_inv.sii_header:
if (literal_eval(issued_inv.sii_header) ==
literal_eval(sii_record.sii_header)):
modify_issued_invoices.append(issued_inv)
else:
delete_issued_invoices.append(issued_inv)
periods = {}
for invoice in delete_issued_invoices:
period = invoice.move.period
if period in periods:
periods[period].append(invoice,)
else:
delete_issued_invoices.append(issued_inv)
periods[period] = [invoice]
issued_invoices[company]['D0'] = periods
periods = {}
for invoice in delete_issued_invoices:
period = invoice.move.period
if period in periods:
periods[period].append(invoice,)
else:
periods[period] = [invoice]
issued_invoices['D0'] = periods
periods2 = {}
for invoice in modify_issued_invoices:
period = invoice.move.period
if period in periods2:
periods2[period].append(invoice,)
else:
periods2[period] = [invoice]
issued_invoices[company]['A1'] = periods2
periods2 = {}
for invoice in modify_issued_invoices:
period = invoice.move.period
if period in periods2:
periods2[period].append(invoice,)
else:
periods2[period] = [invoice]
issued_invoices['A1'] = periods2
# search issued invoices [new]
new_issued_invoices = Invoice.search([
('company', '=', company),
('sii_book_key', '=', 'E'),
('state', 'in', ['posted', 'paid']),
('sii_state', 'in', (None, 'Incorrecto', 'Anulada')),
('sii_pending_sending', '=', True),
('type', '=', 'out'),
('move', '!=', None),
])
# search issued invoices [new]
new_issued_invoices = Invoice.search([
('sii_state', 'in', (None, 'Incorrecto', 'Anulada')),
('sii_pending_sending', '=', True),
('type', '=', 'out'),
('move', '!=', None),
])
new_issued_invoices += delete_issued_invoices
new_issued_invoices += delete_issued_invoices
periods1 = {}
for invoice in new_issued_invoices:
period = invoice.move.period
if period in periods1:
periods1[period].append(invoice,)
else:
periods1[period] = [invoice]
issued_invoices['A0'] = periods1
periods1 = {}
for invoice in new_issued_invoices:
period = invoice.move.period
if period in periods1:
periods1[period].append(invoice,)
else:
periods1[period] = [invoice]
issued_invoices[company]['A0'] = periods1
book_type = 'E' # Issued
return cls.create_sii_book(issued_invoices, book_type)
@ -975,77 +991,82 @@ class SIIReport(Workflow, ModelSQL, ModelView):
Invoice = pool.get('account.invoice')
SIIReportLine = pool.get('aeat.sii.report.lines')
received_invoices = {
'A0': {}, # 'A0', 'Registration of invoices/records'
'A1': {}, # 'A1', 'Amendment of invoices/records
# (registration errors)'
'D0': {}, # 'D0', 'Delete Invoices'
}
companies = cls.get_allowed_companies()
received_invoices = {}
for company in companies:
received_invoices[company] = {
'A0': {}, # 'A0', 'Registration of invoices/records'
'A1': {}, # 'A1', 'Amendment of invoices/records
# (registration errors)'
'D0': {}, # 'D0', 'Delete Invoices'
}
received_invs = Invoice.search([
('sii_pending_sending', '=', True),
('sii_state', '=', 'Correcto'),
('sii_header', '!=', None),
('type', '=', 'in'),
])
# search received invoices [delete]
delete_received_invoices = []
# search received invoices [modify]
modify_received_invoices = []
for received_inv in received_invs:
if not received_inv.sii_records:
continue
sii_record_id = max([s.id for s in received_inv.sii_records])
sii_record = SIIReportLine(sii_record_id)
if received_inv.sii_header:
if (literal_eval(received_inv.sii_header) ==
literal_eval(sii_record.sii_header)):
modify_received_invoices.append(received_inv)
received_invs = Invoice.search([
('company', '=', company),
('sii_pending_sending', '=', True),
('sii_state', '=', 'Correcto'),
('sii_header', '!=', None),
('type', '=', 'in'),
])
# search received invoices [delete]
delete_received_invoices = []
# search received invoices [modify]
modify_received_invoices = []
for received_inv in received_invs:
if not received_inv.sii_records:
continue
sii_record_id = max([s.id for s in received_inv.sii_records])
sii_record = SIIReportLine(sii_record_id)
if received_inv.sii_header:
if (literal_eval(received_inv.sii_header) ==
literal_eval(sii_record.sii_header)):
modify_received_invoices.append(received_inv)
else:
delete_received_invoices.append(received_inv)
periods2 = {}
for invoice in modify_received_invoices:
period = invoice.move.period
if period in periods2:
periods2[period].append(invoice,)
else:
delete_received_invoices.append(received_inv)
periods2[period] = [invoice]
received_invoices[company]['A1'] = periods2
periods2 = {}
for invoice in modify_received_invoices:
period = invoice.move.period
if period in periods2:
periods2[period].append(invoice,)
else:
periods2[period] = [invoice]
received_invoices['A1'] = periods2
periods = {}
for invoice in delete_received_invoices:
period = invoice.move.period
if period in periods:
periods[period].append(invoice,)
else:
periods[period] = [invoice]
received_invoices[company]['D0'] = periods
periods = {}
for invoice in delete_received_invoices:
period = invoice.move.period
if period in periods:
periods[period].append(invoice,)
else:
periods[period] = [invoice]
received_invoices['D0'] = periods
# search received invoices [new]
new_received_invoices = Invoice.search([
('company', '=', company),
('sii_state', 'in', (None, 'Incorrecto', 'Anulada')),
('sii_pending_sending', '=', True),
('type', '=', 'in'),
('move', '!=', None),
])
new_received_invoices += delete_received_invoices
# search received invoices [new]
new_received_invoices = Invoice.search([
('sii_state', 'in', (None, 'Incorrecto', 'Anulada')),
('sii_pending_sending', '=', True),
('type', '=', 'in'),
('move', '!=', None),
])
new_received_invoices += delete_received_invoices
periods1 = {}
for invoice in new_received_invoices:
period = invoice.move.period
if period in periods1:
periods1[period].append(invoice,)
else:
periods1[period] = [invoice]
received_invoices['A0'] = periods1
periods1 = {}
for invoice in new_received_invoices:
period = invoice.move.period
if period in periods1:
periods1[period].append(invoice,)
else:
periods1[period] = [invoice]
received_invoices[company]['A0'] = periods1
book_type = 'R' # Received
return cls.create_sii_book(received_invoices, book_type)
@classmethod
def create_sii_book(cls, book_invoices, book):
def create_sii_book(cls, company_invoices, book):
pool = Pool()
SIIReport = pool.get('aeat.sii.report')
SIIReportLine = pool.get('aeat.sii.report.lines')
@ -1059,40 +1080,45 @@ class SIIReport(Workflow, ModelSQL, ModelView):
report_line_table = SIIReportLine.__table__()
reports = []
for operation in ['D0', 'A1', 'A0']:
values = book_invoices[operation]
delete = True if operation == 'D0' else False
for period, invoices in values.items():
for invs in grouped_slice(invoices, MAX_SII_LINES):
report = SIIReport()
report.company = company
report.company_vat = company_vat
report.fiscalyear = period.fiscalyear
report.period = period
report.operation_type = operation
report.book = book
report.save()
reports.append(report)
reports = []
for company, book_invoices in company_invoices.items():
company = Company(company)
company_vat = company.party.sii_vat_code
for operation in ['D0', 'A1', 'A0']:
values = book_invoices[operation]
delete = True if operation == 'D0' else False
for period, invoices in values.items():
for invs in grouped_slice(invoices, MAX_SII_LINES):
report = SIIReport()
report.company = company
report.company_vat = company_vat
report.fiscalyear = period.fiscalyear
report.period = period
report.operation_type = operation
report.book = book
report.save()
reports.append(report)
values = []
for inv in invs:
sii_header = str(inv.get_sii_header(inv, delete))
values.append(
[report.id, inv.id, sii_header, company.id])
cursor.execute(*report_line_table.insert(
columns=[report_line_table.report,
report_line_table.invoice,
report_line_table.sii_header,
report_line_table.company],
values=values
))
values = []
for inv in invs:
sii_header = str(inv.get_sii_header(inv, delete))
values.append(
[report.id, inv.id, sii_header, company.id])
cursor.execute(*report_line_table.insert(
columns=[report_line_table.report,
report_line_table.invoice,
report_line_table.sii_header,
report_line_table.company],
values=values
))
return reports
@classmethod
def find_reports(cls, book='E'):
companies = cls.get_allowed_companies()
return cls.search([
('company', 'in', companies),
('state', 'in', ('draft', 'confirmed')),
('book', '=', book),
], count=True)