account_invoice_xrechnung/wizard_runreport.py
2024-12-06 14:04:35 +01:00

143 lines
4.9 KiB
Python

# -*- 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')])
to_generate = [x.id for x in invoices if not x.invoice_report_cache]
if to_generate:
report_action = XReport.get_used_report()
# run selected report on invoices w/o stored report-data
data2 = {}
data2.update(data)
data2['action_id'] = report_action.id
data2['model'] = report_action.model
data2['id'] = to_generate[0]
data2['ids'] = to_generate
RepInvoice = pool.get(report_action.report_name, type='report')
with Transaction().set_context({'with_rec_name': False}):
RepInvoice.execute(to_generate, data2)
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