mirror of
https://github.com/bringout/oca-edi.git
synced 2026-04-18 01:52:02 +02:00
Initial commit: OCA Edi packages (42 packages)
This commit is contained in:
commit
df976c03db
2184 changed files with 571602 additions and 0 deletions
88
README.md
Normal file
88
README.md
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
# OCA Edi
|
||||
|
||||
This repository contains **42** OCA packages for edi.
|
||||
|
||||
## Packages Included (42 packages)
|
||||
|
||||
- **odoo-bringout-oca-edi-account_einvoice_generate** - From edi: account_einvoice_generate
|
||||
- **odoo-bringout-oca-edi-account_invoice_edifact** - From edi: account_invoice_edifact
|
||||
- **odoo-bringout-oca-edi-account_invoice_export** - From edi: account_invoice_export
|
||||
- **odoo-bringout-oca-edi-account_invoice_export_job** - From edi: account_invoice_export_job
|
||||
- **odoo-bringout-oca-edi-account_invoice_facturx** - From edi: account_invoice_facturx
|
||||
- **odoo-bringout-oca-edi-account_invoice_facturx_py3o** - From edi: account_invoice_facturx_py3o
|
||||
- **odoo-bringout-oca-edi-account_invoice_ubl** - From edi: account_invoice_ubl
|
||||
- **odoo-bringout-oca-edi-base_business_document_import** - From edi: base_business_document_import
|
||||
- **odoo-bringout-oca-edi-base_business_document_import_phone** - From edi: base_business_document_import_phone
|
||||
- **odoo-bringout-oca-edi-base_ebill_payment_contract** - From edi: base_ebill_payment_contract
|
||||
- **odoo-bringout-oca-edi-base_edi** - From edi: base_edi
|
||||
- **odoo-bringout-oca-edi-base_edifact** - From edi: base_edifact
|
||||
- **odoo-bringout-oca-edi-base_facturx** - From edi: base_facturx
|
||||
- **odoo-bringout-oca-edi-base_ubl** - From edi: base_ubl
|
||||
- **odoo-bringout-oca-edi-base_ubl_payment** - From edi: base_ubl_payment
|
||||
- **odoo-bringout-oca-edi-base_wamas_ubl** - From edi: base_wamas_ubl
|
||||
- **odoo-bringout-oca-edi-despatch_advice_import** - From edi: despatch_advice_import
|
||||
- **odoo-bringout-oca-edi-despatch_advice_import_ubl** - From edi: despatch_advice_import_ubl
|
||||
- **odoo-bringout-oca-edi-framework-account_einvoice_generate** - From edi: framework_account_einvoice_generate
|
||||
- **odoo-bringout-oca-edi-framework-account_invoice_edifact** - From edi: framework_account_invoice_edifact
|
||||
- **odoo-bringout-oca-edi-framework-account_invoice_export** - From edi: framework_account_invoice_export
|
||||
- **odoo-bringout-oca-edi-framework-account_invoice_export_job** - From edi: framework_account_invoice_export_job
|
||||
- **odoo-bringout-oca-edi-framework-account_invoice_facturx** - From edi: framework_account_invoice_facturx
|
||||
- **odoo-bringout-oca-edi-framework-account_invoice_facturx_py3o** - From edi: framework_account_invoice_facturx_py3o
|
||||
- **odoo-bringout-oca-edi-framework-account_invoice_ubl** - From edi: framework_account_invoice_ubl
|
||||
- **odoo-bringout-oca-edi-framework-base_business_document_import** - From edi: framework_base_business_document_import
|
||||
- **odoo-bringout-oca-edi-framework-base_business_document_import_phone** - From edi: framework_base_business_document_import_phone
|
||||
- **odoo-bringout-oca-edi-framework-base_ebill_payment_contract** - From edi: framework_base_ebill_payment_contract
|
||||
- **odoo-bringout-oca-edi-framework-base_edi** - From edi: framework_base_edi
|
||||
- **odoo-bringout-oca-edi-framework-base_edifact** - From edi: framework_base_edifact
|
||||
- **odoo-bringout-oca-edi-framework-base_facturx** - From edi: framework_base_facturx
|
||||
- **odoo-bringout-oca-edi-framework-base_ubl** - From edi: framework_base_ubl
|
||||
- **odoo-bringout-oca-edi-framework-base_ubl_payment** - From edi: framework_base_ubl_payment
|
||||
- **odoo-bringout-oca-edi-framework-base_wamas_ubl** - From edi: framework_base_wamas_ubl
|
||||
- **odoo-bringout-oca-edi-framework-despatch_advice_import** - From edi: framework_despatch_advice_import
|
||||
- **odoo-bringout-oca-edi-framework-despatch_advice_import_ubl** - From edi: framework_despatch_advice_import_ubl
|
||||
- **odoo-bringout-oca-edi-framework-pdf_helper** - From edi: framework_pdf_helper
|
||||
- **odoo-bringout-oca-edi-framework-sale_order_import** - From edi: framework_sale_order_import
|
||||
- **odoo-bringout-oca-edi-framework-sale_order_import_edifact** - From edi: framework_sale_order_import_edifact
|
||||
- **odoo-bringout-oca-edi-pdf_helper** - From edi: pdf_helper
|
||||
- **odoo-bringout-oca-edi-sale_order_import** - From edi: sale_order_import
|
||||
- **odoo-bringout-oca-edi-sale_order_import_edifact** - From edi: sale_order_import_edifact
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
Install any package from this category:
|
||||
|
||||
```bash
|
||||
# Install from local directory
|
||||
pip install packages/oca-edi/PACKAGE_NAME/
|
||||
|
||||
# Install in development mode
|
||||
pip install -e packages/oca-edi/PACKAGE_NAME/
|
||||
|
||||
# Using uv (recommended for speed)
|
||||
uv add packages/oca-edi/PACKAGE_NAME/
|
||||
```
|
||||
|
||||
## Repository Structure
|
||||
|
||||
Each package in this repository follows the standard Odoo addon structure:
|
||||
|
||||
```
|
||||
oca-edi/
|
||||
├── odoo-bringout-oca-PROJECT-ADDON/
|
||||
│ ├── ADDON_NAME/ # Complete addon code
|
||||
│ │ ├── __init__.py
|
||||
│ │ ├── __manifest__.py
|
||||
│ │ └── ... (models, views, etc.)
|
||||
│ ├── pyproject.toml # Python package configuration
|
||||
│ └── README.md # Package documentation
|
||||
└── ...
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
These packages are maintained as part of the [OCA (Odoo Community Association)](https://github.com/OCA) ecosystem.
|
||||
|
||||
## License
|
||||
|
||||
Each package maintains its original license as specified in the OCA repositories.
|
||||
44
odoo-bringout-oca-edi-account_einvoice_generate/README.md
Normal file
44
odoo-bringout-oca-edi-account_einvoice_generate/README.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# Account e-invoice Generate
|
||||
|
||||
Odoo addon: account_einvoice_generate
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-edi-account_einvoice_generate
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
This addon depends on:
|
||||
- account
|
||||
|
||||
## Manifest Information
|
||||
|
||||
- **Name**: Account e-invoice Generate
|
||||
- **Version**: 16.0.1.1.0
|
||||
- **Category**: Accounting & Finance
|
||||
- **License**: AGPL-3
|
||||
- **Installable**: True
|
||||
|
||||
## Source
|
||||
|
||||
Based on [OCA/edi](https://github.com/OCA/edi) branch 16.0, addon `account_einvoice_generate`.
|
||||
|
||||
## 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
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
==========================
|
||||
Account e-invoice Generate
|
||||
==========================
|
||||
|
||||
..
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:7d46d7a31c358dee3280b20b510f7eff3b7bbda3ca7629a5c3fa0ac20ba4fd22
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |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%2Fedi-lightgray.png?logo=github
|
||||
:target: https://github.com/OCA/edi/tree/16.0/account_einvoice_generate
|
||||
: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-account_einvoice_generate
|
||||
: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 is a technical module that ensure compatibility between the e-invoice generation modules of the `OCA/edi project <https://github.com/OCA/edi/>`_. It doesn't bring any feature by itself. You must also install one of the 2 OCA modules that generate electronic invoices:
|
||||
|
||||
* **account_invoice_ubl**: add support for the UBL format (Universal Business Language),
|
||||
* **account_invoice_facturx**: add support for the `Factur-X <http://fnfe-mpe.org/factur-x/factur-x_en/>`_ format.
|
||||
|
||||
See the README of each module for more information.
|
||||
|
||||
These 2 modules are able to embed an XML file in the PDF invoice and
|
||||
this module ensure that these 2 modules are compatible.
|
||||
|
||||
**Table of contents**
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
Before installing the module, you must **uninstall** the module **account_edi** from the official addons. As the account_edi module is auto-installable, it is certainly already installed on your Odoo database.
|
||||
|
||||
For that, go to the *Apps* menu, remove the *Apps* filter, search for the module *account_edi* (the title of the module is *Import/Export Invoices From XML/PDF*). Then click on the button *Module info* and then on the button *Uninstall*.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The new configuration parameter *XML Format embedded in PDF invoice*
|
||||
is available in the menu *Invoicing > Configuration > Settings*.
|
||||
|
||||
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:%20account_einvoice_generate%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
|
||||
~~~~~~~
|
||||
|
||||
* Akretion
|
||||
* Onestein
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
* Andrea Stirpe <a.stirpe@onestein.nl>
|
||||
* Shine IT <contact@openerp.cn>
|
||||
|
||||
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-alexis-via| image:: https://github.com/alexis-via.png?size=40px
|
||||
:target: https://github.com/alexis-via
|
||||
:alt: alexis-via
|
||||
|
||||
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|
||||
|
||||
|maintainer-alexis-via|
|
||||
|
||||
This module is part of the `OCA/edi <https://github.com/OCA/edi/tree/16.0/account_einvoice_generate>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import models
|
||||
from . import wizards
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# Copyright 2018-2022 Akretion France (http://www.akretion.com)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
"name": "Account e-invoice Generate",
|
||||
"version": "16.0.1.1.0",
|
||||
"category": "Accounting & Finance",
|
||||
"license": "AGPL-3",
|
||||
"summary": "Technical module to generate PDF invoices with " "embedded XML file",
|
||||
"author": "Akretion,Onestein,Odoo Community Association (OCA)",
|
||||
"maintainers": ["alexis-via"],
|
||||
"website": "https://github.com/OCA/edi",
|
||||
"depends": ["account"],
|
||||
"data": ["views/res_config_settings.xml"],
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_e-invoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 13.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_e-invoice_generate.view_account_config_settings
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-specific.\" groups=\"base.group_multi_company\"/>"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model,name:account_e-invoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model,name:account_e-invoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_e-invoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model,name:account_e-invoice_generate.model_account_move
|
||||
msgid "Journal Entries"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_e-invoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_e-invoice_generate.view_account_config_settings
|
||||
msgid "Select the format of your e-invoices."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model.fields,field_description:account_e-invoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_e-invoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr ""
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_einvoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-specific.\" groups=\"base.group_multi_company\"/>"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_einvoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "XML format attached to your PDF customer invoices"
|
||||
msgstr ""
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_e-invoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 13.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_e-invoice_generate.view_account_config_settings
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-specific.\" groups=\"base.group_multi_company\"/>"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model,name:account_e-invoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Tvrtke"
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model,name:account_e-invoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr "Postavke"
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_e-invoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr "Elektronički računi"
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model,name:account_e-invoice_generate.model_account_move
|
||||
msgid "Journal Entries"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_e-invoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr "Ništa"
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_e-invoice_generate.view_account_config_settings
|
||||
msgid "Select the format of your e-invoices."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_e-invoice_generate
|
||||
#: model:ir.model.fields,field_description:account_e-invoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_e-invoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr "XML format ugnježđen u PDF račun"
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_einvoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2023-08-07 08:11+0000\n"
|
||||
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.17\n"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title="
|
||||
"\"Values set here are company-specific.\" groups=\"base.group_multi_company"
|
||||
"\"/>"
|
||||
msgstr ""
|
||||
"<span class=\"o_form_label\">Seleccionar Formato</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title="
|
||||
"\"Values set here are company-specific.\" groups=\"base.group_multi_company"
|
||||
"\"/>"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Compañías"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr "Ajustes de Configuración"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr "Facturas electrónicas"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Entrada Diaria"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_einvoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr "Ninguno/a"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr "Formato XML integrado en factura PDF"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "XML format attached to your PDF customer invoices"
|
||||
msgstr "Formato XML adjunto a sus facturas de clientes en PDF"
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_einvoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2023-06-27 19:08+0000\n"
|
||||
"Last-Translator: Alexis de Lattre <alexis@via.ecp.fr>\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: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title="
|
||||
"\"Values set here are company-specific.\" groups=\"base.group_multi_company"
|
||||
"\"/>"
|
||||
msgstr ""
|
||||
"<span class=\"o_form_label\">Sélectionner le format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title="
|
||||
"\"Values set here are company-specific.\" groups=\"base.group_multi_company"
|
||||
"\"/>"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Sociétés"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr "Configuration"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr "Factures électroniques"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Pièce comptable"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_einvoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr "Aucun"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr "Format XML embarqué dans la facture PDF"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "XML format attached to your PDF customer invoices"
|
||||
msgstr "Format XML embarqué à l'intérieur de vos factures clients PDF"
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_e-invoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 12.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2019-11-14 16:34+0000\n"
|
||||
"Last-Translator: Bole <bole@dajmi5.com>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: hr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 3.8\n"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title="
|
||||
"\"Values set here are company-specific.\" groups=\"base.group_multi_company"
|
||||
"\"/>"
|
||||
msgstr ""
|
||||
"<span class=\"fa fa-lg fa-building-o\" title=\"Vrijednosti postavljene ovdje "
|
||||
"su specifične za svaku tvrtku\" groups=\"base.group_multi_company\"/>"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Tvrtke"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr "Postavke"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr "Elektronički računi"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_einvoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr "Ništa"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr "XML format ugnježđen u PDF račun"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "XML format attached to your PDF customer invoices"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Select the format of your e-invoices."
|
||||
#~ msgstr "Odaberite format za vaše elektroničke račune."
|
||||
|
||||
#~ msgid "Format"
|
||||
#~ msgstr "Format"
|
||||
|
||||
#~ msgid "Invoice"
|
||||
#~ msgstr "Račun"
|
||||
|
||||
#~ msgid "Select Format"
|
||||
#~ msgstr "Odabir formata"
|
||||
|
||||
#~ msgid "Universal Business Language (UBL)"
|
||||
#~ msgstr "Universal Business Language (UBL)"
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_einvoice_generate
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2024-05-29 12:37+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 4.17\n"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid ""
|
||||
"<span class=\"o_form_label\">Select Format</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-specific.\" groups=\"base.group_multi_company\"/>"
|
||||
msgstr ""
|
||||
"<span class=\"o_form_label\">Seleziona formato</span>\n"
|
||||
" <span class=\"fa fa-lg fa-building-o\" title=\"I "
|
||||
"valori impostati qui sono specifici per azienda.\" groups=\"base."
|
||||
"group_multi_company\"/>"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Aziende"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_res_config_settings
|
||||
msgid "Config Settings"
|
||||
msgstr "Impostazioni configurazione"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "Electronic Invoices"
|
||||
msgstr "Fatture elettroniche"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model,name:account_einvoice_generate.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Registrazione contabile"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields.selection,name:account_einvoice_generate.selection__res_company__xml_format_in_pdf_invoice__none
|
||||
msgid "None"
|
||||
msgstr "Nessuna"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_company__xml_format_in_pdf_invoice
|
||||
#: model:ir.model.fields,field_description:account_einvoice_generate.field_res_config_settings__xml_format_in_pdf_invoice
|
||||
msgid "XML Format embedded in PDF invoice"
|
||||
msgstr "Formato XML incorporato nella fattura PDF"
|
||||
|
||||
#. module: account_einvoice_generate
|
||||
#: model_terms:ir.ui.view,arch_db:account_einvoice_generate.view_account_config_settings
|
||||
msgid "XML format attached to your PDF customer invoices"
|
||||
msgstr "Formato XML allegato alla tua fattura PDF"
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import res_company
|
||||
from . import account_move
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# Copyright 2018-2022 Akretion France
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, models
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = "account.move"
|
||||
|
||||
def get_payment_identifier(self):
|
||||
"""This method is designed to be inherited in localization modules"""
|
||||
self.ensure_one()
|
||||
return self.payment_reference
|
||||
|
||||
@api.model
|
||||
def _get_invoice_report_names(self):
|
||||
return ["account.report_invoice", "account.report_invoice_with_payments"]
|
||||
|
||||
def _xml_format_in_pdf_invoice(self):
|
||||
"""Returns the format if it is possible to generate the XML
|
||||
Otherwize return False"""
|
||||
self.ensure_one()
|
||||
xml_format = self.company_id.xml_format_in_pdf_invoice
|
||||
# I want to allow embedded XML even on draft invoice
|
||||
# So I write here the conditions to be able to generate a valid XML
|
||||
if (
|
||||
xml_format
|
||||
and xml_format != "none"
|
||||
and self.move_type in ("out_invoice", "out_refund")
|
||||
and self.partner_id
|
||||
and self.state != "cancel"
|
||||
and self.invoice_line_ids.filtered(lambda x: x.display_type == "product")
|
||||
):
|
||||
return xml_format
|
||||
else:
|
||||
return False
|
||||
|
||||
def _get_unece_due_date_type_code(self):
|
||||
"""account.tax has a selection field 'tax_exigibility' with 2 possible values:
|
||||
'on_invoice' or 'on_payment'.
|
||||
As a consequence, tax exigibility is a property of the invoice line.
|
||||
But, in real life (at least in France), tax exigibility is a property of the invoice,
|
||||
not the invoice line!
|
||||
This method is a hook to get the UNECE due date type code from the invoice instead
|
||||
of the tax. If it returns None, Odoo will get it from the tax.
|
||||
"""
|
||||
self.ensure_one()
|
||||
return None
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# Copyright 2018-2022 Akretion (http://www.akretion.com)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
_inherit = "res.company"
|
||||
|
||||
xml_format_in_pdf_invoice = fields.Selection(
|
||||
[("none", "None")], string="XML Format embedded in PDF invoice"
|
||||
)
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
The new configuration parameter *XML Format embedded in PDF invoice*
|
||||
is available in the menu *Invoicing > Configuration > Settings*.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
* Andrea Stirpe <a.stirpe@onestein.nl>
|
||||
* Shine IT <contact@openerp.cn>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
This is a technical module that ensure compatibility between the e-invoice generation modules of the `OCA/edi project <https://github.com/OCA/edi/>`_. It doesn't bring any feature by itself. You must also install one of the 2 OCA modules that generate electronic invoices:
|
||||
|
||||
* **account_invoice_ubl**: add support for the UBL format (Universal Business Language),
|
||||
* **account_invoice_facturx**: add support for the `Factur-X <http://fnfe-mpe.org/factur-x/factur-x_en/>`_ format.
|
||||
|
||||
See the README of each module for more information.
|
||||
|
||||
These 2 modules are able to embed an XML file in the PDF invoice and
|
||||
this module ensure that these 2 modules are compatible.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
Before installing the module, you must **uninstall** the module **account_edi** from the official addons. As the account_edi module is auto-installable, it is certainly already installed on your Odoo database.
|
||||
|
||||
For that, go to the *Apps* menu, remove the *Apps* filter, search for the module *account_edi* (the title of the module is *Import/Export Invoices From XML/PDF*). Then click on the button *Module info* and then on the button *Uninstall*.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
|
|
@ -0,0 +1,447 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
|
||||
<title>Account e-invoice Generate</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
Despite the name, some widely supported CSS2 features are used.
|
||||
|
||||
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
.subscript {
|
||||
vertical-align: sub;
|
||||
font-size: smaller }
|
||||
|
||||
.superscript {
|
||||
vertical-align: super;
|
||||
font-size: smaller }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
table.align-center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
.align-top {
|
||||
vertical-align: top }
|
||||
|
||||
.align-middle {
|
||||
vertical-align: middle }
|
||||
|
||||
.align-bottom {
|
||||
vertical-align: bottom }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: gray; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic, pre.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="account-e-invoice-generate">
|
||||
<h1 class="title">Account e-invoice Generate</h1>
|
||||
|
||||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:7d46d7a31c358dee3280b20b510f7eff3b7bbda3ca7629a5c3fa0ac20ba4fd22
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<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/edi/tree/16.0/account_einvoice_generate"><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-account_einvoice_generate"><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&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 is a technical module that ensure compatibility between the e-invoice generation modules of the <a class="reference external" href="https://github.com/OCA/edi/">OCA/edi project</a>. It doesn’t bring any feature by itself. You must also install one of the 2 OCA modules that generate electronic invoices:</p>
|
||||
<ul class="simple">
|
||||
<li><strong>account_invoice_ubl</strong>: add support for the UBL format (Universal Business Language),</li>
|
||||
<li><strong>account_invoice_facturx</strong>: add support for the <a class="reference external" href="http://fnfe-mpe.org/factur-x/factur-x_en/">Factur-X</a> format.</li>
|
||||
</ul>
|
||||
<p>See the README of each module for more information.</p>
|
||||
<p>These 2 modules are able to embed an XML file in the PDF invoice and
|
||||
this module ensure that these 2 modules are compatible.</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="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="installation">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Installation</a></h1>
|
||||
<p>Before installing the module, you must <strong>uninstall</strong> the module <strong>account_edi</strong> from the official addons. As the account_edi module is auto-installable, it is certainly already installed on your Odoo database.</p>
|
||||
<p>For that, go to the <em>Apps</em> menu, remove the <em>Apps</em> filter, search for the module <em>account_edi</em> (the title of the module is <em>Import/Export Invoices From XML/PDF</em>). Then click on the button <em>Module info</em> and then on the button <em>Uninstall</em>.</p>
|
||||
</div>
|
||||
<div class="section" id="configuration">
|
||||
<h1><a class="toc-backref" href="#toc-entry-2">Configuration</a></h1>
|
||||
<p>The new configuration parameter <em>XML Format embedded in PDF invoice</em>
|
||||
is available in the menu <em>Invoicing > Configuration > Settings</em>.</p>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/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:%20account_einvoice_generate%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Akretion</li>
|
||||
<li>Onestein</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||
<li>Andrea Stirpe <<a class="reference external" href="mailto:a.stirpe@onestein.nl">a.stirpe@onestein.nl</a>></li>
|
||||
<li>Shine IT <<a class="reference external" href="mailto:contact@openerp.cn">contact@openerp.cn</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
|
||||
<p>This module is maintained by the OCA.</p>
|
||||
<a class="reference external image-reference" href="https://odoo-community.org">
|
||||
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
|
||||
</a>
|
||||
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||
mission is to support the collaborative development of Odoo features and
|
||||
promote its widespread use.</p>
|
||||
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
|
||||
<p><a class="reference external image-reference" href="https://github.com/alexis-via"><img alt="alexis-via" src="https://github.com/alexis-via.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/account_einvoice_generate">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>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import test_einvoice_generate
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# Copyright 2019-2022 Onestein (<https://www.onestein.eu>)
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo.tests.common import TransactionCase
|
||||
|
||||
|
||||
class TestEInvoiceGenerate(TransactionCase):
|
||||
def test_config(self):
|
||||
"""Test configuration of Electronic Invoices."""
|
||||
conf = self.env["res.config.settings"].create(
|
||||
{"xml_format_in_pdf_invoice": "none"}
|
||||
)
|
||||
conf.execute()
|
||||
self.assertTrue(self.env.company.xml_format_in_pdf_invoice)
|
||||
conf.xml_format_in_pdf_invoice = False
|
||||
conf.execute()
|
||||
self.assertFalse(self.env.company.xml_format_in_pdf_invoice)
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!--
|
||||
Copyright 2018-2022 Akretion (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
|
||||
<odoo>
|
||||
<record id="view_account_config_settings" model="ir.ui.view">
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="inherit_id" ref="account.res_config_settings_view_form" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath
|
||||
expr="//div[@id='print_vendor_checks_setting_container']"
|
||||
position="after"
|
||||
>
|
||||
<h2>Electronic Invoices</h2>
|
||||
<div class="row mt16 o_settings_container" id="invoicing_settings">
|
||||
<div class="col-12 col-lg-8 o_setting_box" id="e-invoices">
|
||||
<div class="o_setting_left_pane" />
|
||||
<div class="o_setting_right_pane">
|
||||
<span class="o_form_label">Select Format</span>
|
||||
<span
|
||||
class="fa fa-lg fa-building-o"
|
||||
title="Values set here are company-specific."
|
||||
groups="base.group_multi_company"
|
||||
/>
|
||||
<div class="text-muted">
|
||||
XML format attached to your PDF customer invoices
|
||||
</div>
|
||||
<div class="text-muted" name="xml_format_in_pdf_invoice">
|
||||
<field name="xml_format_in_pdf_invoice" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import res_config_settings
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# Copyright 2018-2022 Akretion (http://www.akretion.com)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResConfigSettings(models.TransientModel):
|
||||
_inherit = "res.config.settings"
|
||||
|
||||
xml_format_in_pdf_invoice = fields.Selection(
|
||||
related="company_id.xml_format_in_pdf_invoice", readonly=False
|
||||
)
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# Architecture
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
U[Users] -->|HTTP| V[Views and QWeb Templates]
|
||||
V --> C[Controllers]
|
||||
V --> W[Wizards – Transient Models]
|
||||
C --> M[Models and ORM]
|
||||
W --> M
|
||||
M --> R[Reports]
|
||||
DX[Data XML] --> M
|
||||
S[Security – ACLs and Groups] -. enforces .-> M
|
||||
|
||||
subgraph Account_einvoice_generate Module - account_einvoice_generate
|
||||
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.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Configuration
|
||||
|
||||
Refer to Odoo settings for account_einvoice_generate. Configure related models, access rights, and options as needed.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Controllers
|
||||
|
||||
This module does not define custom HTTP controllers.
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# Dependencies
|
||||
|
||||
This addon depends on:
|
||||
|
||||
- [account](../../odoo-bringout-oca-ocb-account)
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# FAQ
|
||||
|
||||
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
|
||||
- Q: How to enable? A: Start server with --addon account_einvoice_generate or install in UI.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Install
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-edi-account_einvoice_generate"
|
||||
# or
|
||||
uv pip install odoo-bringout-oca-edi-account_einvoice_generate"
|
||||
```
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# Models
|
||||
|
||||
Detected core models and extensions in account_einvoice_generate.
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class account_move
|
||||
class res_company
|
||||
```
|
||||
|
||||
Notes
|
||||
- Classes show model technical names; fields omitted for brevity.
|
||||
- Items listed under _inherit are extensions of existing models.
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# Overview
|
||||
|
||||
Packaged Odoo addon: account_einvoice_generate. Provides features documented in upstream Odoo 16 under this addon.
|
||||
|
||||
- Source: OCA/OCB 16.0, addon account_einvoice_generate
|
||||
- License: LGPL-3
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Reports
|
||||
|
||||
This module does not define custom reports.
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Usage
|
||||
|
||||
Start Odoo including this addon (from repo root):
|
||||
|
||||
```bash
|
||||
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon account_einvoice_generate
|
||||
```
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Wizards
|
||||
|
||||
This module does not include UI wizards.
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
[project]
|
||||
name = "odoo-bringout-oca-edi-account_einvoice_generate"
|
||||
version = "16.0.0"
|
||||
description = "Account e-invoice Generate - Technical module to generate PDF invoices with embedded XML file"
|
||||
authors = [
|
||||
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
|
||||
]
|
||||
dependencies = [
|
||||
"odoo-bringout-oca-ocb-account>=16.0.0",
|
||||
"requests>=2.25.1"
|
||||
]
|
||||
readme = "README.md"
|
||||
requires-python = ">= 3.11"
|
||||
classifiers = [
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Topic :: Office/Business",
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
homepage = "https://github.com/bringout/0"
|
||||
repository = "https://github.com/bringout/0"
|
||||
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[tool.hatch.metadata]
|
||||
allow-direct-references = true
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["account_einvoice_generate"]
|
||||
|
||||
[tool.rye]
|
||||
managed = true
|
||||
dev-dependencies = [
|
||||
"pytest>=8.4.1",
|
||||
]
|
||||
46
odoo-bringout-oca-edi-account_invoice_edifact/README.md
Normal file
46
odoo-bringout-oca-edi-account_invoice_edifact/README.md
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
# Account Invoice EDIFACT
|
||||
|
||||
Odoo addon: account_invoice_edifact
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-edi-account_invoice_edifact
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
This addon depends on:
|
||||
- sale_management
|
||||
- account
|
||||
- base_edifact
|
||||
|
||||
## Manifest Information
|
||||
|
||||
- **Name**: Account Invoice EDIFACT
|
||||
- **Version**: 16.0.1.0.0
|
||||
- **Category**: Invoicing Management
|
||||
- **License**: AGPL-3
|
||||
- **Installable**: True
|
||||
|
||||
## Source
|
||||
|
||||
Based on [OCA/edi](https://github.com/OCA/edi) branch 16.0, addon `account_invoice_edifact`.
|
||||
|
||||
## 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
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
=======================
|
||||
Account Invoice EDIFACT
|
||||
=======================
|
||||
|
||||
..
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:70d9ca517fbd902f6eb1d5b7a7e6b51be92f174ec45f39548e2972b519876286
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png
|
||||
:target: https://odoo-community.org/page/development-status
|
||||
:alt: Alpha
|
||||
.. |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%2Fedi-lightgray.png?logo=github
|
||||
:target: https://github.com/OCA/edi/tree/16.0/account_invoice_edifact
|
||||
: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-account_invoice_edifact
|
||||
: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|
|
||||
|
||||
UN/EDIFACT
|
||||
United Nations rules for Electronic Data Interchange for Administration, Commerce and Transport
|
||||
|
||||
This module will support exporting invoice in EDIFACT format.
|
||||
|
||||
https://www.stedi.com/edi/edifact/D96A/messages/INVOIC
|
||||
|
||||
.. IMPORTANT::
|
||||
This is an alpha version, the data model and design can change at any time without warning.
|
||||
Only for development or testing purpose, do not use in production.
|
||||
`More details on development status <https://odoo-community.org/page/development-status>`_
|
||||
|
||||
**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:%20account_invoice_edifact%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
|
||||
~~~~~~~
|
||||
|
||||
* Camptocamp
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Thien (Vo Hong) <thienvh@trobz.com>
|
||||
|
||||
Other credits
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The development of this module has been 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.
|
||||
|
||||
This module is part of the `OCA/edi <https://github.com/OCA/edi/tree/16.0/account_invoice_edifact>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
# Copyright 2023 Camptocamp
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0)
|
||||
{
|
||||
"name": "Account Invoice EDIFACT",
|
||||
"summary": "Generate customer invoices with EDIFACT/D96A format",
|
||||
"version": "16.0.1.0.0",
|
||||
"development_status": "Alpha",
|
||||
"category": "Invoicing Management",
|
||||
"website": "https://github.com/OCA/edi",
|
||||
"author": "Camptocamp, Odoo Community Association (OCA)",
|
||||
"license": "AGPL-3",
|
||||
"installable": True,
|
||||
"depends": [
|
||||
"sale_management",
|
||||
"account",
|
||||
"base_edifact",
|
||||
],
|
||||
"data": [],
|
||||
"demo": [
|
||||
"demo/data_demo.xml",
|
||||
],
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo noupdate="1">
|
||||
<record id="partner_edifact_dm" model="res.partner">
|
||||
<field name="name">Partner Name 1</field>
|
||||
<field name="is_company" eval="True" />
|
||||
<field name="customer_rank" eval="1" />
|
||||
<field name="street">Street 1</field>
|
||||
<field name="zip">1234</field>
|
||||
<field name="city">City 1</field>
|
||||
<field name="country_id" ref="base.lu" />
|
||||
</record>
|
||||
<record id="partner_edifact_shipto_dm" model="res.partner">
|
||||
<field name="name">Partner Name 2</field>
|
||||
<field name="parent_id" ref="partner_edifact_dm" />
|
||||
<field name="street">Street 2</field>
|
||||
<field name="zip">4321</field>
|
||||
<field name="city">City 2</field>
|
||||
<field name="country_id" ref="base.pl" />
|
||||
<field name="email" />
|
||||
<field name="type">delivery</field>
|
||||
</record>
|
||||
<record id="partner_edifact_invoiceto_dm" model="res.partner">
|
||||
<field name="name">Partner Name 3</field>
|
||||
<field name="parent_id" ref="partner_edifact_dm" />
|
||||
<field name="street">Street 3</field>
|
||||
<field name="zip">3214</field>
|
||||
<field name="city">City 3</field>
|
||||
<field name="country_id" ref="base.pl" />
|
||||
<field name="function">Accountant</field>
|
||||
<field name="customer_rank" eval="1" />
|
||||
<field name="type">invoice</field>
|
||||
</record>
|
||||
|
||||
<record
|
||||
id="user_edifact_sender_dm"
|
||||
model="res.users"
|
||||
context="{'no_reset_password': True}"
|
||||
>
|
||||
<field name="partner_id" ref="partner_edifact_dm" />
|
||||
<field name="name">Edifact User</field>
|
||||
<field name="login">edifact_username</field>
|
||||
<field name="password">edifact_password</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_id_number_edifact" model="res.partner.id_number">
|
||||
<field
|
||||
name="category_id"
|
||||
ref="partner_identification_gln.partner_identification_gln_number_category"
|
||||
/>
|
||||
<field name="partner_id" ref="partner_edifact_dm" />
|
||||
<field name="name">9780201379624</field>
|
||||
</record>
|
||||
<record id="res_partner_id_number_edifact_shipto" model="res.partner.id_number">
|
||||
<field
|
||||
name="category_id"
|
||||
ref="partner_identification_gln.partner_identification_gln_number_category"
|
||||
/>
|
||||
<field name="partner_id" ref="partner_edifact_shipto_dm" />
|
||||
<field name="name">9780201379686</field>
|
||||
</record>
|
||||
<record id="res_partner_id_number_edifact_invoiceto" model="res.partner.id_number">
|
||||
<field
|
||||
name="category_id"
|
||||
ref="partner_identification_gln.partner_identification_gln_number_category"
|
||||
/>
|
||||
<field name="partner_id" ref="partner_edifact_invoiceto_dm" />
|
||||
<field name="name">9780201379174</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_edifact
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#: model:ir.model,name:account_invoice_edifact.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_edifact/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Partner is not allowed to use the feature."
|
||||
msgstr ""
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_edifact
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#: model:ir.model,name:account_invoice_edifact.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Žurnal"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_edifact/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Partner is not allowed to use the feature."
|
||||
msgstr "Partneru nije dozvoljeno da koristi ovu funkciju."
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_edifact
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2024-02-15 21:35+0000\n"
|
||||
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.17\n"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#: model:ir.model,name:account_invoice_edifact.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Entrada en Diario"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_edifact/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Partner is not allowed to use the feature."
|
||||
msgstr "El socio no puede utilizar esta función."
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_edifact
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2024-05-13 10:34+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 4.17\n"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#: model:ir.model,name:account_invoice_edifact.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Registrazione contabile"
|
||||
|
||||
#. module: account_invoice_edifact
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_edifact/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Partner is not allowed to use the feature."
|
||||
msgstr "Il partner non è autorizzato ad utilizzare questa funzionalità."
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import account_move
|
||||
|
|
@ -0,0 +1,328 @@
|
|||
# Copyright 2023 Camtocamp
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from odoo import _, models
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = "account.move"
|
||||
|
||||
def edifact_invoice_generate_data(self):
|
||||
self.ensure_one()
|
||||
edifact_model = self.env["base.edifact"]
|
||||
lines = []
|
||||
interchange = self._edifact_invoice_get_interchange()
|
||||
|
||||
header = self._edifact_invoice_get_header()
|
||||
product, vals = self._edifact_invoice_get_product()
|
||||
summary = self._edifact_invoice_get_summary(vals)
|
||||
lines += header + product + summary
|
||||
for segment in lines:
|
||||
interchange.add_segment(edifact_model.create_segment(*segment))
|
||||
return interchange.serialize()
|
||||
|
||||
def _edifact_invoice_get_interchange(self):
|
||||
id_number = self.env["res.partner.id_number"]
|
||||
sender = id_number.search(
|
||||
[("partner_id", "=", self.invoice_user_id.partner_id.id)], limit=1
|
||||
)
|
||||
recipient = id_number.search([("partner_id", "=", self.partner_id.id)], limit=1)
|
||||
if not sender or not recipient:
|
||||
raise UserError(_("Partner is not allowed to use the feature."))
|
||||
sender_edifact = [sender.name, "14"]
|
||||
recipient_edifact = [recipient.name, "14"]
|
||||
syntax_identifier = ["UNOC", "3"]
|
||||
|
||||
return self.env["base.edifact"].create_interchange(
|
||||
sender_edifact, recipient_edifact, self.id, syntax_identifier
|
||||
)
|
||||
|
||||
def _edifact_invoice_get_address(self, partner):
|
||||
# We apply the same logic as:
|
||||
# https://github.com/OCA/edi/blob/
|
||||
# c41829a8d986c6751c07299807c808d15adbf4db/base_ubl/models/ubl.py#L39
|
||||
|
||||
# oca/partner-contact/partner_address_street3 is installed
|
||||
if hasattr(partner, "street3"):
|
||||
return partner.street3 or partner.street2 or partner.street
|
||||
else:
|
||||
return partner.street2 or partner.street
|
||||
|
||||
def _edifact_invoice_get_buyer(self):
|
||||
buyer = self.partner_id
|
||||
street = self._edifact_invoice_get_address(buyer)
|
||||
return [
|
||||
# Invoice information
|
||||
(
|
||||
"NAD",
|
||||
"IV",
|
||||
[buyer.id, "", "92"],
|
||||
"",
|
||||
buyer.commercial_company_name,
|
||||
[street, ""],
|
||||
buyer.city,
|
||||
"",
|
||||
buyer.zip,
|
||||
buyer.country_id.code,
|
||||
),
|
||||
# Internal customer number
|
||||
("RFF", ["IT", buyer.id]),
|
||||
# Buyer information
|
||||
(
|
||||
"NAD",
|
||||
"BY",
|
||||
[buyer.id, "", "92"],
|
||||
"",
|
||||
buyer.commercial_company_name,
|
||||
[buyer.street, ""],
|
||||
buyer.city,
|
||||
"",
|
||||
buyer.zip,
|
||||
buyer.country_id.code,
|
||||
),
|
||||
("RFF", ["API", ""]),
|
||||
]
|
||||
|
||||
def _edifact_invoice_get_seller(self):
|
||||
id_number = self.env["res.partner.id_number"]
|
||||
seller = self.invoice_user_id.partner_id
|
||||
seller_id_number = id_number.search([("partner_id", "=", seller.id)], limit=1)
|
||||
street = self._edifact_invoice_get_address(seller)
|
||||
return [
|
||||
# Seller information
|
||||
(
|
||||
"NAD",
|
||||
"SE",
|
||||
[seller_id_number.name, "", "92"],
|
||||
"",
|
||||
seller.commercial_company_name,
|
||||
[street, ""],
|
||||
seller.city,
|
||||
"",
|
||||
seller.zip,
|
||||
seller.country_id.code,
|
||||
),
|
||||
# VAT registration number
|
||||
("RFF", ["VA", seller.vat]),
|
||||
# Government reference number
|
||||
("RFF", ["GN", seller.vat]), # TODO: Fix it
|
||||
]
|
||||
|
||||
def _edifact_invoice_get_shipper(self):
|
||||
id_number = self.env["res.partner.id_number"]
|
||||
shipper = self.partner_shipping_id
|
||||
shipper_id_number = id_number.search([("partner_id", "=", shipper.id)], limit=1)
|
||||
return [
|
||||
# Delivery party Information
|
||||
(
|
||||
"NAD",
|
||||
"DP",
|
||||
[shipper_id_number.name, "", "92"],
|
||||
"",
|
||||
shipper.commercial_company_name,
|
||||
[shipper.street, ""],
|
||||
shipper.city,
|
||||
"",
|
||||
shipper.zip,
|
||||
shipper.country_id.code,
|
||||
),
|
||||
("RFF", ["API", ""]),
|
||||
]
|
||||
|
||||
def _edifact_invoice_get_header(self):
|
||||
source_orders = self.line_ids.sale_line_ids.order_id
|
||||
today = datetime.now().date().strftime("%Y%m%d")
|
||||
buyer = self.partner_id
|
||||
|
||||
term_lines = self.invoice_payment_term_id.line_ids
|
||||
discount_percentage, discount_days = (
|
||||
term_lines.discount_percentage,
|
||||
term_lines.discount_days if len(term_lines) == 1 else 0,
|
||||
)
|
||||
|
||||
header = [
|
||||
("UNH", "1", ["INVOIC", "D", "96A", "UN", "EAN008"]),
|
||||
# Commercial invoice
|
||||
("BGM", ["380", "", "", "Invoice"], self.payment_reference, "9"),
|
||||
# 35: Delivery date/time, actual
|
||||
(
|
||||
"DTM",
|
||||
[
|
||||
"35",
|
||||
max(
|
||||
(
|
||||
picking.date_done.date().strftime("%Y%m%d")
|
||||
for order in source_orders
|
||||
for picking in order.picking_ids
|
||||
if picking.date_done
|
||||
),
|
||||
default="",
|
||||
),
|
||||
"102",
|
||||
],
|
||||
),
|
||||
# 11: Despatch date and/or time
|
||||
(
|
||||
"DTM",
|
||||
[
|
||||
"11",
|
||||
min(
|
||||
(
|
||||
order.commitment_date.date().strftime("%Y%m%d")
|
||||
for order in source_orders
|
||||
if order.commitment_date
|
||||
),
|
||||
default="",
|
||||
),
|
||||
"102",
|
||||
],
|
||||
),
|
||||
# Document/message date/time
|
||||
("DTM", ["137", today, "102"]),
|
||||
("PAI", ["", "", "42"]),
|
||||
# Regulatory information
|
||||
("FTX", "REG", "", "", ""),
|
||||
# Payment detail/remittance information
|
||||
("FTX", "PMD", "", "", ""),
|
||||
# Terms of payments
|
||||
("FTX", "AAB", "", "", "30 jours net"),
|
||||
# Delivery note number
|
||||
("RFF", ["DQ", self.id]),
|
||||
# Reference date/time
|
||||
# TODO: fixed value for now, to be clarified
|
||||
("DTM", ["171", "99991231", "102"]),
|
||||
# Reference currency
|
||||
("CUX", ["2", buyer.currency_id.name, "4"]),
|
||||
# Rate of exchange
|
||||
("DTM", ["134", today, "102"]),
|
||||
("PAT", "3"),
|
||||
# Terms net due date
|
||||
("DTM", ["13", self.invoice_date_due, "102"]),
|
||||
# Discount terms
|
||||
(
|
||||
"PAT",
|
||||
"22",
|
||||
"",
|
||||
["5", "3", "D", discount_days],
|
||||
),
|
||||
# Discount percentage
|
||||
(
|
||||
"PCD",
|
||||
"12",
|
||||
discount_percentage,
|
||||
"13",
|
||||
),
|
||||
# Penalty terms
|
||||
# ("PAT", "20"), # TODO: check value this again later
|
||||
# Penalty percentage
|
||||
# ("PCD", "15", "0"), # TODO: check value this again later
|
||||
# Allowance percentage
|
||||
# ("PCD", "1", "0", "13"), # TODO: check value this again later
|
||||
# Allowance or charge amount
|
||||
# ("MOA", "8", "0"), # TODO: check value this again later
|
||||
]
|
||||
header = (
|
||||
header[:11]
|
||||
+ self._edifact_invoice_get_buyer()
|
||||
+ self._edifact_invoice_get_seller()
|
||||
+ self._edifact_invoice_get_shipper()
|
||||
+ header[11:]
|
||||
)
|
||||
return header
|
||||
|
||||
def _edifact_invoice_get_product(self):
|
||||
number = 0
|
||||
segments = []
|
||||
vals = {}
|
||||
tax = {}
|
||||
for line in self.line_ids:
|
||||
if line.display_type != "product":
|
||||
continue
|
||||
order = line.sale_line_ids.order_id
|
||||
number += 1
|
||||
product_tax = 0
|
||||
product = line.product_id
|
||||
product_per_pack = line.product_uom_id._compute_quantity(
|
||||
line.quantity, product.uom_id
|
||||
)
|
||||
if line.tax_ids and line.tax_ids.amount_type == "percent":
|
||||
product_tax = line.tax_ids.amount
|
||||
if product_tax not in tax:
|
||||
tax[product_tax] = line.price_total
|
||||
else:
|
||||
tax[product_tax] += line.price_total
|
||||
product_seg = [
|
||||
# Line item number
|
||||
("LIN", number, "", ["", "EN"]),
|
||||
# Product identification of supplier's article number
|
||||
("PIA", "5", [product.id, "SA", "", "91"]),
|
||||
# Item description of product
|
||||
(
|
||||
"IMD",
|
||||
"ANM",
|
||||
["", "", "", product.product_tmpl_id.description_sale],
|
||||
),
|
||||
# Invoiced quantity
|
||||
("QTY", "47", line.quantity, line.product_uom_id.name),
|
||||
# Quantity per pack
|
||||
(
|
||||
"QTY",
|
||||
"52",
|
||||
product_per_pack if product_per_pack else 1,
|
||||
"PCE",
|
||||
), # TODO:check it again
|
||||
# Pieces delivered
|
||||
("QTY", "46", line.sale_line_ids.qty_delivered),
|
||||
# Line item amount
|
||||
("MOA", "203", line.price_total),
|
||||
# Calculation net
|
||||
("PRI", ["AAA", round(line.price_total / line.quantity, 2)]),
|
||||
("PRI", ["AAB", round(line.price_total / line.quantity, 2)]),
|
||||
# Order number of line item
|
||||
("RFF", ["ON", order.id]),
|
||||
# Tax information
|
||||
(
|
||||
"PRI",
|
||||
"7",
|
||||
"VAT",
|
||||
"",
|
||||
"",
|
||||
["", "", "", product_tax],
|
||||
), # TODO: check value this again later
|
||||
# Allowance or charge amount of line item
|
||||
("MOA", ["8", "0"]),
|
||||
]
|
||||
segments.extend(product_seg)
|
||||
vals["tax"] = tax
|
||||
vals["total_line_item"] = number
|
||||
return segments, vals
|
||||
|
||||
def _edifact_invoice_get_summary(self, vals):
|
||||
tax_list = []
|
||||
total_line_item = vals["total_line_item"]
|
||||
if "tax" in vals:
|
||||
for product_tax, price_total in vals["tax"].items():
|
||||
# Tax Information
|
||||
tax_list.append(
|
||||
("TAX", "7", "VAT", "", price_total, ["", "", "", product_tax])
|
||||
)
|
||||
# Tax amount
|
||||
tax_list.append(("MOA", ["124", price_total * product_tax / 100]))
|
||||
summary = [
|
||||
("UNS", "S"),
|
||||
# Number of line items in message
|
||||
("CNT", ["2", total_line_item]),
|
||||
# Taxable amount
|
||||
("MOA", ["125", self.amount_untaxed]),
|
||||
# Total amount
|
||||
("MOA", ["128", self.amount_total]),
|
||||
# Tax amount
|
||||
("MOA", ["124", self.amount_tax]),
|
||||
("MOA", ["8", "0"]),
|
||||
("UNT", 33 + 11 * total_line_item + 2 * len(vals["tax"]), "1"),
|
||||
]
|
||||
summary = summary[:-2] + tax_list + summary[-2:]
|
||||
return summary
|
||||
|
|
@ -0,0 +1 @@
|
|||
* Thien (Vo Hong) <thienvh@trobz.com>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
The development of this module has been financially supported by:
|
||||
|
||||
* Camptocamp
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
UN/EDIFACT
|
||||
United Nations rules for Electronic Data Interchange for Administration, Commerce and Transport
|
||||
|
||||
This module will support exporting invoice in EDIFACT format.
|
||||
|
||||
https://www.stedi.com/edi/edifact/D96A/messages/INVOIC
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
|
|
@ -0,0 +1,440 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
|
||||
<title>Account Invoice EDIFACT</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
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: grey; } /* 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 {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="account-invoice-edifact">
|
||||
<h1 class="title">Account Invoice EDIFACT</h1>
|
||||
|
||||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:70d9ca517fbd902f6eb1d5b7a7e6b51be92f174ec45f39548e2972b519876286
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Alpha" src="https://img.shields.io/badge/maturity-Alpha-red.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/edi/tree/16.0/account_invoice_edifact"><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-account_invoice_edifact"><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&target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
||||
<dl class="docutils">
|
||||
<dt>UN/EDIFACT</dt>
|
||||
<dd>United Nations rules for Electronic Data Interchange for Administration, Commerce and Transport</dd>
|
||||
</dl>
|
||||
<p>This module will support exporting invoice in EDIFACT format.</p>
|
||||
<p><a class="reference external" href="https://www.stedi.com/edi/edifact/D96A/messages/INVOIC">https://www.stedi.com/edi/edifact/D96A/messages/INVOIC</a></p>
|
||||
<div class="admonition important">
|
||||
<p class="first admonition-title">Important</p>
|
||||
<p class="last">This is an alpha version, the data model and design can change at any time without warning.
|
||||
Only for development or testing purpose, do not use in production.
|
||||
<a class="reference external" href="https://odoo-community.org/page/development-status">More details on development status</a></p>
|
||||
</div>
|
||||
<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">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
|
||||
<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:%20account_invoice_edifact%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-2">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Camptocamp</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Thien (Vo Hong) <<a class="reference external" href="mailto:thienvh@trobz.com">thienvh@trobz.com</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="other-credits">
|
||||
<h2><a class="toc-backref" href="#toc-entry-5">Other credits</a></h2>
|
||||
<p>The development of this module has been financially supported by:</p>
|
||||
<ul class="simple">
|
||||
<li>Camptocamp</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#toc-entry-6">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/edi/tree/16.0/account_invoice_edifact">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>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import test_account_move
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
# Copyright 2023 Camptocamp
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo.tests.common import TransactionCase
|
||||
|
||||
|
||||
class TestEdifactInvoice(TransactionCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
||||
cls.base_edifact_model = cls.env["base.edifact"]
|
||||
cls.company = cls.env.ref("base.main_company")
|
||||
cls.product1 = cls.env.ref("product.product_product_4")
|
||||
cls.product2 = cls.env.ref("product.product_product_1")
|
||||
cls.invoice = cls.env["account.move"].create(
|
||||
{
|
||||
"company_id": cls.company.id,
|
||||
"move_type": "out_invoice",
|
||||
"partner_id": cls.env.ref(
|
||||
"account_invoice_edifact.partner_edifact_invoiceto_dm"
|
||||
).id,
|
||||
"partner_shipping_id": cls.env.ref(
|
||||
"account_invoice_edifact.partner_edifact_shipto_dm"
|
||||
).id,
|
||||
"invoice_user_id": cls.env.ref(
|
||||
"account_invoice_edifact.user_edifact_sender_dm"
|
||||
).id,
|
||||
"currency_id": cls.company.currency_id.id,
|
||||
"invoice_line_ids": [
|
||||
(
|
||||
0,
|
||||
0,
|
||||
{
|
||||
"product_id": cls.product1.id,
|
||||
"product_uom_id": cls.product1.uom_id.id,
|
||||
"quantity": 12,
|
||||
"price_unit": 42.42,
|
||||
},
|
||||
),
|
||||
(
|
||||
0,
|
||||
0,
|
||||
{
|
||||
"product_id": cls.product2.id,
|
||||
"product_uom_id": cls.product2.uom_id.id,
|
||||
"quantity": 2,
|
||||
"price_unit": 12.34,
|
||||
},
|
||||
),
|
||||
],
|
||||
}
|
||||
)
|
||||
cls.invoice.action_post()
|
||||
|
||||
def test_edifact_invoice_generate_data(self):
|
||||
edifact_data = self.invoice.edifact_invoice_generate_data()
|
||||
self.assertTrue(edifact_data)
|
||||
self.assertEqual(isinstance(edifact_data, str), True)
|
||||
|
||||
def test_edifact_invoice_get_interchange(self):
|
||||
interchange = self.invoice._edifact_invoice_get_interchange()
|
||||
self.assertEqual(interchange.sender, ["9780201379624", "14"])
|
||||
self.assertEqual(interchange.recipient, ["9780201379174", "14"])
|
||||
self.assertEqual(interchange.syntax_identifier, ["UNOC", "3"])
|
||||
|
||||
def test_edifact_invoice_get_header(self):
|
||||
segments = self.invoice._edifact_invoice_get_header()
|
||||
seg = ("UNH", "1", ["INVOIC", "D", "96A", "UN", "EAN008"])
|
||||
self.assertEqual(segments[0], seg)
|
||||
self.assertEqual(len(segments), 26)
|
||||
|
||||
def test_edifact_invoice_get_product(self):
|
||||
segments, vals = self.invoice._edifact_invoice_get_product()
|
||||
self.assertEqual(len(segments), 24)
|
||||
self.assertEqual(len(vals), 2)
|
||||
|
||||
def test_edifact_invoice_get_summary(self):
|
||||
vals = {"tax": {0: 533.72}, "total_line_item": 2}
|
||||
segments = self.invoice._edifact_invoice_get_summary(vals)
|
||||
self.assertEqual(len(segments), 9)
|
||||
|
||||
def test_edifact_invoice_get_address(self):
|
||||
partner = self.invoice.partner_id
|
||||
if hasattr(partner, "street3"):
|
||||
partner.street3 = "Address"
|
||||
self.assertEqual(
|
||||
self.invoice._edifact_invoice_get_address(partner), partner.street3
|
||||
)
|
||||
else:
|
||||
self.assertEqual(
|
||||
self.invoice._edifact_invoice_get_address(partner), partner.street
|
||||
)
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# Architecture
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
U[Users] -->|HTTP| V[Views and QWeb Templates]
|
||||
V --> C[Controllers]
|
||||
V --> W[Wizards – Transient Models]
|
||||
C --> M[Models and ORM]
|
||||
W --> M
|
||||
M --> R[Reports]
|
||||
DX[Data XML] --> M
|
||||
S[Security – ACLs and Groups] -. enforces .-> M
|
||||
|
||||
subgraph Account_invoice_edifact Module - account_invoice_edifact
|
||||
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.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Configuration
|
||||
|
||||
Refer to Odoo settings for account_invoice_edifact. Configure related models, access rights, and options as needed.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Controllers
|
||||
|
||||
This module does not define custom HTTP controllers.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Dependencies
|
||||
|
||||
This addon depends on:
|
||||
|
||||
- [sale_management](../../odoo-bringout-oca-ocb-sale_management)
|
||||
- [account](../../odoo-bringout-oca-ocb-account)
|
||||
- [base_edifact](../../odoo-bringout-oca-edi-base_edifact)
|
||||
4
odoo-bringout-oca-edi-account_invoice_edifact/doc/FAQ.md
Normal file
4
odoo-bringout-oca-edi-account_invoice_edifact/doc/FAQ.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# FAQ
|
||||
|
||||
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
|
||||
- Q: How to enable? A: Start server with --addon account_invoice_edifact or install in UI.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Install
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-edi-account_invoice_edifact"
|
||||
# or
|
||||
uv pip install odoo-bringout-oca-edi-account_invoice_edifact"
|
||||
```
|
||||
12
odoo-bringout-oca-edi-account_invoice_edifact/doc/MODELS.md
Normal file
12
odoo-bringout-oca-edi-account_invoice_edifact/doc/MODELS.md
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# Models
|
||||
|
||||
Detected core models and extensions in account_invoice_edifact.
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class account_move
|
||||
```
|
||||
|
||||
Notes
|
||||
- Classes show model technical names; fields omitted for brevity.
|
||||
- Items listed under _inherit are extensions of existing models.
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# Overview
|
||||
|
||||
Packaged Odoo addon: account_invoice_edifact. Provides features documented in upstream Odoo 16 under this addon.
|
||||
|
||||
- Source: OCA/OCB 16.0, addon account_invoice_edifact
|
||||
- License: LGPL-3
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Reports
|
||||
|
||||
This module does not define custom reports.
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Usage
|
||||
|
||||
Start Odoo including this addon (from repo root):
|
||||
|
||||
```bash
|
||||
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon account_invoice_edifact
|
||||
```
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Wizards
|
||||
|
||||
This module does not include UI wizards.
|
||||
44
odoo-bringout-oca-edi-account_invoice_edifact/pyproject.toml
Normal file
44
odoo-bringout-oca-edi-account_invoice_edifact/pyproject.toml
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
[project]
|
||||
name = "odoo-bringout-oca-edi-account_invoice_edifact"
|
||||
version = "16.0.0"
|
||||
description = "Account Invoice EDIFACT - Generate customer invoices with EDIFACT/D96A format"
|
||||
authors = [
|
||||
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
|
||||
]
|
||||
dependencies = [
|
||||
"odoo-bringout-oca-edi-sale_management>=16.0.0",
|
||||
"odoo-bringout-oca-ocb-account>=16.0.0",
|
||||
"odoo-bringout-oca-edi-base_edifact>=16.0.0",
|
||||
"requests>=2.25.1"
|
||||
]
|
||||
readme = "README.md"
|
||||
requires-python = ">= 3.11"
|
||||
classifiers = [
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Topic :: Office/Business",
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
homepage = "https://github.com/bringout/0"
|
||||
repository = "https://github.com/bringout/0"
|
||||
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[tool.hatch.metadata]
|
||||
allow-direct-references = true
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["account_invoice_edifact"]
|
||||
|
||||
[tool.rye]
|
||||
managed = true
|
||||
dev-dependencies = [
|
||||
"pytest>=8.4.1",
|
||||
]
|
||||
45
odoo-bringout-oca-edi-account_invoice_export/README.md
Normal file
45
odoo-bringout-oca-edi-account_invoice_export/README.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# Account Invoice Export
|
||||
|
||||
Odoo addon: account_invoice_export
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-edi-account_invoice_export
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
This addon depends on:
|
||||
- account
|
||||
- account_invoice_transmit_method
|
||||
|
||||
## Manifest Information
|
||||
|
||||
- **Name**: Account Invoice Export
|
||||
- **Version**: 16.0.1.0.0
|
||||
- **Category**: Invoicing Management
|
||||
- **License**: AGPL-3
|
||||
- **Installable**: True
|
||||
|
||||
## Source
|
||||
|
||||
Based on [OCA/edi](https://github.com/OCA/edi) branch 16.0, addon `account_invoice_export`.
|
||||
|
||||
## 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
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
======================
|
||||
Account Invoice Export
|
||||
======================
|
||||
|
||||
..
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:ded419ed17e642aaf14f71f78778c50e6480162d6931a6431f2574ffafa15adf
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |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%2Fedi-lightgray.png?logo=github
|
||||
:target: https://github.com/OCA/edi/tree/16.0/account_invoice_export
|
||||
: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-account_invoice_export
|
||||
: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|
|
||||
|
||||
The goal of this module is to allow sending invoices in different format to external systems.
|
||||
|
||||
It extends the module `account_invoice_transmit_method`, adding options to configure an url and credentials (Basic Authentication).
|
||||
In the UI a new button `Send ebill` send the invoice pdf to the configure url.
|
||||
|
||||
The actual sending of the invoice is manage by queue.job and the standard Odoo chatter on the invoice is used to inform the user on success/failure of the dispatch.
|
||||
|
||||
**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:%20account_invoice_export%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
|
||||
~~~~~~~
|
||||
|
||||
* Camptocamp SA
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
|
||||
* Tam (Nguyen Duc) <tamnd@trobz.com>
|
||||
|
||||
Other credits
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The development of this module has been 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-TDu| image:: https://github.com/TDu.png?size=40px
|
||||
:target: https://github.com/TDu
|
||||
:alt: TDu
|
||||
|
||||
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|
||||
|
||||
|maintainer-TDu|
|
||||
|
||||
This module is part of the `OCA/edi <https://github.com/OCA/edi/tree/16.0/account_invoice_export>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
# Copyright 2020 Camptocamp SA
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
|
||||
{
|
||||
"name": "Account Invoice Export",
|
||||
"version": "16.0.1.0.0",
|
||||
"category": "Invoicing Management",
|
||||
"license": "AGPL-3",
|
||||
"development_status": "Beta",
|
||||
"summary": "",
|
||||
"author": "Camptocamp SA, Odoo Community Association (OCA)",
|
||||
"website": "https://github.com/OCA/edi",
|
||||
"depends": ["account", "account_invoice_transmit_method"],
|
||||
"maintainers": ["TDu"],
|
||||
"data": [
|
||||
"data/mail_activity_type.xml",
|
||||
"views/transmit_method.xml",
|
||||
"views/account_move.xml",
|
||||
"views/message_template.xml",
|
||||
],
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo noupdate="1">
|
||||
<record id="mail_activity_transmit_warning" model="mail.activity.type">
|
||||
<field name="name">Transmission Error</field>
|
||||
<field name="icon">fa-warning</field>
|
||||
<field name="delay_count">0</field>
|
||||
<field name="sequence">99</field>
|
||||
<field name="decoration_type">warning</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_export
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_bank_statement_line__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_move__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_payment__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_transmit_method__send_through_http
|
||||
msgid "Adds a Send eBill button on the invoice"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "An error of type {} occured."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.transmit_method_form
|
||||
msgid ""
|
||||
"By default the PDF of the invoice will be sent using the connection "
|
||||
"parameters below (basic authenticaiton)."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Ebill has already been sent. Are you sure you want to send it again ?"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__send_through_http
|
||||
msgid "Enable send eBill"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.exception_sending_invoice
|
||||
msgid "Error sending invoice to"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "HTTP error {status_code} sending invoice to {method_name}"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.transmit_method_form
|
||||
msgid ""
|
||||
"Handling specific connection needs and/or exporting other files can be done "
|
||||
"through code."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__invoice_export_confirmed
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__invoice_export_confirmed
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__invoice_export_confirmed
|
||||
msgid "Invoice Export Confirmed"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__invoice_exported
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__invoice_exported
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__invoice_exported
|
||||
msgid "Invoice Exported"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Invoice successfuly sent to {}"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model,name:account_invoice_export.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Nothing done, invoice has already been exported before."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_pwd
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Resend eBill"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.actions.server,name:account_invoice_export.action_send_ebill
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Send eBill"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.exception_sending_invoice
|
||||
msgid "The failed job has the uuid"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:mail.activity.type,name:account_invoice_export.mail_activity_transmit_warning
|
||||
msgid "Transmission Error"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model,name:account_invoice_export.model_transmit_method
|
||||
msgid "Transmit Method of a document"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Transmit method is not configured to send through HTTP"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_url
|
||||
msgid "Url"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_user
|
||||
msgid "User"
|
||||
msgstr ""
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_export
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_bank_statement_line__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_move__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_payment__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_transmit_method__send_through_http
|
||||
msgid "Adds a Send eBill button on the invoice"
|
||||
msgstr "Dodaje dugme Pošalji elektronski račun na fakturu"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "An error of type {} occured."
|
||||
msgstr "Desila se greška tipa {}."
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.transmit_method_form
|
||||
msgid ""
|
||||
"By default the PDF of the invoice will be sent using the connection "
|
||||
"parameters below (basic authenticaiton)."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Ebill has already been sent. Are you sure you want to send it again ?"
|
||||
msgstr "Elektronski račun je već poslat. Da li ste sigurni da želite da ga pošaljete ponovo?"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__send_through_http
|
||||
msgid "Enable send eBill"
|
||||
msgstr "Omogući slanje elektronskog računa"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.exception_sending_invoice
|
||||
msgid "Error sending invoice to"
|
||||
msgstr "Greška prilikom slanja fakture na"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "HTTP error {status_code} sending invoice to {method_name}"
|
||||
msgstr "HTTP greška {status_code} prilikom slanja fakture na {method_name}"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.transmit_method_form
|
||||
msgid ""
|
||||
"Handling specific connection needs and/or exporting other files can be done "
|
||||
"through code."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__invoice_export_confirmed
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__invoice_export_confirmed
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__invoice_export_confirmed
|
||||
msgid "Invoice Export Confirmed"
|
||||
msgstr "Izvoz fakture potvrđen"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__invoice_exported
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__invoice_exported
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__invoice_exported
|
||||
msgid "Invoice Exported"
|
||||
msgstr "Faktura izvezena"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Invoice successfuly sent to {}"
|
||||
msgstr "Faktura uspešno poslata na {}"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model,name:account_invoice_export.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Žurnal"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Nothing done, invoice has already been exported before."
|
||||
msgstr "Ništa nije urađeno, faktura je već ranije izvezena."
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_pwd
|
||||
msgid "Password"
|
||||
msgstr "Zaporka"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Resend eBill"
|
||||
msgstr "Pošalji ponovo elektronski račun"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.actions.server,name:account_invoice_export.action_send_ebill
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Send eBill"
|
||||
msgstr "Pošalji elektronski račun"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.exception_sending_invoice
|
||||
msgid "The failed job has the uuid"
|
||||
msgstr "Neuspešan posao ima uuid"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:mail.activity.type,name:account_invoice_export.mail_activity_transmit_warning
|
||||
msgid "Transmission Error"
|
||||
msgstr "Greška prenosa"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model,name:account_invoice_export.model_transmit_method
|
||||
msgid "Transmit Method of a document"
|
||||
msgstr "Metoda prijenosa dokumenta"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Transmit method is not configured to send through HTTP"
|
||||
msgstr "Metod prenosa nije konfigurisan da šalje preko HTTP"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_url
|
||||
msgid "Url"
|
||||
msgstr "Url"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_user
|
||||
msgid "User"
|
||||
msgstr "Korisnik"
|
||||
|
|
@ -0,0 +1,156 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_export
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2024-08-23 12:06+0000\n"
|
||||
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_bank_statement_line__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_move__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_account_payment__send_through_http
|
||||
#: model:ir.model.fields,help:account_invoice_export.field_transmit_method__send_through_http
|
||||
msgid "Adds a Send eBill button on the invoice"
|
||||
msgstr "Aggiunge un pulsante Invia e-fattura nella fattura"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "An error of type {} occured."
|
||||
msgstr "Si è verificato un errore di tipo []."
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.transmit_method_form
|
||||
msgid ""
|
||||
"By default the PDF of the invoice will be sent using the connection "
|
||||
"parameters below (basic authenticaiton)."
|
||||
msgstr ""
|
||||
"In modo predefinito il PDF della fattura verrà inviato utilizzando i "
|
||||
"parametri di connessione sottostanti (autorizzazione base)."
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Ebill has already been sent. Are you sure you want to send it again ?"
|
||||
msgstr "L'e-fattura è già stata inviata. Si è sicuri di rispedirla?"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__send_through_http
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__send_through_http
|
||||
msgid "Enable send eBill"
|
||||
msgstr "Abilita invio e-fattura"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.exception_sending_invoice
|
||||
msgid "Error sending invoice to"
|
||||
msgstr "Errore nell'invio della fattura a"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "HTTP error {status_code} sending invoice to {method_name}"
|
||||
msgstr "Errore HTTP {status_code} nell'invio della fattura a {method_name}"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.transmit_method_form
|
||||
msgid ""
|
||||
"Handling specific connection needs and/or exporting other files can be done "
|
||||
"through code."
|
||||
msgstr ""
|
||||
"La gestione di esigenze specifiche di connessione e/o l'esportazione di "
|
||||
"altri file può essere fatta attraverso il codice."
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__invoice_export_confirmed
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__invoice_export_confirmed
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__invoice_export_confirmed
|
||||
msgid "Invoice Export Confirmed"
|
||||
msgstr "Esportazione fattura confermata"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_bank_statement_line__invoice_exported
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_move__invoice_exported
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_account_payment__invoice_exported
|
||||
msgid "Invoice Exported"
|
||||
msgstr "Fattura esportata"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Invoice successfuly sent to {}"
|
||||
msgstr "Fattura inviata con successo a {}"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model,name:account_invoice_export.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Registrazione contabile"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Nothing done, invoice has already been exported before."
|
||||
msgstr "Nessuna attività, la fattura è già stata esportata in precedenza."
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_pwd
|
||||
msgid "Password"
|
||||
msgstr "Password"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Resend eBill"
|
||||
msgstr "Reinvia e-fattura"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.actions.server,name:account_invoice_export.action_send_ebill
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.view_move_form
|
||||
msgid "Send eBill"
|
||||
msgstr "Invia e-fattura"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_export.exception_sending_invoice
|
||||
msgid "The failed job has the uuid"
|
||||
msgstr "Il lavoro in errore ha uuid"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:mail.activity.type,name:account_invoice_export.mail_activity_transmit_warning
|
||||
msgid "Transmission Error"
|
||||
msgstr "Errore di trasmissione"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model,name:account_invoice_export.model_transmit_method
|
||||
msgid "Transmit Method of a document"
|
||||
msgstr "Metodo trasmissione di un documento"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#. odoo-python
|
||||
#: code:addons/account_invoice_export/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Transmit method is not configured to send through HTTP"
|
||||
msgstr "Il metodo di trasmissione non è configurato per inviare attraverso HTTP"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_url
|
||||
msgid "Url"
|
||||
msgstr "URL"
|
||||
|
||||
#. module: account_invoice_export
|
||||
#: model:ir.model.fields,field_description:account_invoice_export.field_transmit_method__destination_user
|
||||
msgid "User"
|
||||
msgstr "Utente"
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
from . import account_move
|
||||
from . import transmit_method
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
# Copyright 2020 Camptocamp SA
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
|
||||
import requests
|
||||
|
||||
import odoo
|
||||
from odoo import _, fields, models
|
||||
from odoo.exceptions import UserError, except_orm
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = "account.move"
|
||||
|
||||
invoice_exported = fields.Boolean(copy=False)
|
||||
# Usefull when the distant system does not validate the export synchronously
|
||||
invoice_export_confirmed = fields.Boolean(copy=False)
|
||||
send_through_http = fields.Boolean(related="transmit_method_id.send_through_http")
|
||||
|
||||
def export_invoice(self):
|
||||
resend_invoice = self.env.context.get("resend_ebill", False)
|
||||
for invoice in self:
|
||||
invoice._job_export_invoice(resend_invoice)
|
||||
|
||||
def _job_export_invoice(self, resend_invoice=False):
|
||||
"""Export ebill to external server and update the chatter."""
|
||||
self.ensure_one()
|
||||
if (
|
||||
not resend_invoice
|
||||
and self.invoice_exported
|
||||
and self.invoice_export_confirmed
|
||||
):
|
||||
return _("Nothing done, invoice has already been exported before.")
|
||||
try:
|
||||
res = self._export_invoice()
|
||||
except Exception as e:
|
||||
values = {
|
||||
"job_id": self.env.context.get("job_uuid"),
|
||||
"error_detail": "",
|
||||
"error_type": type(e).__name__,
|
||||
"transmit_method_name": self.transmit_method_id.name,
|
||||
}
|
||||
if isinstance(e, except_orm):
|
||||
values["error_detail"] = e.name
|
||||
with odoo.api.Environment.manage():
|
||||
with odoo.registry(self.env.cr.dbname).cursor() as new_cr:
|
||||
# Create a new environment with new cursor database
|
||||
new_env = odoo.api.Environment(
|
||||
new_cr, self.env.uid, self.env.context
|
||||
)
|
||||
# The chatter of the invoice need to be updated, when the job fails
|
||||
self.with_env(new_env).log_error_sending_invoice(values)
|
||||
raise
|
||||
self.log_success_sending_invoice()
|
||||
return res
|
||||
|
||||
def _export_invoice(self):
|
||||
"""Export electronic invoice to external service."""
|
||||
if not self.transmit_method_id.send_through_http:
|
||||
raise UserError(_("Transmit method is not configured to send through HTTP"))
|
||||
file_data = self._get_file_for_transmission_method()
|
||||
headers = self.transmit_method_id.get_transmission_http_header()
|
||||
url = self.transmit_method_id.get_transmission_url()
|
||||
# TODO: Should be configurable as a parameter
|
||||
res = requests.post(url, headers=headers, files=file_data, timeout=10)
|
||||
if res.status_code != 200:
|
||||
raise UserError(
|
||||
_(
|
||||
"HTTP error {status_code} sending invoice to {method_name}".format(
|
||||
status_code=res.status_code,
|
||||
method_name=self.transmit_method_id.name,
|
||||
)
|
||||
)
|
||||
)
|
||||
self.invoice_exported = self.invoice_export_confirmed = True
|
||||
return res.text
|
||||
|
||||
def _get_file_for_transmission_method(self):
|
||||
"""Return the file description to send.
|
||||
|
||||
Use the format expected by the request library
|
||||
By default returns the PDF report.
|
||||
"""
|
||||
report = "account.report_invoice"
|
||||
pdf, _ = self.env["ir.actions.report"]._render(report, [self.id])
|
||||
filename = self._get_report_base_filename().replace("/", "_") + ".pdf"
|
||||
return {"file": (filename, pdf, "application/pdf")}
|
||||
|
||||
def log_error_sending_invoice(self, values):
|
||||
"""Log an exception in invoice's chatter when sending fails.
|
||||
|
||||
If an exception already exists it is update otherwise a new one
|
||||
is created.
|
||||
"""
|
||||
activity_type = "account_invoice_export.mail_activity_transmit_warning"
|
||||
activity = self.activity_reschedule(
|
||||
[activity_type], date_deadline=fields.Date.today()
|
||||
)
|
||||
if not activity:
|
||||
template = "account_invoice_export.exception_sending_invoice"
|
||||
message = self.env["ir.ui.view"]._render_template(template, values=values)
|
||||
activity = self.activity_schedule(
|
||||
activity_type, summary="Job error sending invoice", note=message
|
||||
)
|
||||
error_log = values.get("error_detail")
|
||||
if not error_log:
|
||||
error_log = _("An error of type {} occured.").format(
|
||||
values.get("error_type")
|
||||
)
|
||||
activity.note += "<div class='mt16'><p>{}</p></div>".format(error_log)
|
||||
|
||||
def log_success_sending_invoice(self):
|
||||
"""Log success sending invoice and clear existing exception, if any."""
|
||||
self.activity_feedback(
|
||||
["account_invoice_export.mail_activity_transmit_warning"],
|
||||
feedback="It worked on a later try",
|
||||
)
|
||||
self.message_post(
|
||||
body=_("Invoice successfuly sent to {}").format(
|
||||
self.transmit_method_id.name
|
||||
)
|
||||
)
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# Copyright 2020 Camptocamp SA
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
|
||||
import base64
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class TransmitMethod(models.Model):
|
||||
_inherit = "transmit.method"
|
||||
|
||||
send_through_http = fields.Boolean(
|
||||
string="Enable send eBill", help="Adds a Send eBill button on the invoice"
|
||||
)
|
||||
destination_url = fields.Char(string="Url")
|
||||
destination_user = fields.Char(string="User", copy=False)
|
||||
destination_pwd = fields.Char(string="Password", copy=False)
|
||||
|
||||
def get_transmission_http_header(self):
|
||||
"""Generate the HTTP header needed by the transmission method.
|
||||
|
||||
For now only basic authentication is implemented.
|
||||
|
||||
"""
|
||||
self.ensure_one()
|
||||
auth = "{}:{}".format(self.destination_user or "", self.destination_pwd or "")
|
||||
auth64 = base64.encodebytes(auth.encode("ascii"))[:-1]
|
||||
return {"Authorization": "Basic " + auth64.decode("utf-8")}
|
||||
|
||||
def get_transmission_url(self):
|
||||
"""Returns the base url used to export.
|
||||
|
||||
Override it to add variable parameters.
|
||||
"""
|
||||
self.ensure_one()
|
||||
return self.destination_url or ""
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
|
||||
* Tam (Nguyen Duc) <tamnd@trobz.com>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
The development of this module has been financially supported by:
|
||||
|
||||
* Camptocamp
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
The goal of this module is to allow sending invoices in different format to external systems.
|
||||
|
||||
It extends the module `account_invoice_transmit_method`, adding options to configure an url and credentials (Basic Authentication).
|
||||
In the UI a new button `Send ebill` send the invoice pdf to the configure url.
|
||||
|
||||
The actual sending of the invoice is manage by queue.job and the standard Odoo chatter on the invoice is used to inform the user on success/failure of the dispatch.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
|
|
@ -0,0 +1,435 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
|
||||
<title>Account Invoice Export</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
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: grey; } /* 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 {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="account-invoice-export">
|
||||
<h1 class="title">Account Invoice Export</h1>
|
||||
|
||||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:ded419ed17e642aaf14f71f78778c50e6480162d6931a6431f2574ffafa15adf
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<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/edi/tree/16.0/account_invoice_export"><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-account_invoice_export"><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&target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
||||
<p>The goal of this module is to allow sending invoices in different format to external systems.</p>
|
||||
<p>It extends the module <cite>account_invoice_transmit_method</cite>, adding options to configure an url and credentials (Basic Authentication).
|
||||
In the UI a new button <cite>Send ebill</cite> send the invoice pdf to the configure url.</p>
|
||||
<p>The actual sending of the invoice is manage by queue.job and the standard Odoo chatter on the invoice is used to inform the user on success/failure of the dispatch.</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">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
|
||||
<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:%20account_invoice_export%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-2">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Camptocamp SA</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Thierry Ducrest <<a class="reference external" href="mailto:thierry.ducrest@camptocamp.com">thierry.ducrest@camptocamp.com</a>></li>
|
||||
<li>Tam (Nguyen Duc) <<a class="reference external" href="mailto:tamnd@trobz.com">tamnd@trobz.com</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="other-credits">
|
||||
<h2><a class="toc-backref" href="#toc-entry-5">Other credits</a></h2>
|
||||
<p>The development of this module has been financially supported by:</p>
|
||||
<ul class="simple">
|
||||
<li>Camptocamp</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
|
||||
<p>This module is maintained by the OCA.</p>
|
||||
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
|
||||
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||
mission is to support the collaborative development of Odoo features and
|
||||
promote its widespread use.</p>
|
||||
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
|
||||
<p><a class="reference external image-reference" href="https://github.com/TDu"><img alt="TDu" src="https://github.com/TDu.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/account_invoice_export">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>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import test_export_invoice
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
# Copyright 2023 Camptocamp SA
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
from odoo.tests.common import TransactionCase
|
||||
|
||||
|
||||
class CommonCase(TransactionCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
||||
cls.send_exception = cls.env.ref(
|
||||
"account_invoice_export.mail_activity_transmit_warning"
|
||||
)
|
||||
cls.transmit_method = cls.env["transmit.method"].create(
|
||||
{
|
||||
"name": "HttpPost",
|
||||
"code": "httppost",
|
||||
"customer_ok": True,
|
||||
"send_through_http": True,
|
||||
"destination_url": "https://example.com/post",
|
||||
"destination_user": "user",
|
||||
"destination_pwd": "pwd",
|
||||
}
|
||||
)
|
||||
cls.country = cls.env.ref("base.ch")
|
||||
cls.customer = cls.env.ref("base.res_partner_1")
|
||||
cls.account = cls.env["account.account"].search(
|
||||
[("account_type", "=", "income"), ("company_id", "=", cls.env.company.id)],
|
||||
limit=1,
|
||||
)
|
||||
cls.product = cls.env.ref("product.product_product_1")
|
||||
cls.invoice_1 = cls.env["account.move"].create(
|
||||
{
|
||||
"partner_id": cls.customer.id,
|
||||
"move_type": "out_invoice",
|
||||
"transmit_method_id": cls.transmit_method.id,
|
||||
"invoice_line_ids": [
|
||||
(
|
||||
0,
|
||||
0,
|
||||
{
|
||||
"account_id": cls.account.id,
|
||||
"product_id": cls.product.product_variant_ids[:1].id,
|
||||
"name": "Product 1",
|
||||
"quantity": 4.0,
|
||||
"price_unit": 123.00,
|
||||
},
|
||||
)
|
||||
],
|
||||
}
|
||||
)
|
||||
cls.invoice_1.action_post()
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# Copyright 2020 Camptocamp SA
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
|
||||
from .common import CommonCase
|
||||
|
||||
|
||||
class TestExportAcountInvoice(CommonCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
|
||||
def test_log_error_in_chatter(self):
|
||||
values = {
|
||||
"job_id": "13:123:123",
|
||||
"send_error": 500,
|
||||
"transmit_method_name": "SendMethod",
|
||||
}
|
||||
self.invoice_1.log_error_sending_invoice(values)
|
||||
self.assertEqual(len(self.invoice_1.activity_ids), 1)
|
||||
self.assertEqual(
|
||||
self.invoice_1.activity_ids[0].activity_type_id, self.send_exception
|
||||
)
|
||||
# Multiple error only one exception message
|
||||
self.invoice_1.log_error_sending_invoice(values)
|
||||
self.assertEqual(len(self.invoice_1.activity_ids), 1)
|
||||
# At success exception messages are cleared
|
||||
self.invoice_1.log_success_sending_invoice()
|
||||
self.assertEqual(len(self.invoice_1.activity_ids), 0)
|
||||
|
||||
def test_get_file_description(self):
|
||||
res = self.invoice_1._get_file_for_transmission_method()
|
||||
self.assertTrue(res["file"])
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record id="view_move_form" model="ir.ui.view">
|
||||
<field name="name">Account Invoice Export on Invoice form view</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="transmit_method_id" position="after">
|
||||
<field name="invoice_exported" invisible="1" />
|
||||
<field name="invoice_export_confirmed" invisible="1" />
|
||||
<field name="send_through_http" invisible="1" />
|
||||
</field>
|
||||
<button name="action_invoice_sent" position="after">
|
||||
<button
|
||||
name="export_invoice"
|
||||
string="Send eBill"
|
||||
type="object"
|
||||
attrs="{'invisible':['|', '|', '|', ('send_through_http', '=', False), ('state', '!=', 'posted'), ('invoice_exported', '=', True), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"
|
||||
groups="base.group_user"
|
||||
class="oe_highlight"
|
||||
/>
|
||||
<button
|
||||
name="export_invoice"
|
||||
string="Resend eBill"
|
||||
type="object"
|
||||
attrs="{'invisible':['|', '|', '|', ('send_through_http', '=', False), ('state', '!=', 'posted'), ('invoice_exported', '=', False), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"
|
||||
context="{'resend_ebill': True}"
|
||||
groups="base.group_user"
|
||||
class="oe_highlight"
|
||||
confirm="Ebill has already been sent. Are you sure you want to send it again ?"
|
||||
/>
|
||||
</button>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_invoice_tree" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_invoice_tree" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="state" position="after">
|
||||
<field
|
||||
name="activity_exception_decoration"
|
||||
widget="activity_exception"
|
||||
/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.actions.server" id="action_send_ebill">
|
||||
<field name="name">Send eBill</field>
|
||||
<field name="model_id" ref="account.model_account_move" />
|
||||
<field name="binding_model_id" ref="account.model_account_move" />
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
records.export_invoice()
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<template id="exception_sending_invoice">
|
||||
<div>
|
||||
<p>Error sending invoice to <t t-out="transmit_method_name" />.</p>
|
||||
<p>The failed job has the uuid <t t-out="job_id" /></p>
|
||||
</div>
|
||||
</template>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record id="transmit_method_form" model="ir.ui.view">
|
||||
<field name="name">Transmit Method Form view Export</field>
|
||||
<field name="model">transmit.method</field>
|
||||
<field
|
||||
name="inherit_id"
|
||||
ref="account_invoice_transmit_method.transmit_method_form"
|
||||
/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//group[@name='main']" position="after">
|
||||
<group
|
||||
name="export"
|
||||
attrs="{'invisible': [('customer_ok', '=', False)]}"
|
||||
>
|
||||
<field name="send_through_http" />
|
||||
<div
|
||||
role="alert"
|
||||
class="alert alert-info"
|
||||
colspan="2"
|
||||
attrs="{'invisible': [('send_through_http', '=', False)]}"
|
||||
>
|
||||
<p
|
||||
>By default the PDF of the invoice will be sent using the connection parameters below (basic authenticaiton).</p>
|
||||
<p
|
||||
>Handling specific connection needs and/or exporting other files can be done through code.</p>
|
||||
</div>
|
||||
<field
|
||||
name="destination_url"
|
||||
attrs="{'invisible': [('send_through_http', '=', False)]}"
|
||||
/>
|
||||
<field
|
||||
name="destination_user"
|
||||
attrs="{'invisible': [('send_through_http', '=', False)]}"
|
||||
/>
|
||||
<field
|
||||
name="destination_pwd"
|
||||
attrs="{'invisible': [('send_through_http', '=', False)]}"
|
||||
/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# Architecture
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
U[Users] -->|HTTP| V[Views and QWeb Templates]
|
||||
V --> C[Controllers]
|
||||
V --> W[Wizards – Transient Models]
|
||||
C --> M[Models and ORM]
|
||||
W --> M
|
||||
M --> R[Reports]
|
||||
DX[Data XML] --> M
|
||||
S[Security – ACLs and Groups] -. enforces .-> M
|
||||
|
||||
subgraph Account_invoice_export Module - account_invoice_export
|
||||
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.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Configuration
|
||||
|
||||
Refer to Odoo settings for account_invoice_export. Configure related models, access rights, and options as needed.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Controllers
|
||||
|
||||
This module does not define custom HTTP controllers.
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# Dependencies
|
||||
|
||||
This addon depends on:
|
||||
|
||||
- [account](../../odoo-bringout-oca-ocb-account)
|
||||
- [account_invoice_transmit_method](../../odoo-bringout-oca-account-invoicing-account_invoice_transmit_method)
|
||||
4
odoo-bringout-oca-edi-account_invoice_export/doc/FAQ.md
Normal file
4
odoo-bringout-oca-edi-account_invoice_export/doc/FAQ.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# FAQ
|
||||
|
||||
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
|
||||
- Q: How to enable? A: Start server with --addon account_invoice_export or install in UI.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Install
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-edi-account_invoice_export"
|
||||
# or
|
||||
uv pip install odoo-bringout-oca-edi-account_invoice_export"
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue