Public release from ruodoo-project: 19.0 - 2026-05-31 21:19:12 UTC

This commit is contained in:
CI Publish Bot
2026-05-31 21:19:21 +00:00
commit aa4214c195
1213 changed files with 183945 additions and 0 deletions

View 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

View 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

View 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

View File

@ -0,0 +1,5 @@
from odoo import fields, models
class ProductTnved(models.Model):
_inherit = 'product.product'
kod_tnved = fields.Char('Код ТНВЭД')

View 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

View 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)

View 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("Печать")

View 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()

View 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')

View File

@ -0,0 +1,6 @@
from odoo import fields, models
class TaxInherit(models.Model):
_inherit = 'account.tax'
invisiblePF = fields.Boolean('Не видно в ПФ')

View File

@ -0,0 +1,4 @@
from odoo import fields, models
class UomInherit(models.Model):
_inherit = 'uom.uom'
kod = fields.Char('Код единицы измерения')