Public release from ruodoo-project: 19.0 - 2026-05-10 21:19:01 UTC
This commit is contained in:
12
l10n_ru_doc/models/__init__.py
Normal file
12
l10n_ru_doc/models/__init__.py
Normal file
@ -0,0 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import res_partner
|
||||
from . import res_company
|
||||
from . import res_users
|
||||
from . import res_bank
|
||||
from . import account_invoice
|
||||
from . import account_move_line
|
||||
from . import sale
|
||||
from . import uom
|
||||
from . import tax
|
||||
from . import product
|
||||
150
l10n_ru_doc/models/account_invoice.py
Normal file
150
l10n_ru_doc/models/account_invoice.py
Normal file
@ -0,0 +1,150 @@
|
||||
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:
|
||||
if s:
|
||||
pickings = []
|
||||
pickings_list = '0'
|
||||
orders = self.env['sale.order'].sudo().search([('name','=',s.invoice_origin)]) if s.invoice_origin else []
|
||||
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 and s.name.find('/') > -1:
|
||||
return 'УПД № ' + s.name[len(s.name) - 4:]
|
||||
return 'УПД № ' + str(s.name) if s.name else ''
|
||||
|
||||
|
||||
def get_delivery_doc_date(self):
|
||||
for s in self:
|
||||
if s:
|
||||
delivery_dates = []
|
||||
pickings = []
|
||||
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:
|
||||
if p.date_done:
|
||||
formatted_date = datetime.strftime(p.date, '%d.%m.%Y')
|
||||
pickings.append(formatted_date)
|
||||
if pickings and len(pickings)>0:
|
||||
delivery_dates.append(';'.join(pickings))
|
||||
else:
|
||||
if s.date:
|
||||
delivery_dates.append(datetime.strftime(s.date, '%d.%m.%Y'))
|
||||
return delivery_dates
|
||||
|
||||
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
|
||||
|
||||
|
||||
29
l10n_ru_doc/models/account_move_line.py
Normal file
29
l10n_ru_doc/models/account_move_line.py
Normal file
@ -0,0 +1,29 @@
|
||||
from datetime import datetime
|
||||
from odoo import api, fields, models
|
||||
|
||||
class AccountMoveLine(models.Model):
|
||||
_inherit = 'account.move.line'
|
||||
|
||||
price_total_pf = fields.Monetary(
|
||||
string='TotalPF',
|
||||
compute='_compute_totals',
|
||||
currency_field='currency_id',
|
||||
)
|
||||
|
||||
@api.depends('quantity', 'discount', 'price_unit', 'tax_ids', 'currency_id')
|
||||
def _compute_totals(self):
|
||||
super(AccountMoveLine,self)._compute_totals()
|
||||
for line in self:
|
||||
line_discount_price_unit = line.price_unit * (1 - (line.discount / 100.0))
|
||||
if line.tax_ids.filtered(lambda tax: tax.invisiblePF == False):
|
||||
taxes_res = line.tax_ids.filtered(lambda tax: tax.invisiblePF == False).compute_all(
|
||||
line_discount_price_unit,
|
||||
quantity=line.quantity,
|
||||
currency=line.currency_id,
|
||||
product=line.product_id,
|
||||
partner=line.partner_id,
|
||||
is_refund=line.is_refund,
|
||||
)
|
||||
line.price_total_pf = taxes_res['total_included']
|
||||
else:
|
||||
line.price_total_pf = line.price_total
|
||||
5
l10n_ru_doc/models/product.py
Normal file
5
l10n_ru_doc/models/product.py
Normal file
@ -0,0 +1,5 @@
|
||||
from odoo import fields, models
|
||||
|
||||
class ProductTnved(models.Model):
|
||||
_inherit = 'product.product'
|
||||
kod_tnved = fields.Char('Код ТНВЭД')
|
||||
19
l10n_ru_doc/models/res_bank.py
Normal file
19
l10n_ru_doc/models/res_bank.py
Normal file
@ -0,0 +1,19 @@
|
||||
from odoo import api, fields, models
|
||||
|
||||
class Bank(models.Model):
|
||||
_inherit = 'res.bank'
|
||||
|
||||
corr_acc = fields.Char('Corresponding account', size=64)
|
||||
|
||||
|
||||
class ResPartnerBank(models.Model):
|
||||
_inherit = 'res.partner.bank'
|
||||
|
||||
bank_corr_acc = fields.Char('Corresponding account', size=64)
|
||||
|
||||
@api.onchange('bank_id')
|
||||
def onchange_bank_id(self):
|
||||
for s in self:
|
||||
s.bank_name = s.bank_id.name
|
||||
s.bank_bic = s.bank_id.bic
|
||||
s.bank_corr_acc = s.bank_id.corr_acc
|
||||
18
l10n_ru_doc/models/res_company.py
Normal file
18
l10n_ru_doc/models/res_company.py
Normal file
@ -0,0 +1,18 @@
|
||||
from odoo import fields, models
|
||||
|
||||
class Company(models.Model):
|
||||
_inherit = 'res.company'
|
||||
|
||||
inn = fields.Char(related='partner_id.inn', readonly=False)
|
||||
kpp = fields.Char(related='partner_id.kpp', readonly=False)
|
||||
okpo = fields.Char(related='partner_id.okpo', readonly=False)
|
||||
chief_id = fields.Many2one('res.users', 'Chief')
|
||||
accountant_id = fields.Many2one('res.users', 'General Accountant')
|
||||
print_facsimile = fields.Boolean(string='Print Facsimile',
|
||||
help="Check this for adding Facsimiles of responsible persons to documents.")
|
||||
print_stamp = fields.Boolean(string='Print Stamp',
|
||||
help="Check this for adding Stamp of company to documents.")
|
||||
stamp = fields.Binary("Stamp")
|
||||
print_anywhere = fields.Boolean(string='Print Anywhere',
|
||||
help="Uncheck this, if you want add Facsimile and Stamp only in email.",
|
||||
default=True)
|
||||
11
l10n_ru_doc/models/res_partner.py
Normal file
11
l10n_ru_doc/models/res_partner.py
Normal file
@ -0,0 +1,11 @@
|
||||
from odoo import fields, models
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
inn = fields.Char('INN', related='vat')
|
||||
kpp = fields.Char('KPP', size=9)
|
||||
okpo = fields.Char('OKPO', size=14)
|
||||
ogrn = fields.Char('ОГРН')
|
||||
type = fields.Selection(selection_add=[('director', 'Директор'), ('accountant', 'Бухгалтер')])
|
||||
facsimile = fields.Binary("Подпись")
|
||||
stamp = fields.Binary("Печать")
|
||||
7
l10n_ru_doc/models/res_users.py
Normal file
7
l10n_ru_doc/models/res_users.py
Normal file
@ -0,0 +1,7 @@
|
||||
from odoo import fields, models
|
||||
|
||||
class Users(models.Model):
|
||||
_inherit = 'res.users'
|
||||
|
||||
print_facsimile = fields.Boolean(related='company_id.print_facsimile')
|
||||
facsimile = fields.Binary()
|
||||
73
l10n_ru_doc/models/sale.py
Normal file
73
l10n_ru_doc/models/sale.py
Normal file
@ -0,0 +1,73 @@
|
||||
from odoo import models, fields, api
|
||||
from datetime import datetime
|
||||
import re
|
||||
from pytils import numeral, dt
|
||||
from odoo.tools import pycompat
|
||||
|
||||
|
||||
class SaleOrder(models.Model):
|
||||
_inherit = 'sale.order'
|
||||
|
||||
amount_total_words = fields.Char(
|
||||
string='Сумма прописью',
|
||||
compute='_compute_amount_total_words',
|
||||
store=True
|
||||
)
|
||||
|
||||
chief_initials = fields.Char(
|
||||
string='Инициалы руководителя',
|
||||
compute='_compute_chief_initials',
|
||||
store=True
|
||||
)
|
||||
|
||||
accountant_initials = fields.Char(
|
||||
string='Инициалы бухгалтера',
|
||||
compute='_compute_accountant_initials',
|
||||
store=True
|
||||
)
|
||||
|
||||
@api.depends('company_id.chief_id.name')
|
||||
def _compute_chief_initials(self):
|
||||
for order in self:
|
||||
if order.company_id and order.company_id.chief_id:
|
||||
order.chief_initials = self._get_initials(order.company_id.chief_id.name)
|
||||
else:
|
||||
order.chief_initials = ''
|
||||
|
||||
@api.depends('company_id.accountant_id.name')
|
||||
def _compute_accountant_initials(self):
|
||||
for order in self:
|
||||
if order.company_id and order.company_id.accountant_id:
|
||||
order.accountant_initials = self._get_initials(order.company_id.accountant_id.name)
|
||||
else:
|
||||
order.accountant_initials = ''
|
||||
|
||||
def _get_initials(self, fio):
|
||||
if fio:
|
||||
# fio.split()[0]
|
||||
# [fio[0:1]+'.' for fio in fio.split()[1:]]
|
||||
return (fio.split()[0] + ' ' + ''.join([part[0:1] + '.' for part in fio.split()[1:]])).strip()
|
||||
return ''
|
||||
|
||||
@api.depends('amount_total')
|
||||
def _compute_amount_total_words(self):
|
||||
for order in self:
|
||||
if order.amount_total:
|
||||
order.amount_total_words = self.rubles(order.amount_total)
|
||||
else:
|
||||
order.amount_total_words = ''
|
||||
|
||||
def rubles(self, sum_amount):
|
||||
rub = int(sum_amount)
|
||||
kop = int(round((sum_amount - rub) * 100))
|
||||
|
||||
text_rubles = numeral.rubles(rub)
|
||||
text_copeck = numeral.choose_plural(kop, ("копейка", "копейки", "копеек"))
|
||||
text_rubles = text_rubles[0].upper() + text_rubles[1:]
|
||||
|
||||
return ("%s %02d %s") % (text_rubles, kop, text_copeck)
|
||||
|
||||
def print_quotation(self):
|
||||
self.filtered(lambda s: s.state == 'draft').write({'state': 'sent'})
|
||||
return self.env['report'].get_action(self, 'l10n_ru_doc.report_order')
|
||||
|
||||
6
l10n_ru_doc/models/tax.py
Normal file
6
l10n_ru_doc/models/tax.py
Normal file
@ -0,0 +1,6 @@
|
||||
from odoo import fields, models
|
||||
|
||||
class TaxInherit(models.Model):
|
||||
_inherit = 'account.tax'
|
||||
|
||||
invisiblePF = fields.Boolean('Не видно в ПФ')
|
||||
4
l10n_ru_doc/models/uom.py
Normal file
4
l10n_ru_doc/models/uom.py
Normal file
@ -0,0 +1,4 @@
|
||||
from odoo import fields, models
|
||||
class UomInherit(models.Model):
|
||||
_inherit = 'uom.uom'
|
||||
kod = fields.Char('Код единицы измерения')
|
||||
Reference in New Issue
Block a user