├── requirements.txt ├── account_payment_ux ├── __init__.py ├── models │ ├── __init__.py │ ├── account_move.py │ ├── account_payment.py │ └── payment_transaction.py ├── __manifest__.py ├── README.md └── i18n │ ├── account_payment_ux.pot │ └── es.po ├── account_payment_multi ├── models │ ├── __init__.py │ └── company.py ├── controllers │ └── __init__.py ├── __init__.py ├── views │ ├── payment_form_template.xml │ └── account_portal_templates.xml ├── __manifest__.py └── README.md ├── account_cashbox_l10n_latam_check ├── __init__.py ├── wizards │ ├── __init__.py │ ├── l10n_latam_payment_mass_transfer_views.xml │ └── l10n_latam_payment_mass_transfer.py ├── __manifest__.py ├── views │ └── account_payment_view.xml └── i18n │ ├── account_cashbox_l10n_latam_check.pot │ └── es.po ├── account_cashbox ├── __init__.py ├── static │ ├── description │ │ ├── icon.png │ │ └── img │ │ │ └── user_demo_invoicing-image.jpg │ └── img │ │ └── user_demo_invoicing-image.jpg ├── wizards │ ├── __init__.py │ ├── account_payment_register.xml │ ├── account_cashbox_payment_import.xml │ ├── account_cashbox_rounding_adjustment.xml │ ├── account_cashbox_payment_import.py │ └── account_payment_register.py ├── models │ ├── __init__.py │ ├── account_move.py │ └── res_users.py ├── migrations │ └── 17.0.1.2.0 │ │ └── pre-migration.py ├── views │ ├── account_move_views.xml │ ├── menuitem.xml │ ├── res_users_views.xml │ └── account_payment.xml ├── __manifest__.py └── security │ ├── ir.model.access.csv │ └── cashbox_security.xml ├── card_installment ├── wizards │ ├── __init__.py │ └── res_config_settings.py ├── __init__.py ├── models │ ├── __init__.py │ ├── res_company.py │ ├── account_card.py │ └── account_card_installment.py ├── demo │ ├── product_product.xml │ └── account_card.xml ├── data │ ├── decimal_installment_coeficent.xml │ └── account_card.xml ├── views │ ├── card_installment_view.xml │ └── account_card.xml ├── security │ ├── ir.model.access.csv │ └── ir_rule.xml ├── __manifest__.py └── README.rst ├── payment_retry ├── __init__.py ├── wizards │ ├── __init__.py │ └── payment_transaction_retry.xml ├── models │ ├── __init__.py │ ├── account_move.py │ └── payment_transaction.py ├── security │ └── ir.model.access.csv ├── __manifest__.py ├── data │ └── ir_cron.xml └── README.md ├── account_payment_pro ├── __init__.py ├── tests │ └── __init__.py ├── wizards │ ├── __init__.py │ └── account_payment_invoice_wizard_view.xml ├── models │ ├── __init__.py │ ├── res_company.py │ ├── res_config_setting.py │ ├── account_journal.py │ └── account_write_off_type.py ├── security │ ├── ir.model.access.csv │ └── payment_security.xml ├── __manifest__.py ├── views │ ├── account_move.xml │ ├── account_write_off_type_views.xml │ └── res_company_setting.xml └── README.rst ├── account_payment_pro_receiptbook ├── wizard │ ├── __init__.py │ └── account_resequence.py ├── tests │ └── __init__.py ├── models │ ├── account_journal.py │ ├── res_config_setting.py │ ├── __init__.py │ ├── account_payment_register.py │ ├── l10n_latam_document_type.py │ ├── res_company.py │ ├── account_chart_template.py │ └── account_payment.py ├── data │ └── l10n_latam.document.type.csv ├── hooks.py ├── security │ ├── security.xml │ └── ir.model.access.csv ├── views │ ├── account_payment.xml │ ├── account_journal_views.xml │ ├── res_company_setting.xml │ └── account_payment_receipt_group.xml ├── __manifest__.py └── __init__.py ├── account_payment_financial_surcharge ├── wizards │ ├── __init__.py │ ├── res_config_settings.py │ └── res_config_settings_views.xml ├── __init__.py ├── models │ ├── __init__.py │ ├── account_move_line.py │ └── account_payment_method_line.py ├── views │ ├── card_installment_view.xml │ ├── account_journal_views.xml │ ├── account_move_views.xml │ └── account_payment_views.xml ├── __manifest__.py └── README.rst ├── l10n_ar_payment_bundle ├── static │ └── description │ │ └── icon.png ├── models │ ├── __init__.py │ ├── account_payment_method.py │ ├── res_company.py │ ├── account_chart_template.py │ └── account_journal.py ├── data │ └── account_payment_method_data.xml ├── __init__.py ├── __manifest__.py ├── views │ └── report_payment_receipt_templates.xml └── README.md ├── account_payment_loan ├── wizards │ ├── __init__.py │ ├── account_loan_extra_charges.xml │ ├── account_loan_register.xml │ ├── account_loan_debt_report.xml │ ├── account_loan_extra_charges.py │ └── account_loan_debt_report.py ├── models │ ├── account_card_installment.py │ ├── __init__.py │ ├── account_card.py │ ├── res_company.py │ ├── account_move_line.py │ ├── res_partner.py │ ├── res_config_setting.py │ └── account_chart_template.py ├── security │ ├── res.groups.xml │ └── ir.model.access.csv ├── views │ ├── account_move_line_views.xml │ ├── account_payment.xml │ ├── account_move_views.xml │ ├── account_card.xml │ └── res_company_setting.xml ├── demo │ └── account_card.xml ├── __manifest__.py └── __init__.py ├── l10n_latam_check_ux ├── models │ ├── __init__.py │ ├── account_journal.py │ ├── res_partner.py │ └── l10n_latam_check.py ├── __init__.py ├── wizards │ ├── __init__.py │ ├── l10n_latam_payment_mass_transfer.xml │ ├── account_check_action_wizard_view.xml │ └── checks_to_date_view.xml ├── security │ └── ir.model.access.csv ├── migrations │ └── 18.0.1.6.0 │ │ └── post-migration.py ├── views │ ├── res_partner_view.xml │ ├── account_journal_view.xml │ ├── account_payment_view.xml │ ├── report_payment_receipt_templates.xml │ └── l10n_latam_check_view.xml ├── __manifest__.py └── reports │ └── report_account_transfer.xml ├── CONTRIBUTING.md ├── .copier-answers.yml ├── README.md ├── .gitignore ├── .github └── workflows │ └── pre-commit.yml └── .pre-commit-config.yaml /requirements.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /account_payment_ux/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | -------------------------------------------------------------------------------- /account_payment_multi/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import company 2 | -------------------------------------------------------------------------------- /account_cashbox_l10n_latam_check/__init__.py: -------------------------------------------------------------------------------- 1 | from . import wizards 2 | -------------------------------------------------------------------------------- /account_payment_multi/controllers/__init__.py: -------------------------------------------------------------------------------- 1 | from . import portal 2 | -------------------------------------------------------------------------------- /account_cashbox/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import wizards 3 | -------------------------------------------------------------------------------- /card_installment/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import res_config_settings 2 | -------------------------------------------------------------------------------- /payment_retry/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import wizards 3 | -------------------------------------------------------------------------------- /payment_retry/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import payment_transaction_retry 2 | -------------------------------------------------------------------------------- /account_payment_pro/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import wizards 3 | -------------------------------------------------------------------------------- /card_installment/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import wizards 3 | -------------------------------------------------------------------------------- /account_payment_multi/__init__.py: -------------------------------------------------------------------------------- 1 | from . import controllers 2 | from . import models 3 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/wizard/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_resequence 2 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import res_config_settings 2 | -------------------------------------------------------------------------------- /account_payment_pro/tests/__init__.py: -------------------------------------------------------------------------------- 1 | from . import test_account_paymet_pro_unit_test 2 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import wizards 3 | -------------------------------------------------------------------------------- /account_cashbox_l10n_latam_check/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import l10n_latam_payment_mass_transfer 2 | -------------------------------------------------------------------------------- /payment_retry/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import payment_transaction 2 | from . import account_move 3 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/tests/__init__.py: -------------------------------------------------------------------------------- 1 | from . import test_account_paymet_pro_receiptbook_unit_test 2 | -------------------------------------------------------------------------------- /account_payment_ux/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_payment 2 | from . import payment_transaction 3 | from . import account_move 4 | -------------------------------------------------------------------------------- /card_installment/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import res_company 2 | from . import account_card 3 | from . import account_card_installment 4 | -------------------------------------------------------------------------------- /account_cashbox/static/description/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ingadhoc/account-payment/HEAD/account_cashbox/static/description/icon.png -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/static/description/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ingadhoc/account-payment/HEAD/l10n_ar_payment_bundle/static/description/icon.png -------------------------------------------------------------------------------- /account_payment_loan/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_loan_register 2 | from . import account_loan_debt_report 3 | from . import account_loan_extra_charges 4 | -------------------------------------------------------------------------------- /account_cashbox/static/img/user_demo_invoicing-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ingadhoc/account-payment/HEAD/account_cashbox/static/img/user_demo_invoicing-image.jpg -------------------------------------------------------------------------------- /account_payment_financial_surcharge/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_payment 2 | from . import account_move_line 3 | from . import account_payment_method_line 4 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_payment 2 | from . import account_journal 3 | from . import l10n_latam_check 4 | from . import res_partner 5 | -------------------------------------------------------------------------------- /account_cashbox/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_cashbox_payment_import 2 | from . import account_payment_register 3 | from . import account_cashbox_rounding_adjustment 4 | -------------------------------------------------------------------------------- /account_payment_pro/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | # © 2016 ADHOC SA 2 | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). 3 | 4 | from . import account_payment_invoice_wizard 5 | -------------------------------------------------------------------------------- /account_cashbox/static/description/img/user_demo_invoicing-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ingadhoc/account-payment/HEAD/account_cashbox/static/description/img/user_demo_invoicing-image.jpg -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import res_company 2 | from . import account_chart_template 3 | from . import account_payment 4 | from . import account_payment_method 5 | from . import account_journal 6 | -------------------------------------------------------------------------------- /account_cashbox/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_cashbox 2 | from . import account_cashbox_session 3 | from . import account_cashbox_session_line 4 | from . import res_users 5 | from . import account_payment 6 | from . import account_move 7 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # ADHOC Guidelines 2 | 3 | Please follow the official guide from [Odoo Argentina](https://github.com/ingadhoc/odoo-argentina/wiki). 4 | 5 | ## Project Specific Guidelines 6 | 7 | This project does not have specific coding guidelines. 8 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/account_journal.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class AccountJournal(models.Model): 5 | _inherit = "account.journal" 6 | 7 | use_receiptbook = fields.Boolean(related="company_id.use_receiptbook") 8 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/data/l10n_latam.document.type.csv: -------------------------------------------------------------------------------- 1 | id,sequence,code,name,report_name,internal_type,doc_code_prefix 2 | dc_recibo_x,780,,RECIBOS X,RECIBO,customer_payment,RE-X 3 | dc_orden_pago_x,800,,ORDEN DE PAGO X,ORDEN DE PAGO,supplier_payment,OP-X 4 | -------------------------------------------------------------------------------- /account_payment_pro/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_payment 2 | from . import account_move_line 3 | from . import account_move 4 | from . import account_journal 5 | from . import res_company 6 | from . import res_config_setting 7 | from . import account_write_off_type 8 | -------------------------------------------------------------------------------- /account_cashbox/migrations/17.0.1.2.0/pre-migration.py: -------------------------------------------------------------------------------- 1 | from odoo import SUPERUSER_ID, api 2 | 3 | 4 | def migrate(cr, version): 5 | env = api.Environment(cr, SUPERUSER_ID, {}) 6 | env.cr.execute("ALTER TABLE account_cashbox_session DROP CONSTRAINT IF EXISTS account_cashbox_session_uniq_name") 7 | -------------------------------------------------------------------------------- /account_payment_loan/models/account_card_installment.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class AccountCardInstallment(models.Model): 5 | _inherit = "account.card.installment" 6 | 7 | is_loan = fields.Boolean( 8 | related="card_id.is_loan", 9 | readonly=False, 10 | ) 11 | -------------------------------------------------------------------------------- /card_installment/demo/product_product.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Financial surchage 4 | 5 | service 6 | 7 | 8 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/res_config_setting.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class ResConfigSettings(models.TransientModel): 5 | _inherit = "res.config.settings" 6 | 7 | use_receiptbook = fields.Boolean( 8 | related="company_id.use_receiptbook", 9 | readonly=False, 10 | ) 11 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/__init__.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | from . import models 6 | from . import wizards 7 | -------------------------------------------------------------------------------- /account_payment_loan/security/res.groups.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Loan administration 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /card_installment/data/decimal_installment_coeficent.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Installment coefficient 5 | 5 6 | 7 | 8 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/wizards/res_config_settings.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class ResConfigSettings(models.TransientModel): 5 | _inherit = "res.config.settings" 6 | 7 | product_surcharge_id = fields.Many2one( 8 | related="company_id.product_surcharge_id", 9 | readonly=False, 10 | ) 11 | -------------------------------------------------------------------------------- /account_payment_loan/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_chart_template 2 | from . import account_card 3 | from . import account_card_installment 4 | from . import account_move 5 | from . import account_move_line 6 | from . import res_company 7 | from . import res_config_setting 8 | from . import account_payment 9 | from . import res_partner 10 | -------------------------------------------------------------------------------- /.copier-answers.yml: -------------------------------------------------------------------------------- 1 | # Do NOT update manually; changes here will be overwritten by Copier 2 | _commit: 2f2f7c4 3 | _src_path: https://github.com/ingadhoc/addons-repo-template.git 4 | description: Odoo Invoicing Extension Addons 5 | is_private: false 6 | name: ADHOC Account Invoicing 7 | odoo_version: 19.0 8 | pre_commit_ignore: [] 9 | slug: '' 10 | 11 | -------------------------------------------------------------------------------- /card_installment/views/card_installment_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /account_cashbox/models/account_move.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class AccountMove(models.Model): 5 | _inherit = "account.move" 6 | 7 | cashbox_session_id = fields.Many2one( 8 | "account.cashbox.session", 9 | string="Cashbox Session", 10 | help="Cashbox session associated with this move.", 11 | readonly=True, 12 | ) 13 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import account_move 2 | from . import account_payment 3 | from . import l10n_latam_document_type 4 | from . import account_payment_receiptbook 5 | from . import account_chart_template 6 | from . import res_company 7 | from . import res_config_setting 8 | from . import account_journal 9 | from . import account_payment_register 10 | -------------------------------------------------------------------------------- /payment_retry/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | payment_retry.payment_retry_line, transaction retry line,payment_retry.model_payment_transaction_retry_lines,account.group_account_invoice,1,1,1,1 3 | payment_retry.payment_retry,payment transaction retry,payment_retry.model_payment_transaction_retry,account.group_account_invoice,1,1,1,1 4 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/hooks.py: -------------------------------------------------------------------------------- 1 | from odoo.addons.account.wizard.account_resequence import AccountResequenceWizard 2 | 3 | 4 | def _revert_method(cls, name): 5 | """Revertir el método original llamado 'name'""" 6 | method = getattr(cls, name) 7 | setattr(cls, name, method.origin) 8 | 9 | 10 | def uninstall_hook(cr, registry): 11 | _revert_method(AccountResequenceWizard, "default_get") 12 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/models/account_payment_method.py: -------------------------------------------------------------------------------- 1 | from odoo import api, models 2 | 3 | 4 | class AccountPaymentMethod(models.Model): 5 | _inherit = "account.payment.method" 6 | 7 | @api.model 8 | def _get_payment_method_information(self): 9 | res = super()._get_payment_method_information() 10 | res["payment_bundle"] = {"mode": "unique", "type": ("cash",)} 11 | return res 12 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | from . import account_check_action_wizard 6 | from . import l10n_latam_payment_mass_transfer 7 | from . import checks_to_date_report 8 | -------------------------------------------------------------------------------- /account_payment_multi/views/payment_form_template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /account_payment_ux/models/account_move.py: -------------------------------------------------------------------------------- 1 | from odoo import models 2 | 3 | 4 | class AccountMove(models.Model): 5 | _inherit = "account.move" 6 | 7 | def _has_to_be_paid(self): 8 | pending_transactions = self.transaction_ids.filtered( 9 | lambda tx: tx.state in ("pending") and tx.provider_code not in ["manual", "transfer"] 10 | ) 11 | return not pending_transactions and super()._has_to_be_paid() 12 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/views/card_installment_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | access_account_check_action_wizard,access_account_check_action_wizard,model_account_check_action_wizard,base.group_user,1,1,1,1 3 | l10n_latam_check_ux.access_account_check_to_date_report_wizard,access_account_check_to_date_report_wizard,l10n_latam_check_ux.model_account_check_to_date_report_wizard,account.group_account_invoice,1,1,1,0 4 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/models/account_move_line.py: -------------------------------------------------------------------------------- 1 | from odoo import models 2 | 3 | 4 | class AccountMoveLine(models.Model): 5 | _inherit = "account.move.line" 6 | 7 | def _check_reconciliation(self): 8 | for line in self: 9 | if not line.full_reconcile_id and (line.matched_debit_ids or line.matched_credit_ids): 10 | self = self - line 11 | super(AccountMoveLine, self)._check_reconciliation() 12 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/migrations/18.0.1.6.0/post-migration.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | _logger = logging.getLogger(__name__) 4 | 5 | 6 | def migrate(cr, version): 7 | _logger.info("Forzamos la actualización de los l10n_latam_move_check_ids_operation_date") 8 | cr.execute(""" 9 | UPDATE account_payment 10 | SET l10n_latam_move_check_ids_operation_date = create_date 11 | WHERE l10n_latam_move_check_ids_operation_date IS NULL 12 | """) 13 | -------------------------------------------------------------------------------- /account_payment_loan/models/account_card.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class AccountCard(models.Model): 5 | _inherit = "account.card" 6 | 7 | is_loan = fields.Boolean() 8 | loan_due_method = fields.Selection( 9 | selection=[ 10 | ("create_day", "every month on the same day it was created "), 11 | ("next_day_number", "every month on the same day number "), 12 | ], 13 | ) 14 | due_day = fields.Integer() 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Coverage Status](https://coveralls.io/repos/ingadhoc//badge.png?branch=19.0)](https://coveralls.io/r/ingadhoc/?branch=19.0) 2 | [![Code Climate](https://codeclimate.com/github/ingadhoc//badges/gpa.svg)](https://codeclimate.com/github/ingadhoc/) 3 | 4 | # ADHOC Account Invoicing 5 | 6 | Odoo Invoicing Extension Addons 7 | 8 | ---- 9 | 10 | ADHOC 11 | **Adhoc SA** - www.adhoc.com.ar 12 | . 13 | -------------------------------------------------------------------------------- /payment_retry/__manifest__.py: -------------------------------------------------------------------------------- 1 | { 2 | "name": "payment retry", 3 | "author": "ADHOC SA", 4 | "website": "https://www.adhoc.inc", 5 | "category": "Payment", 6 | "version": "19.0.1.0.0", 7 | "depends": ["account_payment"], 8 | "license": "LGPL-3", 9 | "images": [], 10 | "installable": True, 11 | "data": [ 12 | "security/ir.model.access.csv", 13 | "data/ir_cron.xml", 14 | "wizards/payment_transaction_retry.xml", 15 | ], 16 | } 17 | -------------------------------------------------------------------------------- /account_payment_pro/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | access_account_payment_invoice_wizard,access_account_payment_invoice_wizard,model_account_payment_invoice_wizard,base.group_user,1,1,1,0 3 | access_account_write_off_type_all,access_account_write_off_type,model_account_write_off_type,base.group_user,1,0,0,0 4 | access_account_write_off_type_admin,access_account_write_off_type,model_account_write_off_type,account.group_account_manager,1,1,1,1 5 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/security/security.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Receiptbook Line multi-company 5 | 6 | 7 | [('company_id', 'child_of', company_ids)] 8 | 9 | 10 | -------------------------------------------------------------------------------- /account_payment_loan/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | access_account_loan_register,access.account.loan.register,model_account_loan_register,account.group_account_invoice,1,1,1,0 3 | access_account_loan_debt_report,access.account.loan.register,model_account_loan_debt_report,account.group_account_invoice,1,1,1,0 4 | access_account_loan_extra_charges,access.account.extra.charges,model_account_loan_extra_charges,account.group_account_invoice,1,1,1,0 5 | -------------------------------------------------------------------------------- /card_installment/models/res_company.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | from odoo import fields, models 6 | 7 | 8 | class ResCompany(models.Model): 9 | _inherit = "res.company" 10 | 11 | product_surcharge_id = fields.Many2one("product.product", "Product for use in financial surcharge") 12 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/account_payment_register.py: -------------------------------------------------------------------------------- 1 | from odoo import models 2 | 3 | 4 | class AccountPaymentRegister(models.TransientModel): 5 | _inherit = "account.payment.register" 6 | 7 | def _init_payments(self, to_process, edit_mode=False): 8 | for rec in to_process: 9 | if self.env["res.company"].browse(rec["create_vals"]["company_id"]).use_payment_pro: 10 | rec["create_vals"]["name"] = "/" 11 | return super()._init_payments(to_process, edit_mode=edit_mode) 12 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | account_payment_receiptbook_user,account_payment_receiptbook_user,model_account_payment_receiptbook,account.group_account_invoice,1,0,0,0 3 | account_payment_receiptbook_manager,account_payment_receiptbook_manager,model_account_payment_receiptbook,account.group_account_manager,1,1,1,1 4 | account_payment_receiptbook_global,account_payment_receiptbook_global,model_account_payment_receiptbook,base.group_user,1,0,0,0 5 | -------------------------------------------------------------------------------- /card_installment/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | installment_user,account.card.installment,model_account_card_installment,base.group_user,1,0,0,0 3 | card_user,account.card,model_account_card,base.group_user,1,0,0,0 4 | card_installment.access_card,account.card,card_installment.model_account_card,account.group_account_invoice,1,1,1,1 5 | card_installment.access_installment,account.card.installment,card_installment.model_account_card_installment,account.group_account_invoice,1,1,1,1 6 | -------------------------------------------------------------------------------- /payment_retry/data/ir_cron.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Enviar transacciones de pago 5 | 6 | code 7 | model.cron_asynchronous_process() 8 | 10 9 | minutes 10 | 11 | 12 | -------------------------------------------------------------------------------- /account_payment_pro/models/res_company.py: -------------------------------------------------------------------------------- 1 | from odoo import api, fields, models 2 | 3 | 4 | class ResCompany(models.Model): 5 | _inherit = "res.company" 6 | 7 | use_payment_pro = fields.Boolean(compute="_compute_use_payment_pro", store=True, readonly=False) 8 | 9 | @api.depends("partner_id.country_id") 10 | def _compute_use_payment_pro(self): 11 | ar_companies = self.filtered(lambda x: x.partner_id.country_id.code == "AR") 12 | ar_companies.use_payment_pro = True 13 | (self - ar_companies).use_payment_pro = False 14 | -------------------------------------------------------------------------------- /card_installment/wizards/res_config_settings.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | from odoo import fields, models 6 | 7 | 8 | class ResConfigSettings(models.TransientModel): 9 | _inherit = "res.config.settings" 10 | 11 | product_surcharge_id = fields.Many2one( 12 | related="company_id.product_surcharge_id", 13 | readonly=False, 14 | ) 15 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/views/res_partner_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | res.partner.inherit.view.form 5 | res.partner 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /account_cashbox/views/account_move_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.move.form.cashbox.inherit 5 | account.move 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /account_cashbox/views/menuitem.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /account_payment_ux/__manifest__.py: -------------------------------------------------------------------------------- 1 | # © 2023 ADHOC SA 2 | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). 3 | { 4 | "name": "Account Payment UX", 5 | "version": "19.0.1.0.0", 6 | "category": "Payment", 7 | "website": "www.adhoc.com.ar", 8 | "author": "ADHOC SA", 9 | "license": "AGPL-3", 10 | "application": False, 11 | "installable": True, 12 | "auto_install": True, 13 | "external_dependencies": { 14 | "python": [], 15 | "bin": [], 16 | }, 17 | "depends": [ 18 | "account_payment", 19 | ], 20 | "data": [], 21 | "demo": [], 22 | } 23 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/l10n_latam_document_type.py: -------------------------------------------------------------------------------- 1 | # Part of Odoo. See LICENSE file for full copyright and licensing details. 2 | 3 | from odoo import fields, models 4 | 5 | 6 | class L10nLatamDocumentType(models.Model): 7 | _inherit = "l10n_latam.document.type" 8 | 9 | country_id = fields.Many2one(required=False) 10 | internal_type = fields.Selection( 11 | selection_add=[("customer_payment", "Customer Receipt"), ("supplier_payment", "Supplier Payment")], 12 | ondelete={ 13 | "customer_payment": "set null", 14 | "supplier_payment": "set null", 15 | }, 16 | ) 17 | -------------------------------------------------------------------------------- /account_payment_multi/__manifest__.py: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Account Payment Multi", 3 | "version": "18.0.1.1.0", 4 | "summary": "Manage multiple payments in Odoo", 5 | "author": "Odoo, ADHOC SA", 6 | "website": "www.adhoc.com.ar", 7 | "category": "Technical", 8 | "depends": ["account_payment"], 9 | "assets": { 10 | "web.assets_frontend": [ 11 | "account_payment_multi/static/src/js/payment_form.js", 12 | ], 13 | }, 14 | "data": ["views/account_portal_templates.xml", "views/payment_form_template.xml"], 15 | "installable": False, 16 | "application": False, 17 | "license": "LGPL-3", 18 | } 19 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/views/account_payment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | account.payment.form 4 | account.payment 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/data/account_payment_method_data.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Payment multiple 6 | payment_bundle 7 | outbound 8 | 9 | 10 | Payment multiple 11 | payment_bundle 12 | inbound 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/models/account_payment_method_line.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | from odoo import fields, models 6 | 7 | 8 | class accountPaymentMethodLine(models.Model): 9 | _inherit = "account.payment.method.line" 10 | 11 | available_card_ids = fields.Many2many( 12 | "account.card", 13 | "account_method_line_card_rel", 14 | "method_id", 15 | "card_id", 16 | string="Cards", 17 | ) 18 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/wizards/l10n_latam_payment_mass_transfer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | l10n_latam.payment.mass.transfer.form 5 | l10n_latam.payment.mass.transfer 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | 3 | 4 | def post_init_hook(env): 5 | """Existing companies that have the Argentinean Chart of Accounts set""" 6 | template_codes = ["ar_ri", "ar_ex", "ar_base"] 7 | ar_companies = env["res.company"].search([("chart_template", "in", template_codes), ("parent_id", "=", False)]) 8 | for company in ar_companies: 9 | template_code = company.chart_template 10 | ChartTemplate = env["account.chart.template"].with_company(company) 11 | if journals_to_create := ChartTemplate._get_payment_bundle_account_journal(template_code): 12 | ChartTemplate._load_data({"account.journal": journals_to_create}) 13 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/__manifest__.py: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Payments with Financial Surchange", 3 | "version": "19.0.1.0.0", 4 | "author": "ADHOC SA", 5 | "license": "AGPL-3", 6 | "category": "Payment", 7 | "depends": [ 8 | "account_payment_pro", 9 | "card_installment", 10 | ], 11 | "data": [ 12 | "views/card_installment_view.xml", 13 | "views/account_journal_views.xml", 14 | "views/account_payment_views.xml", 15 | "views/account_move_views.xml", 16 | "wizards/res_config_settings_views.xml", 17 | ], 18 | "demo": [], 19 | "images": [], 20 | "installable": True, 21 | "auto_install": False, 22 | } 23 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/views/account_journal_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.journal.form 5 | account.journal 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /account_cashbox_l10n_latam_check/__manifest__.py: -------------------------------------------------------------------------------- 1 | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). 2 | { 3 | "name": "Check Cashbox management", 4 | "summary": "Add cashbox for check operations", 5 | "version": "19.0.1.0.0", 6 | "category": "Accounting", 7 | "website": "www.adhoc.com.ar", 8 | "author": "ADHOC SA", 9 | "license": "AGPL-3", 10 | "depends": [ 11 | "account_cashbox", 12 | "l10n_latam_check", 13 | ], 14 | "demo": [], 15 | "data": [ 16 | "views/account_payment_view.xml", 17 | "wizards/l10n_latam_payment_mass_transfer_views.xml", 18 | ], 19 | "installable": True, 20 | "application": False, 21 | "auto_install": True, 22 | } 23 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/views/account_journal_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.journal.form 5 | account.journal 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /card_installment/__manifest__.py: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Card installment", 3 | "author": "ADHOC SA", 4 | "website": "https://www.adhoc.com.ar", 5 | "category": "Technical", 6 | "version": "19.0.1.0.0", 7 | "depends": ["product", "account"], 8 | "license": "LGPL-3", 9 | "images": [], 10 | "installable": True, 11 | "data": [ 12 | "security/ir.model.access.csv", 13 | "security/ir_rule.xml", 14 | "data/account_card.xml", 15 | "data/decimal_installment_coeficent.xml", 16 | "views/account_card.xml", 17 | "views/card_installment_view.xml", 18 | ], 19 | "demo": [ 20 | "demo/product_product.xml", 21 | "demo/account_card.xml", 22 | ], 23 | } 24 | -------------------------------------------------------------------------------- /account_payment_ux/README.md: -------------------------------------------------------------------------------- 1 | [![Code Climate](https://codeclimate.com/github/ingadhoc/account-payment/badges/gpa.svg)](https://codeclimate.com/github/ingadhoc/account-payment) 2 | 3 | # ADHOC Account Payment UX 4 | 5 | - Block new payments on the same related invoice, once it has a pending transaction in process. 6 | 7 | - When the electronic transaction is pending the payment will remain in draft status. After done this electronic transaction the payment changes its state and reconcilie with the invoices. 8 | 9 | - Ignore write post processed TX flag in draft and pendding transaction. 10 | 11 | ---- 12 | 13 | ADHOC 14 | **Adhoc SA** - www.adhoc.com.ar 15 | -------------------------------------------------------------------------------- /account_payment_ux/models/account_payment.py: -------------------------------------------------------------------------------- 1 | from odoo import models 2 | 3 | 4 | class AccountPayment(models.Model): 5 | _inherit = "account.payment" 6 | 7 | def action_post(self): 8 | """Odoo a partir de 16, cuando se valida un pago con token, si la transaccion no queda en done cancela el pago 9 | por ahora nosotros revertimos este cambio""" 10 | return super(AccountPayment, self.with_context(from_action_post=True)).action_post() 11 | 12 | def action_cancel(self): 13 | if self.env.context.get("from_action_post"): 14 | self = self - self.filtered(lambda x: x.payment_transaction_id.state in ["draft", "pending", "authorized"]) 15 | return super(AccountPayment, self).action_cancel() 16 | -------------------------------------------------------------------------------- /account_payment_loan/views/account_move_line_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.move.line.inherit.view.list 5 | account.move.line 6 | 7 | 8 | 9 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /account_cashbox/views/account_payment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | account.payment.form 6 | account.payment 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /account_payment_loan/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import wizards 3 | 4 | 5 | def post_init_hook(env): 6 | companies = env["res.company"].search([("parent_id", "=", False)]) 7 | for company in companies: 8 | template_code = company.chart_template 9 | ChartTemplate = env["account.chart.template"].with_company(company) 10 | if accounts_to_create := ChartTemplate._get_personal_loan_account_account(template_code): 11 | ChartTemplate._load_data({"account.account": accounts_to_create}) 12 | 13 | if journals_to_create := ChartTemplate._get_personal_loan_journal(template_code): 14 | ChartTemplate._load_data({"account.journal": journals_to_create}) 15 | 16 | account_loan_journal_id = env.ref(f"account.{company.id}_account_loan_journal") 17 | account_loan_journal_id.default_account_id = env.ref(f"account.{company.id}_account_loan_account").id 18 | company.loan_journal_id = account_loan_journal_id.id 19 | company.account_late_payment_interest = env.ref(f"account.{company.id}_account_loan_interest_account").id 20 | company.account_loan_extra_charges = env.ref(f"account.{company.id}_account_loan_extra_charges").id 21 | -------------------------------------------------------------------------------- /account_cashbox/models/res_users.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | 6 | from odoo import api, fields, models 7 | 8 | 9 | class ResUsers(models.Model): 10 | _inherit = "res.users" 11 | 12 | allowed_cashbox_ids = fields.Many2many( 13 | "account.cashbox", 14 | relation="account_cashbox_users_rel", 15 | column1="user_id", 16 | column2="cashbox_id", 17 | ) 18 | requiere_account_cashbox_session = fields.Boolean() 19 | 20 | default_cashbox_id = fields.Many2one( 21 | comodel_name="account.cashbox", 22 | domain="[('id', 'in', allowed_cashbox_ids)]", 23 | help="""In the case of concurrent sessions in the selected cashbox, 24 | the most recently created session for that cashbox will be assigned to the payments.""", 25 | ) 26 | 27 | @api.onchange("allowed_cashbox_ids") 28 | def _onchange_allowed_cashbox_ids(self): 29 | if self.default_cashbox_id.id not in self.allowed_cashbox_ids.ids: 30 | self.default_cashbox_id = False 31 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/views/account_payment_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | account.payment.form.inherited.add.context 11 | account.payment 12 | 13 | 14 | 15 | 16 | { 17 | 'search_default_last_90_days': payment_method_code in ['in_third_party_checks', 'out_third_party_checks', 'return_third_party_checks'], 18 | } 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /account_payment_pro/views/account_move.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | account.move 4 | account.move 5 | 6 | 7 | 8 | 9 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/models/res_partner.py: -------------------------------------------------------------------------------- 1 | from odoo import api, fields, models 2 | 3 | 4 | class ResPartner(models.Model): 5 | _inherit = "res.partner" 6 | 7 | add_check_credit = fields.Boolean("Agregar Crédito de Cheques") 8 | 9 | @api.depends_context("company") 10 | @api.depends("add_check_credit") 11 | def _credit_debit_get(self): 12 | super()._credit_debit_get() 13 | for partner in self.filtered("add_check_credit"): 14 | partner_checks = self.env["l10n_latam.check"].search( 15 | [ 16 | # Partner actual 17 | ("partner_id", "=", partner.id), 18 | # Filtro por empresa actual 19 | ("company_id", "=", self.env.company.id), 20 | # Filtro On-Hand 21 | ( 22 | "current_journal_id.inbound_payment_method_line_ids.payment_method_id.code", 23 | "=", 24 | "in_third_party_checks", 25 | ), 26 | # Cuya fecha de pago sea mayor a la de hoy 27 | ("payment_date", ">", fields.Date.context_today(self)), 28 | ] 29 | ) 30 | 31 | partner.credit += sum(partner_checks.mapped("amount")) 32 | -------------------------------------------------------------------------------- /account_payment_loan/wizards/account_loan_extra_charges.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.loan.extra.charges.form 5 | account.loan.extra.charges 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 24 |
25 |
26 |
27 |
28 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/wizards/account_check_action_wizard_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | account.check.action.wizard.form 7 | account.check.action.wizard 8 | 9 |
10 | 11 | 12 | 13 |
14 |
18 |
19 |
20 |
21 | 22 | 23 | Check Action 24 | account.check.action.wizard 25 | form 26 | new 27 | 28 | 29 |
30 | -------------------------------------------------------------------------------- /account_cashbox/wizards/account_cashbox_payment_import.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | cashbox_payment_import.view.form 6 | account.cashbox.payment.import 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
19 |
20 |
21 |
22 | 23 | 24 | Import 25 | account.cashbox.payment.import 26 | form 27 | new 28 | 29 | 30 |
31 | -------------------------------------------------------------------------------- /account_cashbox/__manifest__.py: -------------------------------------------------------------------------------- 1 | # © 2022 juanpgarza - Juan Pablo Garza 2 | # © 2023 ADHOC SA 3 | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). 4 | { 5 | "name": "Cashbox management", 6 | "summary": "Introduces concept cashbox and accounting journal sessions", 7 | "version": "19.0.1.0.0", 8 | "category": "Accounting", 9 | "website": "www.adhoc.com.ar", 10 | "author": "juanpgarza, ADHOC SA", 11 | "license": "AGPL-3", 12 | "depends": [ 13 | "account_ux", 14 | "account_internal_transfer", 15 | # la dependencia con payment pro es solo para forzar utilizar el metodo parcheado 16 | # _compute_available_journal_ids 17 | ], 18 | "demo": [ 19 | "demo/cashbox_demo.xml", 20 | ], 21 | "data": [ 22 | "security/cashbox_security.xml", 23 | "security/ir.model.access.csv", 24 | "views/account_cashbox_session.xml", 25 | "views/account_cashbox.xml", 26 | "views/res_users_views.xml", 27 | "views/account_payment.xml", 28 | "views/menuitem.xml", 29 | "views/account_move_views.xml", 30 | "wizards/account_cashbox_payment_import.xml", 31 | "wizards/account_payment_register.xml", 32 | "wizards/account_cashbox_rounding_adjustment.xml", 33 | ], 34 | "installable": True, 35 | "application": False, 36 | } 37 | -------------------------------------------------------------------------------- /account_payment_loan/models/res_partner.py: -------------------------------------------------------------------------------- 1 | from odoo import _, models 2 | 3 | 4 | class ResPartner(models.Model): 5 | _inherit = "res.partner" 6 | 7 | def action_loan_debt_report(self): 8 | self.ensure_one() 9 | 10 | view_id = self.env.ref("account_payment_loan.view_account_loan_debt_report_form").id 11 | view = { 12 | "name": _("Loan debit report"), 13 | "view_mode": "form", 14 | "view_id": view_id, 15 | "view_type": "form", 16 | "res_model": "account.loan.debt.report", 17 | "res_id": False, 18 | "type": "ir.actions.act_window", 19 | "target": "new", 20 | "context": {"default_partner_id": self.id}, 21 | } 22 | return view 23 | 24 | def action_add_extra_charges(self, ctx=None): 25 | self.ensure_one() 26 | 27 | view_id = self.env.ref("account_payment_loan.view_account_loan_extra_charges_form").id 28 | view = { 29 | "name": _("Loan Extra Charges"), 30 | "view_mode": "form", 31 | "view_id": view_id, 32 | "view_type": "form", 33 | "res_model": "account.loan.extra.charges", 34 | "res_id": False, 35 | "type": "ir.actions.act_window", 36 | "target": "new", 37 | "context": {"default_partner_id": self.id}, 38 | } 39 | return view 40 | -------------------------------------------------------------------------------- /account_payment_loan/views/account_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account_card.form 5 | account.card 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | parent.is_loan 15 | 16 | 17 | parent.is_loan 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/wizards/res_config_settings_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | res.config.settings.form.inherit.account.payment 5 | res.config.settings 6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 |
22 |
23 |
24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /account_payment_loan/models/res_config_setting.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class ResConfigSettings(models.TransientModel): 5 | _inherit = "res.config.settings" 6 | 7 | loan_journal_id = fields.Many2one( 8 | related="company_id.loan_journal_id", 9 | readonly=False, 10 | help="Journal to be used for registering loan transactions.", 11 | ) 12 | 13 | late_payment_interest = fields.Float( 14 | related="company_id.late_payment_interest", 15 | readonly=False, 16 | help="Monthly interest rate for late payments, expressed as a percentage (e.g., 0.10 for 10%). " 17 | "This would be prorated to a daily interest rate of 1/30 of the monthly rate.", 18 | ) 19 | 20 | account_late_payment_interest = fields.Many2one( 21 | related="company_id.account_late_payment_interest", 22 | readonly=False, 23 | help="Account used to record income from late payment interests.", 24 | ) 25 | 26 | account_loan_extra_charges = fields.Many2one( 27 | related="company_id.account_loan_extra_charges", 28 | readonly=False, 29 | help="Account used to record additional charges related to loan operations.", 30 | ) 31 | use_loan_terms = fields.Boolean( 32 | string="Default Loan Terms & Conditions", 33 | config_parameter="account.use_loan_terms", 34 | ) 35 | loan_terms = fields.Html(related="company_id.loan_terms", string="Loan Terms & Conditions", readonly=False) 36 | -------------------------------------------------------------------------------- /payment_retry/models/payment_transaction.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from datetime import datetime 3 | 4 | from dateutil import relativedelta 5 | from odoo import _, api, fields, models 6 | 7 | _logger = logging.getLogger(__name__) 8 | 9 | 10 | class PaymentTransaction(models.Model): 11 | _inherit = "payment.transaction" 12 | 13 | asynchronous_process = fields.Boolean("asynchronous_process") 14 | 15 | @api.model 16 | def cron_asynchronous_process(self, retry_limit_days=4): 17 | retry_limit_date = datetime.now() - relativedelta.relativedelta(days=4) 18 | tx_ids = self.env["payment.transaction"].search( 19 | [ 20 | ("state", "=", "draft"), 21 | ("operation", "!=", "validation"), 22 | ("asynchronous_process", "=", True), 23 | ("create_date", ">=", retry_limit_date), 24 | ] 25 | ) 26 | self.env["ir.cron"]._commit_progress(remaining=len(tx_ids)) 27 | for tx_id in tx_ids: 28 | try: 29 | if tx_id.state == "draft": 30 | tx_id._send_payment_request() 31 | self.env["ir.cron"]._commit_progress(1) 32 | except Exception as exp: 33 | self.env.cr.rollback() # pragma pylint: disable=invalid-rollback 34 | tx_id.state = "error" 35 | _logger.error(_("Error al enviar request tx id %i: %s") % (tx_id.id, str(exp))) 36 | self.env["ir.cron"]._commit_progress(1) 37 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/models/account_chart_template.py: -------------------------------------------------------------------------------- 1 | from odoo import Command, _, models 2 | from odoo.addons.account.models.chart_template import template 3 | 4 | 5 | class AccountChartTemplate(models.AbstractModel): 6 | _inherit = "account.chart.template" 7 | 8 | @template(model="account.journal") 9 | def _get_payment_bundle_account_journal(self, template_code): 10 | if self.env.company.country_code == "AR" and template_code in ["ar_ri", "ar_ex", "ar_base"]: 11 | return { 12 | "payment_bundle_journal": { 13 | "name": _("Multiple payments"), 14 | "type": "cash", 15 | "outbound_payment_method_line_ids": [ 16 | Command.create( 17 | { 18 | "payment_method_id": self.env.ref( 19 | "l10n_ar_payment_bundle.account_payment_out_payment_bundle" 20 | ).id, 21 | } 22 | ), 23 | ], 24 | "inbound_payment_method_line_ids": [ 25 | Command.create( 26 | { 27 | "payment_method_id": self.env.ref( 28 | "l10n_ar_payment_bundle.account_payment_in_payment_bundle" 29 | ).id, 30 | } 31 | ), 32 | ], 33 | }, 34 | } 35 | -------------------------------------------------------------------------------- /account_cashbox/wizards/account_cashbox_rounding_adjustment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.cashbox.rounding.adjustment.wizard.form 5 | account.cashbox.rounding.adjustment.wizard 6 | 7 |
8 |

