Public release from ruodoo-project: 19.0 - 2026-05-31 21:19:12 UTC
This commit is contained in:
103
account_move_templates/models/account_move_template_wizard.py
Normal file
103
account_move_templates/models/account_move_template_wizard.py
Normal file
@ -0,0 +1,103 @@
|
||||
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'}
|
||||
Reference in New Issue
Block a user