
модуль l10n_ru_contract файл /l10n_ru_contract/views/contract_customer_view.xml Были изменены id в menuitem с contract на l10n_ru_contract 10n_ru_doc/demo/l10n_ru_doc_demo.xml Закомментированно поле <field name="rml_header1">CodUP</field> ( его в 17-ой версии я не нашел, аналог тоже) Модуль l10n_ru_doc l10n_ru_doc/demo/l10n_ru_doc_demo.xml Заменено поле image на image_1920 Что добавить в Rudo для работы модулей l10n_ru Список штатных модулей: account account_payment payment payment_adyen payment_alipay payment_aps payment_authorize payment_buckaroo payment_custom payment_demo payment_flutterwave payment_mercado_pago payment_mollie payment_ogone payment_paypal payment_payumoney payment_razorpay payment_razorpay_oauth payment_sips payment_stripe payment_xendit payment_asiapay payment_payulatam product purchase sale sale_management stock utm Так же в odoo/tools нужно добавить папку pdf из базового ядра odoo17 в odoo/addons нужно добавить модуль test_mimetypes в файле payment/data/payment_provider_data.xml нужно закомментировать запись payment_provider_sepa_direct_debit В виртуальную среду добавить библиотеку pymorphy2
145 lines
6.0 KiB
Python
Executable File
145 lines
6.0 KiB
Python
Executable File
from datetime import datetime
|
||
from odoo import api, fields, models
|
||
|
||
class AccountInvoice(models.Model):
|
||
_inherit = 'account.move'
|
||
kladov=fields.Many2one('res.users', string='Ответственный за передачу товаров/услуг')
|
||
gruzopol=fields.Many2one('res.partner', string='Грузополучатель')
|
||
gruzootpr=fields.Many2one('res.partner', string='Грузоотправитель')
|
||
transport=fields.Char('Данные о транспортировке и грузе')
|
||
osnovanie=fields.Char('Основание')
|
||
payment_text=fields.Char('Текст для платежек в УПД', compute='_compute_get_txtpayment')
|
||
payment_num=fields.Char('Номер платежки в УПД', compute='_compute_get_txtpayment')
|
||
payment_date = fields.Char('Дата платежки в УПД', compute='_compute_get_txtpayment')
|
||
only_service = fields.Boolean('Только услуги', compute='_compute_get_check_service')
|
||
|
||
@api.depends('invoice_line_ids')
|
||
def _compute_get_check_service(self):
|
||
for s in self:
|
||
s.only_service = all((line.product_id.type=='service') for line in s.invoice_line_ids)
|
||
|
||
def _compute_get_txtpayment(self):
|
||
for s in self:
|
||
payments = s._get_reconciled_payments()
|
||
payment_text = ''
|
||
|
||
for payment in payments:
|
||
if payment.date:
|
||
payment_text += payment.name + ' от ' + \
|
||
fields.Datetime.from_string(payment.date).strftime("%d.%m.%Y")
|
||
if payments[-1]!=payment:
|
||
payment_text += ', '
|
||
if payments:
|
||
s.payment_num = payments[0].name
|
||
s.payment_date = fields.Datetime.from_string(payments[0].date).strftime("%d.%m.%Y")
|
||
else:
|
||
s.payment_num = ''
|
||
s.payment_text = ''
|
||
s.payment_date = ''
|
||
|
||
s.payment_text = payment_text
|
||
|
||
def action_bill_sent(self):
|
||
assert len(self) == 1, 'This option should only be used for a single id at a time.'
|
||
template = self.env.ref('account.email_template_edi_invoice', False)
|
||
compose_form = self.env.ref('mail.email_compose_message_wizard_form', False)
|
||
ctx = {
|
||
'default_model': 'account.move',
|
||
'default_res_id': self.id,
|
||
'default_use_template': bool(template),
|
||
'default_template_id': template.id,
|
||
'default_composition_mode': 'comment',
|
||
'mark_invoice_as_sent': True,
|
||
}
|
||
return {
|
||
'name': 'Compose Email',
|
||
'type': 'ir.actions.act_window',
|
||
'view_type': 'form',
|
||
'view_mode': 'form',
|
||
'res_model': 'mail.compose.message',
|
||
'views': [(compose_form.id, 'form')],
|
||
'view_id': compose_form.id,
|
||
'target': 'new',
|
||
'context': ctx,
|
||
}
|
||
|
||
def bill_print(self):
|
||
assert len(self) == 1, 'This option should only be used for a single id at a time.'
|
||
return self.env['report'].get_action(self, 'l10n_ru_doc.report_upd')
|
||
|
||
def get_delivery_doc_name(self):
|
||
for s in self:
|
||
pickings = []
|
||
pickings_list = '0'
|
||
orders = self.env['sale.order'].sudo().search([('name','=',s.invoice_origin)])
|
||
for o in orders:
|
||
if o.picking_ids:
|
||
for p in o.picking_ids:
|
||
pickings.append(p.name)
|
||
if len(pickings)>0:
|
||
pickings_list = ';'.join(pickings)
|
||
if pickings_list != '0':
|
||
return pickings_list
|
||
if s.name.find('/') > -1:
|
||
return 'УПД № ' + s.name[len(s.name) - 4:]
|
||
return 'УПД № ' + s.name
|
||
|
||
def get_delivery_doc_date(self):
|
||
for s in self:
|
||
pickings = []
|
||
pickings_list = '0'
|
||
orders = self.env['sale.order'].sudo().search([('name','=',s.invoice_origin)])
|
||
for o in orders:
|
||
if o.picking_ids:
|
||
for p in o.picking_ids:
|
||
pickings.append(datetime.strftime(p.date, '%d.%m.%Y'))
|
||
if len(pickings)>0:
|
||
pickings_list = ';'.join(pickings)
|
||
if pickings_list != '0':
|
||
return pickings_list
|
||
return datetime.strftime(s.date, '%d.%m.%Y')
|
||
|
||
def get_function_partner(self, partner=False, type='director'):
|
||
if partner:
|
||
if partner.parent_id:
|
||
partner = partner.parent_id
|
||
director = self.env['res.partner'].search([('parent_id', '=', partner.id),
|
||
('type', '=', type)], limit=1)
|
||
if director:
|
||
if director.function:
|
||
return director.function
|
||
return ''
|
||
|
||
def get_name_partner(self, partner=False, type='director'):
|
||
if partner:
|
||
if partner.parent_id:
|
||
partner = partner.parent_id
|
||
director = self.env['res.partner'].search([('parent_id', '=', partner.id),
|
||
('type', '=', type)], limit=1)
|
||
if director:
|
||
if director.name:
|
||
return director.name
|
||
return ''
|
||
|
||
def get_facsimile_partner(self, partner=False, type='director'):
|
||
if partner:
|
||
if partner.parent_id:
|
||
partner = partner.parent_id
|
||
director = self.env['res.partner'].search([('parent_id', '=', partner.id),
|
||
('type', '=', type)],
|
||
limit=1)
|
||
if director:
|
||
if director.facsimile:
|
||
return director.facsimile
|
||
return ''
|
||
|
||
def get_stamp_partner(self, partner=False):
|
||
if partner:
|
||
if partner.parent_id:
|
||
partner = partner.parent_id
|
||
if partner.stamp:
|
||
return partner.stamp
|
||
return False
|
||
|
||
|