Initial commit: OCA Edi packages (42 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:05 +02:00
commit df976c03db
2184 changed files with 571602 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Despatch Advice Import
Odoo addon: despatch_advice_import
## Installation
```bash
pip install odoo-bringout-oca-edi-framework-despatch_advice_import
```
## Dependencies
This addon depends on:
- purchase
- purchase_stock
- base_business_document_import
## Manifest Information
- **Name**: Despatch Advice Import
- **Version**: 16.0.1.2.1
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/edi-framework](https://github.com/OCA/edi-framework) branch 16.0, addon `despatch_advice_import`.
## 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,99 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
======================
Despatch Advice Import
======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:6ca80319c1f9790b27e5685c5eb372aa2f61b0570f467f49e81d28c3c2abf77a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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%2Fedi-lightgray.png?logo=github
:target: https://github.com/OCA/edi/tree/16.0/despatch_advice_import
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/edi-16-0/edi-16-0-despatch_advice_import
: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/edi&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module will support import despatch advice file
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/edi/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/edi/issues/new?body=module:%20despatch_advice_import%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
* BCIM
Contributors
~~~~~~~~~~~~
* Laurent Mignon <laurent.mignon@acsone.eu>
* `Trobz <https://trobz.com>`_:
* Thien <thienvh@trobz.com>
* Simone Orsi <simone.orsi@camptocamp.com>
* Jacques-Etienne Baudoux <je@bcim.be>
Other credits
~~~~~~~~~~~~~
The migration of this module from 10.0 to 16.0 was financially supported by Camptocamp
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-jbaudoux| image:: https://github.com/jbaudoux.png?size=40px
:target: https://github.com/jbaudoux
:alt: jbaudoux
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-jbaudoux|
This module is part of the `OCA/edi <https://github.com/OCA/edi/tree/16.0/despatch_advice_import>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1 @@
from . import wizard

View file

@ -0,0 +1,17 @@
# Copyright 2020 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Despatch Advice Import",
"summary": """
Despatch Advice import""",
"version": "16.0.1.2.1",
"website": "https://github.com/OCA/edi",
"license": "AGPL-3",
"author": "ACSONE SA/NV,BCIM,Odoo Community Association (OCA)",
"maintainers": ["jbaudoux"],
"depends": ["purchase", "purchase_stock", "base_business_document_import"],
"data": ["security/ir.model.access.csv", "wizard/despatch_advice_import.xml"],
"demo": [],
"installable": True,
}

View file

@ -0,0 +1,232 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * despatch_advice_import
#
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: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__allow_validate_over_qty
msgid "Allow Validate Over Quantity"
msgstr "Dozvoli validaciju preko količine"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Cancel"
msgstr "Otkaži"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery cancelled by the supplier."
msgstr "Isporuka otkazana od strane dobavljača."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed by the supplier."
msgstr "Isporuka potvrđena od strane dobavljača."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed with amendment by the supplier."
msgstr "Isporuka potvrđena sa izmjenom od strane dobavljača."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Despatch Advice Import"
msgstr "Uvoz otpremnog savjeta"
#. module: despatch_advice_import
#: model:ir.model,name:despatch_advice_import.model_despatch_advice_import
msgid "Despatch Advice Import from Files"
msgstr "Uvoz otpremnog savjeta iz datoteka"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__filename
msgid "File Name"
msgstr "Ime fajla"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__id
msgid "ID"
msgstr "ID"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is a PDF file, Odoo will try to find an XML file in the attachments of"
" the PDF file and then use this XML file."
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is an XML file, Odoo will parse it if the module that adds support for"
" this XML format is installed. For the"
msgstr ""
#. module: despatch_advice_import
#: model:ir.actions.act_window,name:despatch_advice_import.despatch_advice_import_action
msgid "Import"
msgstr "Uvoz"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Import document"
msgstr "Uvezi dokument"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document file"
msgstr "Nedostaje datoteka dokumenta"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document filename"
msgstr "Nedostaje ime datoteke dokumenta"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name %s."
msgstr "Nije pronađena narudžba nabavke za ime %s."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/tests/test_despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name 123456."
msgstr "Nije pronađena narudžba nabavke za ime 123456."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "The product quantity is greater than the original product quantity"
msgstr "Količina proizvoda je veća od originalne količine proizvoda"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "There are no embedded XML file in this PDF file."
msgstr "Nema ugrađenih XML datoteka u ovoj PDF datoteci."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "This XML file is not XML-compliant"
msgstr "Ova XML datoteka nije u skladu sa XML standardom"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This file '%s' is not recognised as XML nor PDF file. Please check the file "
"and it's extension."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Document is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Response is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
#. module: despatch_advice_import
#: model:ir.ui.menu,name:despatch_advice_import.despatch_advice_import_importer_menu
msgid "UBL Despatch Advice Importer"
msgstr "UBL uvoznik otpremnog savjeta"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Universal Business Language"
msgstr "Univerzalni poslovni jezik"
#. module: despatch_advice_import
#: model:ir.model.fields,help:despatch_advice_import.field_despatch_advice_import__document
msgid ""
"Upload an Despatch Advice file that you received from your supplier. "
"Supported formats: XML and PDF (PDF with an embeded XML file)."
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"Upload below the DespatchAdvice you received from your supplier. When you "
"click on the import button:"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__document
msgid "XML or PDF Despatch Advice"
msgstr "XML ili PDF otpremni savjet"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"format (UBL), you should install the module "
"<em>despatch_advice_import_ubl</em>."
msgstr ""

View file

@ -0,0 +1,232 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * despatch_advice_import
#
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: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__allow_validate_over_qty
msgid "Allow Validate Over Quantity"
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Cancel"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_uid
msgid "Created by"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_date
msgid "Created on"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery cancelled by the supplier."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed by the supplier."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed with amendment by the supplier."
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Despatch Advice Import"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model,name:despatch_advice_import.model_despatch_advice_import
msgid "Despatch Advice Import from Files"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__display_name
msgid "Display Name"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__filename
msgid "File Name"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__id
msgid "ID"
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is a PDF file, Odoo will try to find an XML file in the attachments of"
" the PDF file and then use this XML file."
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is an XML file, Odoo will parse it if the module that adds support for"
" this XML format is installed. For the"
msgstr ""
#. module: despatch_advice_import
#: model:ir.actions.act_window,name:despatch_advice_import.despatch_advice_import_action
msgid "Import"
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Import document"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import____last_update
msgid "Last Modified on"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_uid
msgid "Last Updated by"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_date
msgid "Last Updated on"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document file"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document filename"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name %s."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/tests/test_despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name 123456."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "The product quantity is greater than the original product quantity"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "There are no embedded XML file in this PDF file."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "This XML file is not XML-compliant"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This file '%s' is not recognised as XML nor PDF file. Please check the file "
"and it's extension."
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Document is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Response is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
#. module: despatch_advice_import
#: model:ir.ui.menu,name:despatch_advice_import.despatch_advice_import_importer_menu
msgid "UBL Despatch Advice Importer"
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Universal Business Language"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,help:despatch_advice_import.field_despatch_advice_import__document
msgid ""
"Upload an Despatch Advice file that you received from your supplier. "
"Supported formats: XML and PDF (PDF with an embeded XML file)."
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"Upload below the DespatchAdvice you received from your supplier. When you "
"click on the import button:"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__document
msgid "XML or PDF Despatch Advice"
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"format (UBL), you should install the module "
"<em>despatch_advice_import_ubl</em>."
msgstr ""

View file

@ -0,0 +1,249 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * despatch_advice_import
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-02-14 15:36+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: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__allow_validate_over_qty
msgid "Allow Validate Over Quantity"
msgstr ""
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Cancel"
msgstr "Cancelar"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_date
msgid "Created on"
msgstr "Creado el"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery cancelled by the supplier."
msgstr "Entrega anulada por el proveedor."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed by the supplier."
msgstr "Entrega confirmada por el proveedor."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed with amendment by the supplier."
msgstr "Entrega confirmada con modificación por el proveedor."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Despatch Advice Import"
msgstr "Aviso de Expedición Importación"
#. module: despatch_advice_import
#: model:ir.model,name:despatch_advice_import.model_despatch_advice_import
msgid "Despatch Advice Import from Files"
msgstr "Aviso de Expedición Importación desde Ficheros"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__filename
msgid "File Name"
msgstr "Nombre del Archivo"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__id
msgid "ID"
msgstr "ID"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is a PDF file, Odoo will try to find an XML file in the attachments of "
"the PDF file and then use this XML file."
msgstr ""
"Si es un archivo PDF, Odoo tratará de encontrar un archivo XML en los "
"adjuntos del archivo PDF y luego usará este archivo XML."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is an XML file, Odoo will parse it if the module that adds support for "
"this XML format is installed. For the"
msgstr ""
"Si es un archivo XML, Odoo lo analizará si está instalado el módulo que "
"agrega soporte para este formato XML. Para el"
#. module: despatch_advice_import
#: model:ir.actions.act_window,name:despatch_advice_import.despatch_advice_import_action
msgid "Import"
msgstr "Importar"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Import document"
msgstr "Importar documento"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import____last_update
msgid "Last Modified on"
msgstr "Última Modificación el"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_uid
msgid "Last Updated by"
msgstr "Última Actualización por"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_date
msgid "Last Updated on"
msgstr "Última Actualización el"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document file"
msgstr "Falta un archivo de documento"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document filename"
msgstr "Falta el nombre de archivo del documento"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name %s."
msgstr "No se ha encontrado ninguna orden de compra para el nombre %s."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/tests/test_despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name 123456."
msgstr "No se ha encontrado ninguna orden de compra a nombre de 123456."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "The product quantity is greater than the original product quantity"
msgstr "La cantidad de producto es superior a la cantidad de producto original"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "There are no embedded XML file in this PDF file."
msgstr "No hay ningún archivo XML incorporado en este archivo PDF."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "This XML file is not XML-compliant"
msgstr "Este archivo no es compatible con el formato XML"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This file '%s' is not recognised as XML nor PDF file. Please check the file "
"and it's extension."
msgstr ""
"Este archivo '%s' no se reconoce como archivo XML ni PDF. Compruebe el "
"archivo y su extensión."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Document is not supported. Did you install the module "
"to support this XML format?"
msgstr ""
"Este tipo de documento de pedido XML no es compatible. ¿Ha instalado el "
"módulo para admitir este formato XML?"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Response is not supported. Did you install the module "
"to support this XML format?"
msgstr ""
"Este tipo de respuesta de pedido XML no es compatible. ¿Ha instalado el "
"módulo para admitir este formato XML?"
#. module: despatch_advice_import
#: model:ir.ui.menu,name:despatch_advice_import.despatch_advice_import_importer_menu
msgid "UBL Despatch Advice Importer"
msgstr "Aviso de Expedición UBL Importador"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Universal Business Language"
msgstr "Lenguaje Comercial Universal"
#. module: despatch_advice_import
#: model:ir.model.fields,help:despatch_advice_import.field_despatch_advice_import__document
msgid ""
"Upload an Despatch Advice file that you received from your supplier. "
"Supported formats: XML and PDF (PDF with an embeded XML file)."
msgstr ""
"Cargue un Archivo de Aviso de Expedición que haya recibido de su proveedor. "
"Formatos admitidos: XML y PDF (PDF con un archivo XML incrustado)."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"Upload below the DespatchAdvice you received from your supplier. When you "
"click on the import button:"
msgstr ""
"Cargue a continuación el Aviso de Expedición que ha recibido de su "
"proveedor. Cuando haga clic en el botón de importación:"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__document
msgid "XML or PDF Despatch Advice"
msgstr "Aviso de Envío XML o PDF"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"format (UBL), you should install the module <em>despatch_advice_import_ubl</"
"em>."
msgstr ""
"formato (UBL), debes instalar el módulo <em>despatch_advice_import_ubl</em>."

View file

@ -0,0 +1,253 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * despatch_advice_import
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-04-22 12:35+0000\n"
"Last-Translator: c2cdidier <didier.donze@camptocamp.com>\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 4.17\n"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__allow_validate_over_qty
msgid "Allow Validate Over Quantity"
msgstr "Autoriser la validation d'une quantité supérieure"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Cancel"
msgstr "Annuler"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_uid
msgid "Created by"
msgstr ""
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_date
msgid "Created on"
msgstr "créé le"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery cancelled by the supplier."
msgstr "Livraison annulée par le fournisseur."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed by the supplier."
msgstr "Livraison confirmée par le fournisseur."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed with amendment by the supplier."
msgstr "Livraison confirmée avec modification par le fournisseur."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Despatch Advice Import"
msgstr "Importation d'avis d'expédition"
#. module: despatch_advice_import
#: model:ir.model,name:despatch_advice_import.model_despatch_advice_import
msgid "Despatch Advice Import from Files"
msgstr "Importation de fichiers d'avis d'expédition"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__filename
msgid "File Name"
msgstr "Nom du fichier"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__id
msgid "ID"
msgstr "ID"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is a PDF file, Odoo will try to find an XML file in the attachments of"
" the PDF file and then use this XML file."
msgstr ""
"S'il s'agit d'un fichier PDF, Odoo essaiera de trouver un fichier XML dans "
"les pièces jointes du fichier PDF et utilisera ce fichier XML."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is an XML file, Odoo will parse it if the module that adds support for"
" this XML format is installed. For the"
msgstr ""
"S'il s'agit d'un fichier XML, Odoo l'analysera si le module qui prend en "
"charge ce format XML est installé. Pour le fichier"
#. module: despatch_advice_import
#: model:ir.actions.act_window,name:despatch_advice_import.despatch_advice_import_action
msgid "Import"
msgstr "Import"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Import document"
msgstr "Importer le document"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document file"
msgstr "Fichier de document manquant"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document filename"
msgstr "Nom de fichier manquant"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name %s."
msgstr "Aucune commande fournisseur trouvée pour le nom %s."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/tests/test_despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name 123456."
msgstr "Aucune commande fournisseur trouvée avec le nom 123456."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "The product quantity is greater than the original product quantity"
msgstr ""
"La quantité de produit est supérieure à la quantité de produit commandée"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "There are no embedded XML file in this PDF file."
msgstr "Il n'y a pas de fichier XML intégré dans ce fichier PDF."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "This XML file is not XML-compliant"
msgstr "Ce fichier XML n'est pas conforme"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This file '%s' is not recognised as XML nor PDF file. Please check the file "
"and it's extension."
msgstr ""
"Le fichier '%s' n'est pas reconnu comme un fichier XML ou PDF. Veuillez "
"vérifier le fichier et son extension."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Document is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
"Ce type de document de commande XML n'est pas pris en charge. Avez-vous "
"installé le module pour supporter ce format XML ?"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Response is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
"Ce type de réponse de commande XML n'est pas pris en charge. Avez-vous "
"installé le module pour supporter ce format XML ?"
#. module: despatch_advice_import
#: model:ir.ui.menu,name:despatch_advice_import.despatch_advice_import_importer_menu
msgid "UBL Despatch Advice Importer"
msgstr "Importateur d'avis d'expédition UBL"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Universal Business Language"
msgstr "Universal Business Language"
#. module: despatch_advice_import
#: model:ir.model.fields,help:despatch_advice_import.field_despatch_advice_import__document
msgid ""
"Upload an Despatch Advice file that you received from your supplier. "
"Supported formats: XML and PDF (PDF with an embeded XML file)."
msgstr ""
"Téléchargez un fichier d'avis d'expédition que vous avez reçu de votre "
"fournisseur. Formats pris en charge : XML et PDF (PDF avec un fichier XML "
"intégré)."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"Upload below the DespatchAdvice you received from your supplier. When you "
"click on the import button:"
msgstr ""
"Téléchargez ci-dessous l'avis d'expédition que vous avez reçu de votre "
"fournisseur. Lorsque vous cliquez sur le bouton d'importation :"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__document
msgid "XML or PDF Despatch Advice"
msgstr "Avis d'expédition XML ou PDF"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"format (UBL), you should install the module "
"<em>despatch_advice_import_ubl</em>."
msgstr ""
"format (UBL), vous devez installer le module "
"<em>despatch_advice_import_ubl</em>."

View file

@ -0,0 +1,251 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * despatch_advice_import
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-08-23 15: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: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__allow_validate_over_qty
msgid "Allow Validate Over Quantity"
msgstr "Consenti validazione sovra quantità"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Cancel"
msgstr "Annulla"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__create_date
msgid "Created on"
msgstr "Creato il"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery cancelled by the supplier."
msgstr "Consegna annullata dal fornitore."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed by the supplier."
msgstr "Consegna confermata dal fornitore."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Delivery confirmed with amendment by the supplier."
msgstr "Consegna confermata con correzione dal fornitore."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Despatch Advice Import"
msgstr "Importa avviso spedizione"
#. module: despatch_advice_import
#: model:ir.model,name:despatch_advice_import.model_despatch_advice_import
msgid "Despatch Advice Import from Files"
msgstr "Importazione di avvisi di spedizione da file"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__filename
msgid "File Name"
msgstr "Nome file"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__id
msgid "ID"
msgstr "ID"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is a PDF file, Odoo will try to find an XML file in the attachments of"
" the PDF file and then use this XML file."
msgstr ""
"Se è un file PDF, Odoo cercherà di trovare un file XML negli allegati del "
"file PDF e usarlo."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"If it is an XML file, Odoo will parse it if the module that adds support for"
" this XML format is installed. For the"
msgstr ""
"Se è un file XML, Odoo lo analizzerà se è installato il modulo che aggiunge "
"il supporto per questo formato XML. Per il"
#. module: despatch_advice_import
#: model:ir.actions.act_window,name:despatch_advice_import.despatch_advice_import_action
msgid "Import"
msgstr "Importa"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Import document"
msgstr "Importa documento"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document file"
msgstr "File documento mancante"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "Missing document filename"
msgstr "Nome file documento mancante"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name %s."
msgstr "Nessun ordine di acquisto trovato per il nome %s."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/tests/test_despatch_advice_import.py:0
#, python-format
msgid "No purchase order found for name 123456."
msgstr "Nessun ordine di acquisto trovato per il nome 123456."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "The product quantity is greater than the original product quantity"
msgstr "La quantità del prodotto è superiore alla quantità originale"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "There are no embedded XML file in this PDF file."
msgstr "In questo PDF non c'è un file XML integrato."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid "This XML file is not XML-compliant"
msgstr "Il file XML non è compatibile al formato XML"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This file '%s' is not recognised as XML nor PDF file. Please check the file "
"and it's extension."
msgstr ""
"Il file '%s' non è riconosciuto come file XML o PDF. Controllare il file e "
"la sua estensione."
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Document is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
"Questo tipo di documento ordine XML non è supportato. Il modulo per "
"supportare questo formato XML è installato?"
#. module: despatch_advice_import
#. odoo-python
#: code:addons/despatch_advice_import/wizard/despatch_advice_import.py:0
#, python-format
msgid ""
"This type of XML Order Response is not supported. Did you install the module"
" to support this XML format?"
msgstr ""
"Questo tipo di risposta ordine XML non è supportato. Il modulo per "
"supportare questo formato XML è installato?"
#. module: despatch_advice_import
#: model:ir.ui.menu,name:despatch_advice_import.despatch_advice_import_importer_menu
msgid "UBL Despatch Advice Importer"
msgstr "Importatore avviso spedizione UBL"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid "Universal Business Language"
msgstr "Linguaggio commerciale universale"
#. module: despatch_advice_import
#: model:ir.model.fields,help:despatch_advice_import.field_despatch_advice_import__document
msgid ""
"Upload an Despatch Advice file that you received from your supplier. "
"Supported formats: XML and PDF (PDF with an embeded XML file)."
msgstr ""
"Caricare un avviso di spedizione ricevuto dal fornitore. Formati supportati: "
"XML e PDF (PDF con XML incorporato)."
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"Upload below the DespatchAdvice you received from your supplier. When you "
"click on the import button:"
msgstr ""
"Caricare in calce l'avviso di spedizione ricevuto dal fornitore. Quando si "
"fa clic sul pulsante di importazione:"
#. module: despatch_advice_import
#: model:ir.model.fields,field_description:despatch_advice_import.field_despatch_advice_import__document
msgid "XML or PDF Despatch Advice"
msgstr "Avviso di spedizione XML o PDF"
#. module: despatch_advice_import
#: model_terms:ir.ui.view,arch_db:despatch_advice_import.despatch_advice_import_form_view
msgid ""
"format (UBL), you should install the module "
"<em>despatch_advice_import_ubl</em>."
msgstr ""
"formato (UBL), bisogna installare il modulo "
"<em>despatch_advice_import_ubl</em>."

View file

@ -0,0 +1,6 @@
* Laurent Mignon <laurent.mignon@acsone.eu>
* `Trobz <https://trobz.com>`_:
* Thien <thienvh@trobz.com>
* Simone Orsi <simone.orsi@camptocamp.com>
* Jacques-Etienne Baudoux <je@bcim.be>

View file

@ -0,0 +1 @@
The migration of this module from 10.0 to 16.0 was financially supported by Camptocamp

View file

@ -0,0 +1 @@
This module will support import despatch advice file

View file

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_despatch_advice_import,despatch.advice.import,model_despatch_advice_import,purchase.group_purchase_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_despatch_advice_import despatch.advice.import model_despatch_advice_import purchase.group_purchase_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,449 @@
<!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>README.rst</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">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="despatch-advice-import">
<h1>Despatch Advice Import</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:6ca80319c1f9790b27e5685c5eb372aa2f61b0570f467f49e81d28c3c2abf77a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/edi/tree/16.0/despatch_advice_import"><img alt="OCA/edi" src="https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/edi-16-0/edi-16-0-despatch_advice_import"><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/edi&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 will support import despatch advice file</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="toc-entry-5">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/edi/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/edi/issues/new?body=module:%20despatch_advice_import%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">
<h2><a class="toc-backref" href="#toc-entry-2">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-3">Authors</a></h3>
<ul class="simple">
<li>ACSONE SA/NV</li>
<li>BCIM</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<ul>
<li><p class="first">Laurent Mignon &lt;<a class="reference external" href="mailto:laurent.mignon&#64;acsone.eu">laurent.mignon&#64;acsone.eu</a>&gt;</p>
</li>
<li><p class="first"><a class="reference external" href="https://trobz.com">Trobz</a>:</p>
<blockquote>
<ul class="simple">
<li>Thien &lt;<a class="reference external" href="mailto:thienvh&#64;trobz.com">thienvh&#64;trobz.com</a>&gt;</li>
</ul>
</blockquote>
</li>
<li><p class="first">Simone Orsi &lt;<a class="reference external" href="mailto:simone.orsi&#64;camptocamp.com">simone.orsi&#64;camptocamp.com</a>&gt;</p>
</li>
<li><p class="first">Jacques-Etienne Baudoux &lt;<a class="reference external" href="mailto:je&#64;bcim.be">je&#64;bcim.be</a>&gt;</p>
</li>
</ul>
</div>
<div class="section" id="other-credits">
<h3><a class="toc-backref" href="#toc-entry-5">Other credits</a></h3>
<p>The migration of this module from 10.0 to 16.0 was financially supported by Camptocamp</p>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h3>
<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/jbaudoux"><img alt="jbaudoux" src="https://github.com/jbaudoux.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/edi/tree/16.0/despatch_advice_import">OCA/edi</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>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
from . import test_despatch_advice_import

View file

@ -0,0 +1,394 @@
# Copyright 2020 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import base64
from odoo import _, fields
from odoo.exceptions import UserError
from odoo.tests.common import TransactionCase
class TestDespatchAdviceImport(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
cls.supplier = cls.env.ref("base.res_partner_12")
cls.supplier.vat = "BE0477472701"
cls.env.user.company_id.partner_id.vat = "BE0421801233"
cls.product_1 = cls.env["product.product"].create(
{
"name": "Product 1",
"default_code": "987654321",
"seller_ids": [
(0, 0, {"partner_id": cls.supplier.id, "product_code": "P1"})
],
}
)
cls.product_2 = cls.env["product.product"].create(
{
"name": "Product 2",
"default_code": "987654312",
"seller_ids": [
(0, 0, {"partner_id": cls.supplier.id, "product_code": "P2"})
],
}
)
cls.product_3 = cls.env["product.product"].create(
{
"name": "Product 3",
"default_code": "123456789",
"seller_ids": [
(0, 0, {"partner_id": cls.supplier.id, "product_code": "P3"})
],
}
)
cls.product_4 = cls.env["product.product"].create(
{
"name": "Product 4",
"default_code": "23456718",
"seller_ids": [
(0, 0, {"partner_id": cls.supplier.id, "product_code": "P4"})
],
}
)
cls.purchase_order = cls.env["purchase.order"].create(
{
"partner_id": cls.supplier.id,
"date_order": fields.Datetime.now(),
"date_planned": fields.Datetime.now(),
}
)
cls.line1 = cls.purchase_order.order_line.create(
{
"order_id": cls.purchase_order.id,
"product_id": cls.product_1.id,
"name": cls.product_1.name,
"date_planned": fields.Datetime.now(),
"product_qty": 24,
"product_uom": cls.env.ref("uom.product_uom_unit").id,
"price_unit": 15,
}
)
cls.line2 = cls.purchase_order.order_line.create(
{
"order_id": cls.purchase_order.id,
"product_id": cls.product_2.id,
"name": cls.product_2.name,
"date_planned": fields.Datetime.now(),
"product_qty": 5,
"product_uom": cls.env.ref("uom.product_uom_unit").id,
"price_unit": 25,
}
)
cls.line3 = cls.purchase_order.order_line.create(
{
"order_id": cls.purchase_order.id,
"product_id": cls.product_3.id,
"name": cls.product_3.name,
"date_planned": fields.Datetime.now(),
"product_qty": 15,
"product_uom": cls.env.ref("uom.product_uom_unit").id,
"price_unit": 25,
}
)
cls.line4 = cls.purchase_order.order_line.create(
{
"order_id": cls.purchase_order.id,
"product_id": cls.product_4.id,
"name": cls.product_4.name,
"date_planned": fields.Datetime.now(),
"product_qty": 15,
"product_uom": cls.env.ref("uom.product_uom_unit").id,
"price_unit": 25,
}
)
cls.purchase_order.button_confirm()
cls.DespatchAdviceImport = cls.env["despatch.advice.import"].create(
{"document": base64.b64encode(bytes("<dummy></dummy>", "utf-8"))}
)
def order_line_to_data(self, order_line, qty=None, backorder_qty=None):
return {
"backorder_qty": backorder_qty,
"qty": qty if qty is not None else order_line.product_qty,
"order_line_id": order_line.id,
"ref": order_line.order_id.name,
"product_ref": order_line.product_id.default_code,
"uom": {"unece_code": order_line.product_uom.unece_code},
}
def _get_base_data(self):
return {
"company": {"vat": "BE0421801233"},
"date": "2020-02-04",
"chatter_msg": [],
"lines": [],
"supplier": {"vat": "BE0477472701"},
"ref": str(self.purchase_order.name),
}
def test_no_purchase_order_name(self):
"""
Data:
Data with unknown PO reference
Test Case:
Process data
Expected result:
UserError is raised
"""
data = self._get_base_data()
data["ref"] = "123456"
data["lines"] = [self.order_line_to_data(self.line1)]
data["lines"][0]["ref"] = "123456"
with self.assertRaises(UserError) as ue:
self.DespatchAdviceImport.process_data(data)
self.assertEqual(
ue.exception.name, _("No purchase order found for name 123456.")
)
def test_process_data_with_backorder_qty(self):
"""
backorder qty
"""
data = self._get_base_data()
confirmed_qty = self.line1.product_qty - 21
data["lines"] = [
self.order_line_to_data(self.line1, qty=confirmed_qty, backorder_qty=21),
self.order_line_to_data(self.line2),
self.order_line_to_data(self.line3),
self.order_line_to_data(self.line4),
]
self.DespatchAdviceImport.process_data(data)
self.assertTrue(self.purchase_order.picking_ids)
move_ids = self.line1.move_ids
self.assertEqual(len(move_ids), 2)
self.assertEqual(sum(move_ids.mapped("product_qty")), self.line1.product_qty)
assigned = move_ids.filtered(lambda s: s.state == "done" and s.product_qty == 3)
self.assertEqual(assigned.product_qty, confirmed_qty)
move_backorder = move_ids.filtered(
lambda s: s.state == "assigned" and s.product_qty == 21
)
self.assertTrue(move_backorder)
self.assertEqual(move_backorder.picking_id.backorder_id, assigned.picking_id)
def test_process_data_with_no_backorder_qty(self):
"""
no backorder qty
"""
data = self._get_base_data()
confirmed_qty = self.line1.product_qty - 21
data["lines"] = [
self.order_line_to_data(self.line1, qty=confirmed_qty),
self.order_line_to_data(self.line2),
self.order_line_to_data(self.line3),
self.order_line_to_data(self.line4),
]
self.DespatchAdviceImport.process_data(data)
self.assertTrue(self.purchase_order.picking_ids)
move_ids = self.line1.move_ids
self.assertEqual(len(move_ids), 2)
self.assertEqual(sum(move_ids.mapped("product_qty")), self.line1.product_qty)
assigned = move_ids.filtered(lambda s: s.state == "done")
self.assertEqual(assigned.product_qty, confirmed_qty)
cancel = move_ids.filtered(lambda s: s.state == "cancel")
self.assertEqual(cancel.product_qty, 21)
def test_process_data_create_backorder(self):
"""
2 back order created, second one is put in the same than the first 1
"""
data = self._get_base_data()
line1_confirmed_qty = self.line1.product_qty - 3
line2_confirmed_qty = self.line2.product_qty - 3
data["lines"] = [
self.order_line_to_data(
self.line1,
qty=line1_confirmed_qty,
backorder_qty=3,
),
self.order_line_to_data(
self.line2,
qty=line2_confirmed_qty,
backorder_qty=3,
),
self.order_line_to_data(self.line3),
self.order_line_to_data(self.line4),
]
self.DespatchAdviceImport.process_data(data)
self.assertEqual(self.purchase_order.state, "purchase")
self.assertEqual(len(self.purchase_order.picking_ids), 2)
# line1
line1_move_ids = self.line1.move_ids
self.assertEqual(len(line1_move_ids), 2)
self.assertEqual(
sum(line1_move_ids.mapped("product_qty")), self.line1.product_qty
)
move_confirmed = line1_move_ids.filtered(
lambda s: s.state == "done" and s.product_qty == line1_confirmed_qty
)
self.assertTrue(move_confirmed)
self.assertEqual(move_confirmed.product_qty, line1_confirmed_qty)
move_backorder = line1_move_ids.filtered(
lambda s: s.state == "assigned" and s.product_qty == 3
)
self.assertTrue(move_backorder)
self.assertEqual(
move_backorder.picking_id.backorder_id,
move_confirmed.picking_id,
)
# line2
line2_move_ids = self.line2.move_ids
self.assertEqual(len(line2_move_ids), 2)
self.assertEqual(
sum(line2_move_ids.mapped("product_qty")), self.line2.product_qty
)
move_confirmed = line2_move_ids.filtered(
lambda s: s.state == "done" and s.product_qty == line2_confirmed_qty
)
self.assertTrue(move_confirmed)
self.assertEqual(move_confirmed.product_qty, line2_confirmed_qty)
move_backorder = line2_move_ids.filtered(
lambda s: s.state == "assigned" and s.product_qty == 3
)
self.assertTrue(move_backorder)
self.assertEqual(
move_backorder.picking_id.backorder_id,
move_confirmed.picking_id,
)
def test_partial_delivery_with_backorder(self):
""" """
data = self._get_base_data()
confirmed_qty = self.line1.product_qty - 3
data["lines"] = [
self.order_line_to_data(
self.line1,
qty=confirmed_qty,
backorder_qty=2,
),
self.order_line_to_data(self.line2),
self.order_line_to_data(self.line3),
self.order_line_to_data(self.line4),
]
self.DespatchAdviceImport.process_data(data)
self.assertEqual(len(self.purchase_order.picking_ids), 2)
move_ids = self.line1.move_ids
self.assertEqual(len(move_ids), 3)
self.assertEqual(sum(move_ids.mapped("product_qty")), self.line1.product_qty)
move_confirmed = move_ids.filtered(
lambda s: s.state == "done" and s.product_qty == confirmed_qty
)
self.assertTrue(move_confirmed)
move_cancel = move_ids.filtered(
lambda s: s.state == "cancel" and s.product_qty == 1
)
self.assertTrue(move_cancel)
move_backorder = move_ids.filtered(
lambda s: s.state == "assigned" and s.product_qty == 2
)
self.assertTrue(move_backorder)
self.assertEqual(
move_backorder.picking_id.backorder_id,
move_confirmed.picking_id,
)
def test_qty_larger_backorder_qty(self):
""" """
data = self._get_base_data()
confirmed_qty = 6
data["lines"] = [
self.order_line_to_data(self.line1),
self.order_line_to_data(self.line2),
self.order_line_to_data(self.line3, qty=confirmed_qty, backorder_qty=3),
self.order_line_to_data(self.line4),
]
self.DespatchAdviceImport.process_data(data)
self.assertEqual(len(self.purchase_order.picking_ids), 2)
move_ids = self.line3.move_ids
self.assertEqual(len(move_ids), 3)
self.assertEqual(sum(move_ids.mapped("product_qty")), self.line3.product_qty)
moves_confirmed = move_ids.filtered(
lambda s: s.state == "done" and not s.picking_id.backorder_id
)
self.assertEqual(sum(moves_confirmed.mapped("product_qty")), confirmed_qty)
move_cancel = move_ids.filtered(
lambda s: s.state == "cancel" and s.product_qty == 6
)
self.assertTrue(move_cancel)
move_backorder = move_ids.filtered(
lambda s: s.state == "assigned" and s.product_qty == 3
)
self.assertTrue(move_backorder)
self.assertEqual(
move_backorder.picking_id.backorder_id,
moves_confirmed[0].picking_id,
)
def test_qty_equal_backorder_qty(self):
""" """
data = self._get_base_data()
confirmed_qty = 3
data["lines"] = [
self.order_line_to_data(self.line1),
self.order_line_to_data(self.line2),
self.order_line_to_data(self.line3),
self.order_line_to_data(
self.line4,
qty=confirmed_qty,
backorder_qty=3,
),
]
self.DespatchAdviceImport.process_data(data)
self.assertEqual(len(self.purchase_order.picking_ids), 2)
move_ids = self.line4.move_ids
self.assertEqual(sum(move_ids.mapped("product_qty")), self.line4.product_qty)
moves_confirmed = move_ids.filtered(
lambda s: s.state == "done" and not s.picking_id.backorder_id
)
self.assertEqual(sum(moves_confirmed.mapped("product_qty")), 3)
moves_cancel = move_ids.filtered(
lambda s: s.state == "cancel" and not s.picking_id.backorder_id
)
self.assertEqual(sum(moves_cancel.mapped("product_qty")), 9)
moves_backorder = move_ids.filtered(
lambda s: s.state == "assigned" and s.picking_id.backorder_id
)
self.assertEqual(sum(moves_backorder.mapped("product_qty")), 3)
def test_confirmed_qty_larger_reserved_qty(self):
"""
confirmed qty > reserved qty
"""
data = self._get_base_data()
confirmed_qty = self.line1.product_qty + 6
data["lines"] = [
self.order_line_to_data(self.line1, qty=confirmed_qty),
self.order_line_to_data(self.line2),
self.order_line_to_data(self.line3),
self.order_line_to_data(self.line4),
]
self.DespatchAdviceImport.with_context(
allow_validate_over_qty=True
).process_data(data)
self.assertTrue(self.purchase_order.picking_ids)
move_ids = self.line1.move_ids
self.assertEqual(len(move_ids), 1)
self.assertEqual(sum(move_ids.mapped("product_qty")), confirmed_qty)
assigned = move_ids.filtered(lambda s: s.state == "done")
self.assertEqual(assigned.product_qty, confirmed_qty)

View file

@ -0,0 +1 @@
from . import despatch_advice_import

View file

@ -0,0 +1,312 @@
# Copyright 2020 ACSONE SA/NV
# Copyright 2025 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
import mimetypes
from base64 import b64decode, b64encode
from lxml import etree
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.tools import float_compare
logger = logging.getLogger(__name__)
class DespatchAdviceImport(models.TransientModel):
_name = "despatch.advice.import"
_description = "Despatch Advice Import from Files"
document = fields.Binary(
string="XML or PDF Despatch Advice",
required=True,
help="Upload an Despatch Advice file that you received from "
"your supplier. Supported formats: XML and PDF "
"(PDF with an embeded XML file).",
)
filename = fields.Char(string="File Name")
allow_validate_over_qty = fields.Boolean(
"Allow Validate Over Quantity", default=True
)
# Format of parsed despatch advice
# {
# 'ref': 'PO01234' # the buyer party identifier
# # (specified into the Order document -> po's name)
# 'despatch_advice_type_code': ' scheduled | delivered'
# 'supplier': {'vat': 'FR25499247138'},
# 'company': {'vat': 'FR12123456789'}, # Only used to check we are not
# # importing the quote in the
# # wrong company by mistake
# 'estimated_delivery_date': '2020-11-20'
# 'lines': [{
# 'id': 123456,
# 'qty': 2.5,
# 'uom': {'unece_code': 'C62'},
# 'backorder_qty: None # if provided and qty != expected
# # the backorder qty will be delivered
# # in a next shipping
# }]
@api.model
def parse_despatch_advice(self, document, filename):
if not document:
raise UserError(_("Missing document file"))
if not filename:
raise UserError(_("Missing document filename"))
filetype = mimetypes.guess_type(filename)[0]
logger.debug("DespatchAdvice file mimetype: %s", filetype)
if filetype in ["application/xml", "text/xml"]:
try:
xml_root = etree.fromstring(document)
except Exception as err:
raise UserError(_("This XML file is not XML-compliant")) from err
if logger.isEnabledFor(logging.DEBUG):
pretty_xml_string = etree.tostring(
xml_root, pretty_print=True, encoding="UTF-8", xml_declaration=True
)
logger.debug("Starting to import the following XML file:")
logger.debug(pretty_xml_string)
parsed_despatch_advice = self.parse_xml_despatch_advice(xml_root)
elif filetype == "application/pdf":
parsed_despatch_advice = self.parse_pdf_despatch_advice(document)
else:
raise UserError(
_(
"This file '%s' is not recognised as XML nor PDF file. "
"Please check the file and it's extension."
)
% filename
)
logger.debug("Result of Despatch Advice parsing: ", parsed_despatch_advice)
if "attachments" not in parsed_despatch_advice:
parsed_despatch_advice["attachments"] = {}
parsed_despatch_advice["attachments"][filename] = b64encode(document)
if "chatter_msg" not in parsed_despatch_advice:
parsed_despatch_advice["chatter_msg"] = []
if parsed_despatch_advice.get("company") and not self.env.context.get(
"edi_skip_company_check"
):
self.env["business.document.import"]._check_company(
parsed_despatch_advice["company"], parsed_despatch_advice["chatter_msg"]
)
defaults = self.env.context.get("despatch_advice_import__default_vals", {}).get(
"despatch_advice", {}
)
parsed_despatch_advice.update(defaults)
return parsed_despatch_advice
@api.model
def parse_xml_despatch_advice(self, xml_root):
raise UserError(
_(
"This type of XML Order Response is not supported. Did you "
"install the module to support this XML format?"
)
)
@api.model
def parse_pdf_despatch_advice(self, document):
"""
Get PDF attachments, filter on XML files and call import_order_xml
"""
xml_files_dict = self.get_xml_files_from_pdf(document)
if not xml_files_dict:
raise UserError(_("There are no embedded XML file in this PDF file."))
for xml_filename, xml_root in xml_files_dict.items():
logger.info("Trying to parse XML file %s", xml_filename)
try:
parsed_despatch_advice = self.parse_xml_despatch_advice(xml_root)
return parsed_despatch_advice
except Exception:
continue
raise UserError(
_(
"This type of XML Order Document is not supported. Did you "
"install the module to support this XML format?"
)
)
def process_document(self):
self.ensure_one()
parsed_order_document = self.parse_despatch_advice(
b64decode(self.document), self.filename
)
self.process_data(parsed_order_document)
def _collect_lines_by_id(self, lines_doc, key="order_line_id"):
lines_by_id = {}
for line in lines_doc:
line_id = int(line[key])
if line_id in lines_by_id:
lines_by_id[line_id]["qty"] += line["qty"]
lines_by_id[line_id]["backorder_qty"] += line["backorder_qty"]
if "product_lot" in line:
lines_by_id[line_id]["product_lot"].append(line["product_lot"])
lines_by_id[line_id]["product_lot"] = list(
set(lines_by_id[line_id]["product_lot"])
)
lines_by_id[line_id]["uom"]["unece_code"].append(
line["uom"]["unece_code"]
)
lines_by_id[line_id]["uom"]["unece_code"] = list(
set(lines_by_id[line_id]["uom"]["unece_code"])
)
else:
lines_by_id[line_id] = line
if "product_lot" in line:
lines_by_id[line_id]["product_lot"] = [
lines_by_id[line_id]["product_lot"]
]
lines_by_id[line_id]["uom"]["unece_code"] = [
lines_by_id[line_id]["uom"]["unece_code"]
]
return lines_by_id
def process_data(self, parsed_order_document):
po_name = parsed_order_document.get("ref")
lines_doc = parsed_order_document.get("lines")
lines_by_id = self._collect_lines_by_id(lines_doc)
lines = self.env["purchase.order.line"].browse(lines_by_id.keys())
for line in lines:
order = line.order_id
line_info = lines_by_id.get(line.id)
if line_info["ref"]:
if order.name != line_info["ref"]:
raise UserError(
_("No purchase order found for name %s.") % line_info["ref"],
)
else:
if order.name != po_name:
raise UserError(_("No purchase order found for name %s.") % po_name)
stock_moves = line.move_ids.filtered(
lambda x: x.state not in ("cancel", "done")
)
moves_qty = sum(stock_moves.mapped("product_qty"))
if line_info["qty"] == moves_qty:
self._process_accepted(stock_moves, parsed_order_document)
elif line_info["qty"] > moves_qty and self.allow_validate_over_qty:
self._process_accepted(
stock_moves, parsed_order_document, forced_qty=line_info["qty"]
)
elif not line_info["qty"] and not line_info["backorder_qty"]:
self._process_rejected(stock_moves, parsed_order_document)
else:
self._process_conditional(stock_moves, parsed_order_document, line_info)
self._process_picking_done(lines[0].move_ids[0])
def _process_picking_done(self, move):
picking = move.picking_id
if all(line.state == "cancel" for line in picking.move_ids):
return True
# skip backorder wizard
picking.with_context(
skip_immediate=True, skip_backorder=True, skip_sms=True, skip_expired=True
).button_validate()
def _cancel_extra_moves(self, moves):
# Loose dependency with stock_picking_restrict_cancel_printed module
# that checks we are canceling the backorder to allow move cancellation.
# Mimic odoo setting this cancel_backorder context variable in this case.
moves.with_context(cancel_backorder=True)._action_cancel()
def _process_rejected(self, stock_moves, parsed_order_document):
parsed_order_document["chatter_msg"] = parsed_order_document.get(
"chatter_msg", []
)
parsed_order_document["chatter_msg"].append(
_("Delivery cancelled by the supplier.")
)
self._cancel_extra_moves(stock_moves)
def _process_accepted(self, stock_moves, parsed_order_document, forced_qty=False):
parsed_order_document["chatter_msg"] = (
parsed_order_document["chatter_msg"] or []
)
parsed_order_document["chatter_msg"].append(
_("Delivery confirmed by the supplier.")
)
stock_moves._action_confirm()
stock_moves._action_assign()
for move in stock_moves:
move.quantity_done = forced_qty or move.product_qty
def _process_conditional(self, moves, parsed_order_document, line):
precision = self.env["decimal.precision"].precision_get(
"Product Unit of Measure"
)
chatter = parsed_order_document["chatter_msg"] = (
parsed_order_document["chatter_msg"] or []
)
chatter.append(_("Delivery confirmed with amendment by the supplier."))
qty = line["qty"]
backorder_qty = line["backorder_qty"]
moves_qty = sum(moves.mapped("product_qty"))
if float_compare(qty, moves_qty, precision_digits=precision) >= 0:
raise UserError(
_("The product quantity is greater than the original product quantity")
)
# confirmed qty < ordered qty
move_ids_to_backorder = []
move_ids_to_cancel = []
for move in moves:
if (
float_compare(qty, move.product_uom_qty, precision_digits=precision)
>= 0
):
# qty planned => qty into the stock move: Keep it
qty -= move.product_uom_qty
continue
if (
qty
and float_compare(qty, move.product_uom_qty, precision_digits=precision)
< 0
):
# qty planned < qty into the stock move: Split it
new_vals = move._split(move.product_uom_qty - qty)
move.quantity_done = move.product_qty
move = self.env["stock.move"].create(new_vals[0])
qty -= move.product_uom_qty
if not backorder_qty:
# if no backorder -> we must cancel the move
move_ids_to_cancel.append(move.id)
continue
# from here we process the backorder qty
# we distribute this qty into the remaining moves and
# if this qty is < than the expected one, we split and cancel the
# remaining qty
if (
float_compare(
backorder_qty, move.product_uom_qty, precision_digits=precision
)
< 0
):
# backorder_qty < qty into the move -> split the move
# and cancel remaining qty
move._action_confirm(merge=False)
new_vals = move._split(move.product_uom_qty - backorder_qty)
move_ids_to_cancel.append(self.env["stock.move"].create(new_vals[0]).id)
backorder_qty -= move.product_uom_qty
move_ids_to_backorder.append(move.id)
# cancel moves to cancel
if move_ids_to_cancel:
moves_to_cancel = self.env["stock.move"].browse(move_ids_to_cancel)
self._cancel_extra_moves(moves_to_cancel)
# move backorder moves to a backorder
if move_ids_to_backorder:
moves_to_backorder = self.env["stock.move"].browse(move_ids_to_backorder)
for move in moves_to_backorder:
move._action_confirm(merge=False)

View file

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2020 ACSONE SA/NV
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="despatch_advice_import_form_view" model="ir.ui.view">
<field name="name">despatch.advice.import (in purchase_order_import)</field>
<field name="model">despatch.advice.import</field>
<field name="arch" type="xml">
<form string="Despatch Advice Import">
<group colspan="4" name="help-import">
<div colspan="2">
<p
>Upload below the DespatchAdvice you received from your supplier. When you click on the import button:</p>
<ol>
<li
>If it is an XML file, Odoo will parse it if the module that adds support for this XML format is installed. For the <a
href="http://ubl.xml.org/"
target="_blank"
>Universal Business Language</a> format (UBL), you should install the module <em
>despatch_advice_import_ubl</em>.</li>
<li
>If it is a PDF file, Odoo will try to find an XML file in the attachments of the PDF file and then use this XML file.</li>
</ol>
</div>
</group>
<group name="main">
<field name="document" filename="filename" />
<field name="filename" invisible="1" />
<field name="allow_validate_over_qty" />
</group>
<footer>
<button
name="process_document"
type="object"
class="oe_highlight"
string="Import document"
/>
<button special="cancel" string="Cancel" class="oe_link" />
</footer>
</form>
</field>
</record>
<record id="despatch_advice_import_action" model="ir.actions.act_window">
<field name="name">Import</field>
<field name="res_model">despatch.advice.import</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.menu" id="despatch_advice_import_importer_menu">
<field name="name">UBL Despatch Advice Importer</field>
<field name="parent_id" ref="purchase.menu_procurement_management" />
<field name="action" ref="despatch_advice_import_action" />
<field name="sequence" eval="99" />
</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 Despatch_advice_import Module - despatch_advice_import
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 despatch_advice_import. 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,7 @@
# Dependencies
This addon depends on:
- [purchase](../../odoo-bringout-oca-ocb-purchase)
- [purchase_stock](../../odoo-bringout-oca-ocb-purchase_stock)
- [base_business_document_import](../../odoo-bringout-oca-edi-base_business_document_import)

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 despatch_advice_import or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-edi-framework-despatch_advice_import"
# or
uv pip install odoo-bringout-oca-edi-framework-despatch_advice_import"
```

View file

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

View file

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

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in despatch_advice_import.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../despatch_advice_import/security/ir.model.access.csv)**
- 1 model access rules
## Record Rules
Row-level security rules defined in:
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../despatch_advice_import/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

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 despatch_advice_import
```

View file

@ -0,0 +1,8 @@
# Wizards
Transient models exposed as UI wizards in despatch_advice_import.
```mermaid
classDiagram
class DespatchAdviceImport
```

View file

@ -0,0 +1,45 @@
[project]
name = "odoo-bringout-oca-edi-framework-despatch_advice_import"
version = "16.0.0"
description = "Despatch Advice Import -
Despatch Advice import"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-purchase>=16.0.0",
"odoo-bringout-oca-edi-framework-purchase_stock>=16.0.0",
"odoo-bringout-oca-edi-framework-base_business_document_import>=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 = ["despatch_advice_import"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]