9 | Rounding Difference Detected
10 | There is a discrepancy between the expected and actual cash balances in your journals.
11 | To resolve this, you can automatically generate journal entries for the rounding difference by clicking Create Journal Entries.
12 | If you prefer not to create these entries, click Don't create entries and close to exit without changes. 13 |

14 |
15 |
24 |
25 |
26 |
27 |
28 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/wizards/checks_to_date_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.check.to_date.report.form 5 | account.check.to_date.report.wizard 6 | 7 |
8 | 9 | 10 | 11 | 12 |
13 |
17 |
18 |
19 |
20 | 21 | 22 | Cheques a fecha 23 | account.check.to_date.report.wizard 24 | new 25 | form 26 | 27 | 28 | 35 | 36 |
37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ⚠️ DO NOT EDIT THIS FILE, IT IS GENERATED BY COPIER ⚠️ 2 | # Changes here will be lost on a future update. 3 | # See: https://github.com/ingadhoc/addons-repo-template 4 | 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | env/ 15 | bin/ 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | 29 | # Installer logs 30 | pip-log.txt 31 | pip-delete-this-directory.txt 32 | 33 | # Unit test / coverage reports 34 | htmlcov/ 35 | .tox/ 36 | .coverage 37 | .cache 38 | nosetests.xml 39 | coverage.xml 40 | 41 | # Translations 42 | *.mo 43 | 44 | # Ensure we never commit pgdumps 45 | *.dump 46 | *.sql 47 | *.pg 48 | *.pg.gpg 49 | 50 | # Mr Developer 51 | .mr.developer.cfg 52 | .project 53 | .pydevproject 54 | 55 | # Rope 56 | .ropeproject 57 | 58 | # Django stuff: 59 | *.log 60 | 61 | # Sphinx documentation 62 | docs/_build/ 63 | 64 | ### macOS ### 65 | # General 66 | .DS_Store 67 | .AppleDouble 68 | .LSOverride 69 | 70 | # Icon must end with two \r 71 | Icon 72 | 73 | 74 | # Thumbnails 75 | ._* 76 | 77 | # Files that might appear in the root of a volume 78 | .DocumentRevisions-V100 79 | .fseventsd 80 | .Spotlight-V100 81 | .TemporaryItems 82 | .Trashes 83 | .VolumeIcon.icns 84 | .com.apple.timemachine.donotpresent 85 | 86 | # Directories potentially created on remote AFP share 87 | .AppleDB 88 | .AppleDesktop 89 | Network Trash Folder 90 | Temporary Items 91 | .apdisk 92 | 93 | ### macOS Patch ### 94 | # iCloud generated files 95 | *.icloud 96 | -------------------------------------------------------------------------------- /account_cashbox/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | access_account_cashbox_user,access_account_cashbox_user,model_account_cashbox,account.group_account_invoice,1,0,0,0 3 | access_account_cashbox_manager,access_account_cashbox_manager,model_account_cashbox,account.group_account_manager,1,1,1,1 4 | access_account_cashbox_session_user,access_account_cashbox_session_user,model_account_cashbox_session,account.group_account_invoice,1,1,1,0 5 | access_account_cashbox_session_manager,access_account_cashbox_session_manager,model_account_cashbox_session,account.group_account_manager,1,1,1,1 6 | access_account_cashbox_session_line_user,access_account_cashbox_session_line_user,model_account_cashbox_session_line,account.group_account_invoice,1,1,1,0 7 | access_account_cashbox_session_line_manager,access_account_cashbox_session_line_user,model_account_cashbox_session_line,account.group_account_manager,1,1,1,1 8 | access_account_cashbox_payment_import_user,access_account_cashbox_payment_import_user,model_account_cashbox_payment_import,account.group_account_invoice,1,1,1,1 9 | access_account_cashbox_payment_import_manager,access_account_cashbox_payment_import_manager,model_account_cashbox_payment_import,account.group_account_manager,1,1,1,1 10 | access_account_cashbox_rounding_adjustment_wizard_user,access_account_cashbox_rounding_adjustment_wizard_user,model_account_cashbox_rounding_adjustment_wizard,account.group_account_invoice,1,1,1,0 11 | access_account_cashbox_rounding_adjustment_wizard_manager,access_account_cashbox_rounding_adjustment_wizard_manager,model_account_cashbox_rounding_adjustment_wizard,account.group_account_manager,1,1,1,0 12 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/models/account_journal.py: -------------------------------------------------------------------------------- 1 | from odoo import _, api, models 2 | from odoo.exceptions import ValidationError 3 | 4 | 5 | class AccountJournal(models.Model): 6 | _inherit = "account.journal" 7 | 8 | @api.constrains("currency_id") 9 | def _currency_in_bundle_journal(self): 10 | if self.filtered( 11 | lambda x: x.currency_id 12 | and "payment_bundle" 13 | in (x.inbound_payment_method_line_ids + x.outbound_payment_method_line_ids).mapped("code") 14 | ): 15 | raise ValidationError( 16 | _("You cannot assign a currency to journals that use the payment bundle payment method.") 17 | ) 18 | 19 | @api.model_create_multi 20 | def create(self, vals_list): 21 | journals = super().create(vals_list) 22 | if bundle_journals := journals.filtered( 23 | lambda x: any(line.payment_method_id.code == "payment_bundle" for line in x.inbound_payment_method_line_ids) 24 | or any(line.payment_method_id.code == "payment_bundle" for line in x.outbound_payment_method_line_ids) 25 | ): 26 | for journal in bundle_journals: 27 | start_code = "6.0.0.00.001" 28 | journal.default_account_id.code = ( 29 | self.env["account.account"].with_company(journal.company_id)._search_new_account_code(start_code) 30 | ) 31 | return journals 32 | 33 | def write(self, vals): 34 | res = super().write(vals) 35 | if "inbound_payment_method_line_ids" in vals or "outbound_payment_method_line_ids" in vals: 36 | self.env.registry.clear_cache() 37 | return res 38 | -------------------------------------------------------------------------------- /account_payment_ux/i18n/account_payment_ux.pot: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * account_payment_ux 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 19.0+e\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2025-11-25 17:15+0000\n" 10 | "PO-Revision-Date: 2025-11-25 17:15+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: account_payment_ux 19 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_move__display_name 20 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_payment__display_name 21 | #: model:ir.model.fields,field_description:account_payment_ux.field_payment_transaction__display_name 22 | msgid "Display Name" 23 | msgstr "" 24 | 25 | #. module: account_payment_ux 26 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_move__id 27 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_payment__id 28 | #: model:ir.model.fields,field_description:account_payment_ux.field_payment_transaction__id 29 | msgid "ID" 30 | msgstr "" 31 | 32 | #. module: account_payment_ux 33 | #: model:ir.model,name:account_payment_ux.model_account_move 34 | msgid "Journal Entry" 35 | msgstr "" 36 | 37 | #. module: account_payment_ux 38 | #: model:ir.model,name:account_payment_ux.model_payment_transaction 39 | msgid "Payment Transaction" 40 | msgstr "" 41 | 42 | #. module: account_payment_ux 43 | #: model:ir.model,name:account_payment_ux.model_account_payment 44 | msgid "Payments" 45 | msgstr "" 46 | -------------------------------------------------------------------------------- /.github/workflows/pre-commit.yml: -------------------------------------------------------------------------------- 1 | # ⚠️ DO NOT EDIT THIS FILE, IT IS GENERATED BY COPIER ⚠️ 2 | # Changes here will be lost on a future update. 3 | # See: https://github.com/ingadhoc/addons-repo-template 4 | 5 | name: pre-commit 6 | 7 | on: 8 | push: 9 | branches: "[0-9][0-9].0" 10 | pull_request_target: 11 | 12 | jobs: 13 | pre-commit: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - 17 | name: Checkout 18 | uses: actions/checkout@v4 19 | with: 20 | ref: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.sha || github.ref }} 21 | - 22 | id: setup-python 23 | name: Setup Python 24 | uses: actions/setup-python@v5 25 | with: 26 | python-version: "3.10" 27 | cache: "pip" 28 | - 29 | name: Pre-commit cache 30 | uses: actions/cache@v4 31 | with: 32 | path: ~/.cache/pre-commit 33 | key: pre-commit|${{ steps.setup-python.outputs.python-version }}|${{ hashFiles('.pre-commit-config.yaml') }} 34 | - 35 | id: precommit 36 | name: Pre-commit 37 | uses: pre-commit/action@v3.0.1 38 | - 39 | name: Create commit status 40 | if: github.event_name == 'pull_request_target' 41 | run: | 42 | curl -L \ 43 | -X POST \ 44 | -H "Accept: application/vnd.github+json" \ 45 | -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ 46 | -H "X-GitHub-Api-Version: 2022-11-28" \ 47 | https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.event.pull_request.head.sha }} \ 48 | -d '{"state":"${{ steps.precommit.outcome }}","context":"mergebot/pre-commit"}' \ 49 | --fail 50 | -------------------------------------------------------------------------------- /account_cashbox/wizards/account_cashbox_payment_import.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | 6 | from odoo import api, fields, models 7 | 8 | 9 | class AccountCashboxPaymentImport(models.TransientModel): 10 | _name = "account.cashbox.payment.import" 11 | _description = "Import Payment into session" 12 | 13 | cashbox_session_id = fields.Many2one("account.cashbox.session", required=True, readonly=True, ondelete="cascade") 14 | available_journal_ids = fields.Many2many("account.journal", compute="_compute_available_journal_ids") 15 | payment_ids = fields.Many2many("account.payment", string="Payments") 16 | 17 | @api.model 18 | def default_get(self, fields): 19 | res = super().default_get(fields) 20 | if "cashbox_session_id" in fields: 21 | pop_session = ( 22 | self.env["account.cashbox.session"].browse(self.env.context["active_id"]) 23 | if self.env.context.get("active_model") == "account.cashbox.session" 24 | else self.env["account.cashbox.session"] 25 | ) 26 | res["cashbox_session_id"] = pop_session.id 27 | return res 28 | 29 | @api.depends("cashbox_session_id") 30 | def _compute_available_journal_ids(self): 31 | for rec in self: 32 | rec.available_journal_ids = rec.cashbox_session_id.line_ids.mapped("journal_id") 33 | 34 | def action_import_payment(self): 35 | self.payment_ids.cashbox_session_id = self.cashbox_session_id 36 | payment_journals = self.payment_ids.mapped("journal_id.display_name") 37 | self.cashbox_session_id.message_post(body="Import payments in journals %s" % ", ".join(payment_journals)) 38 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/wizard/account_resequence.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from odoo import _, models 4 | from odoo.exceptions import ValidationError 5 | 6 | 7 | class AccountResequenceWizard(models.TransientModel): 8 | _inherit = "account.resequence.wizard" 9 | 10 | def resequence(self): 11 | if self.ordering == "keep": 12 | new_names = [v["new_by_name"] for v in json.loads(self[0]["new_values"]).values()] 13 | else: 14 | new_names = [v["new_by_date"] for v in json.loads(self[0]["new_values"]).values()] 15 | 16 | duplicated_names = self.env["account.move"].search( 17 | [ 18 | ("receiptbook_id", "=", self.move_ids.receiptbook_id.id), 19 | ("name", "in", new_names), 20 | ("id", "not in", self.move_ids.ids), 21 | ] 22 | ) 23 | if duplicated_names: 24 | raise ValidationError( 25 | _("The following receipt names already exist:\n%s") % "\n".join(duplicated_names.mapped("name")) 26 | ) 27 | 28 | original_move_ids = self.move_ids 29 | original_wizard = self[0].copy() 30 | 31 | for journal in original_move_ids.journal_id: 32 | move_ids = original_move_ids.filtered(lambda x: x.journal_id == journal) 33 | 34 | all_moves = json.loads(original_wizard.read()[0]["new_values"]) 35 | 36 | # Filter only the moves for this journal 37 | filtered_moves = {str(mid.id): all_moves[str(mid.id)] for mid in move_ids if str(mid.id) in all_moves} 38 | 39 | # I have to write move_ids before new_values because is computed 40 | # and changes new_values 41 | self[0].write({"move_ids": move_ids}) 42 | # Write as proper JSON string 43 | self[0].write({"new_values": json.dumps(filtered_moves)}) 44 | 45 | super().resequence() 46 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/views/account_move_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | account.move 6 | account.move 7 | 8 | 9 | 19 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /account_payment_pro/views/account_write_off_type_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account_write_off_type.list 5 | account.write_off.type 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | account_write_off_type.search 16 | account.write_off.type 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | account_write_off_type.form 26 | account.write_off.type 27 | 28 |
29 |
30 | 31 |
32 | 33 |

