From 68e0a2c83dfa317669e1c07735053804facbba43 Mon Sep 17 00:00:00 2001 From: wan Date: Tue, 22 Jun 2021 12:08:58 +0000 Subject: [PATCH] [FIX] l10n_de: review DIN5008 format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes odoo/odoo#72548 X-original-commit: bfa7c9e78037cd0abda3e8f0a9a519a600988e9c Signed-off-by: Quentin De Paoli (qdp) Signed-off-by: William André (wan) --- addons/l10n_de/models/__init__.py | 3 + addons/l10n_de/models/account_move.py | 40 +++ addons/l10n_de/models/base_document_layout.py | 27 ++ addons/l10n_de/models/ir_actions_report.py | 10 + addons/l10n_de/report/din5008_report.xml | 233 ++++++++++++------ .../static/src/scss/report_din5008.scss | 109 +++++++- addons/l10n_de_purchase/__init__.py | 1 + addons/l10n_de_purchase/__manifest__.py | 12 + addons/l10n_de_purchase/models/__init__.py | 1 + addons/l10n_de_purchase/models/purchase.py | 48 ++++ addons/l10n_de_repair/__init__.py | 1 + addons/l10n_de_repair/__manifest__.py | 12 + addons/l10n_de_repair/models/__init__.py | 1 + addons/l10n_de_repair/models/repair.py | 27 ++ addons/l10n_de_sale/__init__.py | 1 + addons/l10n_de_sale/__manifest__.py | 12 + addons/l10n_de_sale/models/__init__.py | 1 + addons/l10n_de_sale/models/sale.py | 46 ++++ addons/l10n_de_stock/__init__.py | 1 + addons/l10n_de_stock/__manifest__.py | 12 + addons/l10n_de_stock/models/__init__.py | 1 + addons/l10n_de_stock/models/stock.py | 14 ++ odoo/addons/base/models/ir_actions_report.py | 3 - 23 files changed, 537 insertions(+), 79 deletions(-) create mode 100644 addons/l10n_de/models/account_move.py create mode 100644 addons/l10n_de/models/base_document_layout.py create mode 100644 addons/l10n_de/models/ir_actions_report.py create mode 100644 addons/l10n_de_purchase/__init__.py create mode 100644 addons/l10n_de_purchase/__manifest__.py create mode 100644 addons/l10n_de_purchase/models/__init__.py create mode 100644 addons/l10n_de_purchase/models/purchase.py create mode 100644 addons/l10n_de_repair/__init__.py create mode 100644 addons/l10n_de_repair/__manifest__.py create mode 100644 addons/l10n_de_repair/models/__init__.py create mode 100644 addons/l10n_de_repair/models/repair.py create mode 100644 addons/l10n_de_sale/__init__.py create mode 100644 addons/l10n_de_sale/__manifest__.py create mode 100644 addons/l10n_de_sale/models/__init__.py create mode 100644 addons/l10n_de_sale/models/sale.py create mode 100644 addons/l10n_de_stock/__init__.py create mode 100644 addons/l10n_de_stock/__manifest__.py create mode 100644 addons/l10n_de_stock/models/__init__.py create mode 100644 addons/l10n_de_stock/models/stock.py diff --git a/addons/l10n_de/models/__init__.py b/addons/l10n_de/models/__init__.py index e08267fcefa..a2bb92d497e 100644 --- a/addons/l10n_de/models/__init__.py +++ b/addons/l10n_de/models/__init__.py @@ -2,5 +2,8 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import datev +from . import base_document_layout from . import chart_template +from . import ir_actions_report +from . import account_move from . import res_company diff --git a/addons/l10n_de/models/account_move.py b/addons/l10n_de/models/account_move.py new file mode 100644 index 00000000000..71ec4a0acb2 --- /dev/null +++ b/addons/l10n_de/models/account_move.py @@ -0,0 +1,40 @@ +from odoo import models, fields, _ +from odoo.tools import format_date + + +class AccountMove(models.Model): + _inherit = 'account.move' + + l10n_de_template_data = fields.Binary(compute='_compute_l10n_de_template_data') + l10n_de_document_title = fields.Char(compute='_compute_l10n_de_document_title') + + def _compute_l10n_de_template_data(self): + for record in self: + record.l10n_de_template_data = data = [] + if record.name: + data.append((_("Invoice No."), record.name)) + if record.invoice_date: + data.append((_("Invoice Date"), format_date(self.env, record.invoice_date))) + if record.invoice_date_due: + data.append((_("Due Date"), format_date(self.env, record.invoice_date_due))) + if record.invoice_origin: + data.append((_("Source"), record.invoice_origin)) + if record.ref: + data.append((_("Reference"), record.ref)) + + def _compute_l10n_de_document_title(self): + for record in self: + record.l10n_de_document_title = '' + if record.move_type == 'out_invoice': + if record.state == 'posted': + record.l10n_de_document_title = _('Invoice') + elif record.state == 'draft': + record.l10n_de_document_title = _('Draft Invoice') + elif record.state == 'cancel': + record.l10n_de_document_title = _('Cancelled Invoice') + elif record.move_type == 'out_refund': + record.l10n_de_document_title = _('Credit Note') + elif record.move_type == 'in_refund': + record.l10n_de_document_title = _('Vendor Credit Note') + elif record.move_type == 'in_invoice': + record.l10n_de_document_title = _('Vendor Bill') diff --git a/addons/l10n_de/models/base_document_layout.py b/addons/l10n_de/models/base_document_layout.py new file mode 100644 index 00000000000..fbe13bf96f3 --- /dev/null +++ b/addons/l10n_de/models/base_document_layout.py @@ -0,0 +1,27 @@ +from odoo import models, fields, _ +from odoo.tools import format_date + + +class BaseDocumentLayout(models.TransientModel): + _inherit = 'base.document.layout' + + street = fields.Char(related='company_id.street', readonly=True) + street2 = fields.Char(related='company_id.street2', readonly=True) + zip = fields.Char(related='company_id.zip', readonly=True) + city = fields.Char(related='company_id.city', readonly=True) + company_registry = fields.Char(related='company_id.company_registry', readonly=True) + bank_ids = fields.One2many(related='company_id.bank_ids', readonly=True) + account_fiscal_country_id = fields.Many2one(related='company_id.account_fiscal_country_id', readonly=True) + l10n_de_template_data = fields.Binary(compute='_compute_l10n_de_template_data') + l10n_de_document_title = fields.Char(compute='_compute_l10n_de_document_title') + + def _compute_l10n_de_template_data(self): + self.l10n_de_template_data = [ + (_("Invoice No."), 'INV/2021/12345'), + (_("Invoice Date"), format_date(self.env, fields.Date.today())), + (_("Due Date"), format_date(self.env, fields.Date.add(fields.Date.today(), days=7))), + (_("Reference"), 'SO/2021/45678'), + ] + + def _compute_l10n_de_document_title(self): + self.l10n_de_document_title = 'Invoice' diff --git a/addons/l10n_de/models/ir_actions_report.py b/addons/l10n_de/models/ir_actions_report.py new file mode 100644 index 00000000000..bc3c499b68c --- /dev/null +++ b/addons/l10n_de/models/ir_actions_report.py @@ -0,0 +1,10 @@ +from odoo import models + + +class IrActionsReport(models.Model): + _inherit = 'ir.actions.report' + + def _get_rendering_context(self, docids, data): + data = super()._get_rendering_context(docids, data) + data['din_header_spacing'] = self.get_paperformat().header_spacing + return data diff --git a/addons/l10n_de/report/din5008_report.xml b/addons/l10n_de/report/din5008_report.xml index 0da26110a0e..3914c5b8c34 100644 --- a/addons/l10n_de/report/din5008_report.xml +++ b/addons/l10n_de/report/din5008_report.xml @@ -3,108 +3,191 @@ + + European A4 for DIN5008 Type A + + A4 + Portrait + 27 + 40 + 20 + 10 + 70 + + 27 + + - European A4 for DIN + European A4 for DIN5008 Type B A4 Portrait 45 - 28 - 0 - 0 + 40 + 20 + 10 + 70 45 + diff --git a/addons/l10n_de/static/src/scss/report_din5008.scss b/addons/l10n_de/static/src/scss/report_din5008.scss index f0c2f5f97ba..dbe9440740c 100644 --- a/addons/l10n_de/static/src/scss/report_din5008.scss +++ b/addons/l10n_de/static/src/scss/report_din5008.scss @@ -1,3 +1,110 @@ +.din_page { + width: 180mm; + margin-left: -1rem; + font-size: 9pt; + + &.header { + table { + width: 100%; + img, h3, td, tr { + padding: 0; + margin: 0; + } + h3 { + color: $o-default-report-primary-color; + position: relative; + top: -10mm; + margin-bottom: -10mm; + } + img { + float: right; + } + } + } + &.invoice_note { + tr { + td { + vertical-align: bottom; + } + &:nth-child(2) td { + vertical-align: top; + } + .address, .information_block, .shipping_address, .invoice_address { + margin: 0; + } + .address { + height: 45mm; + } + .address, .shipping_address { + width: 85mm; + padding-left: 5mm; + .company_invoice_line { + margin-top: 1mm; + } + > span { + color: $o-default-report-secondary-color; + } + } + .information_block, .invoice_address { + width: 75mm; + min-height: 40mm; + margin-left: 20mm; + table { + width: 100%; + } + } + } + h2 { + margin-left: 5mm; + margin-right: 10mm; + margin-top: 8.46mm; + color: $o-default-report-primary-color; + } + > .pt-5 { // hide hardcoded address from base.template.layout + display: none; + } + .page { + margin-left: 5mm; + margin-right: 10mm; + > h2, h1, #informations { + display: none; + } + [name=invoice_line_table], [name=stock_move_table], .o_main_table { + margin-top: 8.46mm; + th { + color: $o-default-report-secondary-color; + } + } + } + } + &.footer { + padding-left: 5mm; + padding-right: 10mm; + .page_number { + margin-top: 4.23mm; + width: 100%; + height: 4.23mm; + } + .company_details { + margin-top: 4.23mm; + width: 100%; + table { + border-top: solid 1px; + width: 100%; + td { + vertical-align: baseline; + padding-right: 3mm; + &:last-child { + padding-right: initial; + } + } + } + } + } +} + + +// TODO WAN remove in master .din { &.header { min-height: 45mm; @@ -40,7 +147,7 @@ word-break: break-word; float: left; } - .header_address { + .header_address { min-height: 45mm; } .page_number { diff --git a/addons/l10n_de_purchase/__init__.py b/addons/l10n_de_purchase/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/addons/l10n_de_purchase/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/addons/l10n_de_purchase/__manifest__.py b/addons/l10n_de_purchase/__manifest__.py new file mode 100644 index 00000000000..bc5861fba77 --- /dev/null +++ b/addons/l10n_de_purchase/__manifest__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Germany - Purchase', + 'category': 'Accounting/Localizations', + 'depends': [ + 'l10n_de', + 'purchase', + ], + 'auto_install': True, +} diff --git a/addons/l10n_de_purchase/models/__init__.py b/addons/l10n_de_purchase/models/__init__.py new file mode 100644 index 00000000000..370f577b2a2 --- /dev/null +++ b/addons/l10n_de_purchase/models/__init__.py @@ -0,0 +1 @@ +from . import purchase diff --git a/addons/l10n_de_purchase/models/purchase.py b/addons/l10n_de_purchase/models/purchase.py new file mode 100644 index 00000000000..9ccc75c03a5 --- /dev/null +++ b/addons/l10n_de_purchase/models/purchase.py @@ -0,0 +1,48 @@ +from odoo import models, fields, _ +from odoo.tools import format_date + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + l10n_de_template_data = fields.Binary(compute='_compute_l10n_de_template_data') + l10n_de_document_title = fields.Char(compute='_compute_l10n_de_document_title') + l10n_de_addresses = fields.Binary(compute='_compute_l10n_de_addresses') + + def _compute_l10n_de_template_data(self): + for record in self: + record.l10n_de_template_data = data = [] + if record.state == 'draft': + data.append((_("Request for Quotation No."), record.name)) + elif record.state in ['sent', 'to approve', 'purchase', 'done']: + data.append((_("Purchase Order No."), record.name)) + elif record.state == 'cancel': + data.append((_("Cancelled Purchase Order No."), record.name)) + + if record.user_id: + data.append((_("Purchase Representative"), record.user_id.name)) + if record.partner_ref: + data.append((_("Order Reference"), record.partner_ref)) + if record.date_order: + data.append((_("Order Date"), format_date(self.env, record.date_order))) + if record.incoterm_id: + data.append((_("Incoterm"), record.incoterm_id.code)) + + + + def _compute_l10n_de_document_title(self): + for record in self: + if record.state == 'draft': + record.l10n_de_document_title = _("Request for Quotation") + elif record.state in ['sent', 'to approve', 'purchase', 'done']: + record.l10n_de_document_title = _("Purchase Order") + elif record.state == 'cancel': + record.l10n_de_document_title = _("Cancelled Purchase Order") + + def _compute_l10n_de_addresses(self): + for record in self: + record.l10n_de_addresses = data = [] + if record.dest_address_id: + data.append((_("Shipping Address:"), record.dest_address_id)) + elif 'picking_type_id' in record._fields and record.picking_type_id.warehouse_id: + data.append((_("Shipping Address:"), record.picking_type_id.warehouse_id.partner_id)) diff --git a/addons/l10n_de_repair/__init__.py b/addons/l10n_de_repair/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/addons/l10n_de_repair/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/addons/l10n_de_repair/__manifest__.py b/addons/l10n_de_repair/__manifest__.py new file mode 100644 index 00000000000..ab094adee38 --- /dev/null +++ b/addons/l10n_de_repair/__manifest__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Germany - Repair', + 'category': 'Accounting/Localizations', + 'depends': [ + 'l10n_de', + 'repair', + ], + 'auto_install': True, +} diff --git a/addons/l10n_de_repair/models/__init__.py b/addons/l10n_de_repair/models/__init__.py new file mode 100644 index 00000000000..3985e5580bf --- /dev/null +++ b/addons/l10n_de_repair/models/__init__.py @@ -0,0 +1 @@ +from . import repair diff --git a/addons/l10n_de_repair/models/repair.py b/addons/l10n_de_repair/models/repair.py new file mode 100644 index 00000000000..5f007603de9 --- /dev/null +++ b/addons/l10n_de_repair/models/repair.py @@ -0,0 +1,27 @@ +from odoo import models, fields, _ +from odoo.tools import format_date + + +class RepairOrder(models.Model): + _inherit = 'repair.order' + + l10n_de_template_data = fields.Binary(compute='_compute_l10n_de_template_data') + l10n_de_document_title = fields.Char(compute='_compute_l10n_de_document_title') + + def _compute_l10n_de_template_data(self): + for record in self: + record.l10n_de_template_data = data = [] + if record.product_id: + data.append((_("Product to Repair"), record.product_id.name)) + if record.lot_id: + data.append((_("Lot/Serial Number"), record.lot_id.name)) + if record.guarantee_limit: + data.append((_("Warranty"), format_date(self.env, record.guarantee_limit))) + data.append((_("Printing Date"), format_date(self.env, fields.Date.today()))) + + def _compute_l10n_de_document_title(self): + for record in self: + if record.state == 'draft': + record.l10n_de_document_title = _("Repair Order") + else: + record.l10n_de_document_title = _("Repair Quotation") diff --git a/addons/l10n_de_sale/__init__.py b/addons/l10n_de_sale/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/addons/l10n_de_sale/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/addons/l10n_de_sale/__manifest__.py b/addons/l10n_de_sale/__manifest__.py new file mode 100644 index 00000000000..3cf8eebf333 --- /dev/null +++ b/addons/l10n_de_sale/__manifest__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Germany - Sale', + 'category': 'Accounting/Localizations', + 'depends': [ + 'l10n_de', + 'sale', + ], + 'auto_install': True, +} diff --git a/addons/l10n_de_sale/models/__init__.py b/addons/l10n_de_sale/models/__init__.py new file mode 100644 index 00000000000..8a0dc04e1fd --- /dev/null +++ b/addons/l10n_de_sale/models/__init__.py @@ -0,0 +1 @@ +from . import sale diff --git a/addons/l10n_de_sale/models/sale.py b/addons/l10n_de_sale/models/sale.py new file mode 100644 index 00000000000..ad104a97ac2 --- /dev/null +++ b/addons/l10n_de_sale/models/sale.py @@ -0,0 +1,46 @@ +from odoo import models, fields, _ +from odoo.tools import format_date + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + l10n_de_template_data = fields.Binary(compute='_compute_l10n_de_template_data') + l10n_de_document_title = fields.Char(compute='_compute_l10n_de_document_title') + l10n_de_addresses = fields.Binary(compute='_compute_l10n_de_addresses') + + def _compute_l10n_de_template_data(self): + for record in self: + record.l10n_de_template_data = data = [] + if record.state in ('draft', 'sent'): + if record.name: + data.append((_("Quotation No."), record.name)) + if record.date_order: + data.append((_("Quotation Date"), format_date(self.env, record.date_order))) + if record.validity_date: + data.append((_("Expiration"), format_date(self.env, record.validity_date))) + else: + if record.name: + data.append((_("Order No."), record.name)) + if record.date_order: + data.append((_("Order Date"), format_date(self.env, record.date_order))) + if record.client_order_ref: + data.append((_('Customer Reference'), record.client_order_ref)) + if record.user_id: + data.append((_("Salesperson"), record.user_id.name)) + + def _compute_l10n_de_document_title(self): + for record in self: + if record.state in ('draft', 'sent'): + record.l10n_de_document_title = _('Quotation') + else: + record.l10n_de_document_title = _('Sales Order') + + def _compute_l10n_de_addresses(self): + for record in self: + record.l10n_de_addresses = data = [] + if record.partner_shipping_id == record.partner_invoice_id: + data.append((_("Invoicing and Shipping Address:"), record.partner_shipping_id)) + else: + data.append((_("Shipping Address:"), record.partner_shipping_id)) + data.append((_("Invoicing Address:"), record.partner_invoice_id)) diff --git a/addons/l10n_de_stock/__init__.py b/addons/l10n_de_stock/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/addons/l10n_de_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/addons/l10n_de_stock/__manifest__.py b/addons/l10n_de_stock/__manifest__.py new file mode 100644 index 00000000000..677379ae1a3 --- /dev/null +++ b/addons/l10n_de_stock/__manifest__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Germany - Stock', + 'category': 'Accounting/Localizations', + 'depends': [ + 'l10n_de', + 'stock', + ], + 'auto_install': True, +} diff --git a/addons/l10n_de_stock/models/__init__.py b/addons/l10n_de_stock/models/__init__.py new file mode 100644 index 00000000000..12bab770a38 --- /dev/null +++ b/addons/l10n_de_stock/models/__init__.py @@ -0,0 +1 @@ +from . import stock diff --git a/addons/l10n_de_stock/models/stock.py b/addons/l10n_de_stock/models/stock.py new file mode 100644 index 00000000000..7ad1f89ac99 --- /dev/null +++ b/addons/l10n_de_stock/models/stock.py @@ -0,0 +1,14 @@ +from odoo import models, fields, _ +from odoo.tools import format_date + + +class StockInventory(models.Model): + _inherit = 'stock.inventory' + + l10n_de_template_data = fields.Binary(compute='_compute_l10n_de_template_data') + + def _compute_l10n_de_template_data(self): + for record in self: + record.l10n_de_template_data = data = [] + if record.date: + data.append((_("Date"), format_date(self.env, record.date))) diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py index c00b41e6b72..62b43dfd1b3 100644 --- a/odoo/addons/base/models/ir_actions_report.py +++ b/odoo/addons/base/models/ir_actions_report.py @@ -250,7 +250,6 @@ class IrActionsReport(models.Model): ''' return wkhtmltopdf_state - @api.model def get_paperformat(self): return self.paperformat_id or self.env.company.paperformat_id @@ -861,12 +860,10 @@ class IrActionsReport(models.Model): data = self._get_rendering_context(docids, data) return self._render_template(self.sudo().report_name, data), 'html' - @api.model def _get_rendering_context_model(self): report_model_name = 'report.%s' % self.report_name return self.env.get(report_model_name) - @api.model def _get_rendering_context(self, docids, data): # access the report details with sudo() but evaluation context as current user self_sudo = self.sudo()