TIP: You can type at any time to perform a new search.
Overdue Invoice Reminder
account_invoice_overdue_reminder · OCA/credit-control
- Repository
- OCA/credit-control · module folder · Try on Runboat
- Module version
- 1.4.0
- Category
- Accounting
- Folder size
- 0.87 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/credit-control
- Last tracking update
- 2026-08-07 08:43:06
- Authors
- Akretion, Odoo Community Association (OCA)
- Maintainers
- Akretion, Odoo Community Association (OCA)
- Committers
- Alexis de Lattre, Víctor Martínez, Florian da Costa, Weblate, OCA-git-bot, oca-ci, Diego Paradeda
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- oca_all
- Description
This Odoo module is designed to send overdue invoice reminders to customers. It handles reminders by e-mail, letter and phone. This module is an alternative to the OCA module *account_credit_control*. Why another module for invoice reminders ? Because the module *account_credit_control* is quite complex (we experienced that some users find it too complex and eventually stop using it) and its interface is designed to send massive volume of reminders. This module has been designed from the start with the following priorities: - **keep control**: you must keep tight control on the overdue invoice reminders that you send. Overdue invoice reminders are part of the communication with your customers, and this is very important to keep a good relation with your customers. - **usability**: the module is easy to configure and easy to use. - **no accounting skills needed**: the module can be used by users without accounting skills. It can even be used by salesman! - **multi-currency**: if you invoice your customer in another currency that your company currency, the invoice reminders only mention the currency of the invoices. And if you invoice a customer with different currencies, the reminder is clear and easy-to-understand by your customer, with a total residual per currency. - **multi-channel**: supports overdue invoice reminders by e-mail (default), phone and letter. - **simplicity**: for the developers, the code is small and easy to understand. The specifications written before starting the development of this module are written in this [document](https://docs.google.com/document/d/1JIIAP5QsItbJ1zLiaGHuR0RAQplEGv3diOl-d4mS__I/edit?usp=sharing) (in French). The module has one important limitation: it sends a reminder for an invoice when it has past it's *Due Date* (which is in fact the *Final Due Date*): if the invoice has a payment term with several lines, it won't send a reminder before the last term is overdue. An overdue reminder for a customer always include all the overdue invoices of that customer. The module supports a clever per-invoice reminder counter mechanism: - the reminder counter is a property of an invoice, - the reminder counter of each overdue invoice is incremented when sending a reminder by email or by post. It is not incremented for reminders by phone. - in an email or a letter, the subject will be *Overdue invoice reminder n°N* where N is the maximum value of the counter of the overdue invoices plus one. There are two user interfaces to send reminders: - the **one-by-one** interface, which displays one screen for each customer that has overdue invoices, one after the other. You should use this interface when you have a reasonable volume of reminders to send (less than 100 overdue reminders for example). It gives you a tight control on the reminders and the possibility to easily and rapidly customize the reminder e-mails. - the **mass** interface, which displays a list view of all customers that have overdue invoices, and you can process several reminders at the same time (via the *Actions* menu). This video tutorial in English will show you how to configure and use the module: [Youtube link](https://www.youtube.com/watch?v=MaOoVAi7Tc0).
Code Analysis ⓘ
Views touched (25)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
account_invoice_overdue_reminder.report_overdue_reminder_document |
account_invoice_overdue_reminder.report_overdue_reminder_document | ir.ui.view | qweb | New |
account_invoice_overdue_reminder_form |
account.invoice.overdue.reminder.form | account.invoice.overdue.reminder | form | New |
account_invoice_overdue_reminder_norelated_form |
account.invoice.overdue.reminder.norelated.form | account.invoice.overdue.reminder | form | New |
account_invoice_overdue_reminder_norelated_tree |
account.invoice.overdue.reminder.norelated.list | account.invoice.overdue.reminder | list | New |
account_invoice_overdue_reminder_search |
account.invoice.overdue.reminder.search | account.invoice.overdue.reminder | search | New |
account_invoice_overdue_reminder_tree |
account.invoice.overdue.reminder.list | account.invoice.overdue.reminder | list | New |
overdue_reminder_action_form |
overdue.reminder.action.form | overdue.reminder.action | form | New |
overdue_reminder_action_graph |
overdue.reminder.action.graph | overdue.reminder.action | graph | New |
overdue_reminder_action_pivot |
overdue.reminder.action.pivot | overdue.reminder.action | pivot | New |
overdue_reminder_action_search |
overdue.reminder.action.search | overdue.reminder.action | search | New |
overdue_reminder_action_tree |
overdue.reminder.action.list | overdue.reminder.action | list | New |
overdue_reminder_mass_update_form |
overdue.reminder.mass.update.form | overdue.reminder.mass.update | form | New |
overdue_reminder_result_form |
overdue.reminder.result.form | overdue.reminder.result | form | New |
overdue_reminder_result_search |
overdue.reminder.result.search | overdue.reminder.result | search | New |
overdue_reminder_result_tree |
overdue.reminder.result.list | overdue.reminder.result | list | New |
overdue_reminder_start_form |
overdue.reminder.start.form | overdue.reminder.start | form | New |
overdue_reminder_step_form |
overdue.reminder.step.form | overdue.reminder.step | form | New |
overdue_reminder_step_search |
overdue.reminder.step.search | overdue.reminder.step | search | New |
overdue_reminder_step_tree |
overdue.reminder.step.list | overdue.reminder.step | list | New |
report_overdue_reminder |
report_overdue_reminder | ir.ui.view | qweb | New |
view_account_config_settings |
overdue.reminder.res.config.settings.form | res.config.settings | form | Inherits account.res_config_settings_view_form |
view_account_invoice_filter |
overdue.reminder.customer.invoice.search | account.move | search | Inherits account.view_account_invoice_filter |
view_invoice_tree |
account.move | tree | Inherits account.view_invoice_tree | |
view_move_form |
overdue.reminder.customer.invoice.form | account.move | form | Inherits account.view_move_form |
view_partner_property_form |
overdue.reminder.res.partner.form | res.partner | form | Inherits account.view_partner_property_form |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (11)
New fields (14)
-
action_commercial_partner_idMany2onerelated='action_id.commercial_partner_id'store=True -
action_dateDaterelated='action_id.date'store=True -
action_idMany2one → overdue.reminder.actionondelete='cascade'string='Overdue Reminder Action' args: 'overdue.reminder.action' -
action_mail_ccCharreadonly=Truerelated='action_id.mail_id.email_cc'string='Cc' -
action_mail_idMany2onerelated='action_id.mail_id' -
action_mail_stateSelectionrelated='action_id.mail_id.state'string='E-mail Status' -
action_partner_idMany2onerelated='action_id.partner_id'store=True -
action_reminder_typeSelectionrelated='action_id.reminder_type'store=True -
action_result_idMany2onereadonly=Falserelated='action_id.result_id' -
action_result_notesHtmlreadonly=Falserelated='action_id.result_notes' -
action_user_idMany2onerelated='action_id.user_id' -
company_idMany2onerelated='invoice_id.company_id'store=True -
counterIntegerreadonly=True -
invoice_idMany2one → account.moveondelete='cascade'readonly=Truestring='Invoice' args: 'account.move'
-
invoice_id_check(self)@api.constrains('invoice_id')
New fields (6)
-
no_overdue_reminderBooleanstring='Disable Overdue Reminder'tracking=True -
overdueBooleancompute='_compute_overdue' -
overdue_remind_sentBooleancompute='_compute_overdue_reminder_sent' -
overdue_reminder_counterIntegercompute='_compute_overdue_reminder'help='This counter is not increased in case of phone reminder.'store=Truestring='Overdue Reminder Count' -
overdue_reminder_idsOne2many → account.invoice.overdue.reminderstring='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id' -
overdue_reminder_last_dateDatecompute='_compute_overdue_reminder'store=Truestring='Last Overdue Reminder Date'
No public methods.
New fields (13)
-
commercial_partner_idMany2one → res.partnerdomain=[('parent_id', '=', False)]index=Truereadonly=Truestring='Customer' args: 'res.partner' -
company_idMany2one → res.companyreadonly=Truestring='Company' args: 'res.company' -
dateDatedefault=fields.Date.context_todayindex=Truereadonly=Falserequired=True -
mail_ccCharreadonly=Truerelated='mail_id.email_cc' -
mail_idMany2one → mail.mailreadonly=Truestring='Reminder E-mail' args: 'mail.mail' -
mail_stateSelectionrelated='mail_id.state'string='E-mail Status' -
partner_idMany2one → res.partnerreadonly=Truestring='Contact' args: 'res.partner' -
reminder_countIntegercompute='_compute_invoice_count'store=Truestring='Number of invoices' -
reminder_idsOne2many → account.invoice.overdue.reminderreadonly=True args: 'account.invoice.overdue.reminder', 'action_id' -
reminder_typeSelectiondefault='mail'readonly=Truerequired=Truestring='Type' args: '_reminder_type_selection' -
result_idMany2one → overdue.reminder.resultondelete='restrict'string='Info/Result' args: 'overdue.reminder.result' -
result_notesHtmlstring='Info/Result Notes' -
user_idMany2one → res.usersdefault=<expr>ondelete='restrict'readonly=Truerequired=Truestring='Performed by' args: 'res.users'
No public methods.
New fields (2)
-
reminder_typeSelectionstring='New Reminder Type' args: '_reminder_type_selection' -
update_actionSelectionreadonly=Truerequired=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
-
run(self)
New fields (3)
-
activeBooleandefault=True -
nameCharrequired=Truetranslate=True -
sequenceInteger
No public methods.
New fields (8)
-
company_idMany2one → res.companydefault=<expr>readonly=Truerequired=True args: 'res.company' -
interfaceSelectiondefault='onebyone'required=Truestring='Wizard Interface' args: '_interface_selection' -
min_interval_daysIntegerhelp='Odoo will not propose to send a reminder to a customer that already got a reminder for some of the same overdue invoices less than N days ago (N = Minimum Delay Since Last Reminder).'string='Minimum Delay Since Last Reminder' -
partner_idsMany2many → res.partnerdomain=[('customer_rank', '>', 0), ('parent_id', '=', False)]string='Customers' args: 'res.partner' -
partner_policySelectionrequired=Truestring='Contact to Remind' args: '_partner_policy_selection' -
payment_idsMany2many → overdue.reminder.start.paymentreadonly=True args: 'overdue.reminder.start.payment' -
start_daysIntegerhelp='Odoo will propose to send an overdue reminder to a customer if it has at least one invoice which is overdue for more than N days (N = trigger delay).'string='Trigger Delay' -
user_idsMany2many → res.usersstring='Salesman' args: 'res.users'
-
default_get(self, fields_list)@api.model -
run(self)
New fields (5)
-
journal_idMany2one → account.journalreadonly=Truestring='Journal' args: 'account.journal' -
last_entry_create_dateDatetimereadonly=Truestring='Last Entry Created on' -
last_entry_create_uidMany2one → res.usersreadonly=Truestring='Last Entry Created by' args: 'res.users' -
last_entry_dateDatereadonly=Truestring='Last Entry' -
wizard_idMany2one → overdue.reminder.startondelete='cascade' args: 'overdue.reminder.start'
No public methods.
New fields (26)
-
activity_deadlineDateargs: 'Deadline' -
activity_noteHtmlstring='Note' -
activity_summaryCharstring='Summary' -
activity_type_idMany2one → mail.activity.typedomain=[('res_model', 'in', (False, 'overdue.reminder.step'))]string='Activity' args: 'mail.activity.type' -
activity_user_idMany2one → res.usersdefault=<expr>string='Assigned to' args: 'res.users' -
commercial_partner_idMany2one → res.partnerreadonly=Truerequired=Truestring='Customer' args: 'res.partner' -
company_idMany2one → res.companydefault=<expr>readonly=Truerequired=True args: 'res.company' -
counterIntegercompute='_compute_counter_and_mail'precompute=Truestore=Truestring='New Remind Counter' -
create_activityBoolean -
dateDatedefault=fields.Date.context_todayreadonly=True -
interfaceCharreadonly=True -
invoice_idsMany2many → account.movedomain="[('commercial_partner_id', '=', commercial_partner_id), ('company_id', '=', company_id), ('move_type', '=', 'out_invoice'), ('state', '=', 'posted'), ('payment_state', 'not in', ('paid', 'reversed', 'in_payment')), ('no_overdue_reminder', '=', False), ('invoice_date_due', '<', date)]"string='Overdue Invoices' args: 'account.move' -
letter_printedBooleanreadonly=True -
mail_bodyHtmlcompute='_compute_counter_and_mail'precompute=Truereadonly=Falsestore=True -
mail_cc_partner_idsMany2many → res.partnerstring='Cc' args: 'res.partner' -
mail_subjectCharcompute='_compute_counter_and_mail'precompute=Truereadonly=Falsestore=Truestring='Subject' -
partner_emailCharreadonly=Truerelated='partner_id.email' -
partner_idMany2one → res.partnerrequired=Truestring='Invoicing Contact' args: 'res.partner' -
partner_mobileCharreadonly=Truerelated='partner_id.mobile' -
partner_phoneCharreadonly=Truerelated='partner_id.phone' -
reminder_typeSelectiondefault='mail'required=True args: '_reminder_type_selection' -
result_idMany2one → overdue.reminder.resultstring='Call Result/Info' args: 'overdue.reminder.result' -
result_notesHtmlstring='Call Notes' -
stateSelectiondefault='draft'readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')] -
user_idMany2one → res.usersreadonly=Truerequired=True args: 'res.users' -
warn_unreconciled_move_line_idsMany2many → account.move.linereadonly=Truestring='Unreconciled Payments/Refunds' args: 'account.move.line'
-
check_warnings(self) -
generate_mail_vals(self) -
goto_list_view(self) -
next_step(self) -
print_invoices(self) -
print_letter(self) -
reminder_type_change(self)@api.onchange('reminder_type') -
skip(self) -
total_residual(self) -
validate(self) -
validate_mail(self) -
validate_phone(self) -
validate_post(self)
New fields (5)
-
overdue_reminder_attach_invoiceBooleandefault=Truestring='Attach Invoices to Overdue Reminder E-mails' -
overdue_reminder_interfaceSelectiondefault='onebyone'string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection' -
overdue_reminder_min_interval_daysIntegerdefault=5help='Default overdue reminder minimum interval in days'string='Default Overdue Reminder Minimum Interval' -
overdue_reminder_partner_policySelectiondefault='last_reminder'string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection' -
overdue_reminder_start_daysIntegerhelp='Default overdue reminder trigger delay in days'string='Default Overdue Reminder Trigger Delay'
No public methods.
New fields (5)
-
overdue_reminder_attach_invoiceBooleanreadonly=Falserelated='company_id.overdue_reminder_attach_invoice' -
overdue_reminder_interfaceSelectionreadonly=Falserelated='company_id.overdue_reminder_interface' -
overdue_reminder_min_interval_daysIntegerreadonly=Falserelated='company_id.overdue_reminder_min_interval_days' -
overdue_reminder_partner_policySelectionreadonly=Falserelated='company_id.overdue_reminder_partner_policy' -
overdue_reminder_start_daysIntegerreadonly=Falserelated='company_id.overdue_reminder_start_days'
No public methods.
New fields (1)
-
no_overdue_reminderBooleancompany_dependent=Truestring='Disable Overdue Invoice Reminder'
No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
- Status
- Open migration PR — not merged yet for this version
- CI status
- green — ready to merge
- Open since
- 114 days ago
- Last activity
- 15 days ago
- Repository
- OCA/credit-control
- Pull request
- [19.0] [MIG] account_invoice_overdue_reminder: Migration to 19.0 (#560)