Overdue Invoice Reminder

account_invoice_overdue_reminder
REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/18.0/account_invoice_overdue_reminder
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, Víctor Martínez, Florian da Costa, Weblate, OCA-git-bot, oca-ci, Diego Paradeda
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:18
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 IDNameModelTypeStatus
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 block Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.move filter Inherits account.view_account_invoice_filter
view_invoice_tree account.move field Inherits account.view_invoice_tree
view_move_form overdue.reminder.customer.invoice.form account.move div Inherits account.view_move_form
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (11)

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Html
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.move
    ondelete='cascade' readonly=True string='Invoice' args: 'account.move'
Public methods (1)
  • invoice_id_check(self)
    @api.constrains('invoice_id')

New fields (6)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' tracking=True
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_remind_sent Boolean
    compute='_compute_overdue_reminder_sent'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Html
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (8)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer_rank', '>', 0), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment'
  • start_days Integer
    help='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_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (26)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    domain=[('res_model', 'in', (False, 'overdue.reminder.step'))] string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    compute='_compute_counter_and_mail' precompute=True store=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.move
    domain="[('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_printed Boolean
    readonly=True
  • mail_body Html
    compute='_compute_counter_and_mail' precompute=True readonly=False store=True
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    compute='_compute_counter_and_mail' precompute=True readonly=False store=True string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Html
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (13)
  • 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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 help='Default overdue reminder minimum interval in days' string='Default Overdue Reminder Minimum Interval'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    help='Default overdue reminder trigger delay in days' string='Default Overdue Reminder Trigger Delay'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/17.0/account_invoice_overdue_reminder
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Nils Coenen
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 IDNameModelTypeStatus
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 tree 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.tree account.invoice.overdue.reminder tree 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.tree overdue.reminder.action tree 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.tree overdue.reminder.result tree 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.tree overdue.reminder.step tree 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 block Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.move filter Inherits account.view_account_invoice_filter
view_invoice_tree account.move field Inherits account.view_invoice_tree
view_move_form overdue.reminder.customer.invoice.form account.move div Inherits account.view_move_form
view_partner_property_form overdue.reminder.res.partner.form res.partner xpath Inherits account.view_partner_property_form
Models touched (11)

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Html
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.move
    ondelete='cascade' readonly=True string='Invoice' args: 'account.move'
Public methods (1)
  • invoice_id_check(self)
    @api.constrains('invoice_id')

New fields (6)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' tracking=True
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_remind_sent Boolean
    compute='_compute_overdue_reminder_sent'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Html
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (0)

No public methods.

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (8)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer_rank', '>', 0), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment'
  • start_days Integer
    help='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_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (26)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    domain=[('res_model', 'in', (False, 'overdue.reminder.step'))] string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    compute='_compute_counter_and_mail' precompute=True store=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.move
    domain="[('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_printed Boolean
    readonly=True
  • mail_body Html
    compute='_compute_counter_and_mail' precompute=True readonly=False store=True
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    compute='_compute_counter_and_mail' precompute=True readonly=False store=True string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Html
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (13)
  • 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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 help='Default overdue reminder minimum interval in days' string='Default Overdue Reminder Minimum Interval'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    help='Default overdue reminder trigger delay in days' string='Default Overdue Reminder Trigger Delay'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/16.0/account_invoice_overdue_reminder
VERSION
VERSION 1.11.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, GitHub, Miquel Raïch, Weblate, OCA-git-bot, Andrea Stirpe, oca-ci, Lindsay, Diego Paradeda, Zina Rasoamanana
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
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.tree account.invoice.overdue.reminder tree 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.tree account.invoice.overdue.reminder tree 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.tree overdue.reminder.action tree 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.tree overdue.reminder.result tree 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_tree overdue.reminder.step.tree overdue.reminder.step tree 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 xpath Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.move filter Inherits account.view_account_invoice_filter
view_invoice_tree account.move field Inherits account.view_invoice_tree
view_move_form overdue.reminder.customer.invoice.form account.move div Inherits account.view_move_form
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (11)

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Html
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.move
    ondelete='cascade' readonly=True string='Invoice' args: 'account.move'
