Paraguay - Accounting Extensions

l10n_py_account
REPOSITORY
REPOSITORYOCA/l10n-paraguay
GIT
GIThttps://github.com/OCA/l10n-paraguay.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/l10n-paraguay/tree/16.0/l10n_py_account
VERSION
VERSION 2.0.0
CATEGORY
CATEGORYAccounting/Localizations
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), KMEE
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), KMEE
COMMITTERS
COMMITTERSmileo, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/l10n-paraguay
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:12:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/l10n-paraguay:
    - l10n_py
    - l10n_py_base
odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - base_address_extended
    - l10n_latam_base
    - contacts
    - base_vat
    - l10n_latam_invoice_document
    - account_debit_note
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES num2words
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
# Paraguay - Accounting Extensions

This module extends the base Paraguayan accounting localization with specific functionality required for Paraguayan fiscal compliance.

## Features

- **Journal Extensions**: Enhanced journal configuration with Paraguayan-specific fields
  - Establishment (punto de expedición)
  - Point of Sale (punto de emisión)
  - Timbrado (tax stamp authorization)

- **Authorization Management**: Complete timbrado lifecycle management
  - Authorization number tracking
  - Validity period control
  - Document number range management
  - Automatic sequence generation

- **Account Move Extensions**: Enhanced invoice/bill features
  - Automatic timbrado assignment
  - Document number formatting
  - Fiscal validations

- **Fiscal Validations**: 
  - Valid timbrado verification
  - Document number range validation
  - Expiration date checking

## Purpose

This module bridges the gap between Odoo's standard accounting and Paraguayan fiscal requirements, particularly focusing on timbrado management which is mandatory for all fiscal documents in Paraguay.

## Dependencies

- `account`: Odoo core accounting
- `l10n_py_base`: Base Paraguayan localization

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
view_account_authorization_form account.authorization.form account.authorization form New
view_account_authorization_search account.authorization.search account.authorization search New
view_account_authorization_tree account.authorization.tree account.authorization tree New
view_account_journal_form_edi account.journal.form.edi account.journal xpath Inherits account.view_account_journal_form
view_invoice_tree_py account.move.tree.py account.move xpath Inherits account.view_invoice_tree
view_move_form_py account.move.form.py account.move xpath Inherits account.view_move_form
Models touched (4)

New fields (16)
  • active Boolean
    default=True help='Marcar como inactivo para deshabilitar el timbrado' string='Activo'
  • company_id Many2one → res.company
    default=<expr> required=True string='Compañía' args: 'res.company'
  • date_from Date
    help='Fecha desde la cual el timbrado es válido' required=True string='Fecha de Inicio'
  • date_to Date
    help='Fecha hasta la cual el timbrado es válido' required=True string='Fecha de Vencimiento'
  • establishment Char
    default='001' help='Código de establecimiento (3 dígitos)' required=True size=3 string='Establecimiento'
  • expedition_point Char
    default='001' help='Código de punto de expedición (3 dígitos)' required=True size=3 string='Punto de Expedición'
  • invoice_number_from Integer
    help='Primer número de factura autorizado' required=True string='Número Desde'
  • invoice_number_to Integer
    help='Último número de factura autorizado' required=True string='Número Hasta'
  • l10n_latam_document_type_id Many2one → l10n_latam.document.type
    comodel_name='l10n_latam.document.type' help='Tipo de documento LATAM (Factura, NC, ND, etc.)' required=True string='Tipo de Documento'
  • name Char
    help='Número de timbrado otorgado por la SET' required=True size=8 string='Número de Timbrado'
  • next_number Integer
    compute='_compute_next_number' help='Próximo número de factura a utilizar' string='Próximo Número'
  • remaining_numbers Integer
    compute='_compute_remaining_numbers' help='Cantidad de números aún disponibles' string='Números Disponibles'
  • series Char
    default='AA' help='Serie del timbrado (2 letras mayúsculas, AA-ZZ). Permite reiniciar numeración cuando se agota la faja.' size=2 string='Serie'
  • state Selection
    compute='_compute_state' store=True string='Estado' args: [('valid', 'Vigente'), ('expired', 'Vencido'), ('to_expire', 'Por Vencer')]
  • usage_percentage Float
    compute='_compute_usage_percentage' help='Porcentaje de números utilizados respecto al total autorizado' string='Porcentaje de Uso'
  • used_numbers Integer
    compute='_compute_used_numbers' help='Cantidad de números ya utilizados' string='Números Utilizados'