34 | 35 |

36 | 37 | 38 | 39 | 40 | 41 |
42 |
43 |
44 |
45 | 46 | Write Off Types 47 | account.write_off.type 48 | list,form 49 | 50 | 51 | 52 |
53 | -------------------------------------------------------------------------------- /card_installment/README.rst: -------------------------------------------------------------------------------- 1 | .. |company| replace:: ADHOC SA 2 | 3 | .. |company_logo| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-logo.png 4 | :alt: ADHOC SA 5 | :target: https://www.adhoc.com.ar 6 | 7 | .. |icon| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-icon.png 8 | 9 | .. image:: https://img.shields.io/badge/license-AGPL--3-blue.png 10 | :target: https://www.gnu.org/licenses/agpl 11 | :alt: License: AGPL-3 12 | 13 | ================ 14 | Card Installment 15 | ================ 16 | 17 | Module that adds a "Cards" menu 18 | which allows you to define installment plans for debit/credit cards 19 | by defining: fantasy name, installment plan, divisor, coefficient, bank discount. 20 | 21 | Installation 22 | ============ 23 | To install this module, you need to: 24 | #. Just install this module. 25 | 26 | Configuration 27 | ============= 28 | To configure this module, you need to: 29 | #. No configuration nedeed. 30 | 31 | Usage 32 | ===== 33 | To use this module, you need to: 34 | 35 | #. Go to Cards menu and define installment plans for debit/credit cards 36 | 37 | .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas 38 | :alt: Try me on Runbot 39 | :target: http://runbot.adhoc.com.ar/ 40 | 41 | Bug Tracker 42 | =========== 43 | Bugs are tracked on `GitHub Issues 44 | `_. In case of trouble, please 45 | check there if your issue has already been reported. If you spotted it first, 46 | help us smashing it by providing a detailed and welcomed feedback. 47 | 48 | Credits 49 | ======= 50 | 51 | Images 52 | ------ 53 | 54 | * |company| |icon| 55 | 56 | Contributors 57 | ------------ 58 | 59 | Maintainer 60 | ---------- 61 | 62 | |company_logo| 63 | 64 | This module is maintained by the |company|. 65 | 66 | To contribute to this module, please visit https://www.adhoc.com.ar. 67 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/views/account_payment_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | account.payment.form 6 | account.payment 7 | 8 | 9 | 10 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /account_payment_ux/i18n/es.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * account_payment_ux 4 | # 5 | # Translators: 6 | # Juan José Scarafía , 2025 7 | # ADHOC - Bot , 2025 8 | # 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: Odoo Server 19.0+e\n" 12 | "Report-Msgid-Bugs-To: \n" 13 | "POT-Creation-Date: 2025-11-06 20:49+0000\n" 14 | "PO-Revision-Date: 2025-10-20 13:57+0000\n" 15 | "Last-Translator: ADHOC - Bot , 2025\n" 16 | "Language-Team: Spanish (https://app.transifex.com/adhoc/teams/46451/es/)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: \n" 20 | "Language: es\n" 21 | "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 22 | 23 | #. module: account_payment_ux 24 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_move__display_name 25 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_payment__display_name 26 | #: model:ir.model.fields,field_description:account_payment_ux.field_payment_transaction__display_name 27 | msgid "Display Name" 28 | msgstr "Nombre para mostrar" 29 | 30 | #. module: account_payment_ux 31 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_move__id 32 | #: model:ir.model.fields,field_description:account_payment_ux.field_account_payment__id 33 | #: model:ir.model.fields,field_description:account_payment_ux.field_payment_transaction__id 34 | msgid "ID" 35 | msgstr "ID (identificación)" 36 | 37 | #. module: account_payment_ux 38 | #: model:ir.model,name:account_payment_ux.model_account_move 39 | msgid "Journal Entry" 40 | msgstr "Asiento contable" 41 | 42 | #. module: account_payment_ux 43 | #: model:ir.model,name:account_payment_ux.model_payment_transaction 44 | msgid "Payment Transaction" 45 | msgstr "Transacción de pago" 46 | 47 | #. module: account_payment_ux 48 | #: model:ir.model,name:account_payment_ux.model_account_payment 49 | msgid "Payments" 50 | msgstr "Pagos" 51 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/__manifest__.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # 3 | # Copyright (C) 2015 ADHOC SA (http://www.adhoc.com.ar) 4 | # All Rights Reserved. 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Affero General Public License as 8 | # published by the Free Software Foundation, either version 3 of the 9 | # License, or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Affero General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Affero General Public License 17 | # along with this program. If not, see . 18 | # 19 | ############################################################################## 20 | { 21 | "name": "Latam Check UX", 22 | "version": "19.0.1.0.0", 23 | "category": "Accounting", 24 | "sequence": 14, 25 | "summary": "", 26 | "author": "ADHOC SA", 27 | "website": "www.adhoc.com.ar", 28 | "license": "AGPL-3", 29 | "images": [], 30 | "depends": [ 31 | "l10n_latam_check", 32 | "account_ux", 33 | "account_internal_transfer", 34 | ], 35 | "data": [ 36 | "wizards/account_check_action_wizard_view.xml", 37 | "wizards/checks_to_date_view.xml", 38 | "views/account_payment_view.xml", 39 | "views/l10n_latam_check_view.xml", 40 | "views/account_journal_view.xml", 41 | "views/report_payment_receipt_templates.xml", 42 | "views/res_partner_view.xml", 43 | "wizards/l10n_latam_payment_mass_transfer.xml", 44 | "reports/report_account_transfer.xml", 45 | "reports/report_checks_to_date.xml", 46 | "security/ir.model.access.csv", 47 | ], 48 | "demo": [], 49 | "installable": True, 50 | "auto_install": True, 51 | "application": False, 52 | } 53 | -------------------------------------------------------------------------------- /account_payment_ux/models/payment_transaction.py: -------------------------------------------------------------------------------- 1 | from odoo import models 2 | 3 | 4 | class PaymentTransaction(models.Model): 5 | _inherit = "payment.transaction" 6 | 7 | def _post_process(self): 8 | super()._post_process() 9 | 10 | for tx in self.filtered(lambda t: t.state == "done" and t.payment_id and t.payment_id.state == "draft"): 11 | # Si el pago relacionado a la trasaccion esta en draft y coinciden los datos 12 | # lo publico y concilio 13 | # No agrego este if al filtered porque seria iligible. El 99.9% de los casos el if es True 14 | if tx.payment_id.currency_id == tx.currency_id and tx.payment_id.amount == abs(tx.amount): 15 | tx.payment_id.action_post() 16 | if tx.invoice_ids: 17 | (tx.payment_id.line_ids + tx.invoice_ids.line_ids).filtered( 18 | lambda line: line.account_id == tx.payment_id.destination_account_id and not line.reconciled 19 | ).reconcile() 20 | 21 | def write(self, vals): 22 | # Este hack es para evitar que las transacciones se marquen como post processed = True 23 | # Cuando las genero pendientes desde el back end 24 | # 1) Llama a _post_process 25 | # https://github.com/odoo/odoo/blob/19.0/addons/account_payment/models/account_payment.py#L141 26 | # 2) _finalize_post_processing siempre marca la transaccion como _post_process 27 | # aunque su estado no sea DONE... 28 | # https://github.com/odoo/odoo/blob/19.0/addons/payment/models/payment_transaction.py#L1081 29 | ignored_post_processed_tx = self.env["payment.transaction"] 30 | if vals.get("is_post_processed") and vals.get("state", "draft") in ["draft", "pending"]: 31 | altered_vals = vals.copy() 32 | del altered_vals["is_post_processed"] 33 | ignored_post_processed_tx = self.filtered( 34 | lambda x: x.state in ["draft", "pending"] and x.provider_id.code != "custom" 35 | ) 36 | ignored_post_processed_tx.write(altered_vals) 37 | return super(PaymentTransaction, self - ignored_post_processed_tx).write(vals) 38 | -------------------------------------------------------------------------------- /account_cashbox_l10n_latam_check/i18n/account_cashbox_l10n_latam_check.pot: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * account_cashbox_l10n_latam_check 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 19.0+e\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2025-11-25 17:15+0000\n" 10 | "PO-Revision-Date: 2025-11-25 17:15+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: account_cashbox_l10n_latam_check 19 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__cashbox_session_ids_domain 20 | msgid "Cashbox Session Ids Domain" 21 | msgstr "" 22 | 23 | #. module: account_cashbox_l10n_latam_check 24 | #: model:ir.model,name:account_cashbox_l10n_latam_check.model_l10n_latam_payment_mass_transfer 25 | msgid "Checks Mass Transfers" 26 | msgstr "" 27 | 28 | #. module: account_cashbox_l10n_latam_check 29 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__display_name 30 | msgid "Display Name" 31 | msgstr "" 32 | 33 | #. module: account_cashbox_l10n_latam_check 34 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__id 35 | msgid "ID" 36 | msgstr "" 37 | 38 | #. module: account_cashbox_l10n_latam_check 39 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__cashbox_session_id 40 | msgid "POP Session" 41 | msgstr "" 42 | 43 | #. module: account_cashbox_l10n_latam_check 44 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__requiere_account_cashbox_session 45 | msgid "Requiere Account Cashbox Session" 46 | msgstr "" 47 | 48 | #. module: account_cashbox_l10n_latam_check 49 | #. odoo-python 50 | #: code:addons/account_cashbox_l10n_latam_check/wizards/l10n_latam_payment_mass_transfer.py:0 51 | msgid "Your user requires to use payment session on each tranfer" 52 | msgstr "" 53 | -------------------------------------------------------------------------------- /account_cashbox/wizards/account_payment_register.py: -------------------------------------------------------------------------------- 1 | from odoo import api, fields, models 2 | 3 | 4 | class AccountPaymentRegister(models.TransientModel): 5 | """ 6 | Si bien cashbox depende de account_payment_pro y deshabilitamos los wizards de pago 7 | Modulos como hr_expenses continuan utilizando el wizard. por eso agregamos la logica de 8 | las seciones de caja tambien al wizard 9 | """ 10 | 11 | _inherit = "account.payment.register" 12 | 13 | cashbox_session_id = fields.Many2one( 14 | "account.cashbox.session", 15 | string="POP Session", 16 | compute="_compute_cashbox_session_id", 17 | readonly=False, 18 | store=True, 19 | ) 20 | requiere_account_cashbox_session = fields.Boolean( 21 | compute="_compute_requiere_account_cashbox_session", 22 | compute_sudo=False, 23 | ) 24 | 25 | @api.depends_context("uid") 26 | # dummy depends para que se compute(no estamos seguros porque solo con el depends_context no computa) 27 | @api.depends("journal_id") 28 | def _compute_requiere_account_cashbox_session(self): 29 | self.requiere_account_cashbox_session = self.env.user.requiere_account_cashbox_session 30 | 31 | def _compute_cashbox_session_id(self): 32 | for rec in self: 33 | session_ids = self.env["account.cashbox.session"].search( 34 | [("state", "=", "opened"), "|", ("user_ids", "=", self.env.uid), ("user_ids", "=", False)] 35 | ) 36 | if len(session_ids) == 1: 37 | rec.cashbox_session_id = session_ids.id 38 | else: 39 | rec.cashbox_session_id = False 40 | 41 | @api.depends("payment_type", "cashbox_session_id") 42 | def _compute_available_journal_ids(self): 43 | super()._compute_available_journal_ids() 44 | for pay in self.filtered("cashbox_session_id"): 45 | # hacemos dominio sobre los line_ids y no los diarios del pop config porque 46 | # puede ser que sea una sesion vieja y que el setting pop config cambie 47 | pay.available_journal_ids = pay.available_journal_ids._origin.filtered( 48 | lambda x: x in pay.cashbox_session_id.line_ids.mapped("journal_id") 49 | ) 50 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/account_chart_template.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | import logging 6 | 7 | from odoo import _, api, models 8 | 9 | _logger = logging.getLogger(__name__) 10 | 11 | 12 | class AccountChartTemplate(models.AbstractModel): 13 | _inherit = "account.chart.template" 14 | 15 | def _load(self, template_code, company, install_demo, force_create=True): 16 | self._create_receiptbooks(company) 17 | return super()._load(template_code, company, install_demo, force_create) 18 | 19 | @api.model 20 | def _create_receiptbooks(self, company): 21 | """ 22 | This method can be inherited by different localizations 23 | """ 24 | partner_type_name_map = { 25 | "customer": _("Customer Receipts"), 26 | "supplier": _("Supplier Payments"), 27 | } 28 | for partner_type in ["supplier", "customer"]: 29 | receipbook = self.env["account.payment.receiptbook"].search( 30 | [("partner_type", "=", partner_type), ("company_id", "=", company.id)], limit=1 31 | ) 32 | if receipbook: 33 | continue 34 | 35 | document_type = self.env["l10n_latam.document.type"].search( 36 | [("internal_type", "=", "%s_payment" % partner_type)], limit=1 37 | ) 38 | if not document_type: 39 | continue 40 | vals = { 41 | "name": partner_type_name_map[partner_type], 42 | "partner_type": partner_type, 43 | "company_id": company.id, 44 | "document_type_id": document_type.id, 45 | "prefix": "0001-", 46 | } 47 | # sudo() is used to bypass access restrictions during the initial creation 48 | # of receiptbooks when creating an argentine company, 49 | # as the user might not yet have access to the newly created 50 | # company due to multi-company rules. 51 | receipbook.sudo().create(vals) 52 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # ⚠️ DO NOT EDIT THIS FILE, IT IS GENERATED BY COPIER ⚠️ 2 | # Changes here will be lost on a future update. 3 | # See: https://github.com/ingadhoc/addons-repo-template 4 | 5 | exclude: | 6 | (?x) 7 | # We don't want to mess with tool-generated files 8 | .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs| 9 | # Library files can have extraneous formatting (even minimized) 10 | /static/(src/)?lib/| 11 | # Ignore build and dist directories in addons 12 | /build/|/dist/| 13 | # Ignore test files in addons 14 | /tests/samples/.*| 15 | # You don't usually want a bot to modify your legal texts 16 | (LICENSE.*|COPYING.*) 17 | 18 | # Keep in sync with .github/workflows/pre-commit.yml 19 | default_language_version: 20 | python: python3 21 | 22 | repos: 23 | 24 | - repo: https://github.com/pre-commit/pre-commit-hooks 25 | rev: v5.0.0 26 | hooks: 27 | - id: check-added-large-files 28 | - id: check-case-conflict 29 | - id: check-docstring-first 30 | - id: check-executables-have-shebangs 31 | - id: check-merge-conflict 32 | - id: check-symlinks 33 | - id: check-xml 34 | - id: check-yaml 35 | - id: debug-statements 36 | - id: end-of-file-fixer 37 | - id: mixed-line-ending 38 | args: ["--fix=lf"] 39 | - id: trailing-whitespace 40 | # exclude autogenerated files 41 | exclude: \.pot?$ 42 | 43 | - repo: https://github.com/OCA/odoo-pre-commit-hooks 44 | rev: v0.0.35 45 | hooks: 46 | - id: oca-checks-odoo-module 47 | args: 48 | - --disable=xml-dangerous-qweb-replace-low-priority,xml-view-dangerous-replace-low-priority,xml-oe-structure-missing-id 49 | - id: oca-checks-po 50 | args: 51 | - --disable=po-pretty-format 52 | 53 | - repo: https://github.com/astral-sh/ruff-pre-commit 54 | rev: v0.6.8 55 | hooks: 56 | - id: ruff 57 | args: [--fix, --exit-non-zero-on-fix] 58 | - id: ruff-format 59 | 60 | - repo: https://github.com/OCA/pylint-odoo 61 | rev: v9.1.3 62 | hooks: 63 | - id: pylint_odoo 64 | 65 | - repo: https://github.com/rstcheck/rstcheck 66 | rev: v6.2.1 67 | hooks: 68 | - id: rstcheck 69 | -------------------------------------------------------------------------------- /account_payment_financial_surcharge/README.rst: -------------------------------------------------------------------------------- 1 | .. |company| replace:: ADHOC SA 2 | 3 | .. |company_logo| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-logo.png 4 | :alt: ADHOC SA 5 | :target: https://www.adhoc.com.ar 6 | 7 | .. |icon| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-icon.png 8 | 9 | .. image:: https://img.shields.io/badge/license-AGPL--3-blue.png 10 | :target: https://www.gnu.org/licenses/agpl 11 | :alt: License: AGPL-3 12 | 13 | ======================================= 14 | Payments with Financial Surchange 15 | ======================================= 16 | 17 | The module allows the management of financial surcharges when the client opts for installment payments or 18 | financing options. This is common in industries such as retail or financial services, where deferred payment 19 | options are offered. The main functionality is to automatically add a financial surcharge to the payment 20 | amount based on predefined criteria in "Cards". 21 | 22 | Installation 23 | ============ 24 | 25 | To install this module, you need to: 26 | 27 | #. This module is auto-installed 28 | 29 | Configuration 30 | ============= 31 | 32 | To configure this module, you need to: 33 | 34 | #. Go to ... 35 | 36 | Usage 37 | ===== 38 | 39 | To use this module, you need to: 40 | 41 | #. For this module to work you will need the setting 'Use payment pro module' activated for your company 42 | 43 | .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas 44 | :alt: Try me on Runbot 45 | :target: http://runbot.adhoc.com.ar/ 46 | 47 | Bug Tracker 48 | =========== 49 | 50 | Bugs are tracked on `GitHub Issues 51 | `_. In case of trouble, please 52 | check there if your issue has already been reported. If you spotted it first, 53 | help us smashing it by providing a detailed and welcomed feedback. 54 | 55 | Credits 56 | ======= 57 | 58 | Images 59 | ------ 60 | 61 | * |company| |icon| 62 | 63 | Contributors 64 | ------------ 65 | 66 | Maintainer 67 | ---------- 68 | 69 | |company_logo| 70 | 71 | This module is maintained by the |company|. 72 | 73 | To contribute to this module, please visit https://www.adhoc.com.ar. 74 | -------------------------------------------------------------------------------- /account_cashbox/security/cashbox_security.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cashbox multi-company 6 | 7 | [('company_id', 'in', company_ids)] 8 | 9 | 10 | 11 | Cashbox Session multi-company 12 | 13 | [('company_id', 'in', company_ids)] 14 | 15 | 16 | 17 | Cashbox Invoicing User 18 | 19 | ['|', ('allowed_res_users_ids', '=', user.id),('allowed_res_users_ids', '=', False)] 20 | 21 | 22 | 23 | 24 | Cashbox Invoicing Manager 25 | 26 | [(1, '=', 1)] 27 | 28 | 29 | 30 | 31 | 32 | Cashbox Session Invoicing User 33 | 34 | ['|', ('user_ids', '=', user.id),('user_ids', '=', False)] 35 | 36 | 37 | 38 | 39 | 40 | Cashbox Session Invoicing Manager 41 | 42 | [(1, '=', 1)] 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /account_payment_loan/models/account_chart_template.py: -------------------------------------------------------------------------------- 1 | from odoo import _, models 2 | from odoo.addons.account.models.chart_template import template 3 | 4 | 5 | class AccountChartTemplate(models.AbstractModel): 6 | _inherit = "account.chart.template" 7 | 8 | @template(model="account.account") 9 | def _get_personal_loan_account_account(self, template_code): 10 | return { 11 | "account_loan_account": { 12 | "name": _("Account Receivable Loan"), 13 | "code": "loan", 14 | "account_type": "asset_receivable", 15 | "reconcile": True, 16 | }, 17 | "account_loan_interest_account": { 18 | "name": _("Account Interest Loan"), 19 | "code": "LOI", 20 | "account_type": "income_other", 21 | }, 22 | "account_loan_extra_charges": { 23 | "name": _("Account Extra Charges Loan"), 24 | "code": "LOE", 25 | "account_type": "income_other", 26 | }, 27 | } 28 | 29 | @template(model="account.journal") 30 | def _get_personal_loan_journal(self, template_code): 31 | return { 32 | "account_loan_journal": { 33 | "name": _("Personal Loans"), 34 | "type": "general", 35 | "code": "LOA", 36 | }, 37 | } 38 | 39 | def _post_load_data(self, template_code, company, template_data): 40 | def get_first_parent(company): 41 | if company.parent_id: 42 | return get_first_parent(company.parent_id) 43 | return company 44 | 45 | super()._post_load_data(template_code, company, template_data) 46 | company = get_first_parent(company or self.env.company) 47 | 48 | account_loan_journal_id = self.env.ref(f"account.{company.id}_account_loan_journal") 49 | account_loan_journal_id.default_account_id = self.env.ref(f"account.{company.id}_account_loan_account").id 50 | 51 | company.loan_journal_id = account_loan_journal_id.id 52 | company.account_late_payment_interest = self.env.ref(f"account.{company.id}_account_loan_interest_account").id 53 | company.account_loan_extra_charges = self.env.ref(f"account.{company.id}_account_loan_extra_charges").id 54 | -------------------------------------------------------------------------------- /account_payment_pro/README.rst: -------------------------------------------------------------------------------- 1 | .. |company| replace:: ADHOC SA 2 | 3 | .. |company_logo| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-logo.png 4 | :alt: ADHOC SA 5 | :target: https://www.adhoc.com.ar 6 | 7 | .. |icon| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-icon.png 8 | 9 | .. image:: https://img.shields.io/badge/license-AGPL--3-blue.png 10 | :target: https://www.gnu.org/licenses/agpl 11 | :alt: License: AGPL-3 12 | 13 | =================== 14 | Account Payment Pro 15 | =================== 16 | 17 | ​This module is designed to enhance and extend the functionality of Odoo's core payment models. 18 | This module is essential for managing withholdings in Argentina. 19 | 20 | ​Functionalities 21 | 22 | Select Debts to Pay: Users can choose specific debts to settle during the payment process. 23 | Manage Withholdings Calculation: The module facilitates the calculation of withholdings as part of the payment processing. 24 | Register Write-Offs: Users can register write-offs directly within the payment. 25 | Immediate Payment Option in invoices: Provides a "Pay Now" feature for instant payment processing. 26 | 27 | 28 | Installation 29 | ============ 30 | 31 | To install this module, you need to: 32 | 33 | #. account_ux 34 | 35 | Configuration 36 | ============= 37 | 38 | To configure this module, you need to: 39 | 40 | #. Go to ... 41 | 42 | Usage 43 | ===== 44 | 45 | To use this module, you need to: 46 | 47 | #. Go to ... 48 | 49 | .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas 50 | :alt: Try me on Runbot 51 | :target: http://runbot.adhoc.com.ar/ 52 | 53 | Bug Tracker 54 | =========== 55 | 56 | Bugs are tracked on `GitHub Issues 57 | `_. In case of trouble, please 58 | check there if your issue has already been reported. If you spotted it first, 59 | help us smashing it by providing a detailed and welcomed feedback. 60 | 61 | Credits 62 | ======= 63 | 64 | Images 65 | ------ 66 | 67 | * |company| |icon| 68 | 69 | Contributors 70 | ------------ 71 | 72 | Maintainer 73 | ---------- 74 | 75 | |company_logo| 76 | 77 | This module is maintained by the |company|. 78 | 79 | To contribute to this module, please visit https://www.adhoc.com.ar. 80 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/models/l10n_latam_check.py: -------------------------------------------------------------------------------- 1 | from odoo import _, api, fields, models 2 | 3 | 4 | class l10nLatamAccountPaymentCheck(models.Model): 5 | _inherit = "l10n_latam.check" 6 | 7 | check_add_debit_button = fields.Boolean(related="original_journal_id.check_add_debit_button", readonly=True) 8 | date = fields.Date(related="payment_id.date") 9 | memo = fields.Char(related="payment_id.memo") 10 | company_id = fields.Many2one( 11 | compute="_compute_company_id", store=True, compute_sudo=True, comodel_name="res.company" 12 | ) 13 | payment_state = fields.Selection( 14 | related="payment_id.state", 15 | readonly=True, 16 | ) 17 | operation_ids = fields.Many2many(check_company=False) 18 | 19 | @api.depends("operation_ids.state", "payment_id.state") 20 | def _compute_company_id(self): 21 | for rec in self: 22 | last_operation = rec._get_last_operation() or rec.payment_id 23 | rec.company_id = last_operation.company_id 24 | 25 | def button_open_check_operations(self): 26 | action = super(l10nLatamAccountPaymentCheck, self.sudo()).button_open_check_operations() 27 | self.ensure_one() 28 | operations = self.operation_ids.sorted(lambda r: r.l10n_latam_move_check_ids_operation_date, reverse=True) 29 | operations = (operations + self.payment_id).filtered( 30 | lambda x: x.state not in ["draft", "canceled"] and x.company_id == self.company_id 31 | ) 32 | action = { 33 | "name": _("Check Operations"), 34 | "type": "ir.actions.act_window", 35 | "res_model": "account.payment", 36 | "views": [ 37 | (self.env.ref("l10n_latam_check.view_account_third_party_check_operations_tree").id, "list"), 38 | (False, "form"), 39 | ], 40 | "context": {"create": False}, 41 | "domain": [("id", "in", operations.ids)], 42 | } 43 | return action 44 | 45 | def _get_last_operation(self): 46 | super()._get_last_operation() 47 | self.ensure_one() 48 | return ( 49 | (self.payment_id + self.operation_ids) 50 | .filtered(lambda x: x.state not in ["draft", "canceled"] and x.l10n_latam_move_check_ids_operation_date) 51 | .sorted(key=lambda payment: (payment.l10n_latam_move_check_ids_operation_date))[-1:] 52 | ) 53 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/reports/report_account_transfer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 42 | 43 | -------------------------------------------------------------------------------- /account_payment_loan/wizards/account_loan_register.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.loan.register.form 5 | account.loan.register 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
42 | 43 |
44 |
45 |
46 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/views/report_payment_receipt_templates.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 43 | 44 | -------------------------------------------------------------------------------- /account_payment_loan/wizards/account_loan_debt_report.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.loan.debt.report.form 5 | account.loan.debt.report 6 | 7 |
8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 |
42 |
43 |
44 |
45 |
46 | -------------------------------------------------------------------------------- /account_cashbox_l10n_latam_check/i18n/es.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * account_cashbox_l10n_latam_check 4 | # 5 | # Translators: 6 | # ADHOC - Bot , 2025 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: Odoo Server 19.0+e\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2025-11-25 18:28+0000\n" 13 | "PO-Revision-Date: 2025-11-06 14:01+0000\n" 14 | "Last-Translator: ADHOC - Bot , 2025\n" 15 | "Language-Team: Spanish (https://app.transifex.com/adhoc/teams/46451/es/)\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: \n" 19 | "Language: es\n" 20 | "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 21 | 22 | #. module: account_cashbox_l10n_latam_check 23 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__cashbox_session_ids_domain 24 | msgid "Cashbox Session Ids Domain" 25 | msgstr "Dominio de ids de sesiones de caja" 26 | 27 | #. module: account_cashbox_l10n_latam_check 28 | #: model:ir.model,name:account_cashbox_l10n_latam_check.model_l10n_latam_payment_mass_transfer 29 | msgid "Checks Mass Transfers" 30 | msgstr "Transferencia Masiva de Cheques" 31 | 32 | #. module: account_cashbox_l10n_latam_check 33 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__display_name 34 | msgid "Display Name" 35 | msgstr "Nombre a Mostrar" 36 | 37 | #. module: account_cashbox_l10n_latam_check 38 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__id 39 | msgid "ID" 40 | msgstr "ID (identificación)" 41 | 42 | #. module: account_cashbox_l10n_latam_check 43 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__cashbox_session_id 44 | msgid "POP Session" 45 | msgstr "Sesión" 46 | 47 | #. module: account_cashbox_l10n_latam_check 48 | #: model:ir.model.fields,field_description:account_cashbox_l10n_latam_check.field_l10n_latam_payment_mass_transfer__requiere_account_cashbox_session 49 | msgid "Requiere Account Cashbox Session" 50 | msgstr "Requiere Sesión de Caja" 51 | 52 | #. module: account_cashbox_l10n_latam_check 53 | #. odoo-python 54 | #: code:addons/account_cashbox_l10n_latam_check/wizards/l10n_latam_payment_mass_transfer.py:0 55 | msgid "Your user requires to use payment session on each tranfer" 56 | msgstr "Su usuario requiere que use sesiones de caja en cada pago" 57 | -------------------------------------------------------------------------------- /account_payment_multi/README.md: -------------------------------------------------------------------------------- 1 | # Account Payment Multi 2 | 3 | The **Account Payment Multi** module allows users to manage multiple invoice payments in Odoo. With this module, users can select multiple invoices and pay them with a single payment, streamlining the payment process for businesses. 4 | 5 | ## Features 6 | 7 | - **Multi-Invoice Payment**: Select multiple invoices and process them as a single payment. 8 | - **Batch Payment Reference**: Automatically generate a unique batch payment reference for grouped payments. 9 | - **Portal Integration**: Enhanced portal views for selecting and paying invoices. 10 | - **Frontend Enhancements**: Custom JavaScript for improved user interaction in the portal. 11 | 12 | ## Installation 13 | 14 | 1. Ensure the `account_payment` module is installed as it is a dependency. 15 | 2. Add this module to your Odoo addons path. 16 | 3. Update the module list and install the **Account Payment Multi** module. 17 | 18 | ## Configuration 19 | 20 | - No additional configuration is required. The module integrates seamlessly with the existing payment and portal functionalities. 21 | 22 | ## Usage 23 | 24 | 1. Navigate to the **Customer Portal**. 25 | 2. Go to the **My Invoices** section. 26 | 3. Select multiple invoices using the checkboxes provided. 27 | 4. Click the **Pay Selected** button to proceed with the payment. 28 | 5. Review the payment summary and confirm the transaction. 29 | 30 | ## Technical Details 31 | 32 | - **Controllers**: The module extends the payment portal controller to handle multi-invoice payments. See [`portal.py`](account_payment_multi/controllers/portal.py). 33 | - **Models**: Adds a batch payment sequence to the company model for generating unique batch payment references. See [`company.py`](account_payment_multi/models/company.py). 34 | - **Views**: Customizes portal templates for invoice selection and payment. See: 35 | - [`account_portal_templates.xml`](account_payment_multi/views/account_portal_templates.xml) 36 | - [`payment_form_template.xml`](account_payment_multi/views/payment_form_template.xml) 37 | - **JavaScript**: Enhances the frontend with custom logic for selecting invoices and initiating payments. See [`payment_form.js`](account_payment_multi/static/src/js/payment_form.js). 38 | 39 | ## Dependencies 40 | 41 | - `account_payment` 42 | 43 | ## Assets 44 | 45 | The module includes the following assets: 46 | - JavaScript: [`payment_form.js`](account_payment_multi/static/src/js/payment_form.js) 47 | 48 | ## License 49 | 50 | This module is licensed under the LGPL-3 license. 51 | 52 | ## Author 53 | 54 | - **Odoo, ADHOC SA** 55 | - Website: [www.adhoc.com.ar](https://www.adhoc.com.ar) 56 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/views/report_payment_receipt_templates.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 42 | 43 | -------------------------------------------------------------------------------- /account_cashbox_l10n_latam_check/wizards/l10n_latam_payment_mass_transfer.py: -------------------------------------------------------------------------------- 1 | from odoo import _, api, fields, models 2 | from odoo.exceptions import UserError 3 | 4 | 5 | class L10nLatamPaymentMassTransfer(models.TransientModel): 6 | _inherit = "l10n_latam.payment.mass.transfer" 7 | 8 | cashbox_session_id = fields.Many2one( 9 | "account.cashbox.session", 10 | string="POP Session", 11 | compute="_compute_cashbox_session_id", 12 | readonly=False, 13 | ) 14 | requiere_account_cashbox_session = fields.Boolean( 15 | compute="_compute_requiere_account_cashbox_session", 16 | compute_sudo=False, 17 | ) 18 | cashbox_session_ids_domain = fields.Binary(compute="_compute_cashbox_session_ids_domain") 19 | 20 | @api.depends_context("uid") 21 | # dummy depends para que se compute(no estamos seguros porque solo con el depends_context no computa) 22 | @api.depends("destination_journal_id") 23 | def _compute_requiere_account_cashbox_session(self): 24 | self.requiere_account_cashbox_session = self.env.user.requiere_account_cashbox_session 25 | 26 | @api.depends("destination_journal_id") 27 | def _compute_cashbox_session_id(self): 28 | for rec in self: 29 | session_ids = self.env["account.cashbox.session"].search( 30 | [("state", "=", "opened"), "|", ("user_ids", "=", self.env.uid), ("user_ids", "=", False)] 31 | ) 32 | if len(session_ids) == 1: 33 | rec.cashbox_session_id = session_ids.id 34 | else: 35 | rec.cashbox_session_id = False 36 | 37 | def _create_payments(self): 38 | self.ensure_one() 39 | if self.env.user.requiere_account_cashbox_session and not self.cashbox_session_id: 40 | raise UserError(_("Your user requires to use payment session on each tranfer")) 41 | # Envio el contexto paired_transfer en True para poder crear la 42 | # transferencia son cashbox durante la creacion y setearla sobre 43 | # la primera y no la paires 44 | payments = super(L10nLatamPaymentMassTransfer, self.with_context(paired_transfer=True))._create_payments() 45 | payments.cashbox_session_id = self.cashbox_session_id.id 46 | return payments 47 | 48 | @api.onchange("destination_journal_id") 49 | def _compute_cashbox_session_ids_domain(self): 50 | self.cashbox_session_id = False 51 | cashbox_ids = self.env["account.cashbox"].search([("journal_ids", "in", self.destination_journal_id.ids)]) 52 | session_ids = cashbox_ids.mapped("current_concurrent_session_ids").ids 53 | self.cashbox_session_ids_domain = [ 54 | ("state", "=", "opened"), 55 | ("company_id", "=", self.company_id.id), 56 | ("id", "in", session_ids), 57 | "|", 58 | ("user_ids", "=", self.env.uid), 59 | ("user_ids", "=", False), 60 | ] 61 | -------------------------------------------------------------------------------- /payment_retry/README.md: -------------------------------------------------------------------------------- 1 | [![License: LGPL-3](https://img.shields.io/badge/license-LGPL--3-blue.png)](https://www.gnu.org/licenses/lgpl) 2 | 3 | Payment Retry 4 | ============= 5 | 6 | This module provides retry functionality for failed payment transactions in Odoo. 7 | 8 | Features 9 | -------- 10 | 11 | * **Asynchronous Processing**: Handle payment retries in the background 12 | * **Manual Retry Wizard**: Allow users to manually retry failed transactions 13 | * **Email Validation**: Validate partner email addresses before retry 14 | * **Configurable Retry Limits**: Set retry time limits and frequency 15 | * **Cron Job Integration**: Scheduled automatic retry processing 16 | 17 | Installation 18 | ============ 19 | 20 | To install this module, you need to: 21 | 22 | 1. Add this module to your Odoo addons path 23 | 2. Update the apps list in Odoo 24 | 3. Install the module from Apps menu 25 | 26 | Configuration 27 | ============= 28 | 29 | After installation, the module will: 30 | 31 | 1. Add a scheduled action that runs every 10 minutes to process failed transactions 32 | 2. Add retry functionality to payment transactions 33 | 3. Create a wizard for manual retry operations 34 | 35 | The cron job "Enviar transacciones de pago" will automatically process transactions in draft state with asynchronous_process flag enabled. 36 | 37 | Usage 38 | ===== 39 | 40 | Automatic Retry 41 | --------------- 42 | 43 | The module automatically retries payment transactions that meet the following criteria: 44 | 45 | * Transaction state is "draft" 46 | * Operation is not "validation" 47 | * Asynchronous process flag is enabled 48 | * Transaction was created within the retry limit (default: 4 days) 49 | 50 | Manual Retry 51 | ------------ 52 | 53 | Users can manually retry failed transactions using the Payment Transaction Retry wizard: 54 | 55 | 1. Go to payment transactions 56 | 2. Select failed transactions 57 | 3. Use the retry wizard to process them manually 58 | 4. Validate partner email addresses before retry 59 | 5. Configure retry percentage and add custom messages 60 | 61 | Technical Details 62 | ----------------- 63 | 64 | ### Models Extended 65 | 66 | * **payment.transaction**: Added asynchronous_process field and retry logic 67 | * **account.move**: Enhanced for payment retry integration 68 | 69 | ### New Models 70 | 71 | * **payment.transaction.retry**: Wizard for manual retry operations 72 | * **payment.transaction.retry.lines**: Wizard lines for transaction details 73 | 74 | ### Scheduled Actions 75 | 76 | * **Payment Asynchronous Process**: Runs every 10 minutes to retry failed transactions 77 | 78 | Bug Tracker 79 | =========== 80 | 81 | Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. 82 | 83 | Credits 84 | ======= 85 | 86 | Contributors 87 | ------------ 88 | 89 | * ADHOC SA 90 | 91 | Maintainer 92 | ---------- 93 | 94 | This module is maintained by ADHOC SA. 95 | 96 | For support and more information, please visit: https://www.adhoc.inc 97 | -------------------------------------------------------------------------------- /account_payment_pro/wizards/account_payment_invoice_wizard_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account.payment.invoice.wizard.form 5 | account.payment.invoice.wizard 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 |
39 | 40 |
41 |
42 | 43 | 44 | Credit / Debit Note 45 | account.payment.invoice.wizard 46 | form 47 | new 48 | 49 |
50 | -------------------------------------------------------------------------------- /account_payment_pro/views/res_company_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | res.config.settings.view.form.inherit.account 5 | res.config.settings 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 |
25 |
30 |
31 |
32 | 33 | 34 | 35 |
36 |
37 | 38 |
39 |
40 |
45 |
46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /card_installment/views/account_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | account_card.list 5 | account.card 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | account_card.search 15 | account.card 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | account_card.form 24 | account.card 25 | 26 |
27 |
28 | 29 |
30 | 31 |

