From a0b5f118f91e328ae0fb6b66b0b06d6904de4172 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Mon, 1 Jul 2019 10:37:18 -0500 Subject: [PATCH 01/60] [ADD] account_banking_ach_base --- account_banking_ach_base/README.rst | 39 +++++ account_banking_ach_base/__init__.py | 1 + account_banking_ach_base/__manifest__.py | 24 +++ account_banking_ach_base/models/__init__.py | 7 + .../models/account_banking_mandate.py | 48 ++++++ .../models/account_invoice.py | 27 ++++ .../models/account_payment_order.py | 138 ++++++++++++++++++ account_banking_ach_base/models/base.py | 42 ++++++ account_banking_ach_base/models/res_bank.py | 30 ++++ .../models/res_company.py | 12 ++ .../models/res_partner.py | 6 + account_banking_ach_base/requirements.txt | 2 + .../views/account_banking_mandate.xml | 15 ++ .../views/account_invoice.xml | 17 +++ account_banking_ach_base/views/res_bank.xml | 15 ++ .../views/res_company.xml | 16 ++ .../views/res_partner.xml | 15 ++ 17 files changed, 454 insertions(+) create mode 100644 account_banking_ach_base/README.rst create mode 100644 account_banking_ach_base/__init__.py create mode 100644 account_banking_ach_base/__manifest__.py create mode 100644 account_banking_ach_base/models/__init__.py create mode 100644 account_banking_ach_base/models/account_banking_mandate.py create mode 100644 account_banking_ach_base/models/account_invoice.py create mode 100644 account_banking_ach_base/models/account_payment_order.py create mode 100644 account_banking_ach_base/models/base.py create mode 100644 account_banking_ach_base/models/res_bank.py create mode 100644 account_banking_ach_base/models/res_company.py create mode 100644 account_banking_ach_base/models/res_partner.py create mode 100644 account_banking_ach_base/requirements.txt create mode 100644 account_banking_ach_base/views/account_banking_mandate.xml create mode 100644 account_banking_ach_base/views/account_invoice.xml create mode 100644 account_banking_ach_base/views/res_bank.xml create mode 100644 account_banking_ach_base/views/res_company.xml create mode 100644 account_banking_ach_base/views/res_partner.xml diff --git a/account_banking_ach_base/README.rst b/account_banking_ach_base/README.rst new file mode 100644 index 00000000..49fd5f4b --- /dev/null +++ b/account_banking_ach_base/README.rst @@ -0,0 +1,39 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 + +======================= +Counting House ACH Base +======================= + +Add fields to Bank, Partner and Company required for ACH transactions in USA. + +Installation +============ + +This module depends on : + +* stdnum + + +Usage +===== + +Add `routing_number` on Bank records. + +Add Legal ID on Partner and Company records. + +Add Mandate URL field to Company record. Use in email templates to provide customer with an easy +way to access your Mandate Authorization form to streamline ACH authorizations. + +Known issues / Roadmap +====================== + + * Add support for EFT 1464 byte payment files required in Canada + +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 smashing it by providing a detailed and welcomed feedback. diff --git a/account_banking_ach_base/__init__.py b/account_banking_ach_base/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/account_banking_ach_base/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_banking_ach_base/__manifest__.py b/account_banking_ach_base/__manifest__.py new file mode 100644 index 00000000..178a8505 --- /dev/null +++ b/account_banking_ach_base/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2018 Thinkwell Designs +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Localizations for North American Banking & Financials', + 'summary': 'Add fields required for North American Banking & Financials', + 'version': '11.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'Thinkwell Designs', + 'website': 'https://github.com/thinkwelltwd/countinghouse', + 'category': 'Banking addons', + 'depends': [ + 'account_payment_order', + 'account_banking_mandate', + ], + 'data': [ + 'views/account_banking_mandate.xml', + 'views/account_invoice.xml', + 'views/res_bank.xml', + 'views/res_company.xml', + 'views/res_partner.xml', + ], + 'installable': True, +} diff --git a/account_banking_ach_base/models/__init__.py b/account_banking_ach_base/models/__init__.py new file mode 100644 index 00000000..736d9c5a --- /dev/null +++ b/account_banking_ach_base/models/__init__.py @@ -0,0 +1,7 @@ +from . import account_banking_mandate +from . import account_invoice +from . import account_payment_order +from . import base +from . import res_bank +from . import res_company +from . import res_partner diff --git a/account_banking_ach_base/models/account_banking_mandate.py b/account_banking_ach_base/models/account_banking_mandate.py new file mode 100644 index 00000000..183d40e9 --- /dev/null +++ b/account_banking_ach_base/models/account_banking_mandate.py @@ -0,0 +1,48 @@ +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class AccountBankingMandate(models.Model): + _inherit = 'account.banking.mandate' + + delay_days = fields.Integer(string='Delay Days', required=True, default=10, + help='Number of days to wait after invoice date before ' + 'including an invoice in Payment Order for processing.', + ) + + def validate(self): + for mandate in self: + if not mandate.delay_days: + raise UserError('Delay days must be specified, and greater than 0.') + + super(AccountBankingMandate, self).validate() + + def set_payment_modes_on_partner(self): + """ + Set the payment modes on the Partner if they don't already exist. + """ + payment_modes = {} + + if self.partner_id.customer and not self.partner_id.customer_payment_mode_id: + customer_mode = self.env['account.payment.mode'].search([ + ('payment_type', '=', 'inbound'), + ('company_id', '=', self.company_id.id), + ], limit=1) + if customer_mode: + payment_modes['customer_payment_mode_id'] = customer_mode.id + if self.partner_id.supplier and not self.partner_id.supplier_payment_mode_id: + supplier_mode = self.env['account.payment.mode'].search([ + ('payment_type', '=', 'outbound'), + ('company_id', '=', self.company_id.id), + ], limit=1) + if supplier_mode: + payment_modes['supplier_payment_mode_id'] = supplier_mode.id + + if payment_modes: + self.partner_id.write(payment_modes) + + @api.model + def create(self, vals): + mandate = super(AccountBankingMandate, self).create(vals) + self.set_payment_modes_on_partner() + return mandate diff --git a/account_banking_ach_base/models/account_invoice.py b/account_banking_ach_base/models/account_invoice.py new file mode 100644 index 00000000..e95473a3 --- /dev/null +++ b/account_banking_ach_base/models/account_invoice.py @@ -0,0 +1,27 @@ +from datetime import date, timedelta +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + @api.multi + def create_account_payment_line(self): + today = date.today() + + for invoice in self: + mandate = invoice.mandate_id + if not mandate: + continue + + invoice_date = fields.Date.from_string(invoice.date_invoice) + delay_expired = invoice_date + timedelta(days=mandate.delay_days) + + if today < delay_expired: + raise UserError( + 'To satisfy payment mandate, cannot add invoice %s to Debit Order until %s!' % + (invoice.number, delay_expired.strftime('%Y-%m-%d')) + ) + + return super(AccountInvoice, self).create_account_payment_line() diff --git a/account_banking_ach_base/models/account_payment_order.py b/account_banking_ach_base/models/account_payment_order.py new file mode 100644 index 00000000..847c6bc2 --- /dev/null +++ b/account_banking_ach_base/models/account_payment_order.py @@ -0,0 +1,138 @@ +from odoo import api, models, fields, _ +from odoo.exceptions import UserError +from string import ascii_uppercase +from ach.builder import AchFile + + +CREDIT_AUTOMATED_RETURN = '21' +CREDIT_AUTOMATED_DEPOSIT = '22' +CREDIT_PRENOTE_DNE_ENR = '23' +CREDIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA = '24' + +DEBIT_AUTOMATED_RETURN = '26' +DEBIT_AUTOMATED_PAYMENT = '27' +DEBIT_PRENOTE_DNE_ENR = '28' +DEBIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA = '29' + + +class AccountPaymentOrder(models.Model): + _inherit = 'account.payment.order' + + def get_file_id_mod(self): + """ + ACH file_id_mod should be 'A' for the first of the day, + 'B' for the second and so on. + """ + ach_transactions_today = self.env['account.payment.order'].search_count([ + ('create_date', '>=', fields.Date.today()), + ('company_partner_bank_id', '=', self.company_partner_bank_id.id), + ('state', 'in', ['generated', 'uploaded']), + ('payment_mode_id.payment_method_id.code', 'in', ['ACH-In', 'ACH-Out']), + ]) + + return ascii_uppercase[ach_transactions_today] + + def ach_settings(self): + bank = self.company_partner_bank_id.bank_id + routing_number = bank.routing_number + legal_id_number = self.company_id.legal_id_number + + if not legal_id_number: + raise UserError( + '%s does not have an EIN / SSN / BN assigned!' % self.company_id.name + ) + + if not routing_number: + raise UserError( + '%s does not have a Routing Number assigned!' % bank.name + ) + + return { + 'immediate_dest': self.company_partner_bank_id.acc_number, + 'immediate_org': routing_number, + 'immediate_dest_name': bank.name, + 'immediate_org_name': self.company_id.name, + 'company_id': legal_id_number, + } + + def validate_banking(self, line): + if not line.partner_bank_id.bank_id: + raise UserError( + _('%s account number has no Bank assigned' % line.partner_bank_id.acc_number) + ) + + if not line.partner_bank_id.bank_id.routing_number: + raise UserError( + _('%s has no routing number specified' % line.partner_bank_id.bank_id.name) + ) + + def validate_mandates(self, line): + """Ensure that mandates are correctly set""" + if not line.mandate_id: + raise UserError( + _("Missing ACH Direct Debit mandate on the " + "bank payment line with partner '%s' " + "(reference '%s').") + % (line.partner_id.name, line.name)) + if line.mandate_id.state != 'valid': + raise Warning( + _("The ACH Direct Debit mandate with reference '%s' " + "for partner '%s' has expired.") + % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name)) + if line.mandate_id.type == 'oneoff': + if line.mandate_id.last_debit_date: + raise Warning( + _("The mandate with reference '%s' for partner " + "'%s' has type set to 'One-Off' and it has a " + "last debit date set to '%s', so we can't use " + "it.") + % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name, + line.mandate_id.last_debit_date)) + + def get_transaction_type(self, amount): + if not amount: + return DEBIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA if self.payment_type == 'inbound' \ + else CREDIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA + + return DEBIT_AUTOMATED_PAYMENT if self.payment_type == 'inbound' \ + else CREDIT_AUTOMATED_DEPOSIT + + @api.multi + def generate_ach_file(self): + self.ensure_one() + + inbound_payment = self.payment_type == 'inbound' + + file_mod = self.get_file_id_mod() + ach_file = AchFile(file_id_mod=file_mod, settings=self.ach_settings()) + filename = '{today}_{bank}_{file_mod}.txt'.format( + today=fields.Date.today(), bank=self.company_partner_bank_id.id, file_mod=file_mod, + ) + + entries = [] + + for line in self.bank_line_ids: + + if inbound_payment: + self.validate_mandates(line) + + self.validate_banking(line) + + amount = line.amount_currency + entries.append({ + 'type': self.get_transaction_type(amount=amount), + 'routing_number': line.partner_bank_id.bank_id.routing_number, + 'account_number': line.partner_bank_id.acc_number, + 'amount': str(amount), + 'name': line.partner_id.name, + 'addenda': [{ + 'payment_related_info': line.communication, + }], + }) + + credits = self.payment_type == 'outbound' + ach_file.add_batch('PPD', entries, credits=credits, debits=inbound_payment) + + return ach_file.render_to_string(), filename diff --git a/account_banking_ach_base/models/base.py b/account_banking_ach_base/models/base.py new file mode 100644 index 00000000..44a94d66 --- /dev/null +++ b/account_banking_ach_base/models/base.py @@ -0,0 +1,42 @@ +from odoo import api, models, fields +from odoo.exceptions import UserError +from stdnum.us import ssn, ein +from stdnum.ca import bn + + +class LegalIDNumber(models.AbstractModel): + """ + Odoo's VAT field validation prevents it from being used + for EIN / GST / SSN, etc. + + Use generic ID and apply validation depending on the Country field. + """ + _name = 'countinghouse.legal_id_number' + + legal_id_number = fields.Char( + string='Legal ID', + required=False, + help='''For US entities, enter valid EIN or Social Security Number. + Canadian entities, enter Canadian Business Number. + ''' + ) + + @api.constrains('legal_id_number') + def validate_legal_id_number(self): + if not self.legal_id_number: + return + + valid = False + + for v in (ssn, ein, bn): + try: + v.validate(self.legal_id_number) + valid = True + break + except Exception: + continue + + if not valid: + raise UserError( + '%s is not a valid EIN / SSN / Canadian Business Number' % self.legal_id_number + ) diff --git a/account_banking_ach_base/models/res_bank.py b/account_banking_ach_base/models/res_bank.py new file mode 100644 index 00000000..d22951cd --- /dev/null +++ b/account_banking_ach_base/models/res_bank.py @@ -0,0 +1,30 @@ +from odoo import api, models, fields +from odoo.exceptions import ValidationError +from stdnum.us import rtn + + +class ResBank(models.Model): + _inherit = 'res.bank' + + routing_number = fields.Char(string='Routing Number', required=False) + + @api.constrains('routing_number') + def validate_routing_number(self): + if not self.routing_number or not self.country: + return + + country_code = self.country.code + + if country_code == 'US': + try: + rtn.validate(self.routing_number) + except Exception: + raise ValidationError( + '%s is not a valid US routing number!' % self.routing_number + ) + + elif country_code == 'CA': + if len(self.routing_number) != 8 or not not self.routing_number.is_digit(): + raise ValidationError( + '%s is not a valid Canadian routing number!' % self.routing_number + ) diff --git a/account_banking_ach_base/models/res_company.py b/account_banking_ach_base/models/res_company.py new file mode 100644 index 00000000..33b73e36 --- /dev/null +++ b/account_banking_ach_base/models/res_company.py @@ -0,0 +1,12 @@ +from odoo import fields, models + + +class ResCompany(models.Model): + _name = 'res.company' + _inherit = ['countinghouse.legal_id_number', 'res.company'] + + mandate_url = fields.Char(string='Mandate URL', required=False, + help='Full URL to download ACH Mandate / Authorization form. Useful ' + 'to include in email templates for customer to access and ' + 'complete the Mandate form.' + ) diff --git a/account_banking_ach_base/models/res_partner.py b/account_banking_ach_base/models/res_partner.py new file mode 100644 index 00000000..ac54fe0b --- /dev/null +++ b/account_banking_ach_base/models/res_partner.py @@ -0,0 +1,6 @@ +from odoo import models + + +class ResPartner(models.Model): + _name = 'res.partner' + _inherit = ['countinghouse.legal_id_number', 'res.partner'] diff --git a/account_banking_ach_base/requirements.txt b/account_banking_ach_base/requirements.txt new file mode 100644 index 00000000..2695d2b9 --- /dev/null +++ b/account_banking_ach_base/requirements.txt @@ -0,0 +1,2 @@ +stdnum +python-ach \ No newline at end of file diff --git a/account_banking_ach_base/views/account_banking_mandate.xml b/account_banking_ach_base/views/account_banking_mandate.xml new file mode 100644 index 00000000..1749a2bc --- /dev/null +++ b/account_banking_ach_base/views/account_banking_mandate.xml @@ -0,0 +1,15 @@ + + + + + account.invoice.days.delay + account.banking.mandate + + + + + + + + + diff --git a/account_banking_ach_base/views/account_invoice.xml b/account_banking_ach_base/views/account_invoice.xml new file mode 100644 index 00000000..2158a184 --- /dev/null +++ b/account_banking_ach_base/views/account_invoice.xml @@ -0,0 +1,17 @@ + + + + + account.invoice.valid.mandate + account.invoice + + + + + + + + + diff --git a/account_banking_ach_base/views/res_bank.xml b/account_banking_ach_base/views/res_bank.xml new file mode 100644 index 00000000..32149882 --- /dev/null +++ b/account_banking_ach_base/views/res_bank.xml @@ -0,0 +1,15 @@ + + + + + Bank Routing Transit Number + res.bank + + + + + + + + + diff --git a/account_banking_ach_base/views/res_company.xml b/account_banking_ach_base/views/res_company.xml new file mode 100644 index 00000000..4a05d2c3 --- /dev/null +++ b/account_banking_ach_base/views/res_company.xml @@ -0,0 +1,16 @@ + + + + + Company Legal ID Number + res.company + + + + + + + + + + diff --git a/account_banking_ach_base/views/res_partner.xml b/account_banking_ach_base/views/res_partner.xml new file mode 100644 index 00000000..a97a63cf --- /dev/null +++ b/account_banking_ach_base/views/res_partner.xml @@ -0,0 +1,15 @@ + + + + + Partner Legal ID Number + res.partner + + + + + + + + + From 35d13511cd2e3ae1518cd5edf0cf272e4fd632d8 Mon Sep 17 00:00:00 2001 From: Murtuza Saleh Date: Thu, 4 Jul 2019 20:17:18 +0530 Subject: [PATCH 02/60] [IMP] account_banking_ach_base: Improved code. --- account_banking_ach_base/README.rst | 84 +++- account_banking_ach_base/__init__.py | 2 + account_banking_ach_base/__manifest__.py | 11 +- account_banking_ach_base/models/__init__.py | 2 + .../models/account_banking_mandate.py | 25 +- .../models/account_invoice.py | 12 +- .../models/account_payment_order.py | 76 ++-- account_banking_ach_base/models/base.py | 15 +- account_banking_ach_base/models/res_bank.py | 18 +- .../models/res_company.py | 8 +- .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 1 + account_banking_ach_base/readme/USAGE.rst | 6 + account_banking_ach_base/requirements.txt | 2 - .../static/description/index.html | 429 ++++++++++++++++++ .../views/account_banking_mandate.xml | 8 +- .../views/account_invoice.xml | 3 +- 17 files changed, 593 insertions(+), 112 deletions(-) create mode 100644 account_banking_ach_base/readme/CONTRIBUTORS.rst create mode 100644 account_banking_ach_base/readme/DESCRIPTION.rst create mode 100644 account_banking_ach_base/readme/USAGE.rst delete mode 100644 account_banking_ach_base/requirements.txt create mode 100644 account_banking_ach_base/static/description/index.html diff --git a/account_banking_ach_base/README.rst b/account_banking_ach_base/README.rst index 49fd5f4b..a639ec3f 100644 --- a/account_banking_ach_base/README.rst +++ b/account_banking_ach_base/README.rst @@ -1,19 +1,36 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 +===================================================== +Localizations for North American Banking & Financials +===================================================== -======================= -Counting House ACH Base -======================= +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Add fields to Bank, Partner and Company required for ACH transactions in USA. +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--usa-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-usa/tree/12.0/account_banking_ach_base + :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-12-0/l10n-usa-12-0-account_banking_ach_base + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/203/12.0 + :alt: Try me on Runbot -Installation -============ +|badge1| |badge2| |badge3| |badge4| |badge5| -This module depends on : +Add fields to Bank, Partner and Company required for ACH transactions in USA. -* stdnum +**Table of contents** +.. contents:: + :local: Usage ===== @@ -25,15 +42,44 @@ Add Legal ID on Partner and Company records. Add Mandate URL field to Company record. Use in email templates to provide customer with an easy way to access your Mandate Authorization form to streamline ACH authorizations. -Known issues / Roadmap -====================== - - * Add support for EFT 1464 byte payment files required in Canada - 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 smashing it by providing a detailed and welcomed feedback. +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Thinkwell Designs + +Contributors +~~~~~~~~~~~~ + +* Dave Burkholder +* Maxime Chambreuil +* Serpent Consulting Services Pvt. Ltd. + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/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_base/__init__.py b/account_banking_ach_base/__init__.py index 0650744f..83e553ac 100644 --- a/account_banking_ach_base/__init__.py +++ b/account_banking_ach_base/__init__.py @@ -1 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + from . import models diff --git a/account_banking_ach_base/__manifest__.py b/account_banking_ach_base/__manifest__.py index 178a8505..f88672c3 100644 --- a/account_banking_ach_base/__manifest__.py +++ b/account_banking_ach_base/__manifest__.py @@ -4,10 +4,10 @@ { 'name': 'Localizations for North American Banking & Financials', 'summary': 'Add fields required for North American Banking & Financials', - 'version': '11.0.1.0.0', + 'version': '12.0.1.0.0', 'license': 'AGPL-3', - 'author': 'Thinkwell Designs', - 'website': 'https://github.com/thinkwelltwd/countinghouse', + 'author': 'Thinkwell Designs, Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/l10n-usa', 'category': 'Banking addons', 'depends': [ 'account_payment_order', @@ -20,5 +20,10 @@ 'views/res_company.xml', 'views/res_partner.xml', ], + "external_dependencies": { + "python": ['stdnum', + 'ach', + ], + }, 'installable': True, } diff --git a/account_banking_ach_base/models/__init__.py b/account_banking_ach_base/models/__init__.py index 736d9c5a..03d74879 100644 --- a/account_banking_ach_base/models/__init__.py +++ b/account_banking_ach_base/models/__init__.py @@ -1,3 +1,5 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + from . import account_banking_mandate from . import account_invoice from . import account_payment_order diff --git a/account_banking_ach_base/models/account_banking_mandate.py b/account_banking_ach_base/models/account_banking_mandate.py index 183d40e9..48203cbe 100644 --- a/account_banking_ach_base/models/account_banking_mandate.py +++ b/account_banking_ach_base/models/account_banking_mandate.py @@ -1,20 +1,21 @@ -from odoo import api, fields, models +from odoo import api, fields, models, _ from odoo.exceptions import UserError class AccountBankingMandate(models.Model): _inherit = 'account.banking.mandate' - delay_days = fields.Integer(string='Delay Days', required=True, default=10, - help='Number of days to wait after invoice date before ' - 'including an invoice in Payment Order for processing.', - ) + delay_days = fields.Integer(string='Delay Days', required=True, + default=10, + help='''Number of days to wait after invoice + date before including an invoice in Payment + Order for processing.''') def validate(self): for mandate in self: if not mandate.delay_days: - raise UserError('Delay days must be specified, and greater than 0.') - + raise UserError(_('''Delay days must be specified, and + greater than 0.''')) super(AccountBankingMandate, self).validate() def set_payment_modes_on_partner(self): @@ -22,27 +23,27 @@ def set_payment_modes_on_partner(self): Set the payment modes on the Partner if they don't already exist. """ payment_modes = {} - - if self.partner_id.customer and not self.partner_id.customer_payment_mode_id: + if self.partner_id.customer and not \ + self.partner_id.customer_payment_mode_id: customer_mode = self.env['account.payment.mode'].search([ ('payment_type', '=', 'inbound'), ('company_id', '=', self.company_id.id), ], limit=1) if customer_mode: payment_modes['customer_payment_mode_id'] = customer_mode.id - if self.partner_id.supplier and not self.partner_id.supplier_payment_mode_id: + if self.partner_id.supplier and not \ + self.partner_id.supplier_payment_mode_id: supplier_mode = self.env['account.payment.mode'].search([ ('payment_type', '=', 'outbound'), ('company_id', '=', self.company_id.id), ], limit=1) if supplier_mode: payment_modes['supplier_payment_mode_id'] = supplier_mode.id - if payment_modes: self.partner_id.write(payment_modes) @api.model def create(self, vals): mandate = super(AccountBankingMandate, self).create(vals) - self.set_payment_modes_on_partner() + mandate.set_payment_modes_on_partner() return mandate diff --git a/account_banking_ach_base/models/account_invoice.py b/account_banking_ach_base/models/account_invoice.py index e95473a3..3ef29f90 100644 --- a/account_banking_ach_base/models/account_invoice.py +++ b/account_banking_ach_base/models/account_invoice.py @@ -1,5 +1,5 @@ from datetime import date, timedelta -from odoo import api, fields, models +from odoo import api, fields, models, _ from odoo.exceptions import UserError @@ -9,19 +9,15 @@ class AccountInvoice(models.Model): @api.multi def create_account_payment_line(self): today = date.today() - for invoice in self: mandate = invoice.mandate_id if not mandate: continue - invoice_date = fields.Date.from_string(invoice.date_invoice) delay_expired = invoice_date + timedelta(days=mandate.delay_days) - if today < delay_expired: raise UserError( - 'To satisfy payment mandate, cannot add invoice %s to Debit Order until %s!' % - (invoice.number, delay_expired.strftime('%Y-%m-%d')) - ) - + _('To satisfy payment mandate, cannot add invoice %s to ' + 'Debit Order until %s!' % + (invoice.number, delay_expired.strftime('%Y-%m-%d')))) return super(AccountInvoice, self).create_account_payment_line() diff --git a/account_banking_ach_base/models/account_payment_order.py b/account_banking_ach_base/models/account_payment_order.py index 847c6bc2..58667902 100644 --- a/account_banking_ach_base/models/account_payment_order.py +++ b/account_banking_ach_base/models/account_payment_order.py @@ -23,30 +23,29 @@ def get_file_id_mod(self): ACH file_id_mod should be 'A' for the first of the day, 'B' for the second and so on. """ - ach_transactions_today = self.env['account.payment.order'].search_count([ - ('create_date', '>=', fields.Date.today()), - ('company_partner_bank_id', '=', self.company_partner_bank_id.id), - ('state', 'in', ['generated', 'uploaded']), - ('payment_mode_id.payment_method_id.code', 'in', ['ACH-In', 'ACH-Out']), - ]) - + ach_transactions_today =\ + self.env['account.payment.order'].search_count([ + ('create_date', '>=', fields.Date.today()), + ('company_partner_bank_id', '=', + self.company_partner_bank_id.id), + ('state', 'in', ['generated', 'uploaded']), + ('payment_mode_id.payment_method_id.code', 'in', + ['ACH-In', 'ACH-Out']) + ]) return ascii_uppercase[ach_transactions_today] def ach_settings(self): bank = self.company_partner_bank_id.bank_id routing_number = bank.routing_number legal_id_number = self.company_id.legal_id_number - if not legal_id_number: raise UserError( - '%s does not have an EIN / SSN / BN assigned!' % self.company_id.name - ) + _('%s does not have an EIN / SSN / BN ' + 'assigned!' % self.company_id.name)) if not routing_number: raise UserError( - '%s does not have a Routing Number assigned!' % bank.name - ) - + _('%s does not have a Routing Number assigned!' % bank.name)) return { 'immediate_dest': self.company_partner_bank_id.acc_number, 'immediate_org': routing_number, @@ -58,13 +57,13 @@ def ach_settings(self): def validate_banking(self, line): if not line.partner_bank_id.bank_id: raise UserError( - _('%s account number has no Bank assigned' % line.partner_bank_id.acc_number) - ) + _('%s account number has no Bank ' + 'assigned' % line.partner_bank_id.acc_number)) if not line.partner_bank_id.bank_id.routing_number: raise UserError( - _('%s has no routing number specified' % line.partner_bank_id.bank_id.name) - ) + _('%s has no routing number ' + 'specified' % line.partner_bank_id.bank_id.name)) def validate_mandates(self, line): """Ensure that mandates are correctly set""" @@ -80,20 +79,20 @@ def validate_mandates(self, line): "for partner '%s' has expired.") % (line.mandate_id.unique_mandate_reference, line.mandate_id.partner_id.name)) - if line.mandate_id.type == 'oneoff': - if line.mandate_id.last_debit_date: - raise Warning( - _("The mandate with reference '%s' for partner " - "'%s' has type set to 'One-Off' and it has a " - "last debit date set to '%s', so we can't use " - "it.") - % (line.mandate_id.unique_mandate_reference, - line.mandate_id.partner_id.name, - line.mandate_id.last_debit_date)) + if line.mandate_id.type == 'oneoff' and \ + line.mandate_id.last_debit_date: + raise Warning( + _("The mandate with reference '%s' for partner " + "'%s' has type set to 'One-Off' and it has a " + "last debit date set to '%s', so we can't use " + "it.") % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name, + line.mandate_id.last_debit_date)) def get_transaction_type(self, amount): if not amount: - return DEBIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA if self.payment_type == 'inbound' \ + return DEBIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA if \ + self.payment_type == 'inbound' \ else CREDIT_ZERO_DOLLAR_ENTRY_WITH_ADDENDA return DEBIT_AUTOMATED_PAYMENT if self.payment_type == 'inbound' \ @@ -102,24 +101,18 @@ def get_transaction_type(self, amount): @api.multi def generate_ach_file(self): self.ensure_one() - inbound_payment = self.payment_type == 'inbound' - file_mod = self.get_file_id_mod() - ach_file = AchFile(file_id_mod=file_mod, settings=self.ach_settings()) + ach_file = AchFile(file_id_mod=file_mod, + settings=self.ach_settings()) filename = '{today}_{bank}_{file_mod}.txt'.format( - today=fields.Date.today(), bank=self.company_partner_bank_id.id, file_mod=file_mod, - ) - + today=fields.Date.today(), + bank=self.company_partner_bank_id.id, file_mod=file_mod) entries = [] - for line in self.bank_line_ids: - if inbound_payment: self.validate_mandates(line) - self.validate_banking(line) - amount = line.amount_currency entries.append({ 'type': self.get_transaction_type(amount=amount), @@ -131,8 +124,7 @@ def generate_ach_file(self): 'payment_related_info': line.communication, }], }) - - credits = self.payment_type == 'outbound' - ach_file.add_batch('PPD', entries, credits=credits, debits=inbound_payment) - + outbound_payment = self.payment_type == 'outbound' + ach_file.add_batch('PPD', entries, credits=outbound_payment, + debits=inbound_payment) return ach_file.render_to_string(), filename diff --git a/account_banking_ach_base/models/base.py b/account_banking_ach_base/models/base.py index 44a94d66..0490c4cc 100644 --- a/account_banking_ach_base/models/base.py +++ b/account_banking_ach_base/models/base.py @@ -1,4 +1,4 @@ -from odoo import api, models, fields +from odoo import api, fields, models, _ from odoo.exceptions import UserError from stdnum.us import ssn, ein from stdnum.ca import bn @@ -12,22 +12,20 @@ class LegalIDNumber(models.AbstractModel): Use generic ID and apply validation depending on the Country field. """ _name = 'countinghouse.legal_id_number' + _description = 'Countinghouse Legal Id Number' legal_id_number = fields.Char( string='Legal ID', required=False, - help='''For US entities, enter valid EIN or Social Security Number. + help='''For US entities, enter valid EIN or Social Security Number. Canadian entities, enter Canadian Business Number. - ''' - ) + ''') @api.constrains('legal_id_number') def validate_legal_id_number(self): if not self.legal_id_number: return - valid = False - for v in (ssn, ein, bn): try: v.validate(self.legal_id_number) @@ -35,8 +33,7 @@ def validate_legal_id_number(self): break except Exception: continue - if not valid: raise UserError( - '%s is not a valid EIN / SSN / Canadian Business Number' % self.legal_id_number - ) + _('%s is not a valid EIN / SSN / Canadian Business ' + 'Number' % self.legal_id_number)) diff --git a/account_banking_ach_base/models/res_bank.py b/account_banking_ach_base/models/res_bank.py index d22951cd..03198325 100644 --- a/account_banking_ach_base/models/res_bank.py +++ b/account_banking_ach_base/models/res_bank.py @@ -1,4 +1,4 @@ -from odoo import api, models, fields +from odoo import api, fields, models, _ from odoo.exceptions import ValidationError from stdnum.us import rtn @@ -6,25 +6,23 @@ class ResBank(models.Model): _inherit = 'res.bank' - routing_number = fields.Char(string='Routing Number', required=False) + routing_number = fields.Char(string='Routing Number') @api.constrains('routing_number') def validate_routing_number(self): if not self.routing_number or not self.country: return - country_code = self.country.code - if country_code == 'US': try: rtn.validate(self.routing_number) except Exception: raise ValidationError( - '%s is not a valid US routing number!' % self.routing_number - ) - + _('%s is not a valid US routing ' + 'number!' % self.routing_number)) elif country_code == 'CA': - if len(self.routing_number) != 8 or not not self.routing_number.is_digit(): + if len(self.routing_number) != 8 or not \ + self.routing_number.is_digit(): raise ValidationError( - '%s is not a valid Canadian routing number!' % self.routing_number - ) + _('%s is not a valid Canadian routing ' + 'number!' % self.routing_number)) diff --git a/account_banking_ach_base/models/res_company.py b/account_banking_ach_base/models/res_company.py index 33b73e36..03954b4a 100644 --- a/account_banking_ach_base/models/res_company.py +++ b/account_banking_ach_base/models/res_company.py @@ -6,7 +6,7 @@ class ResCompany(models.Model): _inherit = ['countinghouse.legal_id_number', 'res.company'] mandate_url = fields.Char(string='Mandate URL', required=False, - help='Full URL to download ACH Mandate / Authorization form. Useful ' - 'to include in email templates for customer to access and ' - 'complete the Mandate form.' - ) + help='''Full URL to download ACH Mandate / + Authorization form. Useful to include in email + templates for customer to access and + complete the Mandate form.''') diff --git a/account_banking_ach_base/readme/CONTRIBUTORS.rst b/account_banking_ach_base/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..5a46796e --- /dev/null +++ b/account_banking_ach_base/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Dave Burkholder +* Maxime Chambreuil +* Serpent Consulting Services Pvt. Ltd. diff --git a/account_banking_ach_base/readme/DESCRIPTION.rst b/account_banking_ach_base/readme/DESCRIPTION.rst new file mode 100644 index 00000000..f67cdafa --- /dev/null +++ b/account_banking_ach_base/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Add fields to Bank, Partner and Company required for ACH transactions in USA. diff --git a/account_banking_ach_base/readme/USAGE.rst b/account_banking_ach_base/readme/USAGE.rst new file mode 100644 index 00000000..381ada16 --- /dev/null +++ b/account_banking_ach_base/readme/USAGE.rst @@ -0,0 +1,6 @@ +Add `routing_number` on Bank records. + +Add Legal ID on Partner and Company records. + +Add Mandate URL field to Company record. Use in email templates to provide customer with an easy +way to access your Mandate Authorization form to streamline ACH authorizations. diff --git a/account_banking_ach_base/requirements.txt b/account_banking_ach_base/requirements.txt deleted file mode 100644 index 2695d2b9..00000000 --- a/account_banking_ach_base/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -stdnum -python-ach \ No newline at end of file diff --git a/account_banking_ach_base/static/description/index.html b/account_banking_ach_base/static/description/index.html new file mode 100644 index 00000000..aa11efe8 --- /dev/null +++ b/account_banking_ach_base/static/description/index.html @@ -0,0 +1,429 @@ + + + + + + +Localizations for North American Banking & Financials + + + +
+

Localizations for North American Banking & Financials

+ + +

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

+

Add fields to Bank, Partner and Company required for ACH transactions in USA.

+

Table of contents

+ +
+

Usage

+

Add routing_number on Bank records.

+

Add Legal ID on Partner and Company records.

+

Add Mandate URL field to Company record. Use in email templates to provide customer with an easy +way to access your Mandate Authorization form to streamline ACH authorizations.

+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Thinkwell Designs
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+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.

+

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_base/views/account_banking_mandate.xml b/account_banking_ach_base/views/account_banking_mandate.xml index 1749a2bc..142238a1 100644 --- a/account_banking_ach_base/views/account_banking_mandate.xml +++ b/account_banking_ach_base/views/account_banking_mandate.xml @@ -4,10 +4,14 @@ account.invoice.days.delay account.banking.mandate - + - + + + + 1 diff --git a/account_banking_ach_base/views/account_invoice.xml b/account_banking_ach_base/views/account_invoice.xml index 2158a184..27e4044b 100644 --- a/account_banking_ach_base/views/account_invoice.xml +++ b/account_banking_ach_base/views/account_invoice.xml @@ -1,7 +1,8 @@ - + account.invoice.valid.mandate account.invoice From cccb5524a0abee2ef5db46a426b97276c54d8524 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 5 Jul 2019 14:56:48 +0000 Subject: [PATCH 03/60] [UPD] Update account_banking_ach_base.pot --- .../i18n/account_banking_ach_base.pot | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 account_banking_ach_base/i18n/account_banking_ach_base.pot diff --git a/account_banking_ach_base/i18n/account_banking_ach_base.pot b/account_banking_ach_base/i18n/account_banking_ach_base.pot new file mode 100644 index 00000000..048aa843 --- /dev/null +++ b/account_banking_ach_base/i18n/account_banking_ach_base.pot @@ -0,0 +1,197 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_ach_base +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:60 +#, python-format +msgid "%s account number has no Bank assigned" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:48 +#, python-format +msgid "%s does not have a Routing Number assigned!" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:43 +#, python-format +msgid "%s does not have an EIN / SSN / BN assigned!" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:65 +#, python-format +msgid "%s has no routing number specified" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/res_bank.py:27 +#, python-format +msgid "%s is not a valid Canadian routing number!" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/base.py:38 +#, python-format +msgid "%s is not a valid EIN / SSN / Canadian Business Number" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/res_bank.py:21 +#, python-format +msgid "%s is not a valid US routing number!" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_res_bank +msgid "Bank" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_res_partner +msgid "Contact" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_countinghouse_legal_id_number +msgid "Countinghouse Legal Id Number" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_account_banking_mandate__delay_days +msgid "Delay Days" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_banking_mandate.py:17 +#, python-format +msgid "Delay days must be specified, and\n" +" greater than 0." +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_countinghouse_legal_id_number__display_name +msgid "Display Name" +msgstr "" + +#. module: account_banking_ach_base +#: model_terms:ir.ui.view,arch_db:account_banking_ach_base.view_company_legal_id_number +#: model_terms:ir.ui.view,arch_db:account_banking_ach_base.view_partner_legal_id_number +msgid "EIN / SSN / BN" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,help:account_banking_ach_base.field_countinghouse_legal_id_number__legal_id_number +#: model:ir.model.fields,help:account_banking_ach_base.field_res_company__legal_id_number +#: model:ir.model.fields,help:account_banking_ach_base.field_res_partner__legal_id_number +#: model:ir.model.fields,help:account_banking_ach_base.field_res_users__legal_id_number +msgid "For US entities, enter valid EIN or Social Security Number.\n" +" Canadian entities, enter Canadian Business Number.\n" +" " +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,help:account_banking_ach_base.field_res_company__mandate_url +msgid "Full URL to download ACH Mandate /\n" +" Authorization form. Useful to include in email\n" +" templates for customer to access and\n" +" complete the Mandate form." +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_countinghouse_legal_id_number__id +msgid "ID" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_countinghouse_legal_id_number____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_countinghouse_legal_id_number__legal_id_number +#: model:ir.model.fields,field_description:account_banking_ach_base.field_res_company__legal_id_number +#: model:ir.model.fields,field_description:account_banking_ach_base.field_res_partner__legal_id_number +#: model:ir.model.fields,field_description:account_banking_ach_base.field_res_users__legal_id_number +msgid "Legal ID" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_res_company__mandate_url +msgid "Mandate URL" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:72 +#, python-format +msgid "Missing ACH Direct Debit mandate on the bank payment line with partner '%s' (reference '%s')." +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,help:account_banking_ach_base.field_account_banking_mandate__delay_days +msgid "Number of days to wait after invoice\n" +" date before including an invoice in Payment\n" +" Order for processing." +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model,name:account_banking_ach_base.model_account_payment_order +msgid "Payment Order" +msgstr "" + +#. module: account_banking_ach_base +#: model_terms:ir.ui.view,arch_db:account_banking_ach_base.view_account_invoice_filter_valid_mandate_id +msgid "Ready for Payment Order" +msgstr "" + +#. module: account_banking_ach_base +#: model:ir.model.fields,field_description:account_banking_ach_base.field_res_bank__routing_number +msgid "Routing Number" +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:78 +#, python-format +msgid "The ACH Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_payment_order.py:85 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_ach_base +#: code:addons/account_banking_ach_base/models/account_invoice.py:22 +#, python-format +msgid "To satisfy payment mandate, cannot add invoice %s to Debit Order until %s!" +msgstr "" + From 3e861f8644188a1062f67e1474ca64516334c88f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 5 Jul 2019 15:29:24 +0000 Subject: [PATCH 04/60] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 account_banking_ach_base/static/description/icon.png diff --git a/account_banking_ach_base/static/description/icon.png b/account_banking_ach_base/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 65492fc399e9bcc21c3290c214953502676de00c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:08:44 +0000 Subject: [PATCH 05/60] [UPD] README.rst --- account_banking_ach_base/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_ach_base/static/description/index.html b/account_banking_ach_base/static/description/index.html index aa11efe8..7b30f812 100644 --- a/account_banking_ach_base/static/description/index.html +++ b/account_banking_ach_base/static/description/index.html @@ -3,7 +3,7 @@ - + Localizations for North American Banking & Financials + + +
+

Account Banking ACH Credit Transfer

+ + +

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

+

Create ACH files for Credit Transfers

+

Module to export credit transfers in Nacha file format.

+

Table of contents

+ +
+

Installation

+

This module depends on :

+
    +
  • account_banking_ach_base
  • +
  • carta-ach
  • +
  • stdnum
  • +
+
+
+

Configuration

+
    +
  1. Your Company record must have the Legal ID specified.
  2. +
  3. Your Bank must have the Routing Number specified.
  4. +
+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Thinkwell Designs
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+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.

+

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.

+
+
+
+ + From 11d56bf77166218faf056f447da2ac9d5078b0a5 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 8 Jul 2019 14:05:09 +0000 Subject: [PATCH 30/60] [ADD] icon.png --- .../account_banking_ach_credit_transfer.pot | 31 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 account_banking_ach_credit_transfer/i18n/account_banking_ach_credit_transfer.pot create mode 100644 account_banking_ach_credit_transfer/static/description/icon.png diff --git a/account_banking_ach_credit_transfer/i18n/account_banking_ach_credit_transfer.pot b/account_banking_ach_credit_transfer/i18n/account_banking_ach_credit_transfer.pot new file mode 100644 index 00000000..453e561f --- /dev/null +++ b/account_banking_ach_credit_transfer/i18n/account_banking_ach_credit_transfer.pot @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_ach_credit_transfer +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_banking_ach_credit_transfer +#: model:account.payment.method,name:account_banking_ach_credit_transfer.ach_credit_transfer +#: model:account.payment.mode,name:account_banking_ach_credit_transfer.payment_mode_outbound_ach_ct1 +msgid "ACH" +msgstr "" + +#. module: account_banking_ach_credit_transfer +#: model:ir.model,name:account_banking_ach_credit_transfer.model_account_payment_order +msgid "Payment Order" +msgstr "" + +#. module: account_banking_ach_credit_transfer +#: model:ir.ui.menu,name:account_banking_ach_credit_transfer.vendor_payment_orders +msgid "Payment Orders" +msgstr "" + diff --git a/account_banking_ach_credit_transfer/static/description/icon.png b/account_banking_ach_credit_transfer/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_banking_ach_credit_transfer/static/description/index.html b/account_banking_ach_credit_transfer/static/description/index.html index ddba504e..19eee584 100644 --- a/account_banking_ach_credit_transfer/static/description/index.html +++ b/account_banking_ach_credit_transfer/static/description/index.html @@ -3,7 +3,7 @@ - + Account Banking ACH Credit Transfer + + +
+

Account Banking ACH Direct Debit

+ + +

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

+

Create ACH files for Direct Debit

+

Module to export direct debit payment orders in Nacha file format.

+

Table of contents

+ +
+

Installation

+

This module depends on :

+
    +
  • account_banking_ach_base
  • +
  • carta-ach
  • +
  • stdnum
  • +
+
+
+

Configuration

+
    +
  1. Your Company record must have the Legal ID specified.
  2. +
  3. Your Bank must have the Routing Number specified.
  4. +
+

For defining a payment mode that uses ACH direct debit:

+
    +
  1. Go to Accounting > Configuration > Management > Payment Modes.
  2. +
  3. Create a Customer Invoice.
  4. +
  5. Select the Payment Method ACH (which is automatically created upon module installation).
  6. +
+
+
+

Usage

+

In the menu Accounting > Payments > Debit Order, create a new debit +order and select the Payment Mode dedicated to ACH Direct Debit that +you created during the configuration step.

+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Thinkwell Designs
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+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.

+

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_direct_debit/views/account_banking_mandate_view.xml b/account_banking_ach_direct_debit/views/account_banking_mandate_view.xml index 9e60cc2e..5d819c15 100644 --- a/account_banking_ach_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_ach_direct_debit/views/account_banking_mandate_view.xml @@ -4,7 +4,8 @@ ach.mandate.form account.banking.mandate - + ach.mandate.tree account.banking.mandate - + @@ -34,20 +36,23 @@ ach.mandate.search account.banking.mandate - + - - + + + context="{'group_by': 'type'}"/> + context="{'group_by': 'scheme'}"/> + string="Sequence Type" + context="{'group_by': 'recurrent_sequence_type'}"/> From ba988376600de98564732bebe4e9a889593ac2f8 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 9 Jul 2019 07:32:56 +0000 Subject: [PATCH 37/60] [UPD] Update account_banking_ach_direct_debit.pot --- .../i18n/account_banking_ach_direct_debit.pot | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 account_banking_ach_direct_debit/i18n/account_banking_ach_direct_debit.pot diff --git a/account_banking_ach_direct_debit/i18n/account_banking_ach_direct_debit.pot b/account_banking_ach_direct_debit/i18n/account_banking_ach_direct_debit.pot new file mode 100644 index 00000000..c640d4ae --- /dev/null +++ b/account_banking_ach_direct_debit/i18n/account_banking_ach_direct_debit.pot @@ -0,0 +1,181 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_ach_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_banking_mandate.py:101 +#, python-format +msgid "0 ACH Mandates had to be set to Expired" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model,name:account_banking_ach_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,format:0 +#: model:account.payment.method,name:account_banking_ach_direct_debit.ach_direct_debit +msgid "ACH" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:account.payment.mode,name:account_banking_ach_direct_debit.payment_mode_inbound_ach_dd1 +msgid "ACH Direct Debit of customers" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_banking_mandate.py:75 +#, python-format +msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_payment_order.py:51 +#, python-format +msgid "Automatically switched from First to Recurring when the debit order %s has been marked as uploaded." +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,format:0 +msgid "Basic Mandate" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,field_description:account_banking_ach_direct_debit.field_account_banking_mandate__display_name +msgid "Display Name" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,field_description:account_banking_ach_direct_debit.field_account_banking_mandate__format +msgid "Mandate Format" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_banking_mandate.py:74 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,type:0 +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_search +msgid "One-Off" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model,name:account_banking_ach_direct_debit.model_account_payment_order +msgid "Payment Order" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.ui.menu,name:account_banking_ach_direct_debit.customer_payment_orders +msgid "Payment Orders" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,type:0 +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_search +msgid "Recurrent" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,field_description:account_banking_ach_direct_debit.field_account_banking_mandate__scheme +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_search +msgid "Scheme" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_banking_mandate.py:83 +#, python-format +msgid "Searching for ACH Mandates that must be set to Expired" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_search +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_tree +msgid "Sequence Type" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,field_description:account_banking_ach_direct_debit.field_account_banking_mandate__recurrent_sequence_type +msgid "Sequence Type for Next Debit" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.actions.server,name:account_banking_ach_direct_debit.ach_mandate_expire_cron_ir_actions_server +#: model:ir.cron,cron_name:account_banking_ach_direct_debit.ach_mandate_expire_cron +#: model:ir.cron,name:account_banking_ach_direct_debit.ach_mandate_expire_cron +msgid "Set ACH Direct Debit Mandates to Expired" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_banking_mandate.py:98 +#, python-format +msgid "The following ACH Mandate IDs have been set to expired: %s" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: code:addons/account_banking_ach_direct_debit/models/account_banking_mandate.py:47 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,help:account_banking_ach_direct_debit.field_account_banking_mandate__recurrent_sequence_type +msgid "This field is only used for Recurrent mandates, not for\n" +" One-Off mandates." +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_search +#: model_terms:ir.ui.view,arch_db:account_banking_ach_direct_debit.view_mandate_tree +msgid "Type" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,field_description:account_banking_ach_direct_debit.field_account_banking_mandate__type +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_ach_direct_debit +#: model:ir.model.fields,field_description:account_banking_ach_direct_debit.field_account_banking_mandate__unique_mandate_reference +msgid "Unique Mandate Reference" +msgstr "" + From 81fed4cc8b9d2af227eb274f2f9bfb24d744606a Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 9 Jul 2019 08:01:57 +0000 Subject: [PATCH 38/60] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 account_banking_ach_direct_debit/static/description/icon.png diff --git a/account_banking_ach_direct_debit/static/description/icon.png b/account_banking_ach_direct_debit/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 5dba7329ba151e205e4291568062c9c82b4d0188 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:08:44 +0000 Subject: [PATCH 39/60] [UPD] README.rst --- account_banking_ach_direct_debit/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_ach_direct_debit/static/description/index.html b/account_banking_ach_direct_debit/static/description/index.html index cb70d720..a7748a23 100644 --- a/account_banking_ach_direct_debit/static/description/index.html +++ b/account_banking_ach_direct_debit/static/description/index.html @@ -3,7 +3,7 @@ - + Account Banking ACH Direct Debit