Public methods (3)
  • check_number_available(self, number, exclude_move_id=False)
    Verifica si un número está disponible en este timbrado
  • check_validity(self)
    Verifica si el timbrado es válido en la fecha actual
  • name_get(self)
    Formato de visualización del timbrado

New fields (4)
  • l10n_py_authorization_id Many2one → account.authorization
    domain="[('company_id', '=', company_id), ('active', '=', True)]" help='Timbrado autorizado por SET para este diario' string='Timbrado' args: 'account.authorization'
  • l10n_py_authorization_validity Date
    help='Fecha de vencimiento del timbrado' readonly=True related='l10n_py_authorization_id.date_to' store=True string='Vencimiento del Timbrado'
  • l10n_py_establishment Char
    default='001' help='Código de establecimiento (3 dígitos)' size=3 string='Establecimiento'
  • l10n_py_point Char
    default='001' help='Código de punto de expedición (3 dígitos)' size=3 string='Punto de Expedición'
Public methods (0)

No public methods.

New fields (16)
  • l10n_py_amount_exempt Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Subtotal exento/no gravado (SIFEN F003)' store=True string='Total Exento (F003)'
  • l10n_py_amount_iva_10 Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Liquidación IVA 10% (SIFEN F016)' store=True string='Liquidación IVA 10% (F016)'
  • l10n_py_amount_iva_5 Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Liquidación IVA 5% (SIFEN F015)' store=True string='Liquidación IVA 5% (F015)'
  • l10n_py_amount_iva_total Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Total liquidación IVA (SIFEN F014)' store=True string='Total IVA (F014)'
  • l10n_py_amount_subtotal_10 Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Subtotal gravado 10% — valor con impuesto incluido (SIFEN F005)' store=True string='Total Gravado 10% (F005)'
  • l10n_py_amount_subtotal_5 Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Subtotal gravado 5% — valor con impuesto incluido (SIFEN F004)' store=True string='Total Gravado 5% (F004)'
  • l10n_py_amount_total_pyg Monetary
    compute='_compute_l10n_py_total_pyg' currency_field='currency_id' help='Total de la operación en guaraníes (SIFEN F023)' store=True string='Total en Guaraníes (F023)'
  • l10n_py_amount_total_words Char
    compute='_compute_l10n_py_amount_total_words' string='Total en Letras'
  • l10n_py_authorization_id Many2one → account.authorization
    domain="[('company_id', '=', company_id), ('active', '=', True), ('state', '!=', 'expired')]" help='Timbrado utilizado para esta factura' string='Timbrado' args: 'account.authorization'
  • l10n_py_base_10 Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Base gravada neta 10% sin IVA (SIFEN F019)' store=True string='Base Gravada 10% (F019)'
  • l10n_py_base_5 Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Base gravada neta 5% sin IVA (SIFEN F018)' store=True string='Base Gravada 5% (F018)'
  • l10n_py_base_total Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Total base gravada (SIFEN F020 = F018 + F019)' store=True string='Total Base Gravada (F020)'
  • l10n_py_exchange_rate Float
    digits=(16, 4) help='Tipo de cambio a guaraníes (PYG) para facturación en moneda extranjera' string='Tipo de Cambio'
  • l10n_py_full_invoice_number Char
    compute='_compute_l10n_py_full_invoice_number' help='Número completo de factura (formato: 001-001-0000001)' store=True string='Número Completo'
  • l10n_py_invoice_number Integer
    help='Número de factura según timbrado autorizado' string='Número de Factura'
  • l10n_py_total_operation Monetary
    compute='_compute_l10n_py_iva' currency_field='currency_id' help='Total de la operación (SIFEN F008 = F003 + F004 + F005)' store=True string='Total Operación (F008)'
Public methods (1)
  • action_post(self)
    Override para asignar numeración secuencial al confirmar

New fields (0)

No new fields.

Public methods (0)

No public methods.