[FIX] snailmail_account: generate snailmail

Current behavior:

If a customer has no email set, creating an invoice for that
customer and clicking on send and print will not generate a snailmail
for the invoice, even if, the checkbox (checkbox_send_by_post) is True.

Expected behavior:

A snailmail should be sent to the customer.

Steps to reproduce:

Using module_account from saas-16.2 to 17.0.

Create a customer invoice for a customer without email > print and
send > check "By Post" > send and print.

Cause of the issue:

The action action_send_and_print defined in account_move_send.py
filters the moves that trigger a mail creation in the var "success".
This variable filters out all moves without a partner_id.email.
This makes perfect sense for emails but not for snailmails.
However, creations of both types of mails are triggered by the
_hook_if_success method taking "success" as an argument.

Fix:

To allow snailmail creations and correctly trigger email creation,
we filter the moves with a partner email after the _hook_if_success
method and only for email creation, not for snailmails.

opw-3668487

closes odoo/odoo#152506

X-original-commit: b17a2c594aed08248c30842c62d2030de3087b51
Signed-off-by: Florian Gilbert (flg) <flg@odoo.com>
Signed-off-by: Lancelot Semal (lase) <lase@odoo.com>
This commit is contained in:
lase@odoo.com
2024-02-06 18:49:05 +00:00
parent 4a0087af5a
commit 6a133f736d
3 changed files with 49 additions and 2 deletions
+2 -2
View File
@@ -501,7 +501,7 @@ class AccountMoveSend(models.TransientModel):
def _send_mails(self, moves_data):
subtype = self.env.ref('mail.mt_comment')
for move, move_data in moves_data.items():
for move, move_data in [(move, move_data) for move, move_data in moves_data.items() if move.partner_id.email]:
mail_template = move_data['mail_template_id']
mail_lang = move_data['mail_lang']
mail_params = self._get_mail_params(move, move_data)
@@ -659,7 +659,7 @@ class AccountMoveSend(models.TransientModel):
self._generate_invoice_fallback_documents(errors)
# Send mail.
success = {move: move_data for move, move_data in moves_data.items() if not move_data.get('error') and move.partner_id.email}
success = {move: move_data for move, move_data in moves_data.items() if not move_data.get('error')}
if success:
self._hook_if_success(success, from_cron=from_cron, allow_fallback_pdf=allow_fallback_pdf)
@@ -1 +1,2 @@
from . import test_pingen_send
from . import test_snailmail_on_invoice
@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import TransactionCase, tagged
from odoo import Command
@tagged('post_install', '-at_install')
class TestSnailmailOnInvoice(TransactionCase):
def test_snailmail_on_invoice_for_partner_without_email(self):
""""
Checks that a snailmail letter is created when one print and send by post a customer invoice
for a partner without email.
"""
partner_without_email = self.env['res.partner'].create({
'name': 'Partner_without_email',
'email': False,
})
product = self.env['product.product'].create({
'name': 'product',
'sale_ok': True,
'standard_price': 100.0,
})
invoice = self.env['account.move'].create({
'move_type': 'out_invoice',
'partner_id': partner_without_email.id,
'invoice_date': '2019-01-01',
'invoice_line_ids': [Command.create({'product_id': product.id})],
})
invoice.action_post()
print_wiz = self.env['account.move.send'].create({
'move_ids': invoice.ids,
'checkbox_download': False,
'checkbox_send_mail': False,
'checkbox_send_by_post': True,
})
print_wiz.action_send_and_print()
letter = self.env['snailmail.letter'].search([
('partner_id', '=', partner_without_email.id),
('model', '=', invoice._name),
('res_id', '=', invoice.id),
], limit=1)
self.assertTrue(letter)