diff --git a/account_banking_ach_discount/README.rst b/account_banking_ach_discount/README.rst index 3c82bac0..9044807f 100644 --- a/account_banking_ach_discount/README.rst +++ b/account_banking_ach_discount/README.rst @@ -17,13 +17,13 @@ Discount on ACH batch payments :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--usa-lightgray.png?logo=github - :target: https://github.com/OCA/l10n-usa/tree/14.0/account_banking_ach_discount + :target: https://github.com/OCA/l10n-usa/tree/16.0/account_banking_ach_discount :alt: OCA/l10n-usa .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/l10n-usa-14-0/l10n-usa-14-0-account_banking_ach_discount + :target: https://translation.odoo-community.org/projects/l10n-usa-16-0/l10n-usa-16-0-account_banking_ach_discount :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-usa&target_branch=14.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-usa&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -87,7 +87,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -107,6 +107,9 @@ Contributors * Bhavesh Odedra * Maxime Chambreuil +* ForgeFlow + * Jasmin Solanki + Maintainers ~~~~~~~~~~~ @@ -128,6 +131,6 @@ Current `maintainer `__: |maintainer-bodedra| -This module is part of the `OCA/l10n-usa `_ project on GitHub. +This module is part of the `OCA/l10n-usa `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_banking_ach_discount/static/description/index.html b/account_banking_ach_discount/static/description/index.html index efab1716..dacf4b39 100644 --- a/account_banking_ach_discount/static/description/index.html +++ b/account_banking_ach_discount/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,7 +369,7 @@

Discount on ACH batch payments

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:49de557183014de2a8dba5fce829d24e0fd04061b538c048a3553c6f835b02b9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/l10n-usa Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/l10n-usa Translate me on Weblate Try me on Runboat

This module will add support for discount in ACH and batch ACH workflow.

Table of contents

@@ -450,7 +450,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -469,18 +469,22 @@

