Files
odoo_source/addons/purchase
Renaud Thiry 79e9665a49 [IMP] mail: improve Composer duplicates check
Only duplicate emails used to be checked when sending a mass mail.

However it is possible (e.g. using templates) to send a mass mail
to the same person containing different information.

The existing functions to allow models to specify emails
processed in the past by some other means are kept.

A new check is added in the processing that checks the full contents
of the message, subject and attachment ids.

The strings are not hashed as most situations are:
- Sending the exact same mail to everyone
  -> Only need to check against one message
   -> Same complexity as hashing

- Sending all different emails
  -> Checking inequality of str is usually very fast

For attachments, as we cannot compare them easily.
They are ignored for the purpose of equating emails
whenever there are the same number of attachments
in the email values as there are on the composer.

This is because each email should receive its own copy
of the composer attachments. If they have a different
number of attachments, they were generated dynamically
through reports and we assume they are all different.

We can thus remove the 'document based' information
as it is implicitly infered from this check.

-------------------------

Test utils are also updated for two purposes:

1. Add optional body and attachment_name discriminents
assertMailMail assumed all emails could at least be
differentiated by subject. Our test breaks that
assumption, so we use body and attachment to find the
best-fitting email based on the data passed in.

2. Check email_formatted on recipients
When using assertMailMailWEmails, we first find the
email using the non-formatted email of the recipient.
This does not match assertSentMail which checks against
the raw email_to value, which would often be formatted.

Task-2826811

closes odoo/odoo#99541

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
2023-09-18 22:16:56 +00:00
..
…
…

Odoo Supply Chain

Automate requisition-to-pay, control invoicing with the Odoo Open Source Supply Chain.

Automate procurement propositions, launch request for quotations, track purchase orders, manage vendors' information, control products reception and check vendors' invoices.

Automated Procurement Propositions

Reduce inventory level with procurement rules. Get the right purchase proposition at the right time to reduce your inventory level. Improve your purchase and inventory performance with procurement rules depending on stock levels, logistic rules, sales orders, forecasted manufacturing orders, etc.

Send requests for quotations or purchase orders to your vendor in one click. Get access to product receptions and invoices from your purchase order.

Purchase Tenders

Launch purchase tenders, integrate vendor's answers in the process and compare propositions. Choose the best offer and send purchase orders easily. Use reporting to analyse the quality of your vendors afterwards.

Email integrations

Integrate all vendor's communications on the purchase orders (or RfQs) to get a strong traceability on the negotiation or after sales service issues. Use the claim management module to track issues related to vendors.

Standard Price, Average Price, FIFO

Use the costing method that reflects your business: standard price, average price, fifo or lifo. Get your accounting entries and the right inventory valuation in real-time; Odoo manages everything for you, transparently.

Import Vendor Pricelists

Take smart purchase decisions using the best prices. Easily import vendor's pricelists to make smarter purchase decisions based on promotions, prices depending on quantities and special contract conditions. You can even base your sale price depending on your vendor's prices.

Control Products and Invoices

No product or order is left behind, the inventory control allows you to manage back orders, refunds, product reception and quality control. Choose the right control method according to your need.

Control vendor bills with no effort. Choose the right method according to your need: pre-generate draft invoices based on purchase orders, on products receptions, create invoices manually and import lines from purchase orders, etc.