118 lines
5.3 KiB
Python
118 lines
5.3 KiB
Python
from collections import Counter
|
|
|
|
from odoo import _, api, Command, fields, models
|
|
from odoo.exceptions import RedirectWarning, UserError
|
|
|
|
|
|
class AccountMoveSendBatchWizard(models.TransientModel):
|
|
"""Wizard that handles the sending of multiple invoices."""
|
|
_name = 'account.move.send.batch.wizard'
|
|
_inherit = ['account.move.send']
|
|
_description = "Account Move Send Batch Wizard"
|
|
|
|
move_ids = fields.Many2many(comodel_name='account.move', required=True)
|
|
summary_data = fields.Json(compute='_compute_summary_data')
|
|
alerts = fields.Json(compute='_compute_alerts')
|
|
|
|
# -------------------------------------------------------------------------
|
|
# DEFAULTS
|
|
# -------------------------------------------------------------------------
|
|
|
|
@api.model
|
|
def default_get(self, fields_list):
|
|
# EXTENDS 'base'
|
|
results = super().default_get(fields_list)
|
|
if 'move_ids' in fields_list and 'move_ids' not in results:
|
|
move_ids = self._context.get('active_ids', [])
|
|
results['move_ids'] = [Command.set(move_ids)]
|
|
return results
|
|
|
|
# -------------------------------------------------------------------------
|
|
# COMPUTES
|
|
# -------------------------------------------------------------------------
|
|
|
|
@api.depends('move_ids')
|
|
def _compute_summary_data(self):
|
|
extra_edis = self._get_all_extra_edis()
|
|
sending_methods = dict(self.env['res.partner']._fields['invoice_sending_method'].selection)
|
|
sending_methods['manual'] = _('Manually') # in batch sending, everything is done asynchronously, we never "Download"
|
|
|
|
for wizard in self:
|
|
edi_counter = Counter()
|
|
sending_method_counter = Counter()
|
|
|
|
for move in wizard.move_ids:
|
|
edi_counter += Counter([edi for edi in self._get_default_extra_edis(move)])
|
|
sending_settings = self._get_default_sending_settings(move)
|
|
sending_method = next(iter(sending_settings['sending_methods'])) # In batch sending & in 18.0 there can only have !one sending method per move.
|
|
if self._is_applicable_to_move(sending_method, move, **sending_settings):
|
|
sending_method_counter[sending_method] += 1
|
|
|
|
summary_data = dict()
|
|
for edi, edi_count in edi_counter.items():
|
|
summary_data[edi] = {'count': edi_count, 'label': _("by %s", extra_edis[edi]['label'])}
|
|
for sending_method, sending_method_count in sending_method_counter.items():
|
|
summary_data[sending_method] = {'count': sending_method_count, 'label': sending_methods[sending_method]}
|
|
|
|
wizard.summary_data = summary_data
|
|
|
|
@api.depends('summary_data')
|
|
def _compute_alerts(self):
|
|
for wizard in self:
|
|
moves_data = {move: self._get_default_sending_settings(move) for move in wizard.move_ids}
|
|
wizard.alerts = self._get_alerts(wizard.move_ids, moves_data)
|
|
|
|
# -------------------------------------------------------------------------
|
|
# CONSTRAINS
|
|
# -------------------------------------------------------------------------
|
|
|
|
@api.constrains('move_ids')
|
|
def _check_move_ids_constrains(self):
|
|
for wizard in self:
|
|
self._check_move_constrains(wizard.move_ids)
|
|
|
|
# -------------------------------------------------------------------------
|
|
# ACTIONS
|
|
# -------------------------------------------------------------------------
|
|
|
|
def action_send_and_print(self, force_synchronous=False, allow_fallback_pdf=False):
|
|
""" Launch asynchronously the generation and sending of invoices."""
|
|
self.ensure_one()
|
|
if self.alerts:
|
|
self._raise_danger_alerts(self.alerts)
|
|
if force_synchronous:
|
|
self.env['account.move.send']._generate_and_send_invoices(self.move_ids, allow_fallback_pdf=allow_fallback_pdf)
|
|
return
|
|
|
|
account_move_send_cron = self.env.ref('account.ir_cron_account_move_send')
|
|
if not account_move_send_cron.sudo().active:
|
|
if self.env.user.has_group('base.group_system'):
|
|
raise RedirectWarning(
|
|
_("Batch invoice sending is unavailable. Please, activate the cron to enable batch sending of invoices."),
|
|
{
|
|
'views': [(False, 'form')],
|
|
'res_model': 'ir.cron',
|
|
'type': 'ir.actions.act_window',
|
|
'res_id': account_move_send_cron.id,
|
|
'target': 'current',
|
|
},
|
|
_("Go to cron configuration"),
|
|
)
|
|
raise UserError(_("Batch invoice sending is unavailable. Please, contact your system administrator to activate the cron to enable batch sending of invoices."))
|
|
|
|
self.move_ids.sending_data = {
|
|
'author_user_id': self.env.user.id,
|
|
'author_partner_id': self.env.user.partner_id.id,
|
|
}
|
|
account_move_send_cron._trigger()
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'type': 'info',
|
|
'title': _('Sending invoices'),
|
|
'message': _('Invoices are being sent in the background.'),
|
|
'next': {'type': 'ir.actions.act_window_close'},
|
|
},
|
|
}
|