32 | 33 |

34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 |
50 |
51 |
52 | 53 | Cards 54 | account.card 55 | list,form 56 | 57 | 58 | card_installment.list 59 | account.card.installment 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | card_installment.search 74 | account.card.installment 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | Installments 87 | account.card.installment 88 | list 89 | 90 |
91 | -------------------------------------------------------------------------------- /account_payment_pro_receiptbook/models/account_payment.py: -------------------------------------------------------------------------------- 1 | from odoo import _, api, fields, models 2 | from odoo.exceptions import ValidationError 3 | 4 | 5 | class AccountPayment(models.Model): 6 | _inherit = "account.payment" 7 | 8 | receiptbook_id = fields.Many2one( 9 | "account.payment.receiptbook", 10 | "ReceiptBook", 11 | readonly=True, 12 | bypass_search_access=True, 13 | check_company=True, 14 | compute="_compute_receiptbook", 15 | store=True, 16 | domain="[('partner_type', '=', partner_type)]", 17 | ) 18 | 19 | def write(self, vals): 20 | if "receiptbook_id" in vals and any(rec.receiptbook_id.id != vals["receiptbook_id"] for rec in self): 21 | vals["name"] = "/" 22 | res = super().write(vals) 23 | return res 24 | 25 | def action_post(self): 26 | # si no tengo nombre y tengo talonario de recibo, numeramos con el talonario 27 | for rec in self.filtered( 28 | lambda x: x.receiptbook_id 29 | and (not x.name or x.name == "/" or (x.move_id and not x.move_id._get_last_sequence())) 30 | ): 31 | if not rec.receiptbook_id.active: 32 | raise ValidationError( 33 | _('Error! The receiptbook "%s" is archived. Please use a differente receipbook.') 34 | % rec.receiptbook_id.name 35 | ) 36 | 37 | res = super().action_post() 38 | # Reincorporamos el seteo del l10n_latam_document_type_id para el caso de usar talonario de recibo 39 | # Ya que debido al fix en 40 | # https://github.com/ingadhoc/account-payment/commit/8a6ff0564d3526ec8ead24c90a8e53267d038f6a 41 | # se esta evitando el recomputo para impedir que este vuelva a False. 42 | for rec in self.filtered(lambda x: x.receiptbook_id): 43 | rec.move_id.l10n_latam_document_type_id = rec.receiptbook_id.document_type_id.id 44 | 45 | for rec in self.filtered("receiptbook_id.mail_template_id"): 46 | rec.message_post_with_source(rec.receiptbook_id.mail_template_id, subtype_xmlid="mail.mt_comment") 47 | return res 48 | 49 | @api.depends("company_id", "partner_type", "is_internal_transfer") 50 | def _compute_receiptbook(self): 51 | for rec in self: 52 | if rec.is_internal_transfer or not rec.company_id.use_receiptbook: 53 | rec.receiptbook_id = False 54 | elif not rec.receiptbook_id or rec.receiptbook_id.company_id != rec.company_id: 55 | partner_type = rec.partner_type or self.env.context.get( 56 | "partner_type", self.env.context.get("default_partner_type", False) 57 | ) 58 | receiptbook = self.env["account.payment.receiptbook"].search( 59 | [ 60 | ("partner_type", "=", partner_type), 61 | ("company_id", "=", rec.company_id.id), 62 | ], 63 | limit=1, 64 | ) 65 | rec.receiptbook_id = receiptbook 66 | 67 | @api.depends() 68 | def _compute_name(self): 69 | super( 70 | AccountPayment, self.filtered(lambda x: not x.move_id or x.move_id.state != "draft" or not x.receiptbook_id) 71 | )._compute_name() 72 | -------------------------------------------------------------------------------- /account_payment_multi/views/account_portal_templates.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 38 | 39 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /account_payment_loan/wizards/account_loan_extra_charges.py: -------------------------------------------------------------------------------- 1 | from odoo import Command, _, api, fields, models 2 | 3 | 4 | class accountLoanExtraCharges(models.TransientModel): 5 | _name = "account.loan.extra.charges" 6 | _description = "Account Loan extra charges" 7 | 8 | partner_id = fields.Many2one("res.partner") 9 | company_id = fields.Many2one("res.company", required=True, default=lambda self: self.env.company) 10 | currency_id = fields.Many2one("res.currency", related="company_id.currency_id") 11 | label = fields.Char(required=True, default=lambda x: _("Extra Charges")) 12 | available_loan_move_ids = fields.Many2many( 13 | comodel_name="account.move", string="Loans", compute="_compute_available_loan_move_ids" 14 | ) 15 | loan_move_id = fields.Many2one( 16 | comodel_name="account.move", 17 | string="Loan", 18 | required=False, 19 | # domain=[('id', 'in', available_loan_move_id)] 20 | ) 21 | 22 | extra_charges = fields.Monetary(required=True) 23 | 24 | @api.depends("partner_id") 25 | def _compute_available_loan_move_ids(self): 26 | for rec in self: 27 | loan_account_id = self.env.company.loan_journal_id.default_account_id 28 | loan_line_ids = self.env["account.move.line"].search( 29 | [ 30 | ("company_id", "=", self.env.company.id), 31 | ("account_id", "=", loan_account_id.id), 32 | ("partner_id", "=", self.partner_id.id), 33 | ("parent_state", "=", "posted"), 34 | ("amount_residual", ">", 0), 35 | ] 36 | ) 37 | rec.available_loan_move_ids = [(6, 0, loan_line_ids.mapped("move_id").ids)] 38 | 39 | def action_add_extra_charges(self): 40 | loan_account_id = self.company_id.loan_journal_id.default_account_id 41 | extra_charges_account_id = self.company_id.account_loan_extra_charges 42 | if self.loan_move_id: 43 | base_loan_move_ids = self.loan_move_id.ids 44 | else: 45 | base_loan_move_ids = self.available_loan_move_ids.filtered(lambda x: not x.loan_move_ids).ids 46 | move_names = ", ".join(self.loan_move_id.mapped("name")) 47 | extra_charges_move_data = { 48 | "partner_id": self.partner_id.id, 49 | "journal_id": self.company_id.loan_journal_id.id, 50 | "ref": _("Extra Charges for Loan %s") % move_names if move_names else "", 51 | "loan_move_ids": [Command.set(base_loan_move_ids)], 52 | "line_ids": [ 53 | Command.create( 54 | { 55 | "account_id": extra_charges_account_id.id, 56 | "credit": self.extra_charges, 57 | "name": self.label, 58 | "currency_id": self.currency_id.id, 59 | } 60 | ), 61 | Command.create( 62 | { 63 | "account_id": loan_account_id.id, 64 | "debit": self.extra_charges, 65 | "name": self.label, 66 | "currency_id": self.currency_id.id, 67 | } 68 | ), 69 | ], 70 | } 71 | extra_charges_move = self.env["account.move"].create(extra_charges_move_data) 72 | extra_charges_move.action_post() 73 | -------------------------------------------------------------------------------- /l10n_ar_payment_bundle/README.md: -------------------------------------------------------------------------------- 1 | # Argentinean Payment Bundle 2 | 3 | The **Argentinean Payment Bundle** module enhances Odoo's payment functionality by introducing features tailored to the Argentinean market. It allows for the management of complex payment scenarios, including payment bundles, linked payments, and withholding taxes. 4 | 5 | ## Features 6 | 7 | - **Payment Bundles**: Group multiple payments into a single main payment for easier management. 8 | - **Linked Payments**: Automatically create and manage linked payments associated with a main payment. 9 | - **Withholding Tax Management**: Integrates with the `l10n_ar_tax` module to handle withholding taxes during payment processing. 10 | - **Receipt Books**: Supports receipt book management for payments, leveraging the `account_payment_pro_receiptbook` module. 11 | - **Custom Payment Methods**: Adds a new payment method, `Payment multiple`, for both inbound and outbound payments. 12 | 13 | ## Known issues / Roadmap 14 | - ** Multiple receipt report not implemented in non Argentina companies 15 | - ** Payment regiter wizard should not allow to select payment bundle journal 16 | 17 | ## Installation 18 | 19 | To install this module, ensure the following dependencies are installed: 20 | 21 | - `account_payment_pro` 22 | - `l10n_ar_tax` 23 | - `account_payment_pro_receiptbook` 24 | 25 | Once the dependencies are installed, add this module to your Odoo instance and install it through the Apps menu. 26 | 27 | ## Configuration 28 | 29 | 1. **Payment Bundle Journals**: 30 | - Ensure that journals using the `Payment multiple` method are configured correctly. 31 | - Journals with this payment method cannot have a currency assigned. 32 | 33 | 2. **Receipt Books**: 34 | - Configure receipt books for managing payments if required. 35 | 36 | 3. **Withholding Taxes**: 37 | - Set up withholding taxes in the `l10n_ar_tax` module to integrate with payments. 38 | 39 | ## Usage 40 | 41 | ### Creating a Payment Bundle 42 | 1. Navigate to the **Payments** menu. 43 | 2. Create a new payment and select the `Payment multiple` method. 44 | 3. Add linked payments to the main payment as needed. 45 | 46 | ### Managing Linked Payments 47 | - Linked payments are automatically created and managed under the main payment. 48 | - Validation of linked payments must be done through the main payment to ensure consistency. 49 | 50 | ### Withholding Taxes 51 | - Withholding taxes are automatically calculated and applied during payment processing if configured. 52 | 53 | ### Receipt Books 54 | - Use receipt books to manage payment receipts if enabled. 55 | 56 | ## Technical Details 57 | 58 | - **Post-Initialization Hook**: The module includes a post-init hook to create journals for companies using the Argentinean Chart of Accounts. 59 | - **Custom Payment Method**: The `Payment multiple` method is defined in the `data/account_payment_method_data.xml` file. 60 | - **Views**: Customizations to the payment form and tree views are defined in `views/account_payment_view.xml`. 61 | 62 | ## Credits 63 | 64 | - **Author**: ADHOC SA 65 | - **Website**: [www.adhoc.com.ar](https://www.adhoc.com.ar) 66 | - **License**: AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) 67 | 68 | ## Bug Tracker 69 | 70 | Bugs are tracked on [GitHub Issues](https://github.com/ingadhoc/account-payment/issues). If you encounter an issue, please report it with detailed feedback. 71 | 72 | ## Maintainer 73 | 74 | This module is maintained by **ADHOC SA**. For contributions or inquiries, visit [www.adhoc.com.ar](https://www.adhoc.com.ar). 75 | -------------------------------------------------------------------------------- /card_installment/demo/account_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 16 | 17 | 18 | 26 | 27 | 28 | 36 | 37 | 38 | 41 | 42 | 43 | 48 | 49 | 50 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /account_payment_loan/wizards/account_loan_debt_report.py: -------------------------------------------------------------------------------- 1 | from odoo import Command, _, api, fields, models 2 | 3 | 4 | class accountLoanDebtDeport(models.TransientModel): 5 | _name = "account.loan.debt.report" 6 | _description = "Account Loan debt report" 7 | 8 | partner_id = fields.Many2one("res.partner") 9 | company_id = fields.Many2one("res.company", required=True, default=lambda self: self.env.company) 10 | currency_id = fields.Many2one("res.currency", related="company_id.currency_id") 11 | amount = fields.Monetary() 12 | available_loan_move_ids = fields.Many2many( 13 | comodel_name="account.move", string="Loans", compute="_compute_available_loan_move_ids" 14 | ) 15 | loan_move_id = fields.Many2one( 16 | comodel_name="account.move", 17 | string="Loan", 18 | required=False, 19 | # domain=[('id', 'in', available_loan_move_id)] 20 | ) 21 | financial_surchage = fields.Monetary(compute="_compute_financial_surchage") 22 | move_line_ids = fields.Many2many( 23 | comodel_name="account.move.line", 24 | string="Loan Lines", 25 | ) 26 | amount_to_pay = fields.Monetary(compute="_compute_amount_to_pay") 27 | 28 | @api.onchange("loan_move_id") 29 | def _onchange_loan_move_id(self): 30 | if self.loan_move_id: 31 | self.move_line_ids = [Command.clear()] 32 | 33 | @api.depends("partner_id") 34 | def _compute_available_loan_move_ids(self): 35 | for rec in self: 36 | loan_account_id = self.env.company.loan_journal_id.default_account_id 37 | loan_line_ids = self.env["account.move.line"].search( 38 | [ 39 | ("company_id", "=", self.env.company.id), 40 | ("account_id", "=", loan_account_id.id), 41 | ("partner_id", "=", self.partner_id.id), 42 | ("parent_state", "=", "posted"), 43 | ("amount_residual", ">", 0), 44 | ] 45 | ) 46 | rec.available_loan_move_ids = [(6, 0, loan_line_ids.mapped("move_id").ids)] 47 | 48 | @api.depends("move_line_ids") 49 | def _compute_financial_surchage(self): 50 | for rec in self: 51 | rec.financial_surchage = rec.move_line_ids.mapped("move_id")._get_total_debit() or 0.0 52 | 53 | @api.depends("financial_surchage", "move_line_ids") 54 | def _compute_amount_to_pay(self): 55 | for rec in self: 56 | rec.amount_to_pay = rec.financial_surchage + sum(rec.move_line_ids.mapped("amount_residual")) 57 | 58 | def action_payment_items(self): 59 | return self.move_line_ids.action_payment_items_register_payment() 60 | 61 | def action_set_financial_surcharge(self): 62 | if self.loan_move_id: 63 | self.loan_move_id.create_financial_surchage_move() 64 | else: 65 | self.available_loan_move_ids.filtered(lambda x: not x.loan_move_ids).create_financial_surchage_move() 66 | 67 | def action_refinancial_loan(self): 68 | context = { 69 | "refinancial_loan_move_ids": [self.loan_move_id.id] 70 | if self.loan_move_id 71 | else self.available_loan_move_ids.ids, 72 | } 73 | return { 74 | "name": _("Refinancial Loan"), 75 | "res_model": "account.loan.register", 76 | "view_mode": "form", 77 | "views": [[False, "form"]], 78 | "context": context, 79 | "target": "new", 80 | "type": "ir.actions.act_window", 81 | } 82 | -------------------------------------------------------------------------------- /card_installment/models/account_card_installment.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # For copyright and license notices, see __manifest__.py file in module root 3 | # directory 4 | ############################################################################## 5 | from odoo import _, api, fields, models 6 | from odoo.exceptions import ValidationError 7 | 8 | 9 | class AccountCardInstallment(models.Model): 10 | _name = "account.card.installment" 11 | _description = "amount to add for collection in installments" 12 | 13 | card_id = fields.Many2one( 14 | "account.card", 15 | string="Card", 16 | required=True, 17 | ) 18 | name = fields.Char("Fantasy Name", default="/", help="Nombre informativo del plan a mostrar") 19 | divisor = fields.Integer(help="Número por el cual se dividirá el total de cuotas que pagará el usuario final") 20 | installment = fields.Integer( 21 | string="Installment Plan", 22 | help="Plan de cuotas a informar, en caso de utilizar método de pago electrónico: el valor del plan a informar al gateway de pago", 23 | ) 24 | surcharge_coefficient = fields.Float( 25 | default=1.0, 26 | digits="Installment coefficient", 27 | help="Factor a aplicar sobre el monto total para calcular el cargo financiero. Por ejemplo el formato para el recargo de un 6% se aplica con el valor 1.06.", 28 | ) 29 | bank_discount = fields.Float( 30 | help="Porcentaje de reintegro (el reintegro se efectúa sobre el total incluído el recargo financiero) que acuerda el vendedor con el banco o marca de tarjeta para devolución en compra" 31 | ) 32 | active = fields.Boolean(default=True) 33 | 34 | @api.depends("card_id", "card_id.name", "name") 35 | def _compute_display_name(self): 36 | for record in self: 37 | record.display_name = f"{record.name} ({record.card_id.name})" 38 | 39 | @api.constrains("divisor") 40 | def _check_divisor(self): 41 | for record in self: 42 | if record.divisor < 0: 43 | raise ValidationError(_("Divisor cannot be negative")) 44 | 45 | def get_fees(self, amount): 46 | self.ensure_one() 47 | return amount * self.surcharge_coefficient - amount 48 | 49 | def get_real_total(self, amount): 50 | self.ensure_one() 51 | return amount * self.surcharge_coefficient 52 | 53 | def card_installment_tree(self, amount_total): 54 | tree = {} 55 | for card in self.mapped("card_id"): 56 | tree[card.id] = card.map_card_values() 57 | 58 | for installment in self: 59 | tree[installment.card_id.id]["installments"].append(installment.map_installment_values(amount_total)) 60 | return tree 61 | 62 | def map_installment_values(self, amount_total): 63 | self.ensure_one() 64 | amount = amount_total * self.surcharge_coefficient 65 | installment_amount = amount / self.divisor if self.divisor > 0 else 0.0 66 | return { 67 | "id": self.id, 68 | "name": self.name, 69 | "installment": self.installment, 70 | "coefficient": self.surcharge_coefficient, 71 | "bank_discount": self.bank_discount, 72 | "divisor": self.divisor, 73 | "base_amount": amount_total, 74 | "amount": amount, 75 | "fee": amount - amount_total, 76 | "description": _("%s installment of %.2f (total %.2f)") % (self.divisor, installment_amount, amount), 77 | } 78 | -------------------------------------------------------------------------------- /l10n_latam_check_ux/views/l10n_latam_check_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | l10n_latam.check.form.inherited 5 | l10n_latam.check 6 | 7 | 8 | 9 | 10 |