diff --git a/aeat.py b/aeat.py index 413f4c9..80551f6 100644 --- a/aeat.py +++ b/aeat.py @@ -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)