Initial commit: OCA Financial packages (186 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:04 +02:00
commit 3e0e8473fb
8757 changed files with 947473 additions and 0 deletions

View file

@ -0,0 +1,45 @@
# Account Invoice Mass Sending
Odoo addon: account_invoice_mass_sending
## Installation
```bash
pip install odoo-bringout-oca-account-invoicing-account_invoice_mass_sending
```
## Dependencies
This addon depends on:
- account
- queue_job
## Manifest Information
- **Name**: Account Invoice Mass Sending
- **Version**: 16.0.1.1.4
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/account-invoicing](https://github.com/OCA/account-invoicing) branch 16.0, addon `account_invoice_mass_sending`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,103 @@
============================
Account Invoice Mass Sending
============================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1cfd27474a75a005e8431445f0e0a7e4bb0b7ad9da86e4f8d35ea55d8338b3a0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github
:target: https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_mass_sending
:alt: OCA/account-invoicing
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-invoicing-16-0/account-invoicing-16-0-account_invoice_mass_sending
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/account-invoicing&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds a mass sending feature on invoices, using asynchronous jobs.
**Table of contents**
.. contents::
:local:
Configuration
=============
queue_job module needs to be configured, see the module `documentation <https://github.com/OCA/queue/tree/16.0/queue_job>`_
Usage
=====
On the invoices list view, select the invoices to send and click on 'Action > Send & print'.
In the wizard select the 'Email' checkbox and a template then click on 'Email mass sending (Job Queue)'
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-invoicing/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_mass_sending%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* ACSONE SA/NV
* Open Net Sàrl
Contributors
~~~~~~~~~~~~
* Thomas Binsfeld <thomas.binsfeld@acsone.eu>
* Denis Robinet <denis.robinet@acsone.eu>
* Julien Guenat <jgu@open-net.ch>
* Alberto Nieto de Pablos <alberto.nieto@braintec.com> (https://braintec.com)
* `Tecnativa <https://www.tecnativa.com>`__:
* Sergio Teruel
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-jguenat| image:: https://github.com/jguenat.png?size=40px
:target: https://github.com/jguenat
:alt: jguenat
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-jguenat|
This module is part of the `OCA/account-invoicing <https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_mass_sending>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
from . import models
from . import wizards

View file

@ -0,0 +1,24 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Account Invoice Mass Sending",
"summary": """
This addon adds a mass sending feature on invoices.""",
"version": "16.0.1.1.4",
"license": "AGPL-3",
"author": "ACSONE SA/NV, Odoo Community Association (OCA), Open Net Sàrl",
"website": "https://github.com/OCA/account-invoicing",
"depends": [
# ODOO
"account",
# OCA
"queue_job",
],
"data": [
"data/queue_job.xml",
"views/account_invoice_views.xml",
"wizards/account_invoice_send.xml",
],
"maintainers": ["jguenat"],
}

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Queue Job Channel -->
<record id="account_invoice_mass_sending_channel" model="queue.job.channel">
<field name="name">account_invoice_mass_sending_channel</field>
<field name="parent_id" ref="queue_job.channel_root" />
</record>
<!-- Queue Job Function -->
<record id="account_invoice_mass_sending_function" model="queue.job.function">
<field name="model_id" ref="account.model_account_move" />
<field name="method">_send_invoice_individually</field>
<field name="channel_id" ref="account_invoice_mass_sending_channel" />
</record>
</odoo>

View file

@ -0,0 +1,76 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_mass_sending
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_invoice_send
msgid "Account Invoice Send"
msgstr ""
#. module: account_invoice_mass_sending
#: model_terms:ir.ui.view,arch_db:account_invoice_mass_sending.account_invoice_send_wizard_form
msgid "Email mass sending (Job Queue)"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid ""
"If checked, the invoice is already being processed, and it will prevent the "
"sending of a duplicated mail."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"Invoices %(ineligible_invoices)s were already in processing or do not have "
"an email address defined."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid "Invoices: Mass sending"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/models/account_move.py:0
#, python-format
msgid "Send invoice %(name)s by email"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid "Sending In Progress"
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"The sending of %(invoices_count)d invoices will be processed in background."
msgstr ""

View file

@ -0,0 +1,76 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_mass_sending
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_invoice_send
msgid "Account Invoice Send"
msgstr "Slanje računa"
#. module: account_invoice_mass_sending
#: model_terms:ir.ui.view,arch_db:account_invoice_mass_sending.account_invoice_send_wizard_form
msgid "Email mass sending (Job Queue)"
msgstr "Masovno slanje e-pošte (red zadataka)"
#. module: account_invoice_mass_sending
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid ""
"If checked, the invoice is already being processed, and it will prevent the "
"sending of a duplicated mail."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"Invoices %(ineligible_invoices)s were already in processing or do not have "
"an email address defined."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid "Invoices: Mass sending"
msgstr "Fakture: masovno slanje"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_move
msgid "Journal Entry"
msgstr "Žurnal"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/models/account_move.py:0
#, python-format
msgid "Send invoice %(name)s by email"
msgstr "Pošalji fakturu %(name)s e-poštom"
#. module: account_invoice_mass_sending
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid "Sending In Progress"
msgstr "Slanje u toku"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"The sending of %(invoices_count)d invoices will be processed in background."
msgstr ""

View file

@ -0,0 +1,77 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_mass_sending
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_invoice_send
msgid "Account Invoice Send"
msgstr ""
#. module: account_invoice_mass_sending
#: model_terms:ir.ui.view,arch_db:account_invoice_mass_sending.account_invoice_send_wizard_form
msgid "Email mass sending (Job Queue)"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid ""
"If checked, the invoice is already being processed, and it will prevent the "
"sending of a duplicated mail."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"Invoices %(ineligible_invoices)s were already in processing or do not have "
"an email address defined."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid "Invoices: Mass sending"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/models/account_move.py:0
#, python-format
msgid "Send invoice %(name)s by email"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid "Sending In Progress"
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"The sending of %(invoices_count)d invoices will be processed in background."
msgstr ""

View file

@ -0,0 +1,124 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_mass_sending
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-09-03 13:39+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_invoice_send
msgid "Account Invoice Send"
msgstr "Cuenta de Envío de factura"
#. module: account_invoice_mass_sending
#: model_terms:ir.ui.view,arch_db:account_invoice_mass_sending.account_invoice_send_wizard_form
msgid "Email mass sending (Job Queue)"
msgstr "Envío masivo de correo electrónico (cola de trabajo)"
#. module: account_invoice_mass_sending
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid ""
"If checked, the invoice is already being processed, and it will prevent the "
"sending of a duplicated mail."
msgstr ""
"Si está marcado, la factura ya se está procesando, y evitará el envío de un "
"email duplicado."
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"Invoices %(ineligible_invoices)s were already in processing or do not have "
"an email address defined."
msgstr ""
"Las facturas %(ineligible_invoices)s ya se estaban procesando o no tienen "
"una dirección de correo electrónico definida."
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid "Invoices: Mass sending"
msgstr "Facturas: Envío masivo"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_move
msgid "Journal Entry"
msgstr "Asiento contable"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/models/account_move.py:0
#, python-format
msgid "Send invoice %(name)s by email"
msgstr "Enviar factura a %(name)s por correo electrónico"
#. module: account_invoice_mass_sending
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid "Sending In Progress"
msgstr "Envío en progreso"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"The sending of %(invoices_count)d invoices will be processed in background."
msgstr "El envío de %(invoices_count)d facturas se procesará en segundo plano."
#~ msgid "Display Name"
#~ msgstr "Nombre mostrado"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Última modificación el"
#, python-format
#~ msgid "Invoices: Send & Print"
#~ msgstr "Facturas: Enviar & Imprimir"
#~ msgid "Mass Send & Print"
#~ msgstr "Enviar & Imprimir"
#, python-format
#~ msgid "Missing email address on customer {customer_name}."
#~ msgstr ""
#~ "Falta la dirección de correo electrónico del cliente {customer_name}."
#, python-format
#~ msgid ""
#~ "The sending of {in_progress_invoices_count} invoices is already in "
#~ "progress."
#~ msgstr ""
#~ "El envío de {in_progress_invoices_count} facturas ya está en progreso."
#, python-format
#~ msgid ""
#~ "The sending of {invoices_count} invoices will be processed in background."
#~ msgstr ""
#~ "El envío de {invoices_count} facturas se procesará en segundo plano."
#~ msgid "Invoice"
#~ msgstr "Factura"
#, python-format
#~ msgid "Missing email address on customer '{customer_name}'."
#~ msgstr "Falta la dirección de email en el cliente '{customer_name}'."

View file

@ -0,0 +1,106 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_mass_sending
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-02 11:52+0000\n"
"PO-Revision-Date: 2019-04-02 11:52+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_invoice_send
msgid "Account Invoice Send"
msgstr ""
#. module: account_invoice_mass_sending
#: model_terms:ir.ui.view,arch_db:account_invoice_mass_sending.account_invoice_send_wizard_form
msgid "Email mass sending (Job Queue)"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid ""
"If checked, the invoice is already being processed, and it will prevent the "
"sending of a duplicated mail."
msgstr ""
"Si cette case est cochée, la facture est déjà en cours de traitement et "
"empêchera l'envoi d'un courrier dupliqué."
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"Invoices %(ineligible_invoices)s were already in processing or do not have "
"an email address defined."
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid "Invoices: Mass sending"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/models/account_move.py:0
#, python-format
msgid "Send invoice %(name)s by email"
msgstr ""
#. module: account_invoice_mass_sending
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid "Sending In Progress"
msgstr "Envoi en cours"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"The sending of %(invoices_count)d invoices will be processed in background."
msgstr ""
#, python-format
#~ msgid "Invoices: Send & Print"
#~ msgstr "Factures: Envoyer & Imprimer"
#~ msgid "Mass Send & Print"
#~ msgstr "Mass Envoyer & Imprimer"
#, python-format
#~ msgid ""
#~ "The sending of {in_progress_invoices_count} invoices is already in "
#~ "progress."
#~ msgstr "L'envoi de {in_progress_invoices_count} factures est déjà en cours."
#, python-format
#~ msgid ""
#~ "The sending of {invoices_count} invoices will be processed in background."
#~ msgstr "Lenvoi de {invoices_count} sera traité en arrière-plan."
#~ msgid "Invoice"
#~ msgstr "Facture"
#, python-format
#~ msgid "Missing email address on customer '{customer_name}'."
#~ msgstr "Courriel manquant pour le client '{customer_name}'."

View file

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_mass_sending
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-18 13:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_invoice_send
msgid "Account Invoice Send"
msgstr "Conto invio fattura"
#. module: account_invoice_mass_sending
#: model_terms:ir.ui.view,arch_db:account_invoice_mass_sending.account_invoice_send_wizard_form
msgid "Email mass sending (Job Queue)"
msgstr "Spedizione e-mail di massa (coda lavoro)"
#. module: account_invoice_mass_sending
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,help:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid ""
"If checked, the invoice is already being processed, and it will prevent the "
"sending of a duplicated mail."
msgstr ""
"Se selezionata, la fattura è già stata elaborata e preverrà la spedizione di "
"una e-mail duplicata."
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"Invoices %(ineligible_invoices)s were already in processing or do not have "
"an email address defined."
msgstr ""
"Le fatture %(ineligible_invoices)s sono già in elaborazione o non hanno un "
"indirizzo e-mail definito."
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid "Invoices: Mass sending"
msgstr "Fatture: spedizione di massa"
#. module: account_invoice_mass_sending
#: model:ir.model,name:account_invoice_mass_sending.model_account_move
msgid "Journal Entry"
msgstr "Registrazione contabile"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/models/account_move.py:0
#, python-format
msgid "Send invoice %(name)s by email"
msgstr "Invio fattura %(name)s per e-mail"
#. module: account_invoice_mass_sending
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_bank_statement_line__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_move__sending_in_progress
#: model:ir.model.fields,field_description:account_invoice_mass_sending.field_account_payment__sending_in_progress
msgid "Sending In Progress"
msgstr "Spedizione in corso"
#. module: account_invoice_mass_sending
#. odoo-python
#: code:addons/account_invoice_mass_sending/wizards/account_invoice_send.py:0
#, python-format
msgid ""
"The sending of %(invoices_count)d invoices will be processed in background."
msgstr ""
"La spedizione di %(invoices_count)d fatture verrà elaborata in background."

View file

@ -0,0 +1,69 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, fields, models
class AccountInvoice(models.Model):
_inherit = "account.move"
sending_in_progress = fields.Boolean(
default=False,
help="If checked, the invoice is already being processed, "
"and it will prevent the sending of a duplicated mail.",
)
def mass_sending(self, template=None):
"""
This method triggers the asynchronous sending for the selected
invoices for which there is no asynchronous sending in progress
and an email address is defined.
"""
invoices_to_send = self.filtered(
lambda i: not i.sending_in_progress and i.partner_id.email
)
if invoices_to_send:
invoices_to_send.write(
{
"sending_in_progress": True,
}
)
for invoice in invoices_to_send:
description = _("Send invoice %(name)s by email", name=invoice.name)
invoice.with_delay(
description=description,
channel="root.account_invoice_mass_sending_channel",
)._send_invoice_individually(template=template)
return invoices_to_send
def _send_invoice_individually(self, template=None):
self.ensure_one()
res = self.action_invoice_sent()
wiz_ctx = res["context"] or {}
wiz_ctx.update(
{
"active_model": self._name,
# Setting both active_id and active_ids is required,
# mimicking how direct call to ir.actions.act_window works
"active_ids": self.ids,
"active_id": self.id,
"discard_logo_check": True,
"account_invoice_mass_sending": True,
}
)
wiz = self.env["account.invoice.send"].with_context(**wiz_ctx).create({})
wiz.write(
{
"is_print": False,
"is_email": True,
"template_id": template.id,
"composition_mode": "comment",
}
)
wiz.onchange_template_id()
self.write(
{
"sending_in_progress": False,
}
)
return wiz.send_and_print_action()

View file

@ -0,0 +1 @@
queue_job module needs to be configured, see the module `documentation <https://github.com/OCA/queue/tree/16.0/queue_job>`_

View file

@ -0,0 +1,7 @@
* Thomas Binsfeld <thomas.binsfeld@acsone.eu>
* Denis Robinet <denis.robinet@acsone.eu>
* Julien Guenat <jgu@open-net.ch>
* Alberto Nieto de Pablos <alberto.nieto@braintec.com> (https://braintec.com)
* `Tecnativa <https://www.tecnativa.com>`__:
* Sergio Teruel

View file

@ -0,0 +1 @@
This module adds a mass sending feature on invoices, using asynchronous jobs.

View file

@ -0,0 +1,3 @@
On the invoices list view, select the invoices to send and click on 'Action > Send & print'.
In the wizard select the 'Email' checkbox and a template then click on 'Email mass sending (Job Queue)'

View file

@ -0,0 +1,444 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Account Invoice Mass Sending</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="account-invoice-mass-sending">
<h1 class="title">Account Invoice Mass Sending</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1cfd27474a75a005e8431445f0e0a7e4bb0b7ad9da86e4f8d35ea55d8338b3a0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_mass_sending"><img alt="OCA/account-invoicing" src="https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-invoicing-16-0/account-invoicing-16-0-account_invoice_mass_sending"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-invoicing&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module adds a mass sending feature on invoices, using asynchronous jobs.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>queue_job module needs to be configured, see the module <a class="reference external" href="https://github.com/OCA/queue/tree/16.0/queue_job">documentation</a></p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>On the invoices list view, select the invoices to send and click on Action &gt; Send &amp; print.</p>
<p>In the wizard select the Email checkbox and a template then click on Email mass sending (Job Queue)</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-invoicing/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_mass_sending%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>ACSONE SA/NV</li>
<li>Open Net Sàrl</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul class="simple">
<li>Thomas Binsfeld &lt;<a class="reference external" href="mailto:thomas.binsfeld&#64;acsone.eu">thomas.binsfeld&#64;acsone.eu</a>&gt;</li>
<li>Denis Robinet &lt;<a class="reference external" href="mailto:denis.robinet&#64;acsone.eu">denis.robinet&#64;acsone.eu</a>&gt;</li>
<li>Julien Guenat &lt;<a class="reference external" href="mailto:jgu&#64;open-net.ch">jgu&#64;open-net.ch</a>&gt;</li>
<li>Alberto Nieto de Pablos &lt;<a class="reference external" href="mailto:alberto.nieto&#64;braintec.com">alberto.nieto&#64;braintec.com</a>&gt; (<a class="reference external" href="https://braintec.com">https://braintec.com</a>)</li>
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Sergio Teruel</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/jguenat"><img alt="jguenat" src="https://github.com/jguenat.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_mass_sending">OCA/account-invoicing</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_account_invoice_mass_sending

View file

@ -0,0 +1,175 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.tests import TransactionCase
from odoo.tests.common import tagged
from odoo.addons.queue_job.tests.common import trap_jobs
@tagged("post_install", "-at_install")
class TestAccountInvoiceMassSending(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(
context=dict(
cls.env.context,
mail_create_nolog=True,
mail_create_nosubscribe=True,
mail_notrack=True,
no_reset_password=True,
tracking_disable=True,
)
)
if not cls.env.company.chart_template_id:
# Load a CoA if there's none in current company
coa = cls.env.ref("l10n_generic_coa.configurable_chart_template", False)
if not coa:
# Load the first available CoA
coa = cls.env["account.chart.template"].search(
[("visible", "=", True)], limit=1
)
coa.try_loading(company=cls.env.company, install_demo=False)
cls.wizard_obj = cls.env["account.invoice.send"]
cls.invoice_obj = cls.env["account.move"]
cls.mail_template_obj = cls.env["mail.template"]
cls.partner_with_email = cls.env["res.partner"].create(
{"name": "Test partner 1", "email": "test@mail.com"}
)
cls.partner_without_mail = cls.env["res.partner"].create(
{
"name": "Test partner 2",
}
)
cls.account = cls.env["account.account"].create(
{
"name": "Test account",
"code": "TESTAIMS",
"account_type": "equity",
}
)
cls.first_eligible_invoice = cls.invoice_obj.create(
{
"partner_id": cls.partner_with_email.id,
"move_type": "out_invoice",
"invoice_line_ids": [
(
0,
0,
{
"name": "Test product",
"account_id": cls.account.id,
"price_unit": 20.0,
"quantity": 1.0,
},
),
],
}
)
cls.second_eligible_invoice = cls.invoice_obj.create(
{
"partner_id": cls.partner_with_email.id,
"move_type": "out_invoice",
"invoice_line_ids": [
(
0,
0,
{
"name": "Test product",
"account_id": cls.account.id,
"price_unit": 20.0,
"quantity": 1.0,
},
),
],
}
)
cls.invoice_without_mail = cls.invoice_obj.create(
{
"partner_id": cls.partner_without_mail.id,
"move_type": "out_invoice",
"invoice_line_ids": [
(
0,
0,
{
"name": "Test product",
"account_id": cls.account.id,
"price_unit": 20.0,
"quantity": 1.0,
},
),
],
}
)
cls.invoice_in_progress = cls.invoice_obj.create(
{
"partner_id": cls.partner_with_email.id,
"move_type": "out_invoice",
"sending_in_progress": True,
"invoice_line_ids": [
(
0,
0,
{
"name": "Test product",
"account_id": cls.account.id,
"price_unit": 20.0,
"quantity": 1.0,
},
),
],
}
)
def test_invoice_mass_sending_1(self):
# test two eligible invoice to send
self.invoices = self.first_eligible_invoice + self.second_eligible_invoice
with trap_jobs() as trap:
wizard = self.wizard_obj.with_context(
active_ids=self.invoices.ids,
active_model=self.first_eligible_invoice._name,
discard_logo_check=True,
).create({})
wizard.enqueue_invoices()
trap.assert_jobs_count(2)
def test_invoice_mass_sending_2(self):
# test no invoice to send (one in progress)
with trap_jobs() as trap:
wizard = self.wizard_obj.with_context(
active_ids=self.invoice_in_progress.ids,
active_model=self.invoice_in_progress._name,
discard_logo_check=True,
).create({})
wizard.enqueue_invoices()
trap.assert_jobs_count(0)
def test_invoice_mass_sending_3(self):
# test one invoice to send, one with no mail and one already in progress
self.invoices = (
self.first_eligible_invoice
+ self.invoice_without_mail
+ self.invoice_in_progress
)
with trap_jobs() as trap:
wizard = self.wizard_obj.with_context(
active_ids=self.invoices.ids,
active_model=self.first_eligible_invoice._name,
discard_logo_check=True,
).create({})
wizard.enqueue_invoices()
self.assertTrue(self.first_eligible_invoice.sending_in_progress)
self.assertFalse(self.invoice_without_mail.sending_in_progress)
self.assertTrue(self.invoice_in_progress.sending_in_progress)
trap.assert_jobs_count(1)
trap.assert_enqueued_job(
self.first_eligible_invoice._send_invoice_individually,
kwargs={"template": self.mail_template_obj},
)
trap.perform_enqueued_jobs()
self.assertFalse(self.first_eligible_invoice.sending_in_progress)

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 ACSONE SA/NV
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_move_form" model="ir.ui.view">
<field name="name">Account Invoice Form (in invoice_mass_sending)</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form" />
<field name="arch" type="xml">
<field name="user_id" position="after">
<field name="sending_in_progress" />
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import account_invoice_send

View file

@ -0,0 +1,59 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, models
class AccountInvoiceSend(models.TransientModel):
_inherit = "account.invoice.send"
def enqueue_invoices(self):
active_ids = self._context.get("active_ids")
invoices = self.env["account.move"].browse(active_ids)
invoices_to_send = invoices.mass_sending(self.template_id)
ineligible_invoices = invoices - invoices_to_send
title = _("Invoices: Mass sending")
msg = _(
"The sending of %(invoices_count)d invoices will be processed "
"in background.",
invoices_count=len(invoices_to_send),
)
notification = {
"type": "ir.actions.client",
"tag": "display_notification",
"params": {
"title": title,
"message": msg,
"type": "success",
"next": {"type": "ir.actions.act_window_close"},
},
}
if ineligible_invoices:
invoicelist = [invoice.name for invoice in ineligible_invoices]
warn_msg = _(
"Invoices %(ineligible_invoices)s were already in "
"processing or do not have an email address defined.",
ineligible_invoices=" ".join(invoicelist),
)
notification["params"]["next"].update(
{
"type": "ir.actions.client",
"tag": "display_notification",
"params": {
"title": title,
"message": warn_msg,
"type": "warning",
"sticky": True,
"next": {"type": "ir.actions.act_window_close"},
},
}
)
return notification
@api.onchange("invoice_ids")
def _compute_composition_mode(self):
"""Force send as mass_mail although this module sends each invoice one by one
to avoid extra notificactions"""
if not self.env.context.get("account_invoice_mass_sending", False):
return super()._compute_composition_mode()
for wizard in self:
wizard.composer_id.composition_mode = "mass_mail"

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="account_invoice_send_wizard_form" model="ir.ui.view">
<field name="model">account.invoice.send</field>
<field name="inherit_id" ref="account.account_invoice_send_wizard_form" />
<field name="arch" type="xml">
<button name="send_and_print_action" position="before">
<button
name="enqueue_invoices"
string="Email mass sending (Job Queue)"
type="object"
attrs="{'invisible': ['|',('is_email', '=', False),('template_id', '=', False)]}"
class="btn-primary"
/>
</button>
</field>
</record>
</odoo>

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Account_invoice_mass_sending Module - account_invoice_mass_sending
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for account_invoice_mass_sending. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,6 @@
# Dependencies
This addon depends on:
- [account](../../odoo-bringout-oca-ocb-account)
- [queue_job](../../odoo-bringout-oca-queue-queue_job)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon account_invoice_mass_sending or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-account-invoicing-account_invoice_mass_sending"
# or
uv pip install odoo-bringout-oca-account-invoicing-account_invoice_mass_sending"
```

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in account_invoice_mass_sending.
```mermaid
classDiagram
class account_move
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: account_invoice_mass_sending. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon account_invoice_mass_sending
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon account_invoice_mass_sending
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-oca-account-invoicing-account_invoice_mass_sending"
version = "16.0.0"
description = "Account Invoice Mass Sending -
This addon adds a mass sending feature on invoices."
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-account>=16.0.0",
"odoo-bringout-oca-account-invoicing-queue_job>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["account_invoice_mass_sending"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]