diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/account/wizard/account_invoice_send.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/account/wizard/account_invoice_send.py')
| -rw-r--r-- | addons/account/wizard/account_invoice_send.py | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/addons/account/wizard/account_invoice_send.py b/addons/account/wizard/account_invoice_send.py new file mode 100644 index 00000000..b9aae09e --- /dev/null +++ b/addons/account/wizard/account_invoice_send.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ +from odoo.addons.mail.wizard.mail_compose_message import _reopen +from odoo.exceptions import UserError +from odoo.tools.misc import get_lang + + +class AccountInvoiceSend(models.TransientModel): + _name = 'account.invoice.send' + _inherits = {'mail.compose.message':'composer_id'} + _description = 'Account Invoice Send' + + is_email = fields.Boolean('Email', default=lambda self: self.env.company.invoice_is_email) + invoice_without_email = fields.Text(compute='_compute_invoice_without_email', string='invoice(s) that will not be sent') + is_print = fields.Boolean('Print', default=lambda self: self.env.company.invoice_is_print) + printed = fields.Boolean('Is Printed', default=False) + invoice_ids = fields.Many2many('account.move', 'account_move_account_invoice_send_rel', string='Invoices') + composer_id = fields.Many2one('mail.compose.message', string='Composer', required=True, ondelete='cascade') + template_id = fields.Many2one( + 'mail.template', 'Use template', index=True, + domain="[('model', '=', 'account.move')]" + ) + + @api.model + def default_get(self, fields): + res = super(AccountInvoiceSend, self).default_get(fields) + res_ids = self._context.get('active_ids') + + invoices = self.env['account.move'].browse(res_ids).filtered(lambda move: move.is_invoice(include_receipts=True)) + if not invoices: + raise UserError(_("You can only send invoices.")) + + composer = self.env['mail.compose.message'].create({ + 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + }) + res.update({ + 'invoice_ids': res_ids, + 'composer_id': composer.id, + }) + return res + + @api.onchange('invoice_ids') + def _compute_composition_mode(self): + for wizard in self: + wizard.composer_id.composition_mode = 'comment' if len(wizard.invoice_ids) == 1 else 'mass_mail' + + @api.onchange('template_id') + def onchange_template_id(self): + for wizard in self: + if wizard.composer_id: + wizard.composer_id.template_id = wizard.template_id.id + wizard._compute_composition_mode() + wizard.composer_id.onchange_template_id_wrapper() + + @api.onchange('is_email') + def onchange_is_email(self): + if self.is_email: + res_ids = self._context.get('active_ids') + if not self.composer_id: + self.composer_id = self.env['mail.compose.message'].create({ + 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + 'template_id': self.template_id.id + }) + else: + self.composer_id.composition_mode = 'comment' if len(res_ids) == 1 else 'mass_mail' + self.composer_id.template_id = self.template_id.id + self._compute_composition_mode() + self.composer_id.onchange_template_id_wrapper() + + @api.onchange('is_email') + def _compute_invoice_without_email(self): + for wizard in self: + if wizard.is_email and len(wizard.invoice_ids) > 1: + invoices = self.env['account.move'].search([ + ('id', 'in', self.env.context.get('active_ids')), + ('partner_id.email', '=', False) + ]) + if invoices: + wizard.invoice_without_email = "%s\n%s" % ( + _("The following invoice(s) will not be sent by email, because the customers don't have email address."), + "\n".join([i.name for i in invoices]) + ) + else: + wizard.invoice_without_email = False + else: + wizard.invoice_without_email = False + + def _send_email(self): + if self.is_email: + # with_context : we don't want to reimport the file we just exported. + self.composer_id.with_context(no_new_invoice=True, mail_notify_author=self.env.user.partner_id in self.composer_id.partner_ids).send_mail() + if self.env.context.get('mark_invoice_as_sent'): + #Salesman send posted invoice, without the right to write + #but they should have the right to change this flag + self.mapped('invoice_ids').sudo().write({'is_move_sent': True}) + + def _print_document(self): + """ to override for each type of models that will use this composer.""" + self.ensure_one() + action = self.invoice_ids.action_invoice_print() + action.update({'close_on_report_download': True}) + return action + + def send_and_print_action(self): + self.ensure_one() + # Send the mails in the correct language by splitting the ids per lang. + # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. + # basically self.body (which could be manually edited) extracts self.template_id, + # which is then not translated for each customer. + if self.composition_mode == 'mass_mail' and self.template_id: + active_ids = self.env.context.get('active_ids', self.res_id) + active_records = self.env[self.model].browse(active_ids) + langs = active_records.mapped('partner_id.lang') + default_lang = get_lang(self.env) + for lang in (set(langs) or [default_lang]): + active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids + self_lang = self.with_context(active_ids=active_ids_lang, lang=lang) + self_lang.onchange_template_id() + self_lang._send_email() + else: + self._send_email() + if self.is_print: + return self._print_document() + return {'type': 'ir.actions.act_window_close'} + + def save_as_template(self): + self.ensure_one() + self.composer_id.save_as_template() + self.template_id = self.composer_id.template_id.id + action = _reopen(self, self.id, self.model, context=self._context) + action.update({'name': _('Send Invoice')}) + return action |