Contributors

  • Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
  • +
  • ForgeFlow <https://www.forgeflow.com> +* Jasmin Solanki <jasmin.solanki@forgeflow.com>
  • Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +Odoo Community Association +

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    Current maintainer:

    bodedra

    -

    This module is part of the OCA/l10n-usa project on GitHub.

    +

    This module is part of the OCA/l10n-usa project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/account_banking_ach_discount/tests/__init__.py b/account_banking_ach_discount/tests/__init__.py new file mode 100644 index 00000000..bc307d7a --- /dev/null +++ b/account_banking_ach_discount/tests/__init__.py @@ -0,0 +1 @@ +from . import test_account_banking_ach_discount diff --git a/account_banking_ach_discount/tests/test_account_banking_ach_discount.py b/account_banking_ach_discount/tests/test_account_banking_ach_discount.py new file mode 100644 index 00000000..2aec385b --- /dev/null +++ b/account_banking_ach_discount/tests/test_account_banking_ach_discount.py @@ -0,0 +1,179 @@ +# Copyright (C) 2024, ForgeFlow S.A. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from datetime import datetime, timedelta + +from odoo.tests.common import Form, TransactionCase + + +class TestPayment(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.payment_method_model = cls.env["account.payment.method"] + cls.payment_term_model = cls.env["account.payment.term"] + cls.account_invoice_model = cls.env["account.move"] + cls.account_model = cls.env["account.account"] + Journal = cls.env["account.journal"] + + cls.journal_sale = Journal.search([("type", "=", "sale")], limit=1) + cls.income_account = cls.account_model.search( + [ + ( + "account_type", + "=", + "income_other", + ) + ], + limit=1, + ) + cls.partner = cls.env["res.partner"].create({"name": "Partner 1"}) + cls.company = cls.env.ref("base.main_company") + cls.company.partner_id = cls.partner.id + cls.company.legal_id_number = "12-3456789" + cls.payment_method_line = cls.env["account.payment.method.line"].search( + [("code", "=", "ACH-In")], limit=1 + ) + cls.ach_payment_method_01 = cls.payment_method_model.search( + [("code", "=", "ACH-In")], limit=1 + ) + cls.acme_bank = cls.env["res.bank"].create( + { + "name": "ACME Bank", + "bic": "GEBABEBB03B", + "city": "Charleroi", + "routing_number": "021000021", + "country": cls.env.ref("base.be").id, + } + ) + bank_account = cls.env["res.partner.bank"].create( + { + "acc_number": "0023032234211123", + "partner_id": cls.partner.id, + "bank_id": cls.acme_bank.id, + "company_id": cls.company.id, + } + ) + cls.mandate = cls.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2024-01-01", + "company_id": cls.company.id, + "delay_days": 1, + } + ) + cls.mandate.validate() + cls.journal_c1 = cls.env["account.journal"].create( + { + "name": "Journal 1", + "code": "J1", + "type": "bank", + "company_id": cls.company.id, + "bank_account_id": bank_account.id, + } + ) + cls.inbound_mode = cls.env.ref("account_payment_mode.payment_mode_inbound_dd1") + cls.journal = cls.env["account.journal"].search( + [("type", "=", "bank"), ("company_id", "=", cls.env.user.company_id.id)], + limit=1, + ) + cls.payment_mode_c1 = cls.env["account.payment.mode"].create( + { + "name": "ACH Direct Debit", + "bank_account_link": "variable", + "payment_method_id": cls.ach_payment_method_01.id, + "company_id": cls.company.id, + "fixed_journal_id": cls.journal_c1.id, + "variable_journal_ids": [(6, 0, [cls.journal_c1.id])], + } + ) + + # Create account for invoice discount + cls.account_discount = cls.account_model.create( + dict( + code="custaccdiscount", + name="Discount Expenses", + account_type="expense", + reconcile=True, + ) + ) + + # Create Payment term + cls.payment_term = cls.payment_term_model.create( + dict( + name="5%10 NET30", + is_discount=True, + note="5% discount if payment done within 10 days, otherwise net", + line_ids=[ + ( + 0, + 0, + { + "value": "balance", + "discount_percentage": 5.0, + "discount_days": 10, + "discount_expense_account_id": cls.account_discount.id, + "days": 30, + }, + ) + ], + ) + ) + + def test_account_payment_order_ach_discount(self): + + # Create customer invoice + self.customer_invoice = self.account_invoice_model.create( + dict( + name="Test Customer Invoice", + move_type="out_invoice", + invoice_date=datetime.today() - timedelta(days=1), + invoice_payment_term_id=self.payment_term.id, + journal_id=self.journal_sale.id, + partner_id=self.partner.id, + ) + ) + # Prepare invoice line values + self.customer_invoice.write( + { + "invoice_line_ids": [ + ( + 0, + 0, + { + "product_id": self.env.ref("product.product_product_5").id, + "quantity": 10.0, + "account_id": self.income_account.id, + "name": "product test 5", + "price_unit": 100.00, + }, + ) + ] + } + ) + # Validate customer invoice + self.customer_invoice.action_post() + + with Form( + self.env["account.payment.register"].with_context( + active_ids=self.customer_invoice.ids, + batch=True, + active_model="account.move", + ) + ) as register_wizard_form: + register_wizard_form.payment_method_line_id = self.payment_method_line + register_wizard = register_wizard_form.save() + # check 5% discount applied on payment + self.assertEqual( + register_wizard.payment_difference, + self.customer_invoice.amount_total * 0.05, + ) + payment_order_dict = register_wizard.make_payments() + payment_order = self.env["account.payment.order"].browse( + payment_order_dict["res_id"] + ) + payment_order.journal_id = self.journal_c1.id + payment_order.draft2open() + payment_order.payment_line_ids.payment_ids.mandate_id = self.mandate + payment_order.generate_payment_file() + payment_order.generated2uploaded()