Files
gzth/docx_report_custom/rus_docs/rus_docs.py
T
2025-04-14 09:28:56 +08:00

265 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from datetime import datetime
from odoo import fields, models
from .report_helper import Helper
class SaleOrder(models.Model):
_inherit = "sale.order"
def get_report_sale_order_context_rus(self):
"""Данные для счета на оплату для РФ.
данная функция - пример настройки продакшена, но не забывайте
что часть полей кастомная, например основание содержит камтомную модель
договора.
Все кастомные модели необходимо заменить на ваши или заккоментировать
"""
self = self.sudo()
# набор полезных функций, чтобы не засорять пространство sale.order
helper = Helper()
# сборка линий заказа, с учетом кастомной логики отработки
order_line = []
summ = 0
summ_nds = 0
for line in self.order_line:
new_line = {}
nds = 0.0
if line.tax_id:
nds = line.tax_id[0].amount / (100 + line.tax_id[0].amount)
if line.product_uom_qty - line.mt_billed > 0:
new_line["index"] = len(order_line) + 1
new_line["name"] = line.name or ""
new_line["qty"] = line.product_uom_qty - line.mt_billed or ""
new_line["product_uom"] = line.product_uom.name or ""
new_line["currency"] = "руб."
new_line["price"] = line.price_unit or ""
new_line["total_price"] = line.price_unit * (
line.product_uom_qty - line.mt_billed
)
summ = summ + line.price_unit * (
line.product_uom_qty - line.mt_billed
)
summ_nds = (
summ_nds
+ line.price_unit
* (line.product_uom_qty - line.mt_billed)
* nds
)
order_line.append(new_line)
return {
# Банк получателя
"bank_received": (
self.company_id.partner_id.bank_ids
and self.company_id.partner_id.bank_ids[0].bank_name
or ""
)
+ " "
+ (
self.company_id.partner_id.bank_ids
and self.company_id.partner_id.bank_ids[0].bank_id.city
or ""
),
# БИК
"bik": self.company_id.partner_id.bank_ids
and self.company_id.partner_id.bank_ids[0].bank_bic
or "",
# Р/Счёт №.
"acc_number": self.company_id.partner_id.bank_ids
and self.company_id.partner_id.bank_ids[0].acc_number
or "",
# ИНН
"inn": self.company_id.inn or "",
# RRGG
"kpp": self.company_id.kpp or "",
# К/ Счёт №
"correspondent_account": self.company_id.partner_id.bank_ids
and self.company_id.partner_id.bank_ids[
0
].bank_id.correspondent_account
or "",
# Получатель
"reciver": self.company_id.name or "",
# номер счета
"so_number": helper.numer(self.name)
+ "-"
+ str(datetime.today().month)
+ str(datetime.today().day),
# от
"so_from": helper.ru_date2(
datetime.today().strftime("%Y-%m-%d %H:%M:%S")
),
# поставщик
"provider": helper.representation(self.company_id),
# покупатель
"customer": helper.representation(self.partner_id),
# основание
"contract": "Договор № "
+ self.mt_contractid.name
+ " от "
+ fields.Date.from_string(self.mt_contractid.date_start).strftime(
"%d.%m.%Y"
),
"manager": "Менеджер: "
+ self.user_id.name
+ ", email: "
+ self.user_id.partner_id.email
or "" + ", тел. " + self.user_id.partner_id.mobile
or "",
"order_line": order_line,
"len_order_line": len(order_line),
"summ": summ or "0,00",
"summ_nds": round(summ_nds, 2) or "0,00",
"summ_text": helper.rubles(summ).capitalize(),
"chief": helper.initials(self.company_id.chief_id.name),
"accountant": helper.initials(self.company_id.accountant_id.name),
# IMAGES
# 1.jpg, 2.jpg, 3.jpg Печать и подпись берутся динамически из полей.
"images": [
self.company_id.chief_id.facsimile,
self.company_id.accountant_id.facsimile,
self.company_id.stamp,
],
}
def get_report_sale_order_context(self):
"""Пример данных для договора"""
self = self.sudo()
if not self.mt_contractid:
raise exceptions.UserError(
"Отсутствует договор для заказчика, пожалуйста создайте его!"
)
if not len(
self.mt_contractid.company_id.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)
):
raise exceptions.UserError(
"Не найден директор нашей кампании в договоре!Пожалуйста, создайте директора нашей кампании или добавьте нашу кампанию!"
)
if not self.mt_contractid.company_id.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)[0].name:
raise exceptions.UserError(
"Имя директора нашей кампании в договоре пустое!Пожалуйста, введите имя директора в формате Ф И О!"
)
if not len(
self.mt_contractid.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)
):
raise exceptions.UserError(
"Не найден директор контрагента в договоре!Пожалуйста, создайте директора контрагента!"
)
if not self.mt_contractid.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)[0].name:
raise exceptions.UserError(
"Имя директора контрагента пустое!Пожалуйста, введите имя директора контрагента в формате Ф И О!"
)
# if not self.mt_contractid.partner_id.okpo:
# raise exceptions.UserError('Не присвоен ОКПО')
partner_bank = (
self.mt_contractid.partner_id.bank_ids
and self.mt_contractid.partner_id.bank_ids.filtered(
lambda r: r.company_id == self.mt_contractid.company_id
)
)
if not partner_bank:
partner_bank = (
self.mt_contractid.partner_id.bank_ids
and self.mt_contractid.partner_id.bank_ids[-1]
)
company_bank = (
self.mt_contractid.company_id.partner_id.bank_ids
and self.mt_contractid.company_id.partner_id.bank_ids[-1]
)
return {
"phone": self.partner_id.phone,
"contract_name": self.mt_contractid.name,
"our_dir": self.mt_contractid.name_dirprint,
"customer_dir": self.mt_contractid.name_print,
"contract_date_start": fields.Date.from_string(
self.mt_contractid.date_start
).strftime("%d.%m.%Y"),
"contract_date_end": fields.Date.from_string(
self.mt_contractid.date_end
).strftime("%d.%m.%Y"),
"order_line": [line.read()[0] for line in self.order_line],
"amount_total": self.amount_total,
"amount_tax": self.amount_tax,
"order_date": fields.Date.from_string(self.date_order).strftime(
"%d.%m.%Y"
),
# CUSTOMER
"partner_name": self.mt_contractid.partner_id.name,
"partner_inn": self.mt_contractid.partner_id.inn,
"partner_kpp": self.mt_contractid.partner_id.kpp,
"partner_ogrn": self.mt_contractid.partner_id.ogrn,
"partner_okpo": self.mt_contractid.partner_id.okpo,
"partner_address": self.format_partner(
self.mt_contractid.partner_id
),
"p_bank_bic": partner_bank.bank_bic or "",
"p_acc_number": partner_bank.acc_number or "",
"p_bank_name": partner_bank.bank_name or "",
"p_cor_number": partner_bank.bank_id.correspondent_account or "",
"p_mobile": self.mt_contractid.partner_id.mobile or "",
"p_phone": self.mt_contractid.partner_id.phone or "",
"p_email": self.mt_contractid.partner_id.email or "",
"p_print_dir": len(
self.mt_contractid.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)
)
and self.mt_contractid.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)[0].name,
# COMPANY
"contract_company_name": self.mt_contractid.company_id.partner_id.name,
"c_name": self.mt_contractid.company_id.partner_id.name,
"c_inn": self.mt_contractid.company_id.partner_id.inn,
"c_kpp": self.mt_contractid.company_id.partner_id.kpp or "",
# не печатаем False для ИП, так как у ИП нет ОГРН и ОКПО
"c_ogrn": self.mt_contractid.company_id.partner_id.ogrn
if self.mt_contractid.company_id.partner_id.ogrn
else "",
"c_okpo": self.mt_contractid.company_id.partner_id.okpo
if self.mt_contractid.company_id.partner_id.okpo
else "",
"c_address": self.format_partner(
self.mt_contractid.company_id.partner_id
),
"c_bank_bic": company_bank.bank_bic or "",
"c_acc_number": company_bank.acc_number or "",
"c_bank_name": company_bank.bank_name or "",
"c_cor_number": company_bank.bank_id.correspondent_account or "",
"c_mobile": self.mt_contractid.company_id.partner_id.mobile or "",
"c_phone": self.mt_contractid.company_id.partner_id.phone or "",
"c_email": self.mt_contractid.company_id.partner_id.email or "",
"c_print_dir": len(
self.mt_contractid.company_id.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)
)
and self.mt_contractid.company_id.partner_id.child_ids.filtered(
lambda r: not r.type != "director"
)[0].name,
# IMAGES
# 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, 6.jpg, 7.jpg. 1,2.jpg = печать. 3,4,5,6,7.jpg = подпись. Печать и подпись берутся динамически из полей.
"images": [
self.mt_contractid.company_id.stamp,
self.mt_contractid.company_id.stamp,
self.mt_contractid.company_id.chief_id.facsimile,
self.mt_contractid.company_id.chief_id.facsimile,
self.mt_contractid.company_id.chief_id.facsimile,
self.mt_contractid.company_id.chief_id.facsimile,
self.mt_contractid.company_id.chief_id.facsimile,
]
if self.mt_contractid.stamp
else [False, False, False, False, False, False, False],
}