Public methods (2)
  • invoice_id_check(self)
    @api.constrains('invoice_id')
  • name_get(self)
    @api.depends('invoice_id', 'counter')

New fields (6)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' tracking=True
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_remind_sent Boolean
    compute='_compute_overdue_reminder_sent'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Html
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (1)
  • name_get(self)
    @api.depends('commercial_partner_id', 'date')

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (8)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer_rank', '>', 0), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment'
  • start_days Integer
    help='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_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (26)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    domain=[('res_model', 'in', (False, 'overdue.reminder.step'))] string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    compute='_compute_counter_and_mail' precompute=True store=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.move
    domain="[('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_printed Boolean
    readonly=True
  • mail_body Html
    compute='_compute_counter_and_mail' precompute=True readonly=False store=True
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    compute='_compute_counter_and_mail' precompute=True readonly=False store=True string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Html
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (13)
  • 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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 string='Default Overdue Reminder Minimum Interval (days)'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    string='Default Overdue Reminder Trigger Delay (days)'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/15.0/account_invoice_overdue_reminder
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, Miquel Raïch, Weblate, OCA-git-bot, oca-ci, Carlos Roca, Diego Paradeda, Jasmin Solanki
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
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.tree account.invoice.overdue.reminder tree 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.tree account.invoice.overdue.reminder tree 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.tree overdue.reminder.action tree New
overdue_reminder_end_form overdue.reminder.end.form overdue.reminder.end form 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.tree overdue.reminder.result tree 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_tree overdue.reminder.step.tree overdue.reminder.step tree 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 xpath Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.move filter Inherits account.view_account_invoice_filter
view_invoice_tree account.move field Inherits account.view_invoice_tree
view_move_form overdue.reminder.customer.invoice.form account.move div Inherits account.view_move_form
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (12)

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Text
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.move
    ondelete='cascade' readonly=True string='Invoice' args: 'account.move'
Public methods (2)
  • invoice_id_check(self)
    @api.constrains('invoice_id')
  • name_get(self)
    @api.depends('invoice_id', 'counter')

New fields (5)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' tracking=True
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Text
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (1)
  • name_get(self)
    @api.depends('commercial_partner_id', 'date')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer_rank', '>', 0), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment'
  • start_days Integer
    help='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'
  • up_to_date Boolean
    string='I consider that payments are up-to-date'
  • user_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (26)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    readonly=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.move
    readonly=True string='Overdue Invoices' args: 'account.move'
  • letter_printed Boolean
    readonly=True
  • mail_body Html
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Text
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (14)
  • check_warnings(self)
  • create(self, vals)
    @api.model
  • 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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 string='Default Overdue Reminder Minimum Interval (days)'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    string='Default Overdue Reminder Trigger Delay (days)'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/14.0/account_invoice_overdue_reminder
VERSION
VERSION 1.5.2
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, OCA Transbot, Miquel Raïch, JordiMForgeFlow, Sébastien BEAU, oca-travis, Weblate, OCA-git-bot, Carmen Bianca BAKKER, oca-ci, GuillemCForgeFlow, Judith, matthieu.saison, Peter Schwarz
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
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.tree account.invoice.overdue.reminder tree 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.tree account.invoice.overdue.reminder tree 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.tree overdue.reminder.action tree 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.tree overdue.reminder.result tree 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_tree overdue.reminder.step.tree overdue.reminder.step tree 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 xpath Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.move filter Inherits account.view_account_invoice_filter
view_invoice_tree account.move field Inherits account.view_invoice_tree
view_move_form overdue.reminder.customer.invoice.form account.move div Inherits account.view_move_form
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (11)

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Text
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.move
    ondelete='cascade' readonly=True string='Invoice' args: 'account.move'
