1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/documents_account/models/documents_workflow_rule.py
2024-12-10 09:04:09 +07:00

116 lines
5.6 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
class WorkflowActionRuleAccount(models.Model):
_inherit = ['documents.workflow.rule']
create_model = fields.Selection(selection_add=[('account.move.in_invoice', "Vendor bill"),
('account.move.out_invoice', 'Customer invoice'),
('account.move.in_refund', 'Vendor Credit Note'),
('account.move.out_refund', "Credit note"),
('account.move.entry', "Miscellaneous Operations"),
('account.bank.statement', "Bank Statement"),
('account.move.in_receipt', "Purchase Receipt")])
journal_id = fields.Many2one(
comodel_name='account.journal',
company_dependent=True,
domain="[('id', 'in', suitable_journal_ids)]",
)
suitable_journal_ids = fields.Many2many('account.journal', compute='_compute_suitable_journal_ids')
display_journal_id = fields.Boolean(compute='_compute_suitable_journal_ids')
move_type = fields.Char(compute='_compute_move_type')
@api.constrains('journal_id', 'create_model')
def _check_journal_id(self):
# As journal_id is company_dependant it can't be computed.
# A constrain is used so that it gets default values on
# write/create.
for record in self:
if record.journal_id not in record.suitable_journal_ids:
record.journal_id = record.suitable_journal_ids[:1]
@api.depends('create_model')
def _compute_move_type(self):
for rule in self:
move_type = False
if rule.create_model and (rule.create_model.startswith(('account.move', 'account.bank.statement'))):
move_type = rule.create_model.split('.')[2]
rule.move_type = move_type
@api.depends('move_type')
@api.depends_context('company')
def _compute_suitable_journal_ids(self):
company_journals = self.env['account.journal'].search([
*self.env['account.journal']._check_company_domain(self.env.company),
])
for rule in self:
if company_journals:
if rule.move_type == 'statement':
rule.suitable_journal_ids = company_journals.filtered(lambda journal: journal.type == 'bank')
else:
move = self.env['account.move'].new({'move_type': rule.move_type})
rule.suitable_journal_ids = rule.move_type and move.suitable_journal_ids._origin
rule.display_journal_id = bool(rule.move_type)
else:
rule.suitable_journal_ids = False
rule.display_journal_id = False
def create_record(self, documents=None):
rv = super(WorkflowActionRuleAccount, self).create_record(documents=documents)
if self.create_model.startswith('account.move'):
move = None
invoice_ids = []
# 'entry' are outside of document loop because the actions
# returned could be differents (cfr. l10n_be_soda)
if self.move_type == 'entry':
return self.journal_id.create_document_from_attachment(attachment_ids=documents.attachment_id.ids)
for document in documents:
if document.res_model == 'account.move' and document.res_id:
move = self.env['account.move'].browse(document.res_id)
else:
move = self.journal_id\
.with_context(default_move_type=self.move_type)\
._create_document_from_attachment(attachment_ids=document.attachment_id.id)
partner = self.partner_id or document.partner_id
if partner:
move.partner_id = partner
if move.statement_line_id:
move['suspense_statement_line_id'] = move.statement_line_id.id
invoice_ids.append(move.id)
context = dict(self._context, default_move_type=self.move_type)
action = {
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'name': "Invoices",
'view_id': False,
'view_mode': 'tree',
'views': [(False, "list"), (False, "form")],
'domain': [('id', 'in', invoice_ids)],
'context': context,
}
if len(invoice_ids) == 1:
record = move or self.env['account.move'].browse(invoice_ids[0])
view_id = record.get_formview_id() if record else False
action.update({
'view_mode': 'form',
'views': [(view_id, "form")],
'res_id': invoice_ids[0],
'view_id': view_id,
})
return action
elif self.create_model == 'account.bank.statement':
# only the journal type is checked as journal will be retrieved from
# the bank account later on. Also it is not possible to link the doc
# to the newly created entry as they can be more than one. But importing
# many times the same bank statement is later checked.
default_journal = self.journal_id or self.env['account.journal'].search([('type', '=', 'bank')], limit=1)
return default_journal.create_document_from_attachment(attachment_ids=documents.attachment_id.ids)
return rv