offer creating feature is ready, time for offer template
This commit is contained in:
parent
a50f74e375
commit
9069b92175
@ -2,7 +2,7 @@
|
|||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
<data>
|
||||||
|
|
||||||
<!-- Action -->
|
<!-- Action for contract -->
|
||||||
<record id="action_get_contract_context" model="ir.actions.server">
|
<record id="action_get_contract_context" model="ir.actions.server">
|
||||||
<field name="name">Generate Context for Contract</field>
|
<field name="name">Generate Context for Contract</field>
|
||||||
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
||||||
@ -153,7 +153,7 @@ action = ctx
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<!-- Action -->
|
<!-- Action for annex -->
|
||||||
<record id="action_get_annex_context" model="ir.actions.server">
|
<record id="action_get_annex_context" model="ir.actions.server">
|
||||||
<field name="name">Generate Context for Annex</field>
|
<field name="name">Generate Context for Annex</field>
|
||||||
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
||||||
@ -317,6 +317,162 @@ else:
|
|||||||
"partner_ogrn": partner.psrn,
|
"partner_ogrn": partner.psrn,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
action = ctx
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Action for sale order -->
|
||||||
|
<record id="action_get_so_context" model="ir.actions.server">
|
||||||
|
<field name="name">Generate Context for Sale order</field>
|
||||||
|
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
||||||
|
<field name="binding_model_id" ref="client_contracts.model_res_partner_contract_wizard" />
|
||||||
|
<field name="state">code</field>
|
||||||
|
<field name="code">
|
||||||
|
|
||||||
|
# Aliases
|
||||||
|
self = record # sale.order
|
||||||
|
|
||||||
|
seller = self.company_id.partner_id
|
||||||
|
partner = self.partner_id
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
_ = self._t
|
||||||
|
# get_date = self.contract_id.get_date
|
||||||
|
|
||||||
|
# Parse date
|
||||||
|
months = ["",
|
||||||
|
"января", "февраля", "марта", "апреля",
|
||||||
|
"мая", "июня", "июля", "августа",
|
||||||
|
"сентября", "октября", "ноября", "декабря",
|
||||||
|
]
|
||||||
|
offer_date = self.date_order
|
||||||
|
dd = offer_date.day
|
||||||
|
mm = offer_date.month
|
||||||
|
yyyy = offer_date.year
|
||||||
|
yy = yyyy % 100
|
||||||
|
MM = months[mm]
|
||||||
|
|
||||||
|
dd = dd if dd // 10 else '0{}'.format(dd)
|
||||||
|
mm = mm if mm // 10 else '0{}'.format(mm)
|
||||||
|
|
||||||
|
# order_date = self.order_id.date_order
|
||||||
|
|
||||||
|
# ctx keys must be declared in this xml with id equal to "contract_field_{technical_name}"
|
||||||
|
ctx = {
|
||||||
|
"offer_name": self.name,
|
||||||
|
"offer_date": "{} {} {}".format(offer_date.day, months[offer_date.month], offer_date.year),
|
||||||
|
|
||||||
|
# "delivery_address": self.delivery_address,
|
||||||
|
"commitment_date": self.commitment_date,
|
||||||
|
"amount_total": self.amount_total,
|
||||||
|
|
||||||
|
# "payment_part_one": self.payment_part_one,
|
||||||
|
# "payment_part_two": self.payment_part_two,
|
||||||
|
# "payment_part_three": self.payment_part_three,
|
||||||
|
# "delivery_period": self.delivery_period,
|
||||||
|
|
||||||
|
"dd": dd,
|
||||||
|
"mm": mm,
|
||||||
|
"MM": MM,
|
||||||
|
"yy": yy,
|
||||||
|
"yyyy": yyyy,
|
||||||
|
|
||||||
|
"seller_name": seller.name_write,
|
||||||
|
"seller_company_form": _(dict(seller._fields['company_form'].selection).get(seller.company_form)),
|
||||||
|
# "seller_representer_name": seller.representative_id.name,
|
||||||
|
# "seller_representer_name_parent": seller.representative_id.name_genitive,
|
||||||
|
# "seller_representer_name_initials": seller.representative_id.name_initials,
|
||||||
|
# "seller_representer_function": seller.representative_id.function,
|
||||||
|
# "seller_representer_function_parent": seller.representative_id.function_genitive,
|
||||||
|
|
||||||
|
"seller_inn": seller.vat,
|
||||||
|
"seller_kpp": seller.iec,
|
||||||
|
"seller_ogrn": seller.psrn,
|
||||||
|
"seller_business_address": seller.full_address,
|
||||||
|
"seller_phone": seller.phone,
|
||||||
|
"seller_email": seller.email,
|
||||||
|
|
||||||
|
"partner_name": partner.name_write,
|
||||||
|
"partner_representer_name": partner.representative_id.name,
|
||||||
|
"partner_representer_name_initials": partner.representative_id.name_initials,
|
||||||
|
"partner_inn": partner.vat,
|
||||||
|
"partner_business_address": partner.full_address,
|
||||||
|
"partner_phone": partner.phone,
|
||||||
|
"partner_email": partner.email,
|
||||||
|
}
|
||||||
|
|
||||||
|
seller_bank = seller.bank_ids and seller.bank_ids[0]
|
||||||
|
if seller_bank:
|
||||||
|
|
||||||
|
bank = seller_bank.bank_id
|
||||||
|
bank_name = bank and bank.name or ""
|
||||||
|
bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else ""
|
||||||
|
seller_bank_name = "{} {}".format(bank_name, bank_city).strip()
|
||||||
|
|
||||||
|
ctx.update({
|
||||||
|
"seller_bank": seller_bank_name,
|
||||||
|
"seller_rs": seller_bank.acc_number,
|
||||||
|
"seller_ks": bank.corr_account,
|
||||||
|
"seller_bic": bank.bic,
|
||||||
|
})
|
||||||
|
|
||||||
|
partner_bank = partner.bank_ids and partner.bank_ids[0]
|
||||||
|
if partner_bank:
|
||||||
|
|
||||||
|
bank = partner_bank.bank_id
|
||||||
|
bank_name = bank and bank.name or ""
|
||||||
|
bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else ""
|
||||||
|
partner_bank_name = "{} {}".format(bank_name, bank_city).strip()
|
||||||
|
|
||||||
|
ctx.update({
|
||||||
|
"partner_bank": partner_bank_name,
|
||||||
|
"partner_rs": partner_bank.acc_number,
|
||||||
|
"partner_ks": bank.corr_account,
|
||||||
|
"partner_bic": bank.bic,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# Person
|
||||||
|
if not partner.is_company:
|
||||||
|
ctx.update({
|
||||||
|
# "partner_representer_name": partner.name_write,
|
||||||
|
# "partner_representer_name_initials": partner.name_initials,
|
||||||
|
# "partner_representer_passport_number": partner.passport_number,
|
||||||
|
# "partner_representer_passport_date": partner.passport_date,
|
||||||
|
# "partner_representer_passport_department": partner.passport_department,
|
||||||
|
})
|
||||||
|
if not partner.name_write:
|
||||||
|
ctx.update({
|
||||||
|
"partner_name": partner.name,
|
||||||
|
# "partner_representer_name": partner.name,
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
# Company
|
||||||
|
ctx.update({
|
||||||
|
"partner_company_form": _(dict(partner._fields['company_form'].selection).get(partner.company_form)),
|
||||||
|
# "partner_representer_name_parent": partner.representative_id.name_genitive,
|
||||||
|
# "partner_representer_document_parent": partner.representative_document,
|
||||||
|
# "partner_representer_function": partner.representative_id.function,
|
||||||
|
# "partner_representer_function_parent": partner.representative_id.function_genitive,
|
||||||
|
})
|
||||||
|
|
||||||
|
if partner.company_form == 'sp':
|
||||||
|
# Sole Proprietor
|
||||||
|
ctx.update({
|
||||||
|
"partner_ip_number": partner.sp_register_number,
|
||||||
|
"partner_ip_date": partner.sp_register_date,
|
||||||
|
"partner_ogrnip": partner.psrn_sp,
|
||||||
|
# "partner_representer_passport_number": partner.representative_id.passport_number,
|
||||||
|
# "partner_representer_passport_date": partner.representative_id.passport_date,
|
||||||
|
# "partner_representer_passport_department": partner.representative_id.passport_department,
|
||||||
|
})
|
||||||
|
if partner.company_form == 'plc':
|
||||||
|
# Private Limited Company
|
||||||
|
ctx.update({
|
||||||
|
"partner_kpp": partner.iec,
|
||||||
|
"partner_ogrn": partner.psrn,
|
||||||
|
})
|
||||||
|
|
||||||
action = ctx
|
action = ctx
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@ -339,6 +495,44 @@ action = ctx
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Offer fields -->
|
||||||
|
|
||||||
|
<record id="contract_field_offer_name" model="res.partner.contract.field">
|
||||||
|
<field name="name">Offer name</field>
|
||||||
|
<field name="technical_name">offer_name</field>
|
||||||
|
<field name="description">Sale order number</field>
|
||||||
|
<field name="sequence">1</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_offer_date" model="res.partner.contract.field">
|
||||||
|
<field name="name">Offer date</field>
|
||||||
|
<field name="technical_name">offer_date</field>
|
||||||
|
<field name="description">
|
||||||
|
Sale order creation date or confirmation date, if confirmed.
|
||||||
|
</field>
|
||||||
|
<field name="sequence">2</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_commitment_date" model="res.partner.contract.field">
|
||||||
|
<field name="name">Commitment date</field>
|
||||||
|
<field name="technical_name">commitment_date</field>
|
||||||
|
<field name="description">
|
||||||
|
Date when executor's commitment should be fulfilled
|
||||||
|
</field>
|
||||||
|
<field name="sequence">3</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_field_amount_total" model="res.partner.contract.field">
|
||||||
|
<field name="name">Amount total</field>
|
||||||
|
<field name="technical_name">amount_total</field>
|
||||||
|
<field name="description">
|
||||||
|
Sale order total amount
|
||||||
|
</field>
|
||||||
|
<field name="sequence">4</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!-- Common fields -->
|
<!-- Common fields -->
|
||||||
|
|
||||||
<record id="contract_field_contract_number" model="res.partner.contract.field">
|
<record id="contract_field_contract_number" model="res.partner.contract.field">
|
||||||
|
@ -19,11 +19,13 @@ class DocumentTemplate(models.Model):
|
|||||||
("contract", _("Contract")),
|
("contract", _("Contract")),
|
||||||
("annex", _("Annex")),
|
("annex", _("Annex")),
|
||||||
("addition", _("Addition")),
|
("addition", _("Addition")),
|
||||||
|
("offer", _("Offer")),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
document_type_name = fields.Selection(
|
document_type_name = fields.Selection(
|
||||||
string="Document",
|
string="Document",
|
||||||
selection=[
|
selection=[
|
||||||
|
("offer", _("Offer")),
|
||||||
("bill", _("Bill")),
|
("bill", _("Bill")),
|
||||||
("specification", _("Specification")),
|
("specification", _("Specification")),
|
||||||
("approval_list", _("Approval List")),
|
("approval_list", _("Approval List")),
|
||||||
@ -42,6 +44,7 @@ class DocumentTemplate(models.Model):
|
|||||||
selection=[
|
selection=[
|
||||||
("contract", "Contract"),
|
("contract", "Contract"),
|
||||||
("annex", "Annex"),
|
("annex", "Annex"),
|
||||||
|
("offer", _("Offer")),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
sequence = fields.Integer()
|
sequence = fields.Integer()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from odoo import api, fields, models
|
from odoo import api, fields, models, _
|
||||||
|
|
||||||
from ..utils import MODULE_NAME
|
from ..utils import MODULE_NAME
|
||||||
|
|
||||||
@ -48,3 +48,42 @@ class SaleOrder(models.Model):
|
|||||||
self.contract_annex_id = self.contract_annex_ids[0].id
|
self.contract_annex_id = self.contract_annex_ids[0].id
|
||||||
else:
|
else:
|
||||||
self.contract_annex_id = False
|
self.contract_annex_id = False
|
||||||
|
|
||||||
|
def action_print_form(self):
|
||||||
|
self.ensure_one()
|
||||||
|
view = self.env.ref(
|
||||||
|
"{}.res_partner_wizard_print_document_view".format(MODULE_NAME)
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
"name": _("Print Form of Contract"),
|
||||||
|
"type": "ir.actions.act_window",
|
||||||
|
"res_model": "res.partner.contract.wizard",
|
||||||
|
"view_mode": "form",
|
||||||
|
"view_id": view.id,
|
||||||
|
"target": "new",
|
||||||
|
"context": {
|
||||||
|
"self_id": self.id,
|
||||||
|
"active_model": self._name,
|
||||||
|
"company_form": self.partner_id.company_form
|
||||||
|
if self.partner_id.is_company
|
||||||
|
else "person",
|
||||||
|
"attachment_model": "sale.order",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_filename_by_document_template(self, document_template_id):
|
||||||
|
self.ensure_one()
|
||||||
|
return "{doc_type} {number} {from_} {date}".format(
|
||||||
|
doc_type=_("Offer"),
|
||||||
|
number=self.name,
|
||||||
|
from_=_("from"),
|
||||||
|
date=self.date_order.strftime("%d.%m.%Y"),
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _t(arg):
|
||||||
|
"""Uses in xml action (data/fields_default)
|
||||||
|
Arguments:
|
||||||
|
arg {str} -- String to translate
|
||||||
|
"""
|
||||||
|
return _(arg)
|
||||||
|
@ -8,6 +8,10 @@
|
|||||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
|
<xpath expr="//header" position="inside">
|
||||||
|
<button name="action_print_form" type="object" string="Create offer document"/>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
<xpath expr="//field[@name='payment_term_id']" position="after">
|
<xpath expr="//field[@name='payment_term_id']" position="after">
|
||||||
<field name="delivery_time"/>
|
<field name="delivery_time"/>
|
||||||
<field name="contract_annex_id" readonly="1"/>
|
<field name="contract_annex_id" readonly="1"/>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import pdb
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -29,6 +31,7 @@ class ContractWizard(models.TransientModel):
|
|||||||
template_type = {
|
template_type = {
|
||||||
"res.partner.contract": "contract",
|
"res.partner.contract": "contract",
|
||||||
"res.partner.contract.annex": "annex",
|
"res.partner.contract.annex": "annex",
|
||||||
|
"sale.order": "offer",
|
||||||
}.get(self.active_model, False)
|
}.get(self.active_model, False)
|
||||||
company_type = self.env.context.get("company_form", False)
|
company_type = self.env.context.get("company_form", False)
|
||||||
document_template_domain = [
|
document_template_domain = [
|
||||||
@ -41,6 +44,7 @@ class ContractWizard(models.TransientModel):
|
|||||||
selection=[
|
selection=[
|
||||||
("res.partner.contract", "Contract"),
|
("res.partner.contract", "Contract"),
|
||||||
("res.partner.contract.annex", "Contract Annex"),
|
("res.partner.contract.annex", "Contract Annex"),
|
||||||
|
("sale.order", "Offer")
|
||||||
],
|
],
|
||||||
string="Target",
|
string="Target",
|
||||||
default=_default_target,
|
default=_default_target,
|
||||||
@ -133,6 +137,7 @@ class ContractWizard(models.TransientModel):
|
|||||||
model_to_action = {
|
model_to_action = {
|
||||||
"res.partner.contract": "action_get_contract_context",
|
"res.partner.contract": "action_get_contract_context",
|
||||||
"res.partner.contract.annex": "action_get_annex_context",
|
"res.partner.contract.annex": "action_get_annex_context",
|
||||||
|
"sale.order": "action_get_so_context",
|
||||||
}
|
}
|
||||||
action_external_id = "{}.{}".format(
|
action_external_id = "{}.{}".format(
|
||||||
MODULE_NAME, model_to_action[self.active_model]
|
MODULE_NAME, model_to_action[self.active_model]
|
||||||
@ -202,7 +207,7 @@ class ContractWizard(models.TransientModel):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
pdb.set_trace()
|
||||||
return self.afterload(document_as_attachment)
|
return self.afterload(document_as_attachment)
|
||||||
|
|
||||||
def payload(self):
|
def payload(self):
|
||||||
@ -259,6 +264,9 @@ class ContractWizard(models.TransientModel):
|
|||||||
if hasattr(self.target, "contract_id"):
|
if hasattr(self.target, "contract_id"):
|
||||||
res_id = self.target.contract_id.id
|
res_id = self.target.contract_id.id
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.env["mail.message"].create(
|
self.env["mail.message"].create(
|
||||||
{
|
{
|
||||||
"model": self.env.context.get(
|
"model": self.env.context.get(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user