From 9069b9217548d041b97be234ee8095b93687c513 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Tue, 11 May 2021 23:58:05 +0500 Subject: [PATCH] offer creating feature is ready, time for offer template --- data/fields_default.xml | 198 +++++++++++++++++++++++- models/res_partner_document_template.py | 3 + models/sale_order.py | 41 ++++- views/sale_order.xml | 6 +- wizard/res_partner_contract_wizard.py | 10 +- 5 files changed, 253 insertions(+), 5 deletions(-) diff --git a/data/fields_default.xml b/data/fields_default.xml index 4181c58..6570260 100755 --- a/data/fields_default.xml +++ b/data/fields_default.xml @@ -2,7 +2,7 @@ - + Generate Context for Contract @@ -153,7 +153,7 @@ action = ctx - + Generate Context for Annex @@ -317,6 +317,162 @@ else: "partner_ogrn": partner.psrn, }) +action = ctx + + + + + + Generate Context for Sale order + + + 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 @@ -339,6 +495,44 @@ action = ctx + + + + + + Offer name + offer_name + Sale order number + 1 + + + + Offer date + offer_date + + Sale order creation date or confirmation date, if confirmed. + + 2 + + + + Commitment date + commitment_date + + Date when executor's commitment should be fulfilled + + 3 + + + + Amount total + amount_total + + Sale order total amount + + 4 + + diff --git a/models/res_partner_document_template.py b/models/res_partner_document_template.py index 65f9961..f488b0c 100755 --- a/models/res_partner_document_template.py +++ b/models/res_partner_document_template.py @@ -19,11 +19,13 @@ class DocumentTemplate(models.Model): ("contract", _("Contract")), ("annex", _("Annex")), ("addition", _("Addition")), + ("offer", _("Offer")), ], ) document_type_name = fields.Selection( string="Document", selection=[ + ("offer", _("Offer")), ("bill", _("Bill")), ("specification", _("Specification")), ("approval_list", _("Approval List")), @@ -42,6 +44,7 @@ class DocumentTemplate(models.Model): selection=[ ("contract", "Contract"), ("annex", "Annex"), + ("offer", _("Offer")), ] ) sequence = fields.Integer() diff --git a/models/sale_order.py b/models/sale_order.py index ad01266..23c61ef 100755 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -1,4 +1,4 @@ -from odoo import api, fields, models +from odoo import api, fields, models, _ from ..utils import MODULE_NAME @@ -48,3 +48,42 @@ class SaleOrder(models.Model): self.contract_annex_id = self.contract_annex_ids[0].id else: 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) diff --git a/views/sale_order.xml b/views/sale_order.xml index c6a8535..561c9fe 100755 --- a/views/sale_order.xml +++ b/views/sale_order.xml @@ -7,7 +7,11 @@ sale.order - + + +