diff --git a/TODOLIST.md b/TODOLIST.md
new file mode 100644
index 0000000..01f3874
--- /dev/null
+++ b/TODOLIST.md
@@ -0,0 +1,11 @@
+# TODO LIST
+
+## Features
+
+## Fixes
+ - Change all `parents` to `genitive`
+ - Merge `document_type` and `template_type` in `res.partner.document.template`
+ - Change `annex_number` to `annex_counter`
+
+## Big feature
+ - Separate XML actions that generates transient fields for all types of documents
diff --git a/__manifest__.py b/__manifest__.py
index 95d8003..bfe6d85 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -12,12 +12,15 @@
"version": "0.1.1",
"depends": ["base", "contacts", "russian_requisites", "sale",],
"data": [
+ "data/assets_extension.xml",
+ "data/document_templates.xml",
"data/fields_default.xml",
"data/payment_terms.xml",
"security/ir.model.access.csv",
"views/res_partner_contract.xml",
"views/res_partner_contract_annex.xml",
- "views/res_partner_template_print.xml",
+ "views/res_partner_contract_field.xml",
+ "views/res_partner_document_template.xml",
"views/res_partner.xml",
"views/sale_order.xml",
"wizard/res_partner_contract_wizard.xml",
diff --git a/data/assets_extension.xml b/data/assets_extension.xml
new file mode 100644
index 0000000..51bf76c
--- /dev/null
+++ b/data/assets_extension.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/data/document_templates.xml b/data/document_templates.xml
new file mode 100644
index 0000000..48e4684
--- /dev/null
+++ b/data/document_templates.xml
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+ Договор Поставки Исходный
+ Договор Поставки Исходный
+ binary
+
+
+
+ Договор Поставки Исходный
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ Договор Поставки Физлицо
+ Договор поставки
+ binary
+
+
+
+ Договор поставки
+
+ contract
+
+ contract
+ person
+ 10
+
+
+
+
+ Счёт Физлицо
+ Счёт
+ binary
+
+
+
+ Счёт
+
+ annex
+ bill
+ annex
+ person
+ 9
+
+
+
+ Спецификация Физлицо
+ Спецификация
+ binary
+
+
+
+ Спецификация
+
+ annex
+ specification
+ annex
+ person
+ 10
+
+
+
+ Лист согласования Физлицо
+ Лист согласования
+ binary
+
+
+
+ Лист согласования
+
+ addition
+ approval_list
+ annex
+ person
+ 20
+
+
+
+ Акт приема-передачи Физлицо
+ Акт приема-передачи
+ binary
+
+
+
+ Акт приема-передачи
+
+ addition
+ act_at
+ annex
+ person
+ 30
+
+
+
+ Акт приема-сдачи Физлицо
+ Акт приема-сдачи
+ binary
+
+
+
+ Акт приема-сдачи
+
+ addition
+ act_ad
+ annex
+ person
+ 40
+
+
+
+
+
+
+
+
+ Договор поставки ИП
+ Договор поставки
+ binary
+
+
+
+ Договор поставки
+
+ contract
+
+ contract
+ sp
+ 20
+
+
+
+
+
+ Спецификация ИП
+ Спецификация
+ binary
+
+
+
+ Спецификация
+
+ annex
+ specification
+ annex
+ sp
+ 10
+
+
+
+ Счёт ИП
+ Счёт
+ binary
+
+
+
+ Счёт
+
+ annex
+ bill
+ annex
+ sp
+ 9
+
+
+
+ Лист согласования ИП
+ Лист согласования
+ binary
+
+
+
+ Лист согласования
+
+ addition
+ approval_list
+ annex
+ sp
+ 20
+
+
+
+ Акт приема-передачи ИП
+ Акт приема-передачи
+ binary
+
+
+
+ Акт приема-передачи
+
+ addition
+ act_at
+ annex
+ sp
+ 30
+
+
+
+ Акт приема-сдачи ИП
+ Акт приема-сдачи
+ binary
+
+
+
+ Акт приема-сдачи
+
+ addition
+ act_ad
+ annex
+ sp
+ 40
+
+
+
+
+
+
+
+
+ Договор поставки ООО
+ Договор поставки
+ binary
+
+
+
+ Договор поставки
+
+ contract
+
+ contract
+ plc
+ 30
+
+
+
+
+ Спецификация ООО
+ Спецификация
+ binary
+
+
+
+ Спецификация
+
+ annex
+ specification
+ annex
+ plc
+ 10
+
+
+
+
+ Счёт ООО
+ Счёт
+ binary
+
+
+
+ Счёт
+
+ annex
+ bill
+ annex
+ plc
+ 9
+
+
+
+ Лист согласования ООО
+ Лист согласования
+ binary
+
+
+
+ Лист согласования
+
+ addition
+ approval_list
+ annex
+ plc
+ 20
+
+
+
+ Акт приема-передачи ООО
+ Акт приема-передачи
+ binary
+
+
+
+ Акт приема-передачи
+
+ addition
+ act_at
+ annex
+ plc
+ 30
+
+
+
+ Акт приема-сдачи ООО
+ Акт приема-сдачи
+ binary
+
+
+
+ Акт приема-сдачи
+
+ addition
+ act_ad
+ annex
+ plc
+ 40
+
+
+
+
diff --git a/data/fields_default.xml b/data/fields_default.xml
index 4446eba..12633a3 100644
--- a/data/fields_default.xml
+++ b/data/fields_default.xml
@@ -15,11 +15,14 @@ self = record
partner = self.partner_id # res.partner
partner_bank = partner.bank_ids and partner.bank_ids[0] # res.partner.bank
+partner_bank_name = partner_bank.bank_id.name + (" г. {city}".format(city=partner_bank.bank_id.city) if partner_bank.bank_id.city else "")
seller = self.company_id
seller_bank = seller.bank_ids and seller.bank_ids[0]
+seller_bank_name = seller_bank.bank_id.name + (" г. {city}".format(city=seller_bank.bank_id.city) if seller_bank.bank_id.city else "")
# Functions
+_ = self._
get_date = self.get_date
# Parse date
@@ -35,6 +38,9 @@ yyyy = 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)
+
# ctx keys must be decalared in this xml with id equal to "contract_field_{technical_name}"
ctx = {
"contract_number": self.name,
@@ -45,34 +51,42 @@ ctx = {
"yy": yy,
"yyyy": yyyy,
- "seller_name": seller.name,
+ "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_representer_document_parent": seller.representative_document,
"seller_inn": seller.vat,
"seller_kpp": seller.iec,
"seller_ogrn": seller.psrn,
"seller_business_address": seller.full_address,
"seller_phone": seller.phone,
+ "seller_whatsapp": seller.whatsapp,
+ "seller_telegram": seller.telegram,
"seller_email": seller.email,
- "partner_name": partner.name,
+ "partner_name": partner.name_write,
"partner_inn": partner.vat,
"partner_business_address": partner.full_address,
"partner_phone": partner.phone,
+ "partner_whatsapp": partner.whatsapp,
+ "partner_telegram": partner.telegram,
"partner_email": partner.email,
}
if partner_bank:
ctx.update({
+ "partner_bank": partner_bank_name,
"partner_rs": partner_bank.acc_number,
"partner_ks": partner_bank.bank_id.corr_account,
"partner_bic": partner_bank.bank_id.bic,
})
if seller_bank:
ctx.update({
+ "seller_bank": seller_bank_name,
"seller_rs": seller_bank.acc_number,
"seller_ks": seller_bank.bank_id.corr_account,
"seller_bic": seller_bank.bank_id.bic,
@@ -82,11 +96,18 @@ if seller_bank:
# 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,
+ "partner_representer_passport_department_code": partner.passport_department_code,
})
+ if not partner.name_write:
+ ctx.update({
+ "partner_name": partner.name,
+ "partner_representer_name": partner.name,
+ })
else:
# Company
ctx.update({
@@ -94,6 +115,8 @@ else:
"partner_representer_name": partner.representative_id.name,
"partner_representer_name_parent": partner.representative_id.name_genitive,
"partner_representer_name_initials": partner.representative_id.name_initials,
+ "partner_representer_function": partner.representative_id.function,
+ "partner_representer_function_parent": partner.representative_id.function_genitive,
"partner_representer_document_parent": partner.representative_document,
})
@@ -106,6 +129,7 @@ else:
"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,
+ "partner_representer_passport_department_code": partner.representative_id.passport_department_code,
})
if partner.company_form == 'plc':
# Private Limited Company
@@ -131,13 +155,17 @@ action = ctx
# Aliases
self = record
-seller = self.contract_id.company_id
-partner = self.contract_id.partner_id
+seller = self.company_id
+partner = self.partner_id
seller_bank = seller.bank_ids and seller.bank_ids[0]
+seller_bank_name = seller_bank.bank_id.name + (" г. {city}".format(city=seller_bank.bank_id.city) if seller_bank.bank_id.city else "")
+
partner_bank = partner.bank_ids and partner.bank_ids[0]
+partner_bank_name = partner_bank.bank_id.name + (" г. {city}".format(city=partner_bank.bank_id.city) if partner_bank.bank_id.city else "")
# Functions
+_ = self.contract_id._
get_date = self.contract_id.get_date
# Parse date
@@ -153,9 +181,25 @@ yyyy = 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.parse_odoo_datetime(self.order_id.date_order)
+
# ctx keys must be decalared in this xml with id equal to "contract_field_{technical_name}"
ctx = {
"contract_number": self.contract_id.name,
+
+ "annex_name": self.name,
+ "annex_number": self.counter,
+
+ "order_name": self.order_id.name,
+ "order_date": "{} {} {}".format(order_date.day, months[order_date.month], order_date.year),
+
+ "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,
@@ -163,11 +207,13 @@ ctx = {
"yy": yy,
"yyyy": yyyy,
- "seller_name": seller.name,
- "seller_company_form": seller.read(["company_form"])[0]['company_form'],
+ "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,
@@ -176,7 +222,7 @@ ctx = {
"seller_phone": seller.phone,
"seller_email": seller.email,
- "partner_name": partner.name,
+ "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,
@@ -187,12 +233,14 @@ ctx = {
if partner_bank:
ctx.update({
+ "partner_bank": partner_bank_name,
"partner_rs": partner_bank.acc_number,
"partner_ks": partner_bank.bank_id.corr_account,
"partner_bic": partner_bank.bank_id.bic,
})
if seller_bank:
ctx.update({
+ "seller_bank": seller_bank_name,
"seller_rs": seller_bank.acc_number,
"seller_ks": seller_bank.bank_id.corr_account,
"seller_bic": seller_bank.bank_id.bic,
@@ -202,17 +250,25 @@ if seller_bank:
# 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": partner.read(["company_form"])[0]['company_form'],
+ "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':
@@ -246,6 +302,35 @@ action = ctx
1
+
+ Annex Name
+ annex_name
+
+ 2
+
+
+
+ Annex Number
+ annex_number
+
+ 2
+ False
+
+
+
+ Order Name
+ order_name
+
+ 3
+
+
+
+ Order Date
+ order_date
+
+ 4
+
+
Day
dd
@@ -258,6 +343,7 @@ action = ctx
mm
Number
16
+ False
@@ -272,6 +358,7 @@ action = ctx
yy
Short
40
+ False
@@ -293,16 +380,32 @@ action = ctx
-
- Delivery Time
- delivery_time
+
+ Payment Part 1
+ payment_part_one
+ 35
-
- Payment Term
- payment_term
+
+ Payment Part 2
+ payment_part_two
+ 36
+
+
+
+ Payment Part 3
+ payment_part_three
+
+ 37
+
+
+
+ Delivery Period
+ delivery_period
+
+ 38
@@ -399,6 +502,13 @@ action = ctx
144
+
+ Passport Department Code
+ seller_representer_passport_department_code
+ Seller Representative
+ 146
+
+
INN
seller_inn
@@ -476,6 +586,20 @@ action = ctx
232
+
+ WhatsApp
+ seller_whatsapp
+ Seller
+ 233
+
+
+
+ Telegram
+ seller_telegram
+ Seller
+ 234
+
+
Email
seller_email
@@ -577,6 +701,13 @@ action = ctx
344
+
+ Passport Department Code
+ partner_representer_passport_department_code
+ Partner Representative
+ 346
+
+
INN
partner_inn
@@ -654,6 +785,20 @@ action = ctx
432
+
+ WhatsApp
+ partner_whatsapp
+ Partner
+ 433
+
+
+
+ Telegram
+ partner_telegram
+ Partner
+ 434
+
+
Email
partner_email
diff --git a/i18n/ru.po b/i18n/ru.po
index b48285f..9abc06a 100644
--- a/i18n/ru.po
+++ b/i18n/ru.po
@@ -6,10 +6,10 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0-20191106\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-12-28 10:32+0000\n"
-"PO-Revision-Date: 2019-12-28 10:32+0000\n"
-"Last-Translator: <>\n"
-"Language-Team: \n"
+"POT-Creation-Date: 2020-01-22 11:29+0000\n"
+"PO-Revision-Date: 2020-01-22 11:29+0000\n"
+"Last-Translator: Stepan Savelyev\n"
+"Language-Team: RYDLAB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
@@ -41,6 +41,20 @@ msgstr "Оплата в 2 этапа"
msgid "3 stages"
msgstr "Оплата в 3 этапа"
+#. module: client_contracts
+#: code:addons/client_contracts/models/res_partner_document_template.py:31
+#: selection:res.partner.document.template,document_type_name:0
+#, python-format
+msgid "Act of Acceptance and Delivery"
+msgstr "Акт сдачи-приемки"
+
+#. module: client_contracts
+#: code:addons/client_contracts/models/res_partner_document_template.py:30
+#: selection:res.partner.document.template,document_type_name:0
+#, python-format
+msgid "Act of Acceptance and Transfer"
+msgstr "Акт приема-передачи"
+
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_street_actual
#: model:ir.model.fields,field_description:client_contracts.field_res_users_street_actual
@@ -48,9 +62,11 @@ msgid "Actual Address"
msgstr "Актуальный адрес"
#. module: client_contracts
-#: model:ir.model.fields,help:client_contracts.field_res_users_okpo
-msgid "All-Russian Classifier of Enterprises and Organizations"
-msgstr "Общероссийский классификатор предприятий и организаций"
+#: code:addons/client_contracts/models/res_partner_document_template.py:21
+#: selection:res.partner.document.template,document_type:0
+#, python-format
+msgid "Addition"
+msgstr "Дополнение"
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_amount_fractional
@@ -63,21 +79,27 @@ msgid "Amount Whole Part"
msgstr "Целая часть суммы"
#. module: client_contracts
-#: code:addons/client_contracts/wizard/res_partner_contract_wizard.py:139
-#: model:ir.ui.menu,name:client_contracts.res_partner_menu_contracts_templates_annex
+#: code:addons/client_contracts/models/res_partner_document_template.py:20
+#: selection:res.partner.document.template,document_type:0
+#: selection:res.partner.document.template,template_type:0
#, python-format
msgid "Annex"
msgstr "Приложение"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_annex_view
-msgid "Annex values"
-msgstr "Поля в печатном приложении"
+#: model:res.partner.contract.field,name:client_contracts.contract_field_annex_name
+msgid "Annex Name"
+msgstr "Наименование приложения"
+
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_annex_number
+msgid "Annex Number"
+msgstr "Номер приложения"
#. module: client_contracts
#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_form
-msgid "Annexed orders"
-msgstr "Приложенные заказы"
+msgid "Annexed Specifications"
+msgstr "Приложенные спецификации"
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_contract_annex_ids
@@ -90,11 +112,11 @@ msgid "Annexes to this contract"
msgstr "Приложения к договору"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_name
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_name
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_name
-msgid "Attachment Name"
-msgstr "Название вложения"
+#: code:addons/client_contracts/models/res_partner_document_template.py:29
+#: selection:res.partner.document.template,document_type_name:0
+#, python-format
+msgid "Approval List"
+msgstr "Лист согласования"
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_bic
@@ -124,6 +146,13 @@ msgstr "Наименование банка"
msgid "Bank Payment Account"
msgstr "Расчётный счёт"
+#. module: client_contracts
+#: code:addons/client_contracts/models/res_partner_document_template.py:27
+#: selection:res.partner.document.template,document_type_name:0
+#, python-format
+msgid "Bill"
+msgstr "Счёт"
+
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_business_address
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_business_address
@@ -146,15 +175,14 @@ msgid "Closed"
msgstr "Закрыт"
#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_company_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_company_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_company_id
msgid "Company"
msgstr "Компания"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_company_type
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_company_type
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_company_type
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_company_type
msgid "Company Type"
msgstr "Тип компании"
@@ -169,14 +197,15 @@ msgid "Contact"
msgstr "Контакт"
#. module: client_contracts
-#: code:addons/client_contracts/wizard/res_partner_contract_wizard.py:136
+#: code:addons/client_contracts/models/res_partner_document_template.py:19
#: model:ir.model,name:client_contracts.model_res_partner_contract
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_contract_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient__contract_wizard_id
#: model:ir.ui.menu,name:client_contracts.res_partner_menu_contracts
-#: model:ir.ui.menu,name:client_contracts.res_partner_menu_contracts_templates_contract
#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_form
#: selection:res.partner.contract.wizard,target:0
+#: selection:res.partner.document.template,document_type:0
+#: selection:res.partner.document.template,template_type:0
#, python-format
msgid "Contract"
msgstr "Договор"
@@ -205,6 +234,7 @@ msgid "Contract Field Transient"
msgstr "Фактическое поле договора"
#. module: client_contracts
+#: model:ir.actions.act_window,name:client_contracts.res_partner_contract_field_action
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_transient_field_ids
msgid "Contract Fields"
msgstr "Поля договора"
@@ -224,11 +254,6 @@ msgstr "Номер договора"
msgid "Contract parameters"
msgstr "Информация"
-#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_contract_view
-msgid "Contract values"
-msgstr "Поля в печатном договоре"
-
#. module: client_contracts
#: model:ir.actions.act_window,name:client_contracts.res_partner_contract_action
#: model:ir.actions.act_window,name:client_contracts.res_partner_contract_partner_action
@@ -245,41 +270,46 @@ msgstr "Договоры"
msgid "Counter for generate Annex name"
msgstr "Счётчик для генерации имени приложения к договору"
+#. module: client_contracts
+#: model:ir.model.fields,help:client_contracts.field_res_partner_contract_annex_counter
+msgid "Counter of Contract Annexes"
+msgstr "Счётчик приложений к договору"
+
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_create_date_ts
msgid "Create Date Ts"
msgstr "Создан (таймстамп)"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_annex_view
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_contract_view
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_document_view
msgid "Create a document"
msgstr "Создать документ"
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_create_uid
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_create_uid
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_create_uid
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_create_uid
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_create_uid
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_create_uid
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_create_uid
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_create_uid
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_create_uid
msgid "Created by"
msgstr "Создано"
#. module: client_contracts
-#: code:addons/client_contracts/models/res_partner_contract.py:40
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_create_date
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_create_date
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_create_date
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_create_date
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_create_date
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_create_date
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_create_date
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_create_date
-#, python-format
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_create_date
msgid "Created on"
msgstr "Создан"
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_currency_id
+msgid "Currency"
+msgstr "Валюта"
+
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_date_conclusion_fix
msgid "Date of manual conclusion"
@@ -296,9 +326,27 @@ msgid "Day"
msgstr "День"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_delivery_time
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
+msgid "Delivery"
+msgstr "Доставка"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_delivery_address
+msgid "Delivery Address"
+msgstr "Адрес доставки"
+
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_delivery_period
+msgid "Delivery Period"
+msgstr "Срок поставки"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_delivery_period
+msgid "Delivery Period (days)"
+msgstr "Срок поставки изделий"
+
+#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_sale_order_delivery_time
-#: model:res.partner.contract.field,name:client_contracts.contract_field_delivery_time
msgid "Delivery Time"
msgstr "Срок доставки"
@@ -308,24 +356,63 @@ msgstr "Срок доставки"
msgid "Description"
msgstr "Описание"
+#. module: client_contracts
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
+msgid "Design"
+msgstr "Дизайн"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_design_cost
+msgid "Design Cost"
+msgstr "Стоимость разработки дизайна"
+
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_display_name
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_display_name
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_display_name
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_display_name
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_display_name
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_display_name
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_display_name
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_display_name
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_display_name
msgid "Display Name"
msgstr "Отображаемое Имя"
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_document_type_name
+msgid "Document"
+msgstr "Документ"
+
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_document_parent
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_representer_document_parent
msgid "Document Genitive"
msgstr "Документ (род.падеж)"
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_document_name
+msgid "Document Name"
+msgstr "Имя документа"
+
+#. module: client_contracts
+#: model:ir.model,name:client_contracts.model_res_partner_document_template
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_document_template
+msgid "Document Template"
+msgstr "Шаблон документа"
+
+#. module: client_contracts
+#: model:ir.actions.act_window,name:client_contracts.res_partner_document_template_action
+msgid "Document Templates"
+msgstr "Шаблоны документов"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_design_doc_cost
+msgid "Documentation Design Cost"
+msgstr "Стоимость разработки КД"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_design_doc_period
+msgid "Documentation Design Period (days)"
+msgstr "Срок подготовки КД"
+
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_email
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_email
@@ -365,8 +452,8 @@ msgid "Function"
msgstr "Должность"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_function_parent_case
-#: model:ir.model.fields,field_description:client_contracts.field_res_users_function_parent_case
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_function_genitive
+#: model:ir.model.fields,field_description:client_contracts.field_res_users_function_genitive
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_function_parent
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_representer_function_parent
msgid "Function Genitive"
@@ -382,10 +469,9 @@ msgstr "Generate Context for Contract"
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_id
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_id
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_id
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_id
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_id
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_id
msgid "ID"
msgstr "Номер"
@@ -408,17 +494,47 @@ msgid "IP Number"
msgstr "ИП Серия и номер"
#. module: client_contracts
-#: selection:res.partner.template.print,company_type:0
-#: selection:res.partner.template.print.annex,company_type:0
-#: selection:res.partner.template.print.contract,company_type:0
+#: model:ir.model.fields,help:client_contracts.field_res_partner_telegram
+#: model:ir.model.fields,help:client_contracts.field_res_users_telegram
+msgid "If a contact have a Telegram number or identifier"
+msgstr "Номер или идентификатор в Telegram"
+
+#. module: client_contracts
+#: model:ir.model.fields,help:client_contracts.field_res_partner_whatsapp
+#: model:ir.model.fields,help:client_contracts.field_res_users_whatsapp
+msgid "If a contact have a WhatsApp number"
+msgstr "Номер в WhatsApp"
+
+#. module: client_contracts
+#: selection:res.partner.document.template,company_type:0
msgid "Individual"
msgstr "Физическое лицо"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_annex_view
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
msgid "Info"
msgstr "Информация"
+#. module: client_contracts
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
+msgid "Installation"
+msgstr "Монтаж"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_installation_address
+msgid "Installation Address"
+msgstr "Монтаж по адресу"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_installation_cost
+msgid "Installation Cost"
+msgstr "Стоимость монтажа"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_installation_period
+msgid "Installation Period (days)"
+msgstr "Срок монтажа изделий"
+
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_company_form
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_company_form
@@ -437,9 +553,7 @@ msgstr "КПП"
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field___last_update
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient___last_update
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard___last_update
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print___last_update
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex___last_update
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract___last_update
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template___last_update
msgid "Last Modified on"
msgstr "Последнее изменение"
@@ -448,22 +562,25 @@ msgstr "Последнее изменение"
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_write_uid
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_write_uid
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_write_uid
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_write_uid
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_write_uid
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_write_uid
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_write_uid
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_write_uid
msgid "Last Updated by"
-msgstr "Последний раз обновлено"
+msgstr "Последний раз обновил"
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_write_date
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_write_date
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_write_date
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_write_date
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_write_date
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_write_date
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_write_date
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_write_date
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_write_date
msgid "Last Updated on"
-msgstr "Последний раз обновлено"
+msgstr "Последнее обновление"
+
+#. module: client_contracts
+#: model:ir.model,name:client_contracts.model_crm_lead
+msgid "Lead/Opportunity"
+msgstr "Лид / Потенциальная сделка"
#. module: client_contracts
#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
@@ -480,6 +597,8 @@ msgstr "Месяц"
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_name
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_name
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_name
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_name
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_form
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_name
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_name
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_name
@@ -488,21 +607,32 @@ msgid "Name"
msgstr "Название"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_name_parent_case
-#: model:ir.model.fields,field_description:client_contracts.field_res_users_name_parent_case
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_name_genitive
+#: model:ir.model.fields,field_description:client_contracts.field_res_users_name_genitive
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_name_parent
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_representer_name_parent
msgid "Name Genitive"
msgstr "Имя (род.падеж)"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_name_initials_case
-#: model:ir.model.fields,field_description:client_contracts.field_res_users_name_initials_case
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_name_initials
+#: model:ir.model.fields,field_description:client_contracts.field_res_users_name_initials
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_name_initials
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_representer_name_initials
msgid "Name Initials"
msgstr "Фамилия с инициалами"
+#. module: client_contracts
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_info_inherit_view
+msgid "Name in ERP"
+msgstr "Название в ERP"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_name_write
+#: model:ir.model.fields,field_description:client_contracts.field_res_users_name_write
+msgid "Name in contracts"
+msgstr "Название в договоре"
+
#. module: client_contracts
#: model:ir.model.fields,help:client_contracts.field_res_partner_contract_field_technical_name
#: model:ir.model.fields,help:client_contracts.field_res_partner_contract_field_transient_technical_name
@@ -521,7 +651,6 @@ msgid "Number"
msgstr "Число"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_users_okpo
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_okpo
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_okpo
msgid "OKPO"
@@ -532,6 +661,21 @@ msgstr "ОКПО"
msgid "Order"
msgstr "Заказ"
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_order_date
+msgid "Order Date"
+msgstr "Дата заказа"
+
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_order_name
+msgid "Order Name"
+msgstr "Имя заказа"
+
+#. module: client_contracts
+#: model:ir.model.fields,help:client_contracts.field_res_partner_contract_annex_order_id
+msgid "Orders with this partner which are not uses in annexes yet"
+msgstr "Заказы, заключённые с этим партнёром и ещё не использующиеся в приложениях"
+
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_ogrn
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_ogrn
@@ -551,9 +695,9 @@ msgid "Parent Case"
msgstr "В родительном падеже"
#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_partner_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_partner_id
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_partner_id
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_contract_view
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_bank
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_bic
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_business_address
@@ -568,6 +712,8 @@ msgstr "В родительном падеже"
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_okpo
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_phone
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_rs
+#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_telegram
+#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_whatsapp
msgid "Partner"
msgstr "Партнёр"
@@ -586,10 +732,17 @@ msgstr "Партнёр; Сертификат о регистрации ИП"
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_representer_name_parent
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_representer_passport_date
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_representer_passport_department
+#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_representer_passport_department_code
#: model:res.partner.contract.field,description:client_contracts.contract_field_partner_representer_passport_number
msgid "Partner Representative"
msgstr "Представитель Партнёра"
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_passport_department_code
+#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_representer_passport_department_code
+msgid "Passport Department Code"
+msgstr "Код подразделения, выдавшего паспорт"
+
#. module: client_contracts
#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_representer_passport_department
#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_representer_passport_department
@@ -609,14 +762,39 @@ msgid "Passport №"
msgstr "Паспорт №"
#. module: client_contracts
-#: model:res.partner.contract.field,name:client_contracts.contract_field_payment_term
-msgid "Payment Term"
-msgstr "Условия оплаты"
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
+msgid "Payment"
+msgstr "Оплата"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_payment_term
-msgid "Payment Terms"
-msgstr "Условия оплаты"
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_payment_part_one
+msgid "Payment 1 Part (%)"
+msgstr "Оплата первой части в размере (%)"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_payment_part_two
+msgid "Payment 2 Part (%)"
+msgstr "Оплата второй части в размере (%)"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_payment_part_three
+msgid "Payment 3 Part (%)"
+msgstr "Оплата третьей части в размере (%)"
+
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_payment_part_one
+msgid "Payment Part 1"
+msgstr "Оплата первой части (%)"
+
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_payment_part_two
+msgid "Payment Part 2"
+msgstr "Оплата второй части (%)"
+
+#. module: client_contracts
+#: model:res.partner.contract.field,name:client_contracts.contract_field_payment_part_three
+msgid "Payment Part 3"
+msgstr "Оплата третьей части (%)"
#. module: client_contracts
#: model:account.payment.term,note:client_contracts.payment_term_postpayment
@@ -651,24 +829,18 @@ msgid "Phone"
msgstr "Телефон"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_prepaid_expense
-msgid "Prepaid Expense"
-msgstr "Аванс"
-
-#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_annex_view_form
#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_form
msgid "Print"
msgstr "Печать"
#. module: client_contracts
-#: code:addons/client_contracts/models/res_partner_contract.py:95
+#: code:addons/client_contracts/models/res_partner_contract.py:99
#, python-format
msgid "Print Form of Contract"
msgstr "Форма печати договора"
#. module: client_contracts
-#: code:addons/client_contracts/models/res_partner_contract_annex.py:63
+#: code:addons/client_contracts/models/res_partner_contract_annex.py:111
#, python-format
msgid "Print Form of Contract Annex"
msgstr "Форма печати приложения к договору"
@@ -689,26 +861,19 @@ msgid "Print Template Contract Annex"
msgstr "Вложение-шаблон приложения к договору"
#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_print_template_contract
-msgid "Print Template of Contract"
-msgstr "Шаблон-Вложение договора"
-
-#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_print_template_annex
-msgid "Print Template of Contract Annex"
-msgstr "Шаблон-Вложение приложения к договору"
-
-#. module: client_contracts
-#: selection:res.partner.template.print,company_type:0
-#: selection:res.partner.template.print.annex,company_type:0
-#: selection:res.partner.template.print.contract,company_type:0
+#: selection:res.partner.document.template,company_type:0
msgid "Private Limited Company"
msgstr "Общество с ограниченной ответственностью"
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_development_period
+msgid "Product Development Period (days)"
+msgstr "Срок разработки изделий"
+
#. module: client_contracts
#: model:ir.model,name:client_contracts.model_sale_order
msgid "Quotation"
-msgstr "Предложение цен"
+msgstr "Оферта"
#. module: client_contracts
#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_form
@@ -727,18 +892,12 @@ msgstr "Представитель"
msgid "Representative acts on the basis of"
msgstr "Представитель действует на основании"
-#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_contract_view
-msgid "Requisites"
-msgstr "Реквизиты"
-
#. module: client_contracts
#: model:ir.ui.view,arch_db:client_contracts.search_res_partner_contract_filter
msgid "Search Contract"
msgstr "Поиск договора"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_contract_view
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_bank
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_bic
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_business_address
@@ -753,6 +912,8 @@ msgstr "Поиск договора"
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_okpo
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_phone
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_rs
+#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_telegram
+#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_whatsapp
msgid "Seller"
msgstr "Продавец"
@@ -771,12 +932,14 @@ msgstr "Продавец; Сертификат о регистрации ИП"
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_representer_name_parent
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_representer_passport_date
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_representer_passport_department
+#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_representer_passport_department_code
#: model:res.partner.contract.field,description:client_contracts.contract_field_seller_representer_passport_number
msgid "Seller Representative"
msgstr "Представитель Продавца"
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_sequence
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_sequence
msgid "Sequence"
msgstr "Нумерация"
@@ -796,12 +959,22 @@ msgid "Signed"
msgstr "Подписан"
#. module: client_contracts
-#: selection:res.partner.template.print,company_type:0
-#: selection:res.partner.template.print.annex,company_type:0
-#: selection:res.partner.template.print.contract,company_type:0
+#: selection:res.partner.document.template,company_type:0
msgid "Sole Proprietor"
msgstr "Индивидуальный предприниматель"
+#. module: client_contracts
+#: code:addons/client_contracts/models/res_partner_document_template.py:28
+#: selection:res.partner.document.template,document_type_name:0
+#, python-format
+msgid "Specification"
+msgstr "Спецификация"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_specification_name
+msgid "Specification Name"
+msgstr "Имя спецификации"
+
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_state
msgid "Status"
@@ -819,27 +992,27 @@ msgid "Technical Name"
msgstr "Техническое название"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_annex_view
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_contract_view
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_telegram
+#: model:ir.model.fields,field_description:client_contracts.field_res_users_telegram
+#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_telegram
+#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_telegram
+msgid "Telegram"
+msgstr "Telegram"
+
+#. module: client_contracts
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_document_view
msgid "Template"
msgstr "Шаблон"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_template_print_annex_view_form
-msgid "Template Annex"
-msgstr "Шаблон приложения"
-
-#. module: client_contracts
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_annex_attachment_id
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_attachment_id
-#: model:ir.model.fields,field_description:client_contracts.field_res_partner_template_print_contract_attachment_id
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_attachment_id
msgid "Template Attachment"
msgstr "Вложение-шаблон"
#. module: client_contracts
-#: model:ir.ui.view,arch_db:client_contracts.res_partner_template_print_contract_view_form
-msgid "Template Contract"
-msgstr "Шаблон договора"
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_template_type
+msgid "Template Type"
+msgstr "Тип шаблона"
#. module: client_contracts
#: model:ir.ui.menu,name:client_contracts.res_partner_menu_contracts_templates
@@ -847,15 +1020,55 @@ msgid "Templates"
msgstr "Шаблоны"
#. module: client_contracts
-#: model:ir.model.fields,help:client_contracts.field_res_partner_contract_annex_name
-msgid "The Number of Annex"
-msgstr "Номер приложения"
+#: model:ir.model.fields,help:client_contracts.field_res_partner_name_write
+#: model:ir.model.fields,help:client_contracts.field_res_users_name_write
+msgid "This name uses in contracts"
+msgstr "Наименование, используемое при заполнении договоров"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_annex_total_cost
+msgid "Total Cost"
+msgstr "Общая стоимость"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_wizard_transient_field_ids_hidden
+msgid "Transient Field Ids Hidden"
+msgstr "Transient Field Ids Hidden"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_document_template_document_type
+msgid "Type of document"
+msgstr "Вид документа"
+
+#. module: client_contracts
+#: model:ir.model.fields,help:client_contracts.field_res_partner_contract_annex_currency_id
+msgid "Utility field to express amount currency"
+msgstr "Служебное поле, чтобы выразить суммы в валюте"
#. module: client_contracts
#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_value
msgid "Value"
msgstr "Значение"
+#. module: client_contracts
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_wizard_print_document_view
+msgid "Values"
+msgstr "Значения"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_transient_visible
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_contract_field_visible
+msgid "Visible"
+msgstr "Видимый"
+
+#. module: client_contracts
+#: model:ir.model.fields,field_description:client_contracts.field_res_partner_whatsapp
+#: model:ir.model.fields,field_description:client_contracts.field_res_users_whatsapp
+#: model:res.partner.contract.field,name:client_contracts.contract_field_partner_whatsapp
+#: model:res.partner.contract.field,name:client_contracts.contract_field_seller_whatsapp
+msgid "WhatsApp"
+msgstr "WhatsApp"
+
#. module: client_contracts
#: model:res.partner.contract.field,description:client_contracts.contract_field_MM
msgid "Word"
@@ -868,24 +1081,9 @@ msgid "Year"
msgstr "Год"
#. module: client_contracts
-#: model:ir.model,name:client_contracts.model_res_partner_contract_annex_line
-msgid "res.partner.contract.annex.line"
-msgstr "res.partner.contract.annex.line"
-
-#. module: client_contracts
-#: model:ir.model,name:client_contracts.model_res_partner_contract_annex_type
-msgid "res.partner.contract.annex.type"
-msgstr "res.partner.contract.annex.type"
-
-#. module: client_contracts
-#: model:ir.actions.act_window,name:client_contracts.res_partner_contract_field_action
-msgid "res.partner.contract.field.action"
-msgstr "res.partner.contract.field.action"
-
-#. module: client_contracts
-#: model:ir.model,name:client_contracts.model_res_partner_contract_template
-msgid "res.partner.contract.template"
-msgstr "res.partner.contract.template"
+#: model:ir.ui.view,arch_db:client_contracts.res_partner_contract_info_inherit_view
+msgid "i.e. Ural Bank for Reconstruction and Development"
+msgstr "напр. «Уральский банк реконструкции и развития»"
#. module: client_contracts
#: model:ir.model,name:client_contracts.model_res_partner_contract_wizard
@@ -893,11 +1091,13 @@ msgid "res.partner.contract.wizard"
msgstr "res.partner.contract.wizard"
#. module: client_contracts
-#: model:ir.actions.act_window,name:client_contracts.res_partner_print_annex_action
-msgid "res.partner.template.print.annex.action"
-msgstr "res.partner.template.print.annex.action"
+#: code:addons/client_contracts/models/res_partner_contract_annex.py:64
+#, python-format
+msgid "{name} from {date}"
+msgstr "{name} от {date}"
#. module: client_contracts
-#: model:ir.actions.act_window,name:client_contracts.res_partner_print_contract_action
-msgid "res.partner.template.print.contract.action"
-msgstr "res.partner.template.print.contract.action"
+#: code:addons/client_contracts/models/res_partner_contract.py:112
+#, python-format
+msgid "{type} {number} from {date}"
+msgstr "{type} {number} от {date}"
diff --git a/models/__init__.py b/models/__init__.py
index 9be2ae2..7656172 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -3,4 +3,5 @@ from . import res_partner_contract
from . import res_partner_contract_annex
from . import res_partner_contract_field
from . import res_partner_contract_field_transient
+from . import res_partner_document_template
from . import sale_order
diff --git a/models/res_partner.py b/models/res_partner.py
index 6ed46e7..7a9f426 100644
--- a/models/res_partner.py
+++ b/models/res_partner.py
@@ -4,6 +4,9 @@ from odoo import api, fields, models
class ResPartner(models.Model):
_inherit = "res.partner"
+ name_write = fields.Char(
+ string="Name in contracts", help="This name uses in contracts",
+ )
name_genitive = fields.Char(string="Name Genitive",)
name_initials = fields.Char(string="Name Initials",)
function_genitive = fields.Char(string="Function Genitive",)
@@ -24,6 +27,12 @@ class ResPartner(models.Model):
string="Representative acts on the basis of", help="Parent Case",
)
signature = fields.Binary(string="Client signature")
+ whatsapp = fields.Char(
+ string="WhatsApp", help="If a contact have a WhatsApp number",
+ )
+ telegram = fields.Char(
+ string="Telegram", help="If a contact have a Telegram number or identifier",
+ )
@api.depends("street", "street2", "city", "state_id", "zip", "country_id")
def _compute_full_address(self):
diff --git a/models/res_partner_contract.py b/models/res_partner_contract.py
index 3afef6d..db95c18 100644
--- a/models/res_partner_contract.py
+++ b/models/res_partner_contract.py
@@ -1,12 +1,12 @@
import datetime
from odoo import _, api, fields, models
-from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
from ..utils import MODULE_NAME
+from ..utils.misc import Extension, IDocument
-class PartnerContract(models.Model):
+class PartnerContract(models.Model, IDocument, Extension):
_name = "res.partner.contract"
_description = "Contract"
_inherit = ["mail.thread", "mail.activity.mixin", "mail.followers"]
@@ -36,6 +36,7 @@ class PartnerContract(models.Model):
"""Returns timestamp of now by local datetime"""
return datetime.datetime.now().timestamp()
+ res_model = fields.Char(default=lambda self: self._name)
name = fields.Char(string="Contract number", default=_get_default_name,)
create_date = fields.Datetime(string="Created on")
create_date_ts = fields.Char(default=_get_default_create_date_ts)
@@ -90,7 +91,9 @@ class PartnerContract(models.Model):
@api.multi
def action_print_form(self):
- view = self.env.ref("{}.res_partner_wizard_print_contract_view".format(MODULE_NAME))
+ view = self.env.ref(
+ "{}.res_partner_wizard_print_document_view".format(MODULE_NAME)
+ )
return {
"name": _("Print Form of Contract"),
"type": "ir.actions.act_window",
@@ -101,6 +104,20 @@ class PartnerContract(models.Model):
"context": {"self_id": self.id},
}
+ def get_name_by_document_template(self, document_template_id):
+ return self.name
+
+ def get_filename_by_document_template(self, document_template_id):
+ return _("{type} {number} from {date}").format(
+ type=_(
+ dict(document_template_id._fields["document_type"].selection).get(
+ document_template_id.document_type
+ )
+ ),
+ number=self.name,
+ date=self.get_date().strftime("%d.%m.%Y"),
+ )
+
def get_date(self):
"""Uses in xml action (data/fields_default)
@@ -109,37 +126,15 @@ class PartnerContract(models.Model):
"""
date = self.date_conclusion_fix or self.date_conclusion
if date:
- date = datetime.datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT)
+ date = self.parse_odoo_date(date)
else:
- date = self.create_date
- date = datetime.datetime.strptime(date, DEFAULT_SERVER_DATETIME_FORMAT)
+ date = self.parse_odoo_datetime(self.create_date)
return date
+ def _(self, arg):
+ """Uses in xml action (data/fields_default)
-class PrintTemplate(models.Model):
- _name = "res.partner.template.print"
- _description = "Print Template"
-
- name = fields.Char(related="attachment_id.name",)
- attachment_id = fields.Many2one(
- "ir.attachment", string="Template Attachment", required=True,
- )
- company_type = fields.Selection(
- selection=[
- ("person", "Individual"),
- ("sp", "Sole Proprietor"),
- ("plc", "Private Limited Company"),
- ]
- )
-
-
-class PrintTemplateContract(models.Model):
- _name = "res.partner.template.print.contract"
- _inherit = "res.partner.template.print"
- _description = "Print Template Contract"
-
-
-class PrintTemplateAnnex(models.Model):
- _name = "res.partner.template.print.annex"
- _inherit = "res.partner.template.print"
- _description = "Print Template Contract Annex"
+ Arguments:
+ arg {str} -- String to translate
+ """
+ return _(arg)
diff --git a/models/res_partner_contract_annex.py b/models/res_partner_contract_annex.py
index 6aa8b38..cbafbf7 100644
--- a/models/res_partner_contract_annex.py
+++ b/models/res_partner_contract_annex.py
@@ -3,38 +3,74 @@ import math
from odoo import _, api, fields, models
from ..utils import MODULE_NAME
+from ..utils.misc import Extension, IDocument
-class ContractOrderAnnex(models.Model):
+class ContractOrderAnnex(models.Model, IDocument, Extension):
_name = "res.partner.contract.annex"
_description = "Contract Annex"
- name = fields.Char(string="Name", help="The Number of Annex")
- order_id = fields.Many2one("sale.order", string="Order", required=True,)
+ name = fields.Char(string="Name",)
+ display_name = fields.Char(compute="_compute_display_name",)
+ specification_name = fields.Char(compute="_compute_specification_name",)
+
contract_id = fields.Many2one(
"res.partner.contract", string="Contract", readonly=True,
)
+ company_id = fields.Many2one("res.partner", related="contract_id.company_id",)
+ partner_id = fields.Many2one("res.partner", related="contract_id.partner_id",)
+ order_id = fields.Many2one(
+ "sale.order",
+ string="Order",
+ help="Orders with this partner which are not uses in annexes yet",
+ required=True,
+ )
date_conclusion = fields.Date(
string="Conclusion Date", default=fields.Date.today(),
)
- prepaid_expense = fields.Float(string="Prepaid Expense", default=0)
- delivery_time = fields.Integer(related="order_id.delivery_time", readonly=True,)
- payment_term = fields.Many2one(
- "account.payment.term", related="order_id.payment_term_id", readonly=True,
- )
+ counter = fields.Integer(string="№", help="Counter of Contract Annexes",)
+ currency_id = fields.Many2one(related="company_id.currency_id", readonly=True,)
- @api.onchange("contract_id")
- def _onchange_contract_id(self):
- # Compute name if there is no custom name
- contract_number = self.contract_id.name
- annex_number = self.contract_id.contract_annex_number
+ development_period = fields.Integer("Product Development Period (days)",)
- self.name = "{contract}--{annex}".format(
- contract=contract_number, annex=annex_number
+ design_cost = fields.Monetary(string="Design Cost",)
+
+ design_doc_period = fields.Integer(string="Documentation Design Period (days)",)
+ design_doc_cost = fields.Monetary(string="Documentation Design Cost",)
+
+ delivery_address = fields.Char(string="Delivery Address",)
+ delivery_period = fields.Integer(string="Delivery Period (days)")
+
+ installation_address = fields.Char(string="Installation Address",)
+ installation_period = fields.Integer(string="Installation Period (days)",)
+ installation_cost = fields.Integer(string="Installation Cost",)
+
+ total_cost = fields.Monetary(string="Total Cost",)
+
+ payment_part_one = fields.Float(string="Payment 1 Part (%)", default=100)
+ payment_part_two = fields.Float(string="Payment 2 Part (%)",)
+ payment_part_three = fields.Float(string="Payment 3 Part (%)",)
+
+ @api.multi
+ @api.depends("name")
+ def _compute_display_name(self):
+ for record in self:
+ record.display_name = "№{} {}".format(
+ record.counter or record.contract_id.contract_annex_number, record.name
+ )
+
+ @api.depends("specification_name", "contract_id", "order_id")
+ def _compute_specification_name(self):
+ self.specification_name = _("{name} from {date}").format(
+ name="{}-{}".format(self.contract_id.name, self.order_id.name),
+ date=self.contract_id.get_date().strftime("%d.%m.%Y"),
)
- # Compute domain for order_id because of bug with
- # not working correctly domain in model
+ @api.onchange("order_id")
+ def _domain_order_id(self):
+ """Using domain function because of
+ simple domain does not working properly because of
+ contract_id is still False"""
return {
"domain": {
"order_id": [
@@ -44,6 +80,15 @@ class ContractOrderAnnex(models.Model):
}
}
+ @api.onchange("order_id")
+ def _onchange_order_id(self):
+ contract_number = self.contract_id.name
+ order_number = self.order_id.name or "SO###"
+
+ self.name = "{contract}-{order}".format(
+ contract=contract_number, order=order_number,
+ )
+
@api.model
def create(self, values):
record = super().create(values)
@@ -51,14 +96,17 @@ class ContractOrderAnnex(models.Model):
# Fill annex_id to domain it in future
record.order_id.contract_annex_id = record.id
- # Add counter
- record.contract_id.contract_annex_number += 1
+ # Counter
+ record.counter = record.contract_id.contract_annex_number
+ record.contract_id.contract_annex_number += 1 # TODO: should I use a sequence?
return record
@api.multi
def action_print_form(self):
- view = self.env.ref("{}.res_partner_wizard_print_annex_view".format(MODULE_NAME))
+ view = self.env.ref(
+ "{}.res_partner_wizard_print_document_view".format(MODULE_NAME)
+ )
return {
"name": _("Print Form of Contract Annex"),
"type": "ir.actions.act_window",
@@ -69,6 +117,44 @@ class ContractOrderAnnex(models.Model):
"context": {"self_id": self.id},
}
+ def get_name_by_document_template(self, document_template_id):
+ return (
+ {
+ "specification": "{counter} {name}",
+ "approval_list": "{counter}.1 {name}-1",
+ "act_at": "{counter}.2 {name}-2",
+ "act_ad": "{counter}.3 {name}-3",
+ }
+ .get(document_template_id.document_type_name, "Unknown")
+ .format(counter=self.counter, name=self.name,)
+ )
+
+ def get_filename_by_document_template(self, document_template_id):
+ return "{type} №{name}".format(
+ type=_(
+ dict(document_template_id._fields["document_type"].selection).get(
+ document_template_id.document_type
+ )
+ ),
+ name={
+ "bill": "{counter} {type} {name}",
+ "specification": "{counter} {type} {name}",
+ "approval_list": "{counter}.1 {type} {name}-1",
+ "act_at": "{counter}.2 {type} {name}-2",
+ "act_ad": "{counter}.3 {type} {name}-3",
+ }
+ .get(document_template_id.document_type_name)
+ .format(
+ counter=self.counter,
+ type=_(
+ dict(
+ document_template_id._fields["document_type_name"].selection
+ ).get(document_template_id.document_type_name)
+ ),
+ name=self.name,
+ ),
+ )
+
def modf(self, arg):
"""Math.modf function for using in XML ir.action.server code
Uses in data/fields_default.xml
diff --git a/models/res_partner_contract_field.py b/models/res_partner_contract_field.py
index d251f24..25d6897 100644
--- a/models/res_partner_contract_field.py
+++ b/models/res_partner_contract_field.py
@@ -11,3 +11,4 @@ class ContractField(models.Model):
)
description = fields.Char(string="Description", translate=True, default="",)
sequence = fields.Integer(string="Sequence",)
+ visible = fields.Boolean(string="Visible", default=True,)
diff --git a/models/res_partner_contract_field_transient.py b/models/res_partner_contract_field_transient.py
index 43e214b..07f043c 100644
--- a/models/res_partner_contract_field_transient.py
+++ b/models/res_partner_contract_field_transient.py
@@ -18,4 +18,5 @@ class ContractFieldTransient(models.TransientModel):
description = fields.Char(
related="contract_field_id.description", string="Description", readonly=True,
)
+ visible = fields.Boolean(related="contract_field_id.visible",)
value = fields.Char(string="Value", default="",)
diff --git a/models/res_partner_document_template.py b/models/res_partner_document_template.py
new file mode 100644
index 0000000..16d1c6d
--- /dev/null
+++ b/models/res_partner_document_template.py
@@ -0,0 +1,44 @@
+from odoo import _, fields, models
+
+
+class DocumentTemplate(models.Model):
+ _name = "res.partner.document.template"
+ _description = "Document Template"
+ _order = "company_type,document_type,sequence"
+
+ name = fields.Char()
+ attachment_id = fields.Many2one(
+ "ir.attachment",
+ string="Template Attachment",
+ ondelete="cascade",
+ required=True,
+ )
+ document_type = fields.Selection(
+ string="Type of document",
+ selection=[
+ ("contract", _("Contract")),
+ ("annex", _("Annex")),
+ ("addition", _("Addition")),
+ ],
+ )
+ document_type_name = fields.Selection(
+ string="Document",
+ selection=[
+ ("bill", _("Bill")),
+ ("specification", _("Specification")),
+ ("approval_list", _("Approval List")),
+ ("act_at", _("Act of Acceptance and Transfer")),
+ ("act_ad", _("Act of Acceptance and Delivery")),
+ ],
+ )
+ company_type = fields.Selection(
+ selection=[
+ ("person", "Individual"),
+ ("sp", "Sole Proprietor"),
+ ("plc", "Private Limited Company"),
+ ]
+ )
+ template_type = fields.Selection(
+ selection=[("contract", "Contract"), ("annex", "Annex"),]
+ )
+ sequence = fields.Integer()
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 12e0fba..96a55dc 100755
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -4,5 +4,4 @@ access_contracts_contracts,access_contracts_contracts,model_res_partner_contract
access_contracts_field,access_contracts_field,model_res_partner_contract_field,base.group_user,1,0,0,0
access_contracts_field_transient,access_contracts_field_transient,model_res_partner_contract_field_transient,base.group_user,1,1,1,1
access_contracts_field_contract_annex,access_contracts_field_contract_annex,model_res_partner_contract_annex,base.group_user,1,1,1,1
-access_contract_document_template,access_contract_document_template,model_res_partner_template_print_contract,base.group_user,1,0,0,0
-access_contract_annex_template,access_contract_annex_template,model_res_partner_template_print_annex,base.group_user,1,0,0,0
+access_contract_document_template,access_contract_document_template,model_res_partner_document_template,base.group_user,1,0,0,0
diff --git a/static/assets/documents/bill.docx b/static/assets/documents/bill.docx
new file mode 100644
index 0000000..67bf78d
Binary files /dev/null and b/static/assets/documents/bill.docx differ
diff --git a/static/assets/documents/common/bill.docx b/static/assets/documents/common/bill.docx
new file mode 100644
index 0000000..4b9ff8f
Binary files /dev/null and b/static/assets/documents/common/bill.docx differ
diff --git a/static/assets/documents/contract_postavki.docx b/static/assets/documents/contract_postavki.docx
new file mode 100644
index 0000000..462a1b8
Binary files /dev/null and b/static/assets/documents/contract_postavki.docx differ
diff --git a/static/assets/documents/original/Акт приема-передачи.docx b/static/assets/documents/original/Акт приема-передачи.docx
new file mode 100644
index 0000000..ea8b6d6
Binary files /dev/null and b/static/assets/documents/original/Акт приема-передачи.docx differ
diff --git a/static/assets/documents/original/Акт приема-сдачи.docx b/static/assets/documents/original/Акт приема-сдачи.docx
new file mode 100644
index 0000000..a81a961
Binary files /dev/null and b/static/assets/documents/original/Акт приема-сдачи.docx differ
diff --git a/static/assets/documents/original/Договор поставки мебельных изделий - Copy.docx b/static/assets/documents/original/Договор поставки мебельных изделий - Copy.docx
new file mode 100644
index 0000000..bb97cea
Binary files /dev/null and b/static/assets/documents/original/Договор поставки мебельных изделий - Copy.docx differ
diff --git a/static/assets/documents/original/Договор поставки мебельных изделий.docx b/static/assets/documents/original/Договор поставки мебельных изделий.docx
new file mode 100644
index 0000000..462a1b8
Binary files /dev/null and b/static/assets/documents/original/Договор поставки мебельных изделий.docx differ
diff --git a/static/assets/documents/original/Лист согласования.docx b/static/assets/documents/original/Лист согласования.docx
new file mode 100644
index 0000000..8397dc4
Binary files /dev/null and b/static/assets/documents/original/Лист согласования.docx differ
diff --git a/static/assets/documents/original/Спецификация.docx b/static/assets/documents/original/Спецификация.docx
new file mode 100644
index 0000000..840da6c
Binary files /dev/null and b/static/assets/documents/original/Спецификация.docx differ
diff --git a/static/assets/documents/person/addition_act_1_person.docx b/static/assets/documents/person/addition_act_1_person.docx
new file mode 100644
index 0000000..0a6d808
Binary files /dev/null and b/static/assets/documents/person/addition_act_1_person.docx differ
diff --git a/static/assets/documents/person/addition_act_2_person.docx b/static/assets/documents/person/addition_act_2_person.docx
new file mode 100644
index 0000000..35474c0
Binary files /dev/null and b/static/assets/documents/person/addition_act_2_person.docx differ
diff --git a/static/assets/documents/person/addition_list_soglasovania_person.docx b/static/assets/documents/person/addition_list_soglasovania_person.docx
new file mode 100644
index 0000000..203a7bf
Binary files /dev/null and b/static/assets/documents/person/addition_list_soglasovania_person.docx differ
diff --git a/static/assets/documents/person/bill_person.docx b/static/assets/documents/person/bill_person.docx
new file mode 100644
index 0000000..ced8f83
Binary files /dev/null and b/static/assets/documents/person/bill_person.docx differ
diff --git a/static/assets/documents/person/contract_postavki_person.docx b/static/assets/documents/person/contract_postavki_person.docx
new file mode 100644
index 0000000..6f47f5a
Binary files /dev/null and b/static/assets/documents/person/contract_postavki_person.docx differ
diff --git a/static/assets/documents/person/specification_person.docx b/static/assets/documents/person/specification_person.docx
new file mode 100644
index 0000000..6bfe078
Binary files /dev/null and b/static/assets/documents/person/specification_person.docx differ
diff --git a/static/assets/documents/plc/addition_act_1_plc.docx b/static/assets/documents/plc/addition_act_1_plc.docx
new file mode 100644
index 0000000..37bb07d
Binary files /dev/null and b/static/assets/documents/plc/addition_act_1_plc.docx differ
diff --git a/static/assets/documents/plc/addition_act_2_plc.docx b/static/assets/documents/plc/addition_act_2_plc.docx
new file mode 100644
index 0000000..29c4c3e
Binary files /dev/null and b/static/assets/documents/plc/addition_act_2_plc.docx differ
diff --git a/static/assets/documents/plc/addition_list_soglasovania_plc.docx b/static/assets/documents/plc/addition_list_soglasovania_plc.docx
new file mode 100644
index 0000000..3e6c6e7
Binary files /dev/null and b/static/assets/documents/plc/addition_list_soglasovania_plc.docx differ
diff --git a/static/assets/documents/plc/bill_plc.docx b/static/assets/documents/plc/bill_plc.docx
new file mode 100644
index 0000000..5e63f8c
Binary files /dev/null and b/static/assets/documents/plc/bill_plc.docx differ
diff --git a/static/assets/documents/plc/contract_postavki_plc.docx b/static/assets/documents/plc/contract_postavki_plc.docx
new file mode 100644
index 0000000..2fdadd3
Binary files /dev/null and b/static/assets/documents/plc/contract_postavki_plc.docx differ
diff --git a/static/assets/documents/plc/specification_plc.docx b/static/assets/documents/plc/specification_plc.docx
new file mode 100644
index 0000000..13153eb
Binary files /dev/null and b/static/assets/documents/plc/specification_plc.docx differ
diff --git a/static/assets/documents/sp/addition_act_1_sp.docx b/static/assets/documents/sp/addition_act_1_sp.docx
new file mode 100644
index 0000000..da01acc
Binary files /dev/null and b/static/assets/documents/sp/addition_act_1_sp.docx differ
diff --git a/static/assets/documents/sp/addition_act_2_sp.docx b/static/assets/documents/sp/addition_act_2_sp.docx
new file mode 100644
index 0000000..0bd89ea
Binary files /dev/null and b/static/assets/documents/sp/addition_act_2_sp.docx differ
diff --git a/static/assets/documents/sp/addition_list_soglasovania_sp.docx b/static/assets/documents/sp/addition_list_soglasovania_sp.docx
new file mode 100644
index 0000000..98d194b
Binary files /dev/null and b/static/assets/documents/sp/addition_list_soglasovania_sp.docx differ
diff --git a/static/assets/documents/sp/bill_sp.docx b/static/assets/documents/sp/bill_sp.docx
new file mode 100644
index 0000000..021c43a
Binary files /dev/null and b/static/assets/documents/sp/bill_sp.docx differ
diff --git a/static/assets/documents/sp/contract_postavki_sp.docx b/static/assets/documents/sp/contract_postavki_sp.docx
new file mode 100644
index 0000000..d819a83
Binary files /dev/null and b/static/assets/documents/sp/contract_postavki_sp.docx differ
diff --git a/static/assets/documents/sp/specification_sp.docx b/static/assets/documents/sp/specification_sp.docx
new file mode 100644
index 0000000..ec463fa
Binary files /dev/null and b/static/assets/documents/sp/specification_sp.docx differ
diff --git a/static/src/css/mimetypes.css b/static/src/css/mimetypes.css
new file mode 100644
index 0000000..313896c
--- /dev/null
+++ b/static/src/css/mimetypes.css
@@ -0,0 +1,4 @@
+.o_image[data-mimetype$='msword'],
+.o_image[data-mimetype$='application/vnd.openxmlformats-officedocument.wordprocessingml.document'] {
+ background-image: url('/client_contracts/static/src/img/msword.png');
+}
diff --git a/static/src/img/msword.png b/static/src/img/msword.png
new file mode 100644
index 0000000..5ac980f
Binary files /dev/null and b/static/src/img/msword.png differ
diff --git a/utils/__init__.py b/utils/__init__.py
index 5b306d3..6d0f55e 100644
--- a/utils/__init__.py
+++ b/utils/__init__.py
@@ -1 +1 @@
-MODULE_NAME = __package__.split('.')[-2]
+MODULE_NAME = __package__.split(".")[-2]
diff --git a/utils/misc.py b/utils/misc.py
new file mode 100644
index 0000000..9050bf8
--- /dev/null
+++ b/utils/misc.py
@@ -0,0 +1,28 @@
+import datetime as dt
+import inspect
+
+from odoo import fields
+from odoo.tools.misc import (DEFAULT_SERVER_DATE_FORMAT,
+ DEFAULT_SERVER_DATETIME_FORMAT)
+
+
+class IDocument(object):
+ """Class must be used as an interface for create new document based model"""
+
+ def get_name_by_document_template(self, document_template_id: fields.Many2one):
+ raise NotImplementedError(
+ "Method {} is not implemented".format(inspect.currentframe().f_code.co_name)
+ )
+
+ def get_filename_by_document_template(self, document_template_id: fields.Many2one):
+ raise NotImplementedError(
+ "Method {} is not implemented".format(inspect.currentframe().f_code.co_name)
+ )
+
+
+class Extension(object):
+ def parse_odoo_date(self, date: str):
+ return dt.datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT)
+
+ def parse_odoo_datetime(self, datetime: str):
+ return dt.datetime.strptime(datetime, DEFAULT_SERVER_DATETIME_FORMAT)
diff --git a/views/res_partner.xml b/views/res_partner.xml
index 43a0884..fb950f1 100644
--- a/views/res_partner.xml
+++ b/views/res_partner.xml
@@ -3,27 +3,18 @@
- res.partner.contract.field.action
+ Contract Fields
ir.actions.act_window
res.partner.contract.field
tree,form
form
-
-
- res.partner.template.print.contract.action
+
+
+ Document Templates
ir.actions.act_window
- res.partner.template.print.contract
- tree,form
- form
-
-
-
-
- res.partner.template.print.annex.action
- ir.actions.act_window
- res.partner.template.print.annex
+ res.partner.document.template
tree,form
form
@@ -35,21 +26,34 @@
+
+ Name in ERP
+
+
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
@@ -86,18 +90,7 @@
-
-
-
-
diff --git a/views/res_partner_contract.xml b/views/res_partner_contract.xml
index 143ba07..1480ad6 100644
--- a/views/res_partner_contract.xml
+++ b/views/res_partner_contract.xml
@@ -8,8 +8,9 @@
-
+
+
@@ -19,7 +20,7 @@
Contract Form
res.partner.contract
-
diff --git a/views/res_partner_contract_field.xml b/views/res_partner_contract_field.xml
new file mode 100644
index 0000000..ab4059b
--- /dev/null
+++ b/views/res_partner_contract_field.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+ res.partner.contract.field.view.tree
+ res.partner.contract.field
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/views/res_partner_document_template.xml b/views/res_partner_document_template.xml
new file mode 100644
index 0000000..0658f0f
--- /dev/null
+++ b/views/res_partner_document_template.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ res.partner.document.template.view.tree
+ res.partner.document.template
+
+
+
+
+
+
+
+
+
+
diff --git a/views/res_partner_template_print.xml b/views/res_partner_template_print.xml
deleted file mode 100644
index 7e71023..0000000
--- a/views/res_partner_template_print.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
- res.partner.template.print.contract.view.form
- res.partner.template.print.contract
-
-
-
-
-
-
-
- res.partner.template.print.annex.view.form
- res.partner.template.print.annex
-
-
-
-
-
-
-
diff --git a/wizard/res_partner_contract_wizard.py b/wizard/res_partner_contract_wizard.py
index 65e0d14..ba94e6d 100644
--- a/wizard/res_partner_contract_wizard.py
+++ b/wizard/res_partner_contract_wizard.py
@@ -1,22 +1,37 @@
-# -*- coding: utf-8 -*-
import base64
-import logging
-from odoo import _, api, fields, models
-from odoo.exceptions import UserError
+from odoo import api, fields, models
+from odoo.exceptions import ValidationError
from ..utils import MODULE_NAME
from ..utils.docxtpl import get_document_from_values_stream
-_logger = logging.getLogger(__name__)
-
class ContractWizard(models.TransientModel):
_name = "res.partner.contract.wizard"
- def _get_default_partner(self):
- current_id = self.env.context.get("active_id")
- return self.env["res.partner.contract"].browse(current_id).partner_id.id
+ def _default_target(self):
+ return "{model},{target_id}".format(
+ model=self.active_model, target_id=int(self.env.context.get("self_id"))
+ )
+
+ def _default_document_template(self):
+ return self.env["res.partner.document.template"].search(self._get_template_domain(), limit=1)
+
+ def _get_template_domain(self):
+ template_type = {
+ "res.partner.contract": "contract",
+ "res.partner.contract.annex": "annex",
+ }.get(self.active_model, False)
+ company_type = (
+ self.partner_id.company_form if self.partner_id.is_company else "person"
+ )
+
+ document_template_domain = [
+ ("template_type", "=", template_type),
+ ("company_type", "=", company_type),
+ ]
+ return document_template_domain
target = fields.Reference(
selection=[
@@ -24,24 +39,63 @@ class ContractWizard(models.TransientModel):
("res.partner.contract.annex", "Contract Annex"),
],
string="Target",
+ default=_default_target,
)
- company_id = fields.Many2one("res.partner", string="Company")
- partner_id = fields.Many2one("res.partner", string="Partner")
- print_template_contract = fields.Many2one(
- "res.partner.template.print.contract", string="Print Template of Contract",
+ company_id = fields.Many2one(
+ "res.partner", string="Company", compute="_compute_company_id",
)
- print_template_annex = fields.Many2one(
- "res.partner.template.print.annex", string="Print Template of Contract Annex",
+ partner_id = fields.Many2one(
+ "res.partner", string="Partner", compute="_compute_partner_id",
+ )
+ document_name = fields.Char(
+ string="Document Name", compute="_compute_document_name"
+ )
+ document_template = fields.Many2one(
+ "res.partner.document.template",
+ string="Document Template",
+ default=_default_document_template,
+ readonly=False,
)
-
transient_field_ids = fields.One2many(
"res.partner.contract.field.transient",
"_contract_wizard_id",
string="Contract Fields",
)
+ transient_field_ids_hidden = fields.One2many(
+ "res.partner.contract.field.transient", "_contract_wizard_id",
+ )
- @api.onchange("target")
- def _onchange_target(self):
+ @api.depends("company_id", "target")
+ def _compute_company_id(self):
+ if self.target:
+ self.company_id = self.target.company_id
+
+ @api.depends("partner_id", "target")
+ def _compute_partner_id(self):
+ if self.target:
+ self.partner_id = self.target.partner_id
+
+ @api.depends("document_name", "document_template", "target")
+ def _compute_document_name(self):
+ self.document_name = self.target.get_name_by_document_template(
+ self.document_template
+ )
+
+ @api.constrains("document_template")
+ def _check_document_template(self):
+ if not self.document_template:
+ raise ValidationError("You did not set up the template...")
+
+ @api.onchange('document_template')
+ def _domain_document_template(self):
+ return {
+ "domain": {
+ "document_template": self._get_template_domain(),
+ }
+ }
+
+ @api.onchange("document_template")
+ def _onchange_document_template(self):
"""Creates transient fields for generate contract template
Looks as a tree view of *_contract_field_transient model in xml
"""
@@ -51,36 +105,11 @@ class ContractWizard(models.TransientModel):
[("technical_name", "=", technical_name),]
)
- # A model is the wizard called from
- active_model = self.env.context.get("active_model")
- # A record is the model called from (manually set with context)
- target_id = self.env.context.get("self_id")
-
- # Reference to this record
- self.target = "{model},{record_id}".format(
- model=active_model, record_id=int(target_id)
- )
-
- # Check for model and get this meta fields
- company_id = (
- self.target.company_id
- if hasattr(self.target, "company_id")
- else self.target.contract_id.company_id
- )
- partner_id = (
- self.target.partner_id
- if hasattr(self.target, "partner_id")
- else self.target.contract_id.partner_id
- )
-
- self.company_id = company_id
- self.partner_id = partner_id
-
model_to_action = {
- "res.partner.contract": "{}.action_get_contract_context".format(MODULE_NAME),
- "res.partner.contract.annex": "{}.action_get_annex_context".format(MODULE_NAME),
+ "res.partner.contract": "action_get_contract_context",
+ "res.partner.contract.annex": "action_get_annex_context",
}
- action = model_to_action[active_model]
+ action = "{}.{}".format(MODULE_NAME, model_to_action[self.active_model])
# Get dictionary for `transient_fields_ids` with editable fields
# With data from Odoo database
@@ -98,50 +127,33 @@ class ContractWizard(models.TransientModel):
.id,
0,
)
- for field, value in sorted(contract_context_values.items(), key=lambda tpl: self.env.ref("{}.contract_field_{}".format(MODULE_NAME, tpl[0])).sequence)
+ for field, value in sorted(
+ contract_context_values.items(),
+ key=lambda tpl: self.env.ref(
+ "{}.contract_field_{}".format(MODULE_NAME, tpl[0])
+ ).sequence,
+ )
]
-
- # Set up template domain
- company_type = (
- self.partner_id.company_form if self.partner_id.is_company else "person"
+ self.transient_field_ids_hidden = (
+ self.transient_field_ids - self.transient_field_ids.filtered("visible")
)
- return {
- "domain": {
- "print_template_contract": [("company_type", "=", company_type)],
- "print_template_annex": [("company_type", "=", company_type)],
- }
- }
+ self.transient_field_ids = (
+ self.transient_field_ids - self.transient_field_ids_hidden
+ )
+
+ # Other
@api.multi
def get_docx_contract(self):
- template = self._get_template()
- if not template:
- raise UserError("Template must be set up")
+ template = self.document_template.attachment_id
+ template_path = template._full_path(template.store_fname)
- path_to_template = template._full_path(template.store_fname)
-
- fields = {
- transient_field.technical_name: transient_field.value
- for transient_field in self.transient_field_ids
- if transient_field.technical_name and transient_field.value
- }
-
- binary_data = get_document_from_values_stream(path_to_template, fields).read()
+ payload = self.payload()
+ binary_data = get_document_from_values_stream(template_path, payload).read()
encoded_data = base64.b64encode(binary_data)
- attachment_name = "{name}-{number}.{ext}".format(
- number=self.target.name,
- ext="docx",
- name=(
- _("Contract")
- if self.target._name == "res.partner.contract"
- else (
- _("Annex")
- if self.target._name == "res.partner.contract.annex"
- else ("Unknown")
- )
- ),
- )
+ get_fn = self.target.get_filename_by_document_template
+ attachment_name = "{}.docx".format(get_fn(self.document_template or "Unknown"))
document_as_attachment = self.env["ir.attachment"].create(
{
@@ -152,7 +164,51 @@ class ContractWizard(models.TransientModel):
}
)
- # Send message with attachment to a mail.thread of the company
+ return self.afterload(document_as_attachment)
+
+ def payload(self):
+ # Collect fields into a key-value structure
+ fields = {
+ transient_field.technical_name: transient_field.value
+ for transient_field in (
+ self.transient_field_ids + self.transient_field_ids_hidden
+ )
+ if transient_field.technical_name and transient_field.value
+ }
+ # Extend with special case
+ if self.target._name == "res.partner.contract.annex":
+ fields.update(
+ {
+ "annex_name": self.document_name,
+ "specification_name": self.target.specification_name,
+ }
+ )
+ # Extend with order product lines
+ if hasattr(self.target, "order_id") and self.target.order_id.order_line:
+ def number_generator(n=1):
+ while (True):
+ yield n
+ n += 1
+
+ counter = number_generator()
+
+ fields.update(
+ {
+ "order_products": [
+ {
+ "number": next(counter),
+ "label": item.product_id.name,
+ "count": item.product_uom_qty,
+ "unit": item.product_uom.name,
+ "cost": item.price_unit,
+ "amount": item.price_subtotal,
+ } for item in self.target.order_id.order_line or []
+ ]
+ }
+ )
+ return fields
+
+ def afterload(self, result):
res_id = self.target.id
if hasattr(self.target, "contract_id"):
res_id = self.target.contract_id.id
@@ -162,16 +218,12 @@ class ContractWizard(models.TransientModel):
"model": "res.partner.contract",
"res_id": res_id,
"message_type": "comment",
- "attachment_ids": [(4, document_as_attachment.id, False)],
+ "attachment_ids": [(4, result.id, False)],
}
)
- return document_as_attachment
+ return result
- @api.multi
- def _get_template(self):
- model_to_template = {
- "res.partner.contract": self.print_template_contract.attachment_id,
- "res.partner.contract.annex": self.print_template_annex.attachment_id,
- }
- return model_to_template.get(self.env.context.get("active_model"), False)
+ @property
+ def active_model(self):
+ return self.env.context.get("active_model")
diff --git a/wizard/res_partner_contract_wizard.xml b/wizard/res_partner_contract_wizard.xml
index 8fcabe7..2890da8 100644
--- a/wizard/res_partner_contract_wizard.xml
+++ b/wizard/res_partner_contract_wizard.xml
@@ -1,23 +1,28 @@
-
- Print Contract
+
+ Generate Document
res.partner.contract.wizard
-
-
-
-
- Print Annex
- res.partner.contract.wizard
-
-
-