# -*- coding: utf-8 -*- # This file is part of the account-invoice-xrechnung-module # from m-ds for Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. from trytond.model import ModelView, fields from trytond.wizard import Wizard, StateView, StateReport, Button from trytond.pool import Pool from trytond.exceptions import UserError from trytond.i18n import gettext from trytond.transaction import Transaction sel_edocument = [ ('edocument.xrechnung.invoice-2.2', 'XRechnung UBL Invoice 2.2'), ('edocument.xrechnung.invoice-2.3', 'XRechnung UBL Invoice 2.3'), ('edocument.xrechnung.invoice-3.0', 'XRechnung UBL Invoice 3.0'), ('edocument.facturxext.invoice', 'Factur-X Extended'), ('edocument.facturxext.invoice-ferd', 'ZUGFeRD 2.3.2'), ('edocument.uncefact.invoice', 'CII CrossIndustryInvoice D16B'), ] edoc_versions = { 'edocument.xrechnung.invoice-2.2': 'XRechnung-2.2', 'edocument.xrechnung.invoice-2.3': 'XRechnung-2.3', 'edocument.xrechnung.invoice-3.0': 'XRechnung-3.0', 'edocument.facturxext.invoice': 'Factur-X-1.07.2-extended', 'edocument.facturxext.invoice-ferd': 'Factur-X-1.07.2-extended', 'edocument.uncefact.invoice': '16B-CII'} class RunXRechnungReportStart(ModelView): 'eDocument Export' __name__ = 'account_invoice_xrechnung.runrep.start' invoice = fields.Many2One( string='Invoice', readonly=True, model_name='account.invoice', required=True) state = fields.Char( string='State', readonly=True, states={'invisible': True}) edocument = fields.Selection( string='Type', required=True, selection=sel_edocument) as_zip = fields.Boolean(string='ZIP-File') @classmethod def default_as_zip(cls): """ default: True """ return True @classmethod def default_edocument(cls): """ default xrechnung """ return 'edocument.xrechnung.invoice-3.0' # end RunXRechnungReportStart class RunXRechnungReport(Wizard): 'eDocument Export' __name__ = 'account_invoice_xrechnung.runrep' start_state = 'start' export = StateReport('account_invoice_xrechnung.export') start = StateView( model_name='account_invoice_xrechnung.runrep.start', view='account_invoice_xrechnung.wiz_start_form', buttons=[ Button(string='Cancel', state='end', icon='tryton-cancel'), Button(string='Export', state='export', icon='tryton-export'), ]) def default_start(self, fields): """ set defaults """ context = Transaction().context pool = Pool() Invoice = pool.get('account.invoice') WizRepStart = pool.get('account_invoice_xrechnung.runrep.start') Configuration = pool.get('account.configuration') cfg1 = Configuration.get_singleton() invoice = Invoice.browse([context.get('active_id', -1)]) result = { 'edocument': WizRepStart.default_edocument(), 'invoice': context.get('active_id', -1), 'state': invoice[0].state if invoice else ''} if cfg1 and cfg1.xrechn_default: result['edocument'] = cfg1.xrechn_default return result def generate_invoice_reports(self, data): """ generate missing reports and store to db Args: data (dict): report-data """ pool = Pool() Invoice = pool.get('account.invoice') XReport = pool.get('account_invoice_xrechnung.export', type='report') invoices = Invoice.search([ ('id', '=', data['invoice']), ('type', '=', 'out')]) # check if stored report is pdf to_delete_report = [ x for x in invoices if x.invoice_report_cache and (x.invoice_report_format != 'pdf')] # delete reports if to_delete_report: Invoice.write(*[ to_delete_report, { 'invoice_report_cache': None, 'invoice_report_format': None}]) to_generate = [x for x in invoices if not x.invoice_report_cache] if to_generate: # the pdf should be stored in db... XReport.generate_pdf_data(to_generate) def do_export(self, action): """ run export """ if self.start.state != 'posted': raise UserError(gettext( 'account_invoice_xrechnung.msg_invoice_must_posted', invname=self.start.invoice.rec_name)) data = { 'invoice': self.start.invoice.id, 'edocument': self.start.edocument, 'as_zip': self.start.as_zip} # if zugferd - generate missing report-cache-items if data['edocument'] == 'edocument.facturxext.invoice-ferd': # pdf is stored to db self.generate_invoice_reports(data) return action, data # end RunXRechnungReport