Public methods (2)
  • invoice_id_check(self)
    @api.constrains('invoice_id')
  • name_get(self)
    @api.depends('invoice_id', 'counter')

New fields (5)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' tracking=True
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Text
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (1)
  • name_get(self)
    @api.depends('commercial_partner_id', 'date')

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (8)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer_rank', '>', 0), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment', 'wizard_id'
  • start_days Integer
    help='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_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (26)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    compute='_compute_counter_and_mail' store=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.move
    domain="[('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_printed Boolean
    readonly=True
  • mail_body Html
    compute='_compute_counter_and_mail' readonly=False store=True
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    compute='_compute_counter_and_mail' readonly=False store=True string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True string='Reminder Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Text
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (14)
  • check_warnings(self)
  • generate_mail_vals(self)
  • get_invoices(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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 string='Default Overdue Reminder Minimum Interval (days)'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    string='Default Overdue Reminder Trigger Delay (days)'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/13.0/account_invoice_overdue_reminder
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, manu, OCA Transbot, Miquel Raïch, JordiMForgeFlow, oca-travis, Weblate, OCA-git-bot, oca-ci, GuillemCForgeFlow, Judith
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
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.tree account.invoice.overdue.reminder tree 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.tree account.invoice.overdue.reminder tree 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.tree overdue.reminder.action tree New
overdue_reminder_end_form overdue.reminder.end.form overdue.reminder.end form 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.tree overdue.reminder.result tree 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_tree overdue.reminder.step.tree overdue.reminder.step tree 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 xpath Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.move filter Inherits account.view_account_invoice_filter
view_invoice_tree account.move field Inherits account.view_invoice_tree
view_move_form overdue.reminder.customer.invoice.form account.move div Inherits account.view_move_form
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (12)

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Text
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.move
    ondelete='cascade' readonly=True string='Invoice' args: 'account.move'
Public methods (2)
  • invoice_id_check(self)
    @api.constrains('invoice_id')
  • name_get(self)
    @api.depends('invoice_id', 'counter')

New fields (5)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' tracking=True
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Text
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (1)
  • name_get(self)
    @api.depends('commercial_partner_id', 'date')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer_rank', '>', 0), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment', 'wizard_id'
  • start_days Integer
    help='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'
  • up_to_date Boolean
    string='I consider that payments are up-to-date'
  • user_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (26)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    readonly=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.move
    readonly=True string='Overdue Invoices' args: 'account.move'
  • letter_printed Boolean
    readonly=True
  • mail_body Html
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True string='Reminder Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Text
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (14)
  • check_warnings(self)
  • create(self, vals)
    @api.model
  • 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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 string='Default Overdue Reminder Minimum Interval (days)'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    string='Default Overdue Reminder Trigger Delay (days)'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/12.0/account_invoice_overdue_reminder
VERSION
VERSION 2.2.2
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, eLBati, Sylvain LE GAL, GitHub, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Carmen Bianca BAKKER, oca-ci, Sergio Lop Sanz
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - http_routing
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
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.tree account.invoice.overdue.reminder tree 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.tree account.invoice.overdue.reminder tree New
invoice_form overdue.reminder.customer.invoice.form account.invoice button Inherits account.invoice_form
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.tree overdue.reminder.action tree New
overdue_reminder_end_form overdue.reminder.end.form overdue.reminder.end form 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.tree overdue.reminder.result tree 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_tree overdue.reminder.step.tree overdue.reminder.step tree 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 xpath Inherits account.res_config_settings_view_form
view_account_invoice_filter overdue.reminder.customer.invoice.search account.invoice filter Inherits account.view_account_invoice_filter
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (13)

New fields (5)
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' track_visibility='onchange'
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (14)
  • action_commercial_partner_id Many2one
    related='action_id.commercial_partner_id' store=True
  • action_date Date
    related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    related='action_id.mail_id'
  • action_mail_state Selection
    related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Text
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    related='action_id.user_id'
  • company_id Many2one
    related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.invoice
    ondelete='cascade' readonly=True string='Invoice' args: 'account.invoice'
Public methods (2)
  • invoice_id_check(self)
    @api.constrains('invoice_id')
  • name_get(self)
    @api.depends('invoice_id', 'counter')

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Text
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (1)
  • name_get(self)
    @api.depends('commercial_partner_id', 'date')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer', '=', True), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment', 'wizard_id'
  • start_days Integer
    help='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'
  • up_to_date Boolean
    string='I consider that payments are up-to-date'
  • user_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (27)
  • activity_deadline Date
    args: 'Deadline'
  • activity_note Html
    string='Note'
  • activity_summary Char
    string='Summary'
  • activity_type_id Many2one → mail.activity.type
    string='Activity' args: 'mail.activity.type'
  • activity_user_id Many2one → res.users
    default=<expr> string='Assigned to' args: 'res.users'
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    readonly=True string='New Remind Counter'
  • create_activity Boolean
  • date Date
    default=fields.Date.context_today readonly=True
  • display_button_recompute_mail_info Boolean
    default=False
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.invoice
    string='Overdue Invoices' args: 'account.invoice'
  • letter_printed Boolean
    readonly=True
  • mail_body Html
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Invoicing Contact' args: 'res.partner'
  • partner_mobile Char
    readonly=True related='partner_id.mobile'
  • partner_phone Char
    readonly=True related='partner_id.phone'
  • reminder_type Selection
    default='mail' required=True string='Reminder Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Text
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (15)
  • button_compute_mail_info(self)
    @api.multi
  • check_warnings(self)
  • create(self, vals)
    @api.model
  • goto_list_view(self)
  • next(self)
  • onchange_invoice_ids(self)
    @api.onchange('invoice_ids')
  • 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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 string='Default Overdue Reminder Minimum Interval (days)'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    string='Default Overdue Reminder Trigger Delay (days)'
Public methods (0)

No public methods.

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/credit-control
GIT
GIThttps://github.com/OCA/credit-control.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/credit-control/tree/10.0/account_invoice_overdue_reminder
VERSION
VERSION 2.0.2
CATEGORY
CATEGORYAccounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/credit-control
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:20:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - report
    - analytic
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
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.tree account.invoice.overdue.reminder tree 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.tree account.invoice.overdue.reminder tree New
invoice_form overdue.reminder.customer.invoice.form account.invoice button Inherits account.invoice_form
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.tree overdue.reminder.action tree New
overdue_reminder_end_form overdue.reminder.end.form overdue.reminder.end form 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.tree overdue.reminder.result tree 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_tree overdue.reminder.step.tree overdue.reminder.step tree New
report_overdue_reminder report_overdue_reminder ir.ui.view qweb New
view_account_config_settings overdue.reminder.res.config.settings.form account.config.settings group Inherits account.view_account_config_settings
view_account_invoice_filter overdue.reminder.customer.invoice.search account.invoice filter Inherits account.view_account_invoice_filter
view_partner_property_form overdue.reminder.res.partner.form res.partner group Inherits account.view_partner_property_form
Models touched (12)

New fields (5)
  • overdue_reminder_attach_invoice Boolean
    readonly=False related='company_id.overdue_reminder_attach_invoice'
  • overdue_reminder_interface Selection
    readonly=False related='company_id.overdue_reminder_interface'
  • overdue_reminder_min_interval_days Integer
    readonly=False related='company_id.overdue_reminder_min_interval_days'
  • overdue_reminder_partner_policy Selection
    readonly=False related='company_id.overdue_reminder_partner_policy'
  • overdue_reminder_start_days Integer
    readonly=False related='company_id.overdue_reminder_start_days'
Public methods (0)

No public methods.

New fields (6)
  • amount_untaxed_invoice_signed Monetary
    compute='_compute_amount_untaxed_invoice_signed' currency_field='currency_id' readonly=True string='Untaxed Amount in Invoice Currency'
  • no_overdue_reminder Boolean
    string='Disable Overdue Reminder' track_visibility='onchange'
  • overdue Boolean
    compute='_compute_overdue'
  • overdue_reminder_counter Integer
    compute='_compute_overdue_reminder' help='This counter is not increased in case of phone reminder.' store=True string='Overdue Reminder Count'
  • overdue_reminder_ids One2many → account.invoice.overdue.reminder
    string='Overdue Reminder Action History' args: 'account.invoice.overdue.reminder', 'invoice_id'
  • overdue_reminder_last_date Date
    compute='_compute_overdue_reminder' store=True string='Last Overdue Reminder Date'
Public methods (0)

No public methods.

New fields (14)
  • action_commercial_partner_id Many2one
    readonly=True related='action_id.commercial_partner_id' store=True
  • action_date Date
    readonly=True related='action_id.date' store=True
  • action_id Many2one → overdue.reminder.action
    ondelete='cascade' string='Overdue Reminder Action' args: 'overdue.reminder.action'
  • action_mail_cc Char
    readonly=True related='action_id.mail_id.email_cc' string='Cc'
  • action_mail_id Many2one
    readonly=True related='action_id.mail_id'
  • action_mail_state Selection
    readonly=True related='action_id.mail_id.state' string='E-mail Status'
  • action_partner_id Many2one
    readonly=True related='action_id.partner_id' store=True
  • action_reminder_type Selection
    related='action_id.reminder_type' store=True
  • action_result_id Many2one
    readonly=False related='action_id.result_id'
  • action_result_notes Text
    readonly=False related='action_id.result_notes'
  • action_user_id Many2one
    readonly=True related='action_id.user_id'
  • company_id Many2one
    readonly=True related='invoice_id.company_id' store=True
  • counter Integer
    readonly=True
  • invoice_id Many2one → account.invoice
    ondelete='cascade' readonly=True string='Invoice' args: 'account.invoice'
Public methods (2)
  • invoice_id_check(self)
    @api.constrains('invoice_id')
  • name_get(self)
    @api.depends('invoice_id', 'counter')

New fields (13)
  • commercial_partner_id Many2one → res.partner
    domain=[('parent_id', '=', False)] index=True readonly=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date Date
    default=fields.Date.context_today index=True readonly=False required=True
  • mail_cc Char
    readonly=True related='mail_id.email_cc'
  • mail_id Many2one → mail.mail
    readonly=True string='Reminder E-mail' args: 'mail.mail'
  • mail_state Selection
    related='mail_id.state' string='E-mail Status'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • reminder_count Integer
    compute='_compute_invoice_count' store=True string='Number of invoices'
  • reminder_ids One2many → account.invoice.overdue.reminder
    readonly=True args: 'account.invoice.overdue.reminder', 'action_id'
  • reminder_type Selection
    default='mail' readonly=True required=True string='Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    ondelete='restrict' string='Info/Result' args: 'overdue.reminder.result'
  • result_notes Text
    string='Info/Result Notes'
  • user_id Many2one → res.users
    default=<expr> ondelete='restrict' readonly=True required=True string='Performed by' args: 'res.users'
Public methods (1)
  • name_get(self)
    @api.depends('commercial_partner_id', 'date')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • reminder_type Selection
    string='New Reminder Type' args: '_reminder_type_selection'
  • update_action Selection
    readonly=True required=True args: [('validate', 'Validate'), ('reminder_type', 'Change Reminder Type'), ('skip', 'Skip')]
Public methods (1)
  • run(self)

New fields (3)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
  • sequence Integer
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • interface Selection
    default='onebyone' required=True string='Wizard Interface' args: '_interface_selection'
  • min_interval_days Integer
    help='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_ids Many2many → res.partner
    domain=[('customer', '=', True), ('parent_id', '=', False)] string='Customers' args: 'res.partner'
  • partner_policy Selection
    required=True string='Contact to Remind' args: '_partner_policy_selection'
  • payment_ids Many2many → overdue.reminder.start.payment
    readonly=True args: 'overdue.reminder.start.payment', 'wizard_id'
  • start_days Integer
    help='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'
  • up_to_date Boolean
    string='I consider that payments are up-to-date'
  • user_ids Many2many → res.users
    string='Salesman' args: 'res.users'
Public methods (2)
  • default_get(self, fields_list)
    @api.model
  • run(self)

New fields (5)
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • last_entry_create_date Datetime
    readonly=True string='Last Entry Created on'
  • last_entry_create_uid Many2one → res.users
    readonly=True string='Last Entry Created by' args: 'res.users'
  • last_entry_date Date
    readonly=True string='Last Entry'
  • wizard_id Many2one → overdue.reminder.start
    ondelete='cascade' args: 'overdue.reminder.start'
Public methods (0)

No public methods.

New fields (21)
  • commercial_partner_id Many2one → res.partner
    readonly=True required=True string='Customer' args: 'res.partner'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • counter Integer
    readonly=True string='New Remind Counter'
  • date Date
    default=fields.Date.context_today readonly=True
  • interface Char
    readonly=True
  • invoice_ids Many2many → account.invoice
    readonly=True string='Overdue Invoices' args: 'account.invoice'
  • letter_printed Boolean
    readonly=True
  • mail_body Html
  • mail_cc_partner_ids Many2many → res.partner
    string='Cc' args: 'res.partner'
  • mail_subject Char
    string='Subject'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    required=True string='Reminder Contact' args: 'res.partner'
  • partner_mobile Char
    compute='_compute_phone' readonly=True string='Mobile'
  • partner_phone Char
    compute='_compute_phone' readonly=True string='Phone'
  • reminder_type Selection
    default='mail' required=True string='Reminder Type' args: '_reminder_type_selection'
  • result_id Many2one → overdue.reminder.result
    string='Call Result/Info' args: 'overdue.reminder.result'
  • result_notes Text
    string='Call Notes'
  • state Selection
    default='draft' readonly=True args: [('draft', 'Draft'), ('skipped', 'Skipped'), ('done', 'Done')]
  • unreconciled_move_line_normal Boolean
    string='Check if unreconciled payments/refunds above have a good reason not to be reconciled with an open invoice'
  • user_id Many2one → res.users
    readonly=True required=True args: 'res.users'
  • warn_unreconciled_move_line_ids Many2many → account.move.line
    readonly=True string='Unreconciled Payments/Refunds' args: 'account.move.line'
Public methods (13)
  • check_warnings(self)
  • create(self, vals)
    @api.model
  • goto_list_view(self)
  • next(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_invoice Boolean
    default=True string='Attach Invoices to Overdue Reminder E-mails'
  • overdue_reminder_interface Selection
    default='onebyone' string='Default Overdue Reminder Wizard Interface' args: '_overdue_reminder_interface_selection'
  • overdue_reminder_min_interval_days Integer
    default=5 string='Default Overdue Reminder Minimum Interval (days)'
  • overdue_reminder_partner_policy Selection
    default='last_reminder' string='Contact to Remind' args: '_overdue_reminder_partner_policy_selection'
  • overdue_reminder_start_days Integer
    string='Default Overdue Reminder Trigger Delay (days)'
Public methods (0)

No public methods.

New fields (1)
  • no_overdue_reminder Boolean
    company_dependent=True string='Disable Overdue Invoice Reminder'
Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/credit-control
PULL REQUEST
PULL REQUEST[19.0] [MIG] account_invoice_overdue_reminder: Migration to 19.0 (#560)