104 lines
3.6 KiB
Python
104 lines
3.6 KiB
Python
from odoo import api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class AccountMoveTemplateWizardLine(models.TransientModel):
|
|
_name = 'account.move.template.wizard.line'
|
|
_description = 'Черновая строка визарда шаблона'
|
|
|
|
wizard_id = fields.Many2one(
|
|
comodel_name='account.move.template.wizard',
|
|
required=True,
|
|
ondelete='cascade',
|
|
)
|
|
account_id = fields.Many2one(
|
|
comodel_name='account.account',
|
|
string='Счёт',
|
|
required=True,
|
|
)
|
|
move_type = fields.Selection(
|
|
selection=[('debit', 'Дебет'), ('credit', 'Кредит')],
|
|
string='Сторона',
|
|
required=True,
|
|
)
|
|
amount = fields.Float(
|
|
string='Сумма',
|
|
digits=(16, 2),
|
|
)
|
|
|
|
|
|
class AccountMoveTemplateWizard(models.TransientModel):
|
|
_name = 'account.move.template.wizard'
|
|
_description = 'Визард создания проводки по шаблону'
|
|
|
|
res_model = fields.Char(string='Модель документа', required=True)
|
|
res_id = fields.Integer(string='ID документа', required=True)
|
|
template_id = fields.Many2one(
|
|
comodel_name='account.move.template',
|
|
string='Шаблон',
|
|
)
|
|
amount = fields.Float(
|
|
string='Базовая сумма',
|
|
digits=(16, 2),
|
|
)
|
|
draft_line_ids = fields.One2many(
|
|
comodel_name='account.move.template.wizard.line',
|
|
inverse_name='wizard_id',
|
|
string='Черновые строки',
|
|
)
|
|
|
|
@api.onchange('template_id', 'amount')
|
|
def _onchange_compute_draft_lines(self):
|
|
"""Recompute draft lines when template or amount changes."""
|
|
self.draft_line_ids = [(5, 0, 0)] # clear existing
|
|
if not self.template_id or not self.amount:
|
|
return
|
|
lines = []
|
|
for tpl_line in self.template_id.line_ids:
|
|
line_amount = self.amount * tpl_line.percent / 100.0
|
|
lines.append((0, 0, {
|
|
'account_id': tpl_line.account_id.id,
|
|
'move_type': tpl_line.move_type,
|
|
'amount': line_amount,
|
|
}))
|
|
self.draft_line_ids = lines
|
|
|
|
def action_post(self):
|
|
"""Create account.move from draft lines and link to source document."""
|
|
self.ensure_one()
|
|
if not self.template_id or not self.amount:
|
|
raise UserError('Необходимо выбрать шаблон и указать базовую сумму.')
|
|
|
|
try:
|
|
# Build move lines
|
|
move_line_vals = []
|
|
for draft_line in self.draft_line_ids:
|
|
if draft_line.move_type == 'debit':
|
|
debit = draft_line.amount
|
|
credit = 0.0
|
|
else:
|
|
debit = 0.0
|
|
credit = draft_line.amount
|
|
move_line_vals.append((0, 0, {
|
|
'account_id': draft_line.account_id.id,
|
|
'debit': debit,
|
|
'credit': credit,
|
|
'name': self.template_id.name,
|
|
}))
|
|
|
|
# Create the move
|
|
move = self.env['account.move'].create({
|
|
'move_type': 'entry',
|
|
'state': 'draft',
|
|
'line_ids': move_line_vals,
|
|
})
|
|
|
|
# Link move to source document via move_ids
|
|
source_record = self.env[self.res_model].browse(self.res_id)
|
|
source_record.move_ids = [(4, move.id)]
|
|
|
|
except Exception as e:
|
|
raise UserError(f'Ошибка при создании проводки: {str(e)}') from e
|
|
|
|
return {'type': 'ir.actions.act_window_close'}
|