[ADD] contract_field model, contract_field_transient_model, default_fields, transient field view inside a contract wizard, generate contract using transient fields, usererror when has no template
This commit is contained in:
parent
e313d822ab
commit
0dce76ae93
@ -23,10 +23,11 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
'data': [
|
'data': [
|
||||||
# 'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
# 'views/templates.xml',
|
# 'views/templates.xml',
|
||||||
'views/res_partner.xml',
|
|
||||||
'views/res_partner_contract.xml',
|
'views/res_partner_contract.xml',
|
||||||
|
'views/res_partner.xml',
|
||||||
'views/contract_wizard.xml',
|
'views/contract_wizard.xml',
|
||||||
|
'data/fields_default.xml',
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
219
data/fields_default.xml
Normal file
219
data/fields_default.xml
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<!-- Action -->
|
||||||
|
<record id="action_get_context" model="ir.actions.server">
|
||||||
|
<field name="name">Generate Context for Contract</field>
|
||||||
|
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
||||||
|
<field name="state">code</field>
|
||||||
|
<field name="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
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Common fields -->
|
||||||
|
|
||||||
|
<record id="contract_field_contract_number" model="res.partner.contract.field">
|
||||||
|
<field name="name">Contract Number</field>
|
||||||
|
<field name="technical_name">contract_number</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_amount_whole" model="res.partner.contract.field">
|
||||||
|
<field name="name">Amount Whole Part</field>
|
||||||
|
<field name="technical_name">amount_whole</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_amount_fractional" model="res.partner.contract.field">
|
||||||
|
<field name="name">Amount Fractional Part</field>
|
||||||
|
<field name="technical_name">amount_fractional</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Seller -->
|
||||||
|
|
||||||
|
<record id="contract_field_seller_company_name" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Company Name</field>
|
||||||
|
<field name="technical_name">seller_company_name</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_business_address" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Business Address</field>
|
||||||
|
<field name="technical_name">seller_business_address</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_representer_name" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Representer Name</field>
|
||||||
|
<field name="technical_name">seller_representer_name</field>
|
||||||
|
<field name="description"></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_representer_name_parent" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Representer Parent Name</field>
|
||||||
|
<field name="technical_name">seller_representer_name_parent</field>
|
||||||
|
<field name="description"></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_representer_name_initials" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Representer Initials Name</field>
|
||||||
|
<field name="technical_name">seller_representer_name_initials</field>
|
||||||
|
<field name="description"></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_representer_function" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Representer Function</field>
|
||||||
|
<field name="technical_name">seller_representer_function</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_inn" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller INN</field>
|
||||||
|
<field name="technical_name">seller_inn</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_kpp" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller KPP</field>
|
||||||
|
<field name="technical_name">seller_kpp</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_bic" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller BIC</field>
|
||||||
|
<field name="technical_name">seller_bic</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_ogrn" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller OGRN</field>
|
||||||
|
<field name="technical_name">seller_ogrn</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_bank" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Bank Name</field>
|
||||||
|
<field name="technical_name">seller_bank</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_bank_account" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Bank Account</field>
|
||||||
|
<field name="technical_name">seller_bank_account</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_seller_phone" model="res.partner.contract.field">
|
||||||
|
<field name="name">Seller Phone</field>
|
||||||
|
<field name="technical_name">seller_phone</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Partner -->
|
||||||
|
|
||||||
|
<record id="contract_field_partner_company_name" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Company Name</field>
|
||||||
|
<field name="technical_name">partner_company_name</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_business_address" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Business Address</field>
|
||||||
|
<field name="technical_name">partner_business_address</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_representer_name" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Representer Name</field>
|
||||||
|
<field name="technical_name">partner_representer_name</field>
|
||||||
|
<field name="description"></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_representer_name_parent" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Representer Parent Name</field>
|
||||||
|
<field name="technical_name">partner_representer_name_parent</field>
|
||||||
|
<field name="description"></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_representer_name_initials" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Representer Initials Name</field>
|
||||||
|
<field name="technical_name">partner_representer_name_initials</field>
|
||||||
|
<field name="description"></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_representer_function" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Representer Function</field>
|
||||||
|
<field name="technical_name">partner_representer_function</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_inn" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner INN</field>
|
||||||
|
<field name="technical_name">partner_inn</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_kpp" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner KPP</field>
|
||||||
|
<field name="technical_name">partner_kpp</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_bic" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner BIC</field>
|
||||||
|
<field name="technical_name">partner_bic</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_ogrn" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner OGRN</field>
|
||||||
|
<field name="technical_name">partner_ogrn</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_bank" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Bank Name</field>
|
||||||
|
<field name="technical_name">partner_bank</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_bank_account" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Bank Account</field>
|
||||||
|
<field name="technical_name">partner_bank_account</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_partner_phone" model="res.partner.contract.field">
|
||||||
|
<field name="name">Partner Phone</field>
|
||||||
|
<field name="technical_name">partner_phone</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <record id="" model="res.partner.contract.field">
|
||||||
|
<field name="name"></field>
|
||||||
|
<field name="technical_name"></field>
|
||||||
|
</record> -->
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
@ -1,6 +1,8 @@
|
|||||||
from . import contract_wizard
|
from . import contract_wizard
|
||||||
from . import res_partner
|
from . import res_partner
|
||||||
from . import res_partner_contract
|
from . import res_partner_contract
|
||||||
|
from . import res_partner_contract_field
|
||||||
|
from . import res_partner_contract_field_transient
|
||||||
from . import sale_order
|
from . import sale_order
|
||||||
|
|
||||||
# TODO: rename all fields ilike 'adress' -> 'address'
|
# TODO: rename all fields ilike 'adress' -> 'address'
|
||||||
|
@ -4,6 +4,7 @@ import math
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from odoo import api, fields, models
|
from odoo import api, fields, models
|
||||||
|
from odoo.exceptions import UserError
|
||||||
from pytils import numeral
|
from pytils import numeral
|
||||||
|
|
||||||
from ..utils.docxtpl import get_document_from_values_stream
|
from ..utils.docxtpl import get_document_from_values_stream
|
||||||
@ -246,6 +247,12 @@ class ContractWizard(models.TransientModel):
|
|||||||
default='company'
|
default='company'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
transient_field_ids = fields.One2many(
|
||||||
|
'res.partner.contract.field.transient',
|
||||||
|
'_contract_wizard_id',
|
||||||
|
string="Contract Fields",
|
||||||
|
)
|
||||||
|
|
||||||
@api.depends('contract_id')
|
@api.depends('contract_id')
|
||||||
def _compute_context_name(self):
|
def _compute_context_name(self):
|
||||||
self._context_name = self.contract_id.name
|
self._context_name = self.contract_id.name
|
||||||
@ -500,11 +507,43 @@ class ContractWizard(models.TransientModel):
|
|||||||
}
|
}
|
||||||
return context
|
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):
|
def get_docx_contract(self):
|
||||||
template = self.template.attachment_id
|
template = self.template.attachment_id
|
||||||
|
if not template:
|
||||||
|
raise UserError("Template must be set up")
|
||||||
|
|
||||||
path_to_template = template._full_path(template.store_fname)
|
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(
|
binary_data = get_document_from_values_stream(
|
||||||
path_to_template, fields).read()
|
path_to_template, fields).read()
|
||||||
|
22
models/res_partner_contract_field.py
Normal file
22
models/res_partner_contract_field.py
Normal file
@ -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,
|
||||||
|
)
|
39
models/res_partner_contract_field_transient.py
Normal file
39
models/res_partner_contract_field_transient.py
Normal file
@ -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
|
@ -70,44 +70,14 @@
|
|||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
<group string="Contract values">
|
<group string="Contract values">
|
||||||
<group string="Contract">
|
<field name="transient_field_ids">
|
||||||
<field name="_context_name"/>
|
<tree>
|
||||||
<field name="_context_date"/>
|
<field name="technical_name"/>
|
||||||
<field name="_context_summ_rub"/>
|
<field name="name"/>
|
||||||
<field name="_context_summ_rub_word"/>
|
<field name="value"/>
|
||||||
<field name="_context_summ_kop"/>
|
<field name="description"/>
|
||||||
<field name="_context_summ_word"/>
|
</tree>
|
||||||
<field name="_context_delivery_term"/>
|
</field>
|
||||||
<field name="_context_delivery_term_word"/>
|
|
||||||
<field name="_context_payment_term"/>
|
|
||||||
<field name="_context_payment_term_word"/>
|
|
||||||
</group>
|
|
||||||
<group string="Company values">
|
|
||||||
<field name="_context_seller_contract_name"/>
|
|
||||||
<field name="_context_seller_adress"/>
|
|
||||||
<field name="_context_seller_representer_contract_job_name"/>
|
|
||||||
<field name="_context_seller_representer_contract_name"/>
|
|
||||||
<field name="_context_seller_inn"/>
|
|
||||||
<field name="_context_seller_kpp"/>
|
|
||||||
<field name="_context_seller_rs"/>
|
|
||||||
<field name="_context_seller_bik"/>
|
|
||||||
<field name="_context_seller_bank"/>
|
|
||||||
<field name="_context_seller_phone"/>
|
|
||||||
<field name="_context_seller_representer_job_name"/>
|
|
||||||
<field name="_context_seller_representer_name"/>
|
|
||||||
</group>
|
|
||||||
<group string="Partner values">
|
|
||||||
<field name="_context_partner_contract_name"/>
|
|
||||||
<field name="_context_partner_adress"/>
|
|
||||||
<field name="_context_partner_representer_contract_name"/>
|
|
||||||
<field name="_context_partner_inn"/>
|
|
||||||
<field name="_context_partner_kpp"/>
|
|
||||||
<field name="_context_partner_rs"/>
|
|
||||||
<field name="_context_partner_bik"/>
|
|
||||||
<field name="_context_partner_bank"/>
|
|
||||||
<field name="_context_partner_phone"/>
|
|
||||||
<field name="_context_partner_representer_name"/>
|
|
||||||
</group>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<button string="Form DOCX from template" type="object" name="get_docx_contract" />
|
<button string="Form DOCX from template" type="object" name="get_docx_contract" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user