[ADD] l10n_latam_invoice_document: new module to manage documents types

This module special for Chile and Argentina, although e.g.
Brasil and the Domenican Republic could use it too in the
future.

The number of an invoice does not just depend on the journal, but
also on the document type which depends on the type of client you
will send your invoice to.  So, each of these needs their own sequence.

For the vendor bills, LATAM countries are really not used to an internal
reference number, so the internal number is immediately the one of
the vendor.

A special case is also that on certain documents, certain taxes need to be
included in the backend, but should not appear on the ticket (hidden,
but still included in the net price)
This commit is contained in:
Katherine Zaoral
2019-08-22 16:18:40 +00:00
committed by Josse Colpaert
parent f84dbf63b9
commit 895f89ff2d
25 changed files with 1559 additions and 0 deletions
@@ -0,0 +1,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizards
from . import report
@@ -0,0 +1,33 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
"name": "LATAM Document",
"version": "13.0.1.0.0",
"author": "ADHOC SA",
"category": "Localization",
'description': """
LATAM Document
==============
This module is intended to be extended by localizations (like Argentina and
Chile) in order to manage the document types that need to be reported to the
government required by this countries.
In order to do that we add a new model named Document Topes and we create
links between this new model and another Odoo's models.
""",
"depends": [
"account",
],
"data": [
'views/account_journal_view.xml',
'views/account_move_line_view.xml',
'views/account_move_view.xml',
'views/l10n_latam_document_type_view.xml',
'views/report_invoice.xml',
'views/ir_sequence_view.xml',
'report/invoice_report_view.xml',
'wizards/account_move_reversal_view.xml',
'security/ir.model.access.csv',
],
'installable': True,
}
@@ -0,0 +1,389 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_latam_document
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0alpha1+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-02 20:49+0000\n"
"PO-Revision-Date: 2019-08-02 20:49+0000\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: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_chart_template
msgid "Account Chart Template"
msgstr "Plantilla de Plan de Cuentas"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_move_reversal
msgid "Account Move Reversal"
msgstr "Revocación de movimiento en cuenta"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__active
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Active"
msgstr "Activo"
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__internal_type
msgid ""
"Analog to odoo account.move.type but with more options allowing to identify "
"the kind of document we are working with. (not only related to account.move,"
" could be for documents of other models like stock.picking)"
msgstr ""
"Análogo a al campo Tipo en la factura pero con mas opciones permitiendo "
"indentificar el tipo de documento con el que estamos trabajando (no solo "
"relacionado a la factura, puede ser para documentos de otros modelos como "
"los movimientos de inventario)."
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Archived"
msgstr "Archivado"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__code
msgid "Code"
msgstr "Código"
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__code
msgid "Code used by different localizations"
msgstr "Código usando por diferentes localizaciones"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__country_id
msgid "Country"
msgstr "País"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_journal__l10n_latam_country_code
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_country_code
msgid "Country Code"
msgstr "Código País"
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__country_id
msgid "Country in which this type of document is valid"
msgstr "País donde el tipo de documento es valido"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__create_date
msgid "Created on"
msgstr "Creado el"
#. module: l10n_latam_document
#: selection:l10n_latam.document.type,internal_type:0
msgid "Credit Notes"
msgstr "Notas de Crédito"
#. module: l10n_latam_document
#: selection:l10n_latam.document.type,internal_type:0
msgid "Debit Notes"
msgstr "Notas de Débito"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__doc_code_prefix
msgid "Document Code Prefix"
msgstr "Prefijo del código de documento"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_document_number
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_document_number
msgid "Document Number"
msgstr "Número de Documento"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_invoice_report__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_ir_sequence__l10n_latam_document_type_id
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_invoice_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_invoice_report_search
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_move_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_move_line_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_form
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_tree
msgid "Document Type"
msgstr "Tipo de Documento"
#. module: l10n_latam_document
#: model:ir.actions.act_window,name:l10n_latam_invoice_document.action_document_type
#: model:ir.ui.menu,name:l10n_latam_invoice_document.menu_document_type
msgid "Document Types"
msgstr "Tipos de Documentos"
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Group By..."
msgstr "Agrupar por..."
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__id
msgid "ID"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_journal__l10n_latam_use_documents
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_move__l10n_latam_use_documents
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_use_documents
msgid ""
"If active: will be using for legal invoicing (invoices, debit/credit notes)."
" If not set means that will be used to register accounting entries not "
"related to invoicing legal documents. For Example: Receipts, Tax Payments, "
"Register journal entries"
msgstr ""
"Si esta activo: será utilizado para facturación (facturas, notas de débito y"
" crédito). SI esta desactivado significa que que será usado para registrar "
"movimientos contables que no están relacionas con facturación como tal. Por "
"ejemplo: Recibos, Pagos de Impuestos, Registrar asientos contables"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__internal_type
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Internal Type"
msgstr "Tipo interno"
#. module: l10n_latam_document
#: selection:l10n_latam.document.type,internal_type:0
msgid "Invoices"
msgstr "Facturas"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_invoice_report
msgid "Invoices Statistics"
msgstr "Estadísticas de facturas"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_journal
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_ir_sequence__l10n_latam_journal_id
msgid "Journal"
msgstr "Diario"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_move
msgid "Journal Entries"
msgstr "Asientos contables"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_move_line
msgid "Journal Item"
msgstr "Apunte contable"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_amount_tax
msgid "L10N Latam Amount Tax"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_amount_untaxed
msgid "L10N Latam Amount Untaxed"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_available_document_type_ids
msgid "L10N Latam Available Document Type"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_journal__l10n_latam_company_use_documents
msgid "L10N Latam Company Use Documents"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_price_net
msgid "L10N Latam Price Net"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_price_subtotal
msgid "L10N Latam Price Subtotal"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_price_unit
msgid "L10N Latam Price Unit"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_sequence_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_sequence_id
msgid "L10N Latam Sequence"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_tax_ids
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_tax_ids
msgid "L10N Latam Tax"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_l10n_latam_document_type
msgid "Latam Document Type"
msgstr "Tipo de Documento Latam"
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Localization"
msgstr "Localización"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__name
msgid "Name"
msgstr "Nombre"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__report_name
msgid "Name on Reports"
msgstr "Nombre en Reportes"
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__report_name
msgid "Name that will be printed in reports, for example \"CREDIT NOTE\""
msgstr "Nombre que será impreso en los reportes, por ejemplo \"NOTA DE CREDITO\""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:87
#, python-format
msgid "No sequence or document number linked to invoice id %s"
msgstr "No hay secuencia o número de documento vinculado a la factura %s"
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:102
#, python-format
msgid "Please set the document number on the following invoices %s."
msgstr ""
"Por favor asigne el número de documento en las siguientes facturas %s."
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__doc_code_prefix
msgid ""
"Prefix for Documents Codes on Invoices and Account Moves. For eg. 'FA ' will"
" build 'FA 0001-0000001' Document Number"
msgstr ""
"Prefijo para Códigos de Documentos en Facturas y Asientos. Por eje: 'FA ' "
"será construirá 'FA 0001-0000001' como el numero de documento"
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_ir_sequence
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__sequence
msgid "Sequence"
msgstr "Secuencia"
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Show active document types"
msgstr "Mostrar tipos de documento activos"
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Show archived document types"
msgstr "Mostrar tipos de documento archivados"
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_journal__l10n_latam_country_code
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_move__l10n_latam_country_code
msgid "Technical field used to hide/show fields regarding the localization"
msgstr ""
"Campo técnico usado para esconder/mostrar dependiendo de la liocalización"
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__name
msgid "The document name"
msgstr "El nombre del documento"
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:97
#, python-format
msgid ""
"The journal require a document type but not document type has been selected "
"on invoices %s."
msgstr ""
"El diario requiere un tipo de documento pero no hay tipo de documento "
"seleccionado en las facturas %s."
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__sequence
msgid ""
"To set in which order show the documents type taking into account the most "
"commonly used first"
msgstr ""
"Para seleccionar en que orden deben mostrar los tipos de documento teniendo "
"en cuenta los más usados comunmente"
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_journal__l10n_latam_use_documents
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_use_documents
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_use_documents
msgid "Use Documents?"
msgstr "Usa Documentos?"
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:182
#, python-format
msgid "Vendor bill number must be unique per vendor and company."
msgstr ""
"El número de la Factura de Proveedor debe ser único por proveedor y por "
"compañía."
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_journal.py:32
#, python-format
msgid ""
"You can not modify the field \"Use Documents?\" if there are validated "
"invoices in this journal!"
msgstr ""
"No puedes modificar el campo \"Usa Documentos?\" si ya existen facturas "
"validades en este diario!"
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:113
#, python-format
msgid "You can not use a %s document type with a invoice"
msgstr "No puedes utilizar el tipo de documento %s en una factura"
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:111
#, python-format
msgid "You can not use a %s document type with a refund invoice"
msgstr ""
"No puedes utilizar el tipo de documento %s en una factura de reembolso"
@@ -0,0 +1,368 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_latam_document
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0alpha1+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-02 20:54+0000\n"
"PO-Revision-Date: 2019-08-02 20:54+0000\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: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_chart_template
msgid "Account Chart Template"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_move_reversal
msgid "Account Move Reversal"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__active
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Active"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__internal_type
msgid ""
"Analog to odoo account.move.type but with more options allowing to identify "
"the kind of document we are working with. (not only related to account.move,"
" could be for documents of other models like stock.picking)"
msgstr ""
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Archived"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__code
msgid "Code"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__code
msgid "Code used by different localizations"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_res_company
msgid "Companies"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__country_id
msgid "Country"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_journal__l10n_latam_country_code
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_country_code
msgid "Country Code"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__country_id
msgid "Country in which this type of document is valid"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__create_uid
msgid "Created by"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__create_date
msgid "Created on"
msgstr ""
#. module: l10n_latam_document
#: selection:l10n_latam.document.type,internal_type:0
msgid "Credit Notes"
msgstr ""
#. module: l10n_latam_document
#: selection:l10n_latam.document.type,internal_type:0
msgid "Debit Notes"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__display_name
msgid "Display Name"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__doc_code_prefix
msgid "Document Code Prefix"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_document_number
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_document_number
msgid "Document Number"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_invoice_report__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_document_type_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_ir_sequence__l10n_latam_document_type_id
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_invoice_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_invoice_report_search
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_move_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_account_move_line_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_form
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_tree
msgid "Document Type"
msgstr ""
#. module: l10n_latam_document
#: model:ir.actions.act_window,name:l10n_latam_invoice_document.action_document_type
#: model:ir.ui.menu,name:l10n_latam_invoice_document.menu_document_type
msgid "Document Types"
msgstr ""
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Group By..."
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__id
msgid "ID"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_journal__l10n_latam_use_documents
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_move__l10n_latam_use_documents
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_use_documents
msgid ""
"If active: will be using for legal invoicing (invoices, debit/credit notes)."
" If not set means that will be used to register accounting entries not "
"related to invoicing legal documents. For Example: Receipts, Tax Payments, "
"Register journal entries"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__internal_type
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Internal Type"
msgstr ""
#. module: l10n_latam_document
#: selection:l10n_latam.document.type,internal_type:0
msgid "Invoices"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_invoice_report
msgid "Invoices Statistics"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_journal
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_ir_sequence__l10n_latam_journal_id
msgid "Journal"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_move
msgid "Journal Entries"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_account_move_line
msgid "Journal Item"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_amount_tax
msgid "L10N Latam Amount Tax"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_amount_untaxed
msgid "L10N Latam Amount Untaxed"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_available_document_type_ids
msgid "L10N Latam Available Document Type"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_journal__l10n_latam_company_use_documents
msgid "L10N Latam Company Use Documents"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_price_net
msgid "L10N Latam Price Net"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_price_subtotal
msgid "L10N Latam Price Subtotal"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_price_unit
msgid "L10N Latam Price Unit"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_sequence_id
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_sequence_id
msgid "L10N Latam Sequence"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_tax_ids
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_line__l10n_latam_tax_ids
msgid "L10N Latam Tax"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type____last_update
msgid "Last Modified on"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__write_uid
msgid "Last Updated by"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__write_date
msgid "Last Updated on"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_l10n_latam_document_type
msgid "Latam Document Type"
msgstr ""
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Localization"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__name
msgid "Name"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__report_name
msgid "Name on Reports"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__report_name
msgid "Name that will be printed in reports, for example \"CREDIT NOTE\""
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:87
#, python-format
msgid "No sequence or document number linked to invoice id %s"
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:102
#, python-format
msgid "Please set the document number on the following invoices %s."
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__doc_code_prefix
msgid ""
"Prefix for Documents Codes on Invoices and Account Moves. For eg. 'FA ' will"
" build 'FA 0001-0000001' Document Number"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model,name:l10n_latam_invoice_document.model_ir_sequence
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_l10n_latam_document_type__sequence
msgid "Sequence"
msgstr ""
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Show active document types"
msgstr ""
#. module: l10n_latam_document
#: model_terms:ir.ui.view,arch_db:l10n_latam_invoice_document.view_document_type_filter
msgid "Show archived document types"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_journal__l10n_latam_country_code
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_account_move__l10n_latam_country_code
msgid "Technical field used to hide/show fields regarding the localization"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__name
msgid "The document name"
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:97
#, python-format
msgid ""
"The journal require a document type but not document type has been selected "
"on invoices %s."
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,help:l10n_latam_invoice_document.field_l10n_latam_document_type__sequence
msgid ""
"To set in which order show the documents type taking into account the most "
"commonly used first"
msgstr ""
#. module: l10n_latam_document
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_journal__l10n_latam_use_documents
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move__l10n_latam_use_documents
#: model:ir.model.fields,field_description:l10n_latam_invoice_document.field_account_move_reversal__l10n_latam_use_documents
msgid "Use Documents?"
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:182
#, python-format
msgid "Vendor bill number must be unique per vendor and company."
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_journal.py:32
#, python-format
msgid ""
"You can not modify the field \"Use Documents?\" if there are validated "
"invoices in this journal!"
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:113
#, python-format
msgid "You can not use a %s document type with a invoice"
msgstr ""
#. module: l10n_latam_document
#: code:addons/l10n_latam_document/models/account_move.py:111
#, python-format
msgid "You can not use a %s document type with a refund invoice"
msgstr ""
@@ -0,0 +1,9 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import res_company
from . import l10n_latam_document_type
from . import account_journal
from . import account_move
from . import account_move_line
from . import account_chart_template
from . import ir_sequence
@@ -0,0 +1,19 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, api, fields, _
class AccountChartTemplate(models.Model):
_inherit = 'account.chart.template'
@api.model
def _prepare_all_journals(self, acc_template_ref, company, journals_dict=None):
""" We add use_documents or not depending on the context"""
journal_data = super()._prepare_all_journals(acc_template_ref, company, journals_dict)
# if chart has localization, then we use documents by default
if company._localization_use_documents():
for vals_journal in journal_data:
if vals_journal['type'] in ['sale', 'purchase']:
vals_journal['l10n_latam_use_documents'] = True
return journal_data
@@ -0,0 +1,39 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, api, _
from odoo.exceptions import ValidationError
class AccountJournal(models.Model):
_inherit = "account.journal"
l10n_latam_use_documents = fields.Boolean(
'Use Documents?', help="If active: will be using for legal invoicing (invoices, debit/credit notes)."
" If not set means that will be used to register accounting entries not related to invoicing legal documents."
" For Example: Receipts, Tax Payments, Register journal entries")
l10n_latam_company_use_documents = fields.Boolean(compute='_compute_l10n_latam_company_use_documents')
l10n_latam_country_code = fields.Char(
related='company_id.country_id.code', help='Technical field used to hide/show fields regarding the localization')
@api.depends('company_id')
def _compute_l10n_latam_company_use_documents(self):
for rec in self:
rec.l10n_latam_company_use_documents = rec.company_id._localization_use_documents()
@api.onchange('company_id', 'type')
def _onchange_company(self):
self.l10n_latam_use_documents = self.type in ['sale', 'purchase'] and \
self.l10n_latam_company_use_documents
@api.constrains('l10n_latam_use_documents')
def check_use_document(self):
for rec in self:
if rec.env['account.move'].search([('journal_id', '=', rec.id), ('state', '!=', 'draft')]):
raise ValidationError(_(
'You can not modify the field "Use Documents?" if there are validated invoices in this journal!'))
@api.model
def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None):
if self._context.get('default_type') in ('out_receipt', 'in_receipt'):
args += [('l10n_latam_use_documents', '=', False)]
return super()._search(args, offset, limit, order, count=count, access_rights_uid=access_rights_uid)
@@ -0,0 +1,212 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
from functools import partial
from odoo.tools.misc import formatLang
class AccountMove(models.Model):
_inherit = "account.move"
l10n_latam_amount_tax = fields.Monetary(compute='_compute_l10n_latam_amount_and_taxes')
l10n_latam_amount_untaxed = fields.Monetary(compute='_compute_l10n_latam_amount_and_taxes')
l10n_latam_tax_ids = fields.One2many(compute="_compute_l10n_latam_amount_and_taxes", comodel_name='account.move.line')
l10n_latam_available_document_type_ids = fields.Many2many('l10n_latam.document.type', compute='_compute_l10n_latam_documents')
l10n_latam_document_type_id = fields.Many2one(
'l10n_latam.document.type', string='Document Type', copy=False, readonly=True, auto_join=True, index=True,
states={'posted': [('readonly', True)]})
l10n_latam_sequence_id = fields.Many2one('ir.sequence', compute='_compute_l10n_latam_sequence')
l10n_latam_document_number = fields.Char(
compute='_compute_l10n_latam_document_number', inverse='_inverse_l10n_latam_document_number',
string='Document Number', readonly=True, states={'draft': [('readonly', False)]})
l10n_latam_use_documents = fields.Boolean(related='journal_id.l10n_latam_use_documents')
l10n_latam_country_code = fields.Char(
related='company_id.country_id.code', help='Technical field used to hide/show fields regarding the localization')
def _get_sequence_prefix(self):
""" If we use documents we update sequences only from journal """
return super(AccountMove, self.filtered(lambda x: not x.l10n_latam_use_documents))._get_sequence_prefix()
@api.depends('name')
def _compute_l10n_latam_document_number(self):
recs_with_name = self.filtered(lambda x: x.name != '/')
for rec in recs_with_name:
name = rec.name
doc_code_prefix = rec.l10n_latam_document_type_id.doc_code_prefix
if doc_code_prefix and name:
name = name.split(" ", 1)[-1]
rec.l10n_latam_document_number = name
remaining = self - recs_with_name
remaining.l10n_latam_document_number = False
@api.onchange('l10n_latam_document_type_id', 'l10n_latam_document_number')
def _inverse_l10n_latam_document_number(self):
for rec in self.filtered('l10n_latam_document_type_id'):
if not rec.l10n_latam_document_number:
rec.name = '/'
else:
l10n_latam_document_number = rec.l10n_latam_document_type_id._format_document_number(rec.l10n_latam_document_number)
if rec.l10n_latam_document_number != l10n_latam_document_number:
rec.l10n_latam_document_number = l10n_latam_document_number
rec.name = "%s %s" % (rec.l10n_latam_document_type_id.doc_code_prefix, l10n_latam_document_number)
@api.depends('l10n_latam_document_type_id', 'journal_id')
def _compute_l10n_latam_sequence(self):
recs_with_journal_id = self.filtered('journal_id')
for rec in recs_with_journal_id:
rec.l10n_latam_sequence_id = rec._get_document_type_sequence()
remaining = self - recs_with_journal_id
remaining.l10n_latam_sequence_id = False
def _compute_l10n_latam_amount_and_taxes(self):
recs_invoice = self.filtered(lambda x: x.is_invoice(include_receipts=True))
for invoice in recs_invoice:
tax_lines = invoice.line_ids.filtered('tax_line_id')
included_taxes = invoice.l10n_latam_document_type_id and \
invoice.l10n_latam_document_type_id._filter_taxes_included(tax_lines.mapped('tax_line_id'))
if not included_taxes:
l10n_latam_amount_tax = invoice.amount_tax
l10n_latam_amount_untaxed = invoice.amount_untaxed
not_included_invoice_taxes = tax_lines
else:
included_invoice_taxes = tax_lines.filtered(lambda x: x.tax_line_id in included_taxes)
not_included_invoice_taxes = tax_lines - included_invoice_taxes
if invoice.is_inbound():
sign = -1
else:
sign = 1
l10n_latam_amount_tax = sign * sum(not_included_invoice_taxes.mapped('balance'))
l10n_latam_amount_untaxed = invoice.amount_untaxed + sign * sum(included_invoice_taxes.mapped('balance'))
invoice.l10n_latam_amount_tax = l10n_latam_amount_tax
invoice.l10n_latam_amount_untaxed = l10n_latam_amount_untaxed
invoice.l10n_latam_tax_ids = not_included_invoice_taxes
remaining = self - recs_invoice
remaining.l10n_latam_amount_tax = False
remaining.l10n_latam_amount_untaxed = False
remaining.l10n_latam_tax_ids = []
def _compute_invoice_sequence_number_next(self):
""" If journal use documents disable the next number header"""
with_latam_document_number = self.filtered('l10n_latam_use_documents')
with_latam_document_number.invoice_sequence_number_next_prefix = False
with_latam_document_number.invoice_sequence_number_next = False
return super(AccountMove, self - with_latam_document_number)._compute_invoice_sequence_number_next()
def post(self):
for rec in self.filtered(lambda x: x.l10n_latam_use_documents and (not x.name or x.name == '/')):
if not rec.l10n_latam_sequence_id:
raise UserError(_('No sequence or document number linked to invoice id %s') % rec.id)
if rec.type in ('in_receipt', 'out_receipt'):
raise UserError(_('We do not accept the usage of document types on receipts yet. '))
rec.l10n_latam_document_number = rec.l10n_latam_sequence_id.next_by_id()
return super().post()
@api.constrains('name', 'journal_id', 'state')
def _check_unique_sequence_number(self):
""" Do not apply unique sequence number for vendoer bills and refunds.
Also apply constraint when state change """
vendor = self.filtered(lambda x: x.type in ['in_refund', 'in_invoice'])
try:
return super(AccountMove, self - vendor)._check_unique_sequence_number()
except ValidationError:
raise ValidationError(_('Duplicated invoice number detected. You probably add twice the same customer'
' invoice/debit note.'))
@api.constrains('state', 'l10n_latam_document_type_id')
def _check_l10n_latam_documents(self):
validated_invoices = self.filtered(lambda x: x.l10n_latam_use_documents and x.state in ['open', 'done'])
without_doc_type = validated_invoices.filtered(lambda x: not x.l10n_latam_document_type_id)
if without_doc_type:
raise ValidationError(_(
'The journal require a document type but not document type has been selected on invoices %s.' % (
without_doc_type.ids)))
without_number = validated_invoices.filtered(
lambda x: not x.l10n_latam_document_number and not x.l10n_latam_sequence_id)
if without_number:
raise ValidationError(_('Please set the document number on the following invoices %s.' % (
without_number.ids)))
@api.constrains('type', 'l10n_latam_document_type_id')
def _check_invoice_type_document_type(self):
for rec in self.filtered('l10n_latam_document_type_id.internal_type'):
internal_type = rec.l10n_latam_document_type_id.internal_type
invoice_type = rec.type
if internal_type in ['debit_note', 'invoice'] and invoice_type in ['out_refund', 'in_refund']:
raise ValidationError(_('You can not use a %s document type with a refund invoice') % internal_type)
elif internal_type == 'credit_note' and invoice_type in ['out_invoice', 'in_invoice']:
raise ValidationError(_('You can not use a %s document type with a invoice') % (internal_type))
def _get_l10n_latam_documents_domain(self):
self.ensure_one()
if self.type in ['out_refund', 'in_refund']:
internal_types = ['credit_note']
else:
internal_types = ['invoice', 'debit_note']
return [('internal_type', 'in', internal_types), ('country_id', '=', self.company_id.country_id.id)]
@api.depends('journal_id', 'partner_id', 'company_id')
def _compute_l10n_latam_documents(self):
internal_type = self._context.get('internal_type', False)
recs_with_journal_partner = self.filtered(lambda x: x.journal_id and x.l10n_latam_use_documents and x.partner_id)
for rec in recs_with_journal_partner:
document_types = self.env['l10n_latam.document.type'].search(rec._get_l10n_latam_documents_domain())
# If internal_type is in context we try to search for an specific document. for eg used on debit notes
document_type = internal_type and document_types.filtered(
lambda x: x.internal_type == internal_type) or document_types
rec.l10n_latam_available_document_type_ids = document_types
rec.l10n_latam_document_type_id = document_type and document_type[0]
remaining = self - recs_with_journal_partner
remaining.l10n_latam_available_document_type_ids = []
remaining.l10n_latam_document_type_id = False
@api.model_create_multi
def create(self, vals_list):
recs = super().create(vals_list)
recs.filtered(lambda x: x.l10n_latam_use_documents and not x.l10n_latam_document_type_id)._compute_l10n_latam_documents()
return recs
def _compute_invoice_taxes_by_group(self):
move_with_doc_type = self.filtered('l10n_latam_document_type_id')
for move in move_with_doc_type:
lang_env = move.with_context(lang=move.partner_id.lang).env
tax_lines = move.l10n_latam_tax_ids
res = {}
for line in tax_lines:
res.setdefault(line.tax_line_id.tax_group_id, {'base': 0.0, 'amount': 0.0})
res[line.tax_line_id.tax_group_id]['amount'] += line.price_subtotal
res[line.tax_line_id.tax_group_id]['base'] += line.tax_base_amount
res = sorted(res.items(), key=lambda l: l[0].sequence)
move.amount_by_group = [(
group.name, amounts['amount'],
amounts['base'],
formatLang(lang_env, amounts['amount'], currency_obj=move.currency_id),
formatLang(lang_env, amounts['base'], currency_obj=move.currency_id),
len(res),
) for group, amounts in res]
super(AccountMove, self - move_with_doc_type)._compute_invoice_taxes_by_group()
def _get_document_type_sequence(self):
""" Method to be inherited by different localizations. """
self.ensure_one()
return self.env['ir.sequence']
@api.constrains('name', 'partner_id', 'company_id')
def _check_unique_vendor_number(self):
""" The constraint _check_unique_sequence_number is valid for customer bills but not valid for us on vendor
bills because the uniqueness must be per partner and also because we want to validate on entry creation and
not on entry validation """
for rec in self.filtered(lambda x: x.is_purchase_document() and x.l10n_latam_use_documents and x.l10n_latam_document_number):
domain = [
('type', '=', rec.type),
# by validating name we validate l10n_latam_document_number and l10n_latam_document_type_id
('name', '=', rec.name),
('company_id', '=', rec.company_id.id),
('id', '!=', rec.id),
('commercial_partner_id', '=', rec.commercial_partner_id.id)
]
if rec.search(domain):
raise ValidationError(_('Vendor bill number must be unique per vendor and company.'))
@@ -0,0 +1,38 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, api, fields
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
l10n_latam_document_type_id = fields.Many2one(
related='move_id.l10n_latam_document_type_id', auto_join=True, store=True, index=True)
l10n_latam_price_unit = fields.Monetary(compute='compute_l10n_latam_prices_and_taxes')
l10n_latam_price_subtotal = fields.Monetary(compute='compute_l10n_latam_prices_and_taxes')
l10n_latam_price_net = fields.Monetary(compute='compute_l10n_latam_prices_and_taxes')
l10n_latam_tax_ids = fields.One2many(compute="compute_l10n_latam_prices_and_taxes", comodel_name='account.tax')
@api.depends('price_unit', 'price_subtotal', 'move_id.l10n_latam_document_type_id')
def compute_l10n_latam_prices_and_taxes(self):
for line in self:
invoice = line.move_id
included_taxes = \
invoice.l10n_latam_document_type_id and invoice.l10n_latam_document_type_id._filter_taxes_included(
line.tax_ids)
if not included_taxes:
l10n_latam_price_unit = line.price_unit
l10n_latam_price_subtotal = line.price_subtotal
not_included_taxes = line.tax_ids
l10n_latam_price_net = l10n_latam_price_unit * (1 - (line.discount or 0.0) / 100.0)
else:
not_included_taxes = line.tax_ids - included_taxes
l10n_latam_price_unit = included_taxes.compute_all(
line.price_unit, invoice.currency_id, 1.0, line.product_id, invoice.partner_id)['total_included']
l10n_latam_price_net = l10n_latam_price_unit * (1 - (line.discount or 0.0) / 100.0)
l10n_latam_price_subtotal = l10n_latam_price_net * line.quantity
line.l10n_latam_price_subtotal = l10n_latam_price_subtotal
line.l10n_latam_price_unit = l10n_latam_price_unit
line.l10n_latam_price_net = l10n_latam_price_net
line.l10n_latam_tax_ids = not_included_taxes
@@ -0,0 +1,10 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class IrSequence(models.Model):
_inherit = 'ir.sequence'
l10n_latam_journal_id = fields.Many2one('account.journal', 'Journal')
l10n_latam_document_type_id = fields.Many2one('l10n_latam.document.type', 'Document Type')
@@ -0,0 +1,55 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, api
class L10nLatamDocumentType(models.Model):
_name = 'l10n_latam.document.type'
_description = 'Latam Document Type'
_order = 'sequence, id'
active = fields.Boolean(default=True)
sequence = fields.Integer(
default=10, required=True, help='To set in which order show the documents type taking into account the most'
' commonly used first')
country_id = fields.Many2one(
'res.country', required=True, index=True, help='Country in which this type of document is valid')
name = fields.Char(required=True, index=True, help='The document name')
doc_code_prefix = fields.Char(
'Document Code Prefix', help="Prefix for Documents Codes on Invoices and Account Moves. For eg. 'FA ' will"
" build 'FA 0001-0000001' Document Number")
code = fields.Char(help='Code used by different localizations')
report_name = fields.Char('Name on Reports', help='Name that will be printed in reports, for example "CREDIT NOTE"')
internal_type = fields.Selection(
[('invoice', 'Invoices'), ('debit_note', 'Debit Notes'), ('credit_note', 'Credit Notes')], index=True,
help='Analog to odoo account.move.type but with more options allowing to identify the kind of document we are'
' working with. (not only related to account.move, could be for documents of other models like stock.picking)')
def _format_document_number(self, document_number):
""" Method to be inherited by different localizations. The purpose of this method is to allow:
* making validations on the document_number. If it is wrong it should raise an exception
* format the document_number against a pattern and return it
"""
self.ensure_one()
return document_number
def name_get(self):
result = []
for rec in self:
name = rec.name
if rec.code:
name = '(%s) %s' % (rec.code, name)
result.append((rec.id, name))
return result
def _filter_taxes_included(self, taxes):
""" This method is to be inherited by different localizations and must return filter the given taxes recordset
returning the taxes to be included on reports of this document type. All taxes are going to be discriminated
except the one returned by this method. """
self.ensure_one()
return self.env['account.tax']
def get_document_sequence_vals(self, journal):
self.ensure_one()
return {'name': '%s - %s' % (journal.name, self.name), 'padding': 8, 'prefix': self.code}
@@ -0,0 +1,12 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
def _localization_use_documents(self):
""" This method is to be inherited by localizations and return True if localization use documents """
self.ensure_one()
return False
@@ -0,0 +1,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import invoice_report
@@ -0,0 +1,16 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields
class AccountInvoiceReport(models.Model):
_inherit = 'account.invoice.report'
l10n_latam_document_type_id = fields.Many2one('l10n_latam.document.type', 'Document Type', index=True)
_depends = {'account.move': ['l10n_latam_document_type_id'],}
def _select(self):
return super()._select() + ", move.l10n_latam_document_type_id as l10n_latam_document_type_id"
def _group_by(self):
return super()._group_by() + ", move.l10n_latam_document_type_id"
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record model="ir.ui.view" id="view_account_invoice_report_search">
<field name="name">account.invoice.report.search</field>
<field name="model">account.invoice.report</field>
<field name="inherit_id" ref="account.view_account_invoice_report_search"/>
<field name="arch" type="xml">
<search>
<field name="l10n_latam_document_type_id"/>
</search>
<filter name="user" position="after">
<filter domain="[]" string="Document Type" name="l10n_latam_document_type" context="{'group_by':'l10n_latam_document_type_id'}"/>
</filter>
</field>
</record>
</odoo>
@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_l10n_latam_document_type_all,l10n_latam.document.type.all,model_l10n_latam_document_type,,1,0,0,0
access_l10n_latam_document_type_account_manager,l10n_latam.document.type.all,model_l10n_latam_document_type,account.group_account_manager,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_l10n_latam_document_type_all l10n_latam.document.type.all model_l10n_latam_document_type 1 0 0 0
3 access_l10n_latam_document_type_account_manager l10n_latam.document.type.all model_l10n_latam_document_type account.group_account_manager 1 1 1 0
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_journal_form" model="ir.ui.view">
<field name="model">account.journal</field>
<field name="name">account.journal.form</field>
<field name="inherit_id" ref="account.view_account_journal_form"/>
<field name="arch" type="xml">
<form>
<field name="l10n_latam_country_code" invisible="1"/>
<field name="l10n_latam_company_use_documents" invisible="1"/>
</form>
<field name="type" position="after">
<field name="l10n_latam_use_documents" attrs="{'invisible': ['|', ('l10n_latam_company_use_documents', '=', False), ('type', 'not in', ['purchase','sale'])]}"/>
</field>
</field>
</record>
</odoo>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_move_line_filter" model="ir.ui.view">
<field name="name">account.move.line.filter</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
<field name="arch" type="xml">
<separator position="before">
<field name="l10n_latam_document_type_id"/>
</separator>
<group>
<filter string="Document Type" name="l10n_latam_document_type" domain="" context="{'group_by':'l10n_latam_document_type_id'}"/>
</group>
</field>
</record>
</odoo>
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_invoice_filter" model="ir.ui.view">
<field name="name">account.move.select</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="l10n_latam_document_type_id"/>
</field>
<group>
<filter string="Document Type" name="l10n_latam_document_type" domain="" context="{'group_by':'l10n_latam_document_type_id'}"/>
</group>
</field>
</record>
<record id="view_account_move_filter" model="ir.ui.view">
<field name="name">account.move.filter</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_account_move_filter"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="l10n_latam_document_type_id"/>
</field>
<group>
<filter string="Document Type" name="l10n_latam_document_type" domain="" context="{'group_by':'l10n_latam_document_type_id'}"/>
</group>
</field>
</record>
<record id="view_move_form" model="ir.ui.view">
<field name="name">account.move.form</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<form>
<field name="l10n_latam_available_document_type_ids" invisible="1"/>
<field name="l10n_latam_use_documents" invisible="1"/>
<field name="l10n_latam_country_code" invisible="1"/>
<field name="l10n_latam_sequence_id" invisible="1"/>
</form>
<field name="journal_id" position="after">
<field name="l10n_latam_document_type_id"
attrs="{'invisible': [('l10n_latam_use_documents', '=', False)], 'required': [('l10n_latam_use_documents', '=', True)], 'readonly': [('state', '!=', 'draft')]}"
domain="[('id', 'in', l10n_latam_available_document_type_ids)]" options="{'no_open': True, 'no_create': True}"/>
<field name="l10n_latam_document_number"
attrs="{'invisible': ['|', ('l10n_latam_sequence_id', '!=', False), ('l10n_latam_use_documents', '=', False)], 'required': [('l10n_latam_sequence_id', '=', False), ('l10n_latam_use_documents', '=', True)], 'readonly': [('state', '!=', 'draft')]}"/>
</field>
<field name="journal_id" position="attributes">
<attribute name="context">{'default_type': type}</attribute>
</field>
</field>
</record>
</odoo>
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sequence_view" model="ir.ui.view">
<field name="name">ir.sequence.form</field>
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.sequence_view"/>
<field name="arch" type="xml">
<field name="implementation" position="after">
<field name="l10n_latam_journal_id" options="{'no_open': True, 'no_create': True}"/>
<field name="l10n_latam_document_type_id" options="{'no_open': True, 'no_create': True}"/>
</field>
</field>
</record>
<record id="sequence_view_tree" model="ir.ui.view">
<field name="name">ir.sequence.tree</field>
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.sequence_view_tree"/>
<field name="arch" type="xml">
<field name="implementation" position="after">
<field name="l10n_latam_journal_id"/>
<field name="l10n_latam_document_type_id"/>
</field>
</field>
</record>
<record id="view_sequence_search" model="ir.ui.view">
<field name="name">ir.sequence.search</field>
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.view_sequence_search"/>
<field name="arch" type="xml">
<field name="code" position="before">
<field name="l10n_latam_journal_id"/>
<field name="l10n_latam_document_type_id"/>
</field>
</field>
</record>
</odoo>
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_document_type_form" model="ir.ui.view">
<field name="name">l10n_latam.document.type.form</field>
<field name="model">l10n_latam.document.type</field>
<field name="arch" type="xml">
<form string="Document Type" create="0" edit="0">
<group>
<field name='code'/>
<field name="name"/>
<field name='doc_code_prefix'/>
<field name='report_name'/>
<field name='internal_type'/>
<field name='country_id'/>
</group>
</form>
</field>
</record>
<record id="view_document_type_tree" model="ir.ui.view">
<field name="name">l10n_latam.document.type.tree</field>
<field name="model">l10n_latam.document.type</field>
<field name="arch" type="xml">
<tree string="Document Type" decoration-muted="(not active)" create="0" edit="0">
<field name="code"/>
<field name="name"/>
<field name="doc_code_prefix"/>
<field name='report_name'/>
<field name='internal_type'/>
<field name='country_id'/>
<field name="active" widget="boolean_toggle"/>
</tree>
</field>
</record>
<record id="view_document_type_filter" model="ir.ui.view">
<field name="name">l10n_latam.document.type.filter</field>
<field name="model">l10n_latam.document.type</field>
<field name="arch" type="xml">
<search string="Document Type">
<field name="name"/>
<field name="code"/>
<field name='internal_type'/>
<field name='country_id'/>
<filter name="active" string="Active" domain="[('active','=',True)]" help="Show active document types"/>
<filter name="inactive" string="Archived" domain="[('active','=',False)]" help="Show archived document types"/>
<group expand="1" string="Group By...">
<filter string="Internal Type" name="group_by_internal_type" context="{'group_by':'internal_type'}"/>
<filter string="Localization" name="group_by_localization" context="{'group_by':'country_id'}"/>
</group>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_document_type">
<field name="name">Document Types</field>
<field name="res_model">l10n_latam.document.type</field>
<field name="domain">['|', ('active', '=', True), ('active', '=', False)]</field>
<field name="context">{"search_default_active":1}</field>
</record>
<menuitem action="action_document_type" id="menu_document_type" sequence="20" parent="account.account_account_menu"/>
</odoo>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_invoice_document" inherit_id="account.report_invoice_document">
<xpath expr="//t[@id='inv_tax_id_label']" position="attributes">
<attribute name="t-esc">o.partner_id.l10n_latam_identification_type_id.name or o.company_id.country_id.vat_label</attribute>
</xpath>
<xpath expr="//h2" position="attributes">
<attribute name="t-if">not o.l10n_latam_document_type_id.report_name</attribute>
</xpath>
<xpath expr="//h2" position="after">
<h2 t-if="o.l10n_latam_document_type_id.report_name">
<span t-field="o.l10n_latam_document_type_id.report_name"/>
<span t-field="o.l10n_latam_document_number"/>
</h2>
</xpath>
<xpath expr="//span[@t-field='line.price_unit']" position="attributes">
<attribute name="t-field">line.l10n_latam_price_unit</attribute>
</xpath>
<xpath expr="//span[@id='line_tax_ids']" position="attributes">
<attribute name="t-esc">', '.join(map(lambda x: (x.description or x.name), line.l10n_latam_tax_ids))</attribute>
</xpath>
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal" position="replace">
<t t-set="current_subtotal" t-value="current_subtotal + line.l10n_latam_price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
</t>
<span t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded" position="replace">
<span t-field="line.l10n_latam_price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
</span>
<span t-field="o.amount_untaxed" position="attributes">
<attribute name="t-field">o.l10n_latam_amount_untaxed</attribute>
</span>
</template>
</odoo>
@@ -0,0 +1,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import account_move_reversal
@@ -0,0 +1,65 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, _
from odoo.exceptions import UserError
class AccountMoveReversal(models.TransientModel):
_inherit = "account.move.reversal"
l10n_latam_use_documents = fields.Boolean(
related='move_id.journal_id.l10n_latam_use_documents', readonly=True)
l10n_latam_document_type_id = fields.Many2one('l10n_latam.document.type', 'Document Type', ondelete='cascade')
l10n_latam_sequence_id = fields.Many2one('ir.sequence', compute='_compute_l10n_latam_sequence')
l10n_latam_document_number = fields.Char(string='Document Number')
@staticmethod
def reverse_type_map(move_type):
match = {
'entry': 'entry',
'out_invoice': 'out_refund',
'in_invoice': 'in_refund',
'in_refund': 'in_invoice',
'out_receipt': 'in_receipt',
'in_receipt': 'out_receipt'}
return match.get(move_type)
@api.onchange('move_id')
def _onchange_move_id(self):
if self.move_id.l10n_latam_use_documents:
refund = self.move_id.new({
'type': self.reverse_type_map(self.move_id.type),
'journal_id': self.move_id.journal_id.id,
'partner_id': self.move_id.partner_id.id,
'company_id': self.move_id.company_id.id,
})
refund._compute_l10n_latam_documents()
self.l10n_latam_document_type_id = refund.l10n_latam_document_type_id
return {'domain': {
'l10n_latam_document_type_id': [('id', 'in', refund.l10n_latam_available_document_type_ids.ids)]}}
def reverse_moves(self):
return super(AccountMoveReversal, self.with_context(
default_l10n_latam_document_type_id=self.l10n_latam_document_type_id.id,
default_l10n_latam_document_number=self.l10n_latam_document_number)).reverse_moves()
@api.depends('l10n_latam_document_type_id')
def _compute_l10n_latam_sequence(self):
for rec in self:
refund = rec.move_id.new({
'type': self.reverse_type_map(rec.move_id.type),
'journal_id': rec.move_id.journal_id.id,
'partner_id': rec.move_id.partner_id.id,
'company_id': rec.move_id.company_id.id,
'l10n_latam_document_type_id': rec.l10n_latam_document_type_id.id,
})
rec.l10n_latam_sequence_id = refund._get_document_type_sequence()
@api.onchange('l10n_latam_document_number', 'l10n_latam_document_type_id')
def _onchange_l10n_latam_document_number(self):
if self.l10n_latam_document_type_id:
l10n_latam_document_number = self.l10n_latam_document_type_id._format_document_number(
self.l10n_latam_document_number)
if self.l10n_latam_document_number != l10n_latam_document_number:
self.l10n_latam_document_number = l10n_latam_document_number
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_move_reversal" model="ir.ui.view">
<field name="name">account.move.reversal.form</field>
<field name="model">account.move.reversal</field>
<field name="inherit_id" ref="account.view_account_move_reversal"/>
<field name="arch" type="xml">
<form>
<field name="l10n_latam_use_documents" invisible="1"/>
<field name="l10n_latam_sequence_id" invisible="1"/>
</form>
<field name="date" position="before">
<field name="l10n_latam_document_type_id" attrs="{'invisible': ['|', ('l10n_latam_use_documents', '=', False), ('refund_method', '=', 'refund')], 'required': [('l10n_latam_use_documents', '=', True), ('refund_method', '!=', 'refund')]}" options="{'no_open': True, 'no_create': True}"/>
<field name="l10n_latam_document_number" attrs="{'invisible': ['|', ('l10n_latam_sequence_id', '!=', False), ('refund_method', '=', 'refund')], 'required': [('l10n_latam_sequence_id', '=', True), ('refund_method', '!=', 'refund')]}"/>
</field>
</field>
</record>
</odoo>