diff --git a/__manifest__.py b/__manifest__.py index de3da9c..225a926 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -23,10 +23,11 @@ ], 'data': [ - # 'security/ir.model.access.csv', + 'security/ir.model.access.csv', # 'views/templates.xml', - 'views/res_partner.xml', 'views/res_partner_contract.xml', + 'views/res_partner.xml', 'views/contract_wizard.xml', + 'data/fields_default.xml', ], } diff --git a/data/fields_default.xml b/data/fields_default.xml new file mode 100644 index 0000000..33cacb1 --- /dev/null +++ b/data/fields_default.xml @@ -0,0 +1,219 @@ + + + + + + + Generate Context for Contract + + code + +self = records + +# ctx keys must be decalared in this xml +ctx = { + "contract_number":"--1", + "amount_whole":"", + "amount_fractional":"", + + "seller_company_name":"Test Company Name", + "seller_business_address":"", + "seller_representer_name":"", + "seller_representer_name_parent":"", + "seller_representer_name_initials":"", + "seller_representer_function":"", + "seller_inn":"", + "seller_kpp":"", + "seller_bic":"", + "seller_ogrn":"", + "seller_bank":"", + "seller_bank_account":"", + "seller_phone":"", + + "partner_company_name":"", + "partner_business_address":"", + "partner_representer_name":"", + "partner_representer_name_parent":"", + "partner_representer_name_initials":"", + "partner_representer_function":"", + "partner_inn":"", + "partner_kpp":"", + "partner_bic":"", + "partner_ogrn":"", + "partner_bank":"", + "partner_bank_account":"", + "partner_phone":"", +} +action = ctx + + + + + + + + Contract Number + contract_number + + + + Amount Whole Part + amount_whole + + + + Amount Fractional Part + amount_fractional + + + + + + + Seller Company Name + seller_company_name + + + + Seller Business Address + seller_business_address + + + + Seller Representer Name + seller_representer_name + + + + + Seller Representer Parent Name + seller_representer_name_parent + + + + + Seller Representer Initials Name + seller_representer_name_initials + + + + + Seller Representer Function + seller_representer_function + + + + Seller INN + seller_inn + + + + Seller KPP + seller_kpp + + + + Seller BIC + seller_bic + + + + Seller OGRN + seller_ogrn + + + + Seller Bank Name + seller_bank + + + + Seller Bank Account + seller_bank_account + + + + Seller Phone + seller_phone + + + + + + + Partner Company Name + partner_company_name + + + + Partner Business Address + partner_business_address + + + + Partner Representer Name + partner_representer_name + + + + + Partner Representer Parent Name + partner_representer_name_parent + + + + + Partner Representer Initials Name + partner_representer_name_initials + + + + + Partner Representer Function + partner_representer_function + + + + Partner INN + partner_inn + + + + Partner KPP + partner_kpp + + + + Partner BIC + partner_bic + + + + Partner OGRN + partner_ogrn + + + + Partner Bank Name + partner_bank + + + + Partner Bank Account + partner_bank_account + + + + Partner Phone + partner_phone + + + + + + + + \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index 5f8738b..acb416b 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,6 +1,8 @@ from . import contract_wizard from . import res_partner from . import res_partner_contract +from . import res_partner_contract_field +from . import res_partner_contract_field_transient from . import sale_order # TODO: rename all fields ilike 'adress' -> 'address' diff --git a/models/contract_wizard.py b/models/contract_wizard.py index 9a84ac2..a63e428 100644 --- a/models/contract_wizard.py +++ b/models/contract_wizard.py @@ -4,6 +4,7 @@ import math from datetime import datetime from odoo import api, fields, models +from odoo.exceptions import UserError from pytils import numeral from ..utils.docxtpl import get_document_from_values_stream @@ -246,6 +247,12 @@ class ContractWizard(models.TransientModel): default='company' ) + transient_field_ids = fields.One2many( + 'res.partner.contract.field.transient', + '_contract_wizard_id', + string="Contract Fields", + ) + @api.depends('contract_id') def _compute_context_name(self): self._context_name = self.contract_id.name @@ -500,11 +507,43 @@ class ContractWizard(models.TransientModel): } return context + @api.onchange('partner_id') + def _onchange_partner_id(self): + """Creates transient fields for generate contract template + Looks as a tree view of *_contract_field_transient model in xml + """ + def get_contract_field(technical_name): + return self.env['res.partner.contract.field'].search([ + ('technical_name', '=', technical_name), + ]) + + contract_context_values = self.env.ref( + 'client_contracts.action_get_context').run() + + self.transient_field_ids = [ # one2many + ( + 4, + self.env['res.partner.contract.field.transient'].create({ + "contract_field_id": get_contract_field(field).id, + "value": value, + }).id, + 0, + ) for field, value in contract_context_values.items() + ] + def get_docx_contract(self): template = self.template.attachment_id + if not template: + raise UserError("Template must be set up") + path_to_template = template._full_path(template.store_fname) - fields = self._generate_context() + fields = { + transient_field.technical_name: transient_field.value + for transient_field + in self.transient_field_ids + if transient_field.technical_name + } binary_data = get_document_from_values_stream( path_to_template, fields).read() diff --git a/models/res_partner_contract_field.py b/models/res_partner_contract_field.py new file mode 100644 index 0000000..2185bd6 --- /dev/null +++ b/models/res_partner_contract_field.py @@ -0,0 +1,22 @@ +from odoo import fields, models + + +class ContractField(models.Model): + _name = "res.partner.contract.field" + _description = "Contract Field" + + description = fields.Char( + string="Description", + translate=True, + default="", + ) + name = fields.Char( + string="Name", + required=True, + translate=True, + ) + technical_name = fields.Char( + string="Technical Name", + help="Name uses in template", + required=True, + ) diff --git a/models/res_partner_contract_field_transient.py b/models/res_partner_contract_field_transient.py new file mode 100644 index 0000000..dc638c2 --- /dev/null +++ b/models/res_partner_contract_field_transient.py @@ -0,0 +1,39 @@ +from odoo import api, fields, models + + +class ContractFieldTransient(models.TransientModel): + _name = "res.partner.contract.field.transient" + _description = "Contract Field Transient" + + _contract_wizard_id = fields.Many2one( + 'res.partner.contract.wizard', + string='Contract', + readonly=True, + ) + contract_field_id = fields.Many2one( + "res.partner.contract.field", + string="Field", + ) + technical_name = fields.Char( + string="Technical Name", + ) + name = fields.Char( + string="Name", + ) + description = fields.Char( + string="Description", + ) + value = fields.Char( + string="Value", + default="", + ) + + @api.model + def create(self, values): + res = super().create(values) + + res.technical_name = res.contract_field_id.technical_name + res.name = res.contract_field_id.name + res.description = res.contract_field_id.description + + return res diff --git a/views/contract_wizard.xml b/views/contract_wizard.xml index 9426f13..032a171 100644 --- a/views/contract_wizard.xml +++ b/views/contract_wizard.xml @@ -70,44 +70,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + +