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 @@
# Enqueue sales order invoicing
Odoo addon: sale_order_invoicing_queued
## Installation
```bash
pip install odoo-bringout-oca-account-invoicing-sale_order_invoicing_queued
```
## Dependencies
This addon depends on:
- sale
- queue_job
## Manifest Information
- **Name**: Enqueue sales order invoicing
- **Version**: 16.0.1.0.0
- **Category**: Sales Management
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/account-invoicing](https://github.com/OCA/account-invoicing) branch 16.0, addon `sale_order_invoicing_queued`.
## 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,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 Sale_order_invoicing_queued Module - sale_order_invoicing_queued
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 sale_order_invoicing_queued. 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:
- [sale](../../odoo-bringout-oca-ocb-sale)
- [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 sale_order_invoicing_queued or install in UI.

View file

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

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in sale_order_invoicing_queued.
```mermaid
classDiagram
class sale_order
```
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: sale_order_invoicing_queued. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon sale_order_invoicing_queued
- 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 sale_order_invoicing_queued
```

View file

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

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-account-invoicing-sale_order_invoicing_queued"
version = "16.0.0"
description = "Enqueue sales order invoicing - Odoo addon"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-sale>=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 = ["sale_order_invoicing_queued"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,122 @@
=============================
Enqueue sales order invoicing
=============================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:aba259bf3a3cdba02fda1914c23bfc3f1ae2d803c77ecaa8db3a95ee567ad7f3
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/sale_order_invoicing_queued
: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-sale_order_invoicing_queued
: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 allows to enqueue in several jobs the sales orders invoicing
process to be executed in paralell on background, which is normally done
serially and on foreground.
Jobs are split following the same criteria as standard Odoo: grouping by
order invoicing address and order currency.
**Table of contents**
.. contents::
:local:
Installation
============
This module depends on *queue_job* module that is hosted on
https://github.com/OCA/queue.
It only works in an updated 13.0 version after the 4th of March of 2020,
specifically after the commit https://github.com/odoo/odoo/commit/6f036e758000.
Configuration
=============
Jobs are enqueued in the channel ``root.sale_order_invoicing_queued``,
so you must adjust your Odoo configuration according this.
If you want to see queued jobs, you need "Job Queue / Job Queue Manager"
permission in your user.
Usage
=====
#. Go to *Sales > Invoicing > Orders to Invoice*.
#. Select sales orders whose invoicing you want to enqueue.
#. Click on *Action > Invoice Order*.
#. Click on "Enqueue Invoicing" button.
#. On that moment, jobs will be enqueued on foreground, but the control will
be returned to you after that.
#. Having the "Job Queue Manager" permissions, you can go to the sales order,
and see the tab "Invoicing Jobs". There a list with all the jobs related
to that sales order can be found.
Changelog
=========
16.0.1.0.0 (2024-07-22)
~~~~~~~~~~~~~~~~~~~~~~~
* Migration of the module. Only change was on sale_order_views to add 'group' tag inside the page and not as a field.
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:%20sale_order_invoicing_queued%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
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`__:
* Pedro M. Baeza
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.
This module is part of the `OCA/account-invoicing <https://github.com/OCA/account-invoicing/tree/16.0/sale_order_invoicing_queued>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

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

View file

@ -0,0 +1,19 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Enqueue sales order invoicing",
"version": "16.0.1.0.0",
"category": "Sales Management",
"license": "AGPL-3",
"author": "Tecnativa, " "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-invoicing",
"depends": ["sale", "queue_job"],
"data": [
"data/job_queue.xml",
"views/queue_job_views.xml",
"views/sale_order_views.xml",
"wizards/sale_advance_payment_inv_views.xml",
],
"installable": True,
}

View file

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

View file

@ -0,0 +1,54 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
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: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr "Otkaži"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr "Stavi fakturisanje u red"
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr "Poslovi fakturisanja"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr "Ponovo stavi u red"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr "Avansna faktura prodaje"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr "Prodajni nalog"
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""

View file

@ -0,0 +1,55 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ca\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: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr ""
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr ""
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr ""
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""

View file

@ -0,0 +1,75 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-29 16:09+0000\n"
"PO-Revision-Date: 2023-12-01 14:33+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: \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: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr "Cancelar"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr "Encolar facturación"
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr "Trabajos de facturación"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr "Volver a poner en cola"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr "Ventas. Anticipo pago factura"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr "Pedido de venta"
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""
"Ya existe un trabajo encolado para facturar el pedido de venta %s. Por favor "
"espera hasta que haya terminado o elimine el pedido de la selección."
#~ msgid "Display Name"
#~ msgstr "Mostrar Nombre"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Última Modificación el"
#~ msgid "Quotation"
#~ msgstr "Presupuesto"
#~ msgid "Queue Job"
#~ msgstr "Trabajo en cola"

View file

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-05-12 10:23+0000\n"
"Last-Translator: \"Benjamin Willig (ACSONE)\" <benjamin.willig@acsone.eu>\n"
"Language-Team: none\n"
"Language: fr\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.10.4\n"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr "Annuler"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr "Facturer en tâche de fond"
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr "Tâches de facturation"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr "Relancer"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr "Commandes de vente"
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""
"Il y a déjà une tâche dans la liste d'attente pour la commande de vente %s. "
"Veuillez attendre qu'elle se termine ou supprimez la de la sélection."

View file

@ -0,0 +1,68 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-04-07 13:24+0000\n"
"Last-Translator: Francesco Foresti <francesco.foresti@ooops404.com>\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 4.14.1\n"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr "Annulla"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr "Metti in coda la fatturazione"
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr "Jobs Fatturazione"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr "Rimetti in coda"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr "Fattura di vendita con pagamento anticipato"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr "Ordine di vendita"
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""
"Esiste già un job in coda per fatturare l'ordine di vendita %s. Attendi che "
"sia finito o rimuovilo dalla selezione."
#~ msgid "Display Name"
#~ msgstr "Nome visualizzato"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Ultima modifica il"

View file

@ -0,0 +1,54 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
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: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr ""
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr ""
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr ""
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr ""
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""

View file

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_invoicing_queued
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-12-13 09:05+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.9.1\n"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Cancel"
msgstr "取消"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_sale_advance_payment_inv
msgid "Enqueue Invoicing"
msgstr "排队开票"
#. module: sale_order_invoicing_queued
#: model:ir.model.fields,field_description:sale_order_invoicing_queued.field_sale_order__invoicing_job_ids
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_order_form_invoicing_queued
msgid "Invoicing Jobs"
msgstr "开票作业"
#. module: sale_order_invoicing_queued
#: model_terms:ir.ui.view,arch_db:sale_order_invoicing_queued.view_queue_job_sale_order_invoicing
msgid "Requeue"
msgstr "重新排队"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_advance_payment_inv
msgid "Sales Advance Payment Invoice"
msgstr "销售预付款发票"
#. module: sale_order_invoicing_queued
#: model:ir.model,name:sale_order_invoicing_queued.model_sale_order
msgid "Sales Order"
msgstr "销售订单"
#. module: sale_order_invoicing_queued
#. odoo-python
#: code:addons/sale_order_invoicing_queued/wizards/sale_advance_payment_inv.py:0
#, python-format
msgid ""
"There's already an enqueued job for invoicing the sales order %s. Please "
"wait until it's finished or remove it from the selection."
msgstr ""
"已经有一个用于为%s销售订单开具发票的排队作业。请等待该作业完成或将其从所选内"
"容中删除。"

View file

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

View file

@ -0,0 +1,22 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = "sale.order"
invoicing_job_ids = fields.Many2many(
comodel_name="queue.job",
column1="order_id",
column2="job_id",
string="Invoicing Jobs",
copy=False,
)
def create_invoices_job(self, final, invoice_date=False):
ctx = self.env.context.copy()
if invoice_date:
ctx.update({"default_invoice_date": invoice_date})
self.with_context(**ctx)._create_invoices(final=final)

View file

@ -0,0 +1,5 @@
Jobs are enqueued in the channel ``root.sale_order_invoicing_queued``,
so you must adjust your Odoo configuration according this.
If you want to see queued jobs, you need "Job Queue / Job Queue Manager"
permission in your user.

View file

@ -0,0 +1,3 @@
* `Tecnativa <https://www.tecnativa.com>`__:
* Pedro M. Baeza

View file

@ -0,0 +1,6 @@
This module allows to enqueue in several jobs the sales orders invoicing
process to be executed in paralell on background, which is normally done
serially and on foreground.
Jobs are split following the same criteria as standard Odoo: grouping by
order invoicing address and order currency.

View file

@ -0,0 +1,4 @@
16.0.1.0.0 (2024-07-22)
~~~~~~~~~~~~~~~~~~~~~~~
* Migration of the module. Only change was on sale_order_views to add 'group' tag inside the page and not as a field.

View file

@ -0,0 +1,5 @@
This module depends on *queue_job* module that is hosted on
https://github.com/OCA/queue.
It only works in an updated 13.0 version after the 4th of March of 2020,
specifically after the commit https://github.com/odoo/odoo/commit/6f036e758000.

View file

@ -0,0 +1,9 @@
#. Go to *Sales > Invoicing > Orders to Invoice*.
#. Select sales orders whose invoicing you want to enqueue.
#. Click on *Action > Invoice Order*.
#. Click on "Enqueue Invoicing" button.
#. On that moment, jobs will be enqueued on foreground, but the control will
be returned to you after that.
#. Having the "Job Queue Manager" permissions, you can go to the sales order,
and see the tab "Invoicing Jobs". There a list with all the jobs related
to that sales order can be found.

View file

@ -0,0 +1,474 @@
<!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>Enqueue sales order invoicing</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="enqueue-sales-order-invoicing">
<h1 class="title">Enqueue sales order invoicing</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:aba259bf3a3cdba02fda1914c23bfc3f1ae2d803c77ecaa8db3a95ee567ad7f3
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/sale_order_invoicing_queued"><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-sale_order_invoicing_queued"><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 allows to enqueue in several jobs the sales orders invoicing
process to be executed in paralell on background, which is normally done
serially and on foreground.</p>
<p>Jobs are split following the same criteria as standard Odoo: grouping by
order invoicing address and order currency.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-3">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="toc-entry-4">Changelog</a><ul>
<li><a class="reference internal" href="#section-1" id="toc-entry-5">16.0.1.0.0 (2024-07-22)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-6">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-7">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-8">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-9">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-10">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#toc-entry-1">Installation</a></h1>
<p>This module depends on <em>queue_job</em> module that is hosted on
<a class="reference external" href="https://github.com/OCA/queue">https://github.com/OCA/queue</a>.</p>
<p>It only works in an updated 13.0 version after the 4th of March of 2020,
specifically after the commit <a class="reference external" href="https://github.com/odoo/odoo/commit/6f036e758000">https://github.com/odoo/odoo/commit/6f036e758000</a>.</p>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-2">Configuration</a></h1>
<p>Jobs are enqueued in the channel <tt class="docutils literal">root.sale_order_invoicing_queued</tt>,
so you must adjust your Odoo configuration according this.</p>
<p>If you want to see queued jobs, you need “Job Queue / Job Queue Manager”
permission in your user.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-3">Usage</a></h1>
<ol class="arabic simple">
<li>Go to <em>Sales &gt; Invoicing &gt; Orders to Invoice</em>.</li>
<li>Select sales orders whose invoicing you want to enqueue.</li>
<li>Click on <em>Action &gt; Invoice Order</em>.</li>
<li>Click on “Enqueue Invoicing” button.</li>
<li>On that moment, jobs will be enqueued on foreground, but the control will
be returned to you after that.</li>
<li>Having the “Job Queue Manager” permissions, you can go to the sales order,
and see the tab “Invoicing Jobs”. There a list with all the jobs related
to that sales order can be found.</li>
</ol>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#toc-entry-4">Changelog</a></h1>
<div class="section" id="section-1">
<h2><a class="toc-backref" href="#toc-entry-5">16.0.1.0.0 (2024-07-22)</a></h2>
<ul class="simple">
<li>Migration of the module. Only change was on sale_order_views to add group tag inside the page and not as a field.</li>
</ul>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-6">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:%20sale_order_invoicing_queued%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-7">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-8">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-9">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Pedro M. Baeza</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-10">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>This module is part of the <a class="reference external" href="https://github.com/OCA/account-invoicing/tree/16.0/sale_order_invoicing_queued">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_sale_order_invoicing_queued

View file

@ -0,0 +1,88 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import exceptions
from odoo.tests import TransactionCase
class TestSaleOrderInvoicingQueue(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.wizard_obj = cls.env["sale.advance.payment.inv"]
cls.queue_obj = cls.env["queue.job"]
cls.partner = cls.env["res.partner"].create({"name": "Test partner"})
cls.partner2 = cls.env["res.partner"].create({"name": "Other partner"})
cls.product = cls.env["product.product"].create(
{"name": "Test product", "type": "service", "invoice_policy": "order"}
)
cls.order = cls.env["sale.order"].create(
{
"partner_id": cls.partner.id,
"partner_shipping_id": cls.partner.id,
"partner_invoice_id": cls.partner.id,
"pricelist_id": cls.partner.property_product_pricelist.id,
"order_line": [
(
0,
0,
{
"name": cls.product.name,
"product_id": cls.product.id,
"price_unit": 20,
"product_uom_qty": 1,
"product_uom": cls.product.uom_id.id,
},
)
],
}
)
cls.order.action_confirm()
cls.order2 = cls.order.copy({"partner_invoice_id": cls.partner2.id})
cls.order2.action_confirm()
cls.order3 = cls.order.copy()
cls.order3.action_confirm()
def test_queue_invoicing(self):
wizard = self.wizard_obj.with_context(
active_ids=(self.order + self.order2).ids, active_model=self.order._name
).create({})
prev_jobs = self.queue_obj.search([])
wizard.enqueue_invoices()
current_jobs = self.queue_obj.search([])
jobs = current_jobs - prev_jobs
self.assertEqual(len(jobs), 2)
self.assertTrue(self.order.invoicing_job_ids)
self.assertTrue(self.order2.invoicing_job_ids)
self.assertNotEqual(self.order.invoicing_job_ids, self.order2.invoicing_job_ids)
# Try to enqueue invoicing again
with self.assertRaises(exceptions.UserError):
wizard.enqueue_invoices()
def test_direct_invoicing(self):
# Test methods that produces directly invoices
wizard = self.wizard_obj.with_context(
active_ids=self.order.ids, active_model=self.order._name
).create({"advance_payment_method": "percentage", "amount": 50})
wizard.enqueue_invoices()
self.assertTrue(self.order.invoice_ids)
def test_invoicing(self):
# Execute method directly for checking if invoicing is done
self.order.create_invoices_job(True)
self.assertTrue(self.order.invoice_ids)
def test_direct_invoices_job_date(self):
# Test direct invoicing checking invoice_date declaration
wizard = self.wizard_obj.with_context(
active_ids=self.order3.ids, active_model=self.order3._name
).create({})
wizard.enqueue_invoices()
self.order3.create_invoices_job(True, "2024-08-04")
self.assertTrue(self.order3.invoice_ids)
invoice_date = (
self.order3.invoice_ids[0].invoice_date.strftime("%Y-%m-%d")
if self.order3.invoice_ids[0].invoice_date
else False
)
self.assertEqual(invoice_date, "2024-08-04")

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2019 Tecnativa - Pedro M. Baeza
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_queue_job_sale_order_invoicing" model="ir.ui.view">
<field name="model">queue.job</field>
<field name="priority" eval="9999" />
<field name="arch" type="xml">
<tree>
<field name="date_created" />
<field name="func_string" />
<field name="date_done" />
<field name="state" />
<button
type="object"
name="requeue"
string="Requeue"
class="oe_highlight"
attrs="{'invisible': [('state', '!=', 'failed')]}"
/>
<button
type="object"
name="unlink"
string="Cancel"
class="oe_highlight_cancel"
icon="fa-times-circle"
attrs="{'invisible': [('state', 'not in', ['pending','enqueued'])]}"
/>
</tree>
</field>
</record>
</odoo>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Tecnativa - Pedro M. Baeza
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_order_form_invoicing_queued" model="ir.ui.view">
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<notebook position="inside">
<page
name="page_invoicing_jobs"
string="Invoicing Jobs"
attrs="{'invisible': [('invoicing_job_ids', '=', [])]}"
groups="queue_job.group_queue_job_manager"
>
<field
name="invoicing_job_ids"
options="{'reload_on_button': true}"
nolabel="1"
readonly="1"
context="{'tree_view_ref': 'sale_order_invoicing_queued.view_queue_job_sale_order_invoicing'}"
/>
</page>
</notebook>
</field>
</record>
</odoo>

View file

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

View file

@ -0,0 +1,60 @@
# Copyright 2019-2021 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from collections import defaultdict
from odoo import _, exceptions, models
class SaleAdvancePaymentInv(models.TransientModel):
_inherit = "sale.advance.payment.inv"
def enqueue_invoices(self):
queue_obj = self.env["queue.job"]
order_obj = self.env["sale.order"]
context = self.env.context
final = self.advance_payment_method in {"delivered", "all"}
if self.advance_payment_method not in {"delivered", "all"}:
# Call standard method in these cases
return self.create_invoices()
sale_orders = order_obj.browse(context.get("active_ids", []))
grouped_orders = defaultdict(lambda: order_obj.browse())
for order in sale_orders:
# If we have `sale_order_invoicing_grouping_criteria` module
# installed, we take that grouping criteria
if hasattr(order, "_get_sale_invoicing_group_key"):
group_key = order._get_sale_invoicing_group_key()
else:
# HACK: This is not exactly doing the same as upstream, as we
# apply fields over order, not invoice vals, but serves for
# standard case and most of the transferred fields mapping them.
# This is done this way for not needing to build 2 times the
# same vals dictionary.
field_mapping = {"partner_id": "partner_invoice_id"}
group_key = tuple(
[
order[field_mapping.get(grouping_key, grouping_key)]
for grouping_key in order._get_invoice_grouping_keys()
]
)
if order.invoicing_job_ids.filtered(
lambda x: x.state in {"pending", "enqueued", "started"}
):
raise exceptions.UserError(
_(
"There's already an enqueued job for invoicing the sales "
"order %s. Please wait until it's finished or remove it "
"from the selection."
)
% (order.name,)
)
grouped_orders[group_key] |= order
invoice_date = False
if hasattr(self.env["sale.advance.payment.inv"], "invoice_date"):
invoice_date = self.invoice_date
for orders in grouped_orders.values():
new_delay = orders.with_delay().create_invoices_job(
final, invoice_date=invoice_date
)
job = queue_obj.search([("uuid", "=", new_delay.uuid)])
orders.sudo().write({"invoicing_job_ids": [(4, job.id)]})

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Tecnativa - Pedro M. Baeza
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_sale_advance_payment_inv" model="ir.ui.view">
<field name="model">sale.advance.payment.inv</field>
<field name="inherit_id" ref="sale.view_sale_advance_payment_inv" />
<field name="arch" type="xml">
<button name="create_invoices" position="before">
<button
name="enqueue_invoices"
string="Enqueue Invoicing"
type="object"
class="btn-primary"
/>
</button>
</field>
</record>
</odoo>