From 59931711a930f2b23231b2f7a5d98c3359d9aefc Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 15 Jun 2020 18:38:14 +0200 Subject: [PATCH 01/50] Add module account_invoice_overdue_reminder --- account_invoice_overdue_reminder/__init__.py | 2 + .../__manifest__.py | 32 + .../data/mail_template.xml | 82 +++ .../data/overdue_reminder_result.xml | 47 ++ .../migrations/12.0.2.0.0/post-migration.py | 52 ++ .../migrations/12.0.2.0.0/pre-migration.py | 11 + .../models/__init__.py | 7 + .../models/account_invoice.py | 60 ++ .../account_invoice_overdue_reminder.py | 61 ++ .../models/company.py | 38 ++ .../models/config_settings.py | 20 + .../models/overdue_reminder_action.py | 66 +++ .../models/overdue_reminder_result.py | 20 + .../models/partner.py | 13 + .../readme/CONFIGURATION.rst | 9 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 31 + .../readme/USAGE.rst | 12 + .../security/ir.model.access.csv | 7 + .../security/rule.xml | 18 + .../views/account_invoice.xml | 50 ++ .../account_invoice_overdue_reminder.xml | 109 ++++ .../views/config_settings.xml | 46 ++ .../views/overdue_reminder_action.xml | 101 ++++ .../views/overdue_reminder_result.xml | 62 ++ .../views/partner.xml | 25 + .../views/report.xml | 19 + .../views/report_overdue_reminder.xml | 94 +++ .../wizard/__init__.py | 1 + .../wizard/overdue_reminder_wizard.py | 558 ++++++++++++++++++ .../wizard/overdue_reminder_wizard_view.xml | 241 ++++++++ 31 files changed, 1895 insertions(+) create mode 100644 account_invoice_overdue_reminder/__init__.py create mode 100644 account_invoice_overdue_reminder/__manifest__.py create mode 100644 account_invoice_overdue_reminder/data/mail_template.xml create mode 100644 account_invoice_overdue_reminder/data/overdue_reminder_result.xml create mode 100644 account_invoice_overdue_reminder/migrations/12.0.2.0.0/post-migration.py create mode 100644 account_invoice_overdue_reminder/migrations/12.0.2.0.0/pre-migration.py create mode 100644 account_invoice_overdue_reminder/models/__init__.py create mode 100644 account_invoice_overdue_reminder/models/account_invoice.py create mode 100644 account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py create mode 100644 account_invoice_overdue_reminder/models/company.py create mode 100644 account_invoice_overdue_reminder/models/config_settings.py create mode 100644 account_invoice_overdue_reminder/models/overdue_reminder_action.py create mode 100644 account_invoice_overdue_reminder/models/overdue_reminder_result.py create mode 100644 account_invoice_overdue_reminder/models/partner.py create mode 100644 account_invoice_overdue_reminder/readme/CONFIGURATION.rst create mode 100644 account_invoice_overdue_reminder/readme/CONTRIBUTORS.rst create mode 100644 account_invoice_overdue_reminder/readme/DESCRIPTION.rst create mode 100644 account_invoice_overdue_reminder/readme/USAGE.rst create mode 100644 account_invoice_overdue_reminder/security/ir.model.access.csv create mode 100644 account_invoice_overdue_reminder/security/rule.xml create mode 100644 account_invoice_overdue_reminder/views/account_invoice.xml create mode 100644 account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml create mode 100644 account_invoice_overdue_reminder/views/config_settings.xml create mode 100644 account_invoice_overdue_reminder/views/overdue_reminder_action.xml create mode 100644 account_invoice_overdue_reminder/views/overdue_reminder_result.xml create mode 100644 account_invoice_overdue_reminder/views/partner.xml create mode 100644 account_invoice_overdue_reminder/views/report.xml create mode 100644 account_invoice_overdue_reminder/views/report_overdue_reminder.xml create mode 100644 account_invoice_overdue_reminder/wizard/__init__.py create mode 100644 account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py create mode 100644 account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml diff --git a/account_invoice_overdue_reminder/__init__.py b/account_invoice_overdue_reminder/__init__.py new file mode 100644 index 000000000..9b4296142 --- /dev/null +++ b/account_invoice_overdue_reminder/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/account_invoice_overdue_reminder/__manifest__.py b/account_invoice_overdue_reminder/__manifest__.py new file mode 100644 index 000000000..09cda1fd9 --- /dev/null +++ b/account_invoice_overdue_reminder/__manifest__.py @@ -0,0 +1,32 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Overdue Invoice Reminder', + 'version': '12.0.2.0.0', + 'category': 'Accounting', + 'license': 'AGPL-3', + 'summary': 'Simple mail/letter/phone overdue customer invoice reminder ', + 'author': 'Akretion,Odoo Community Association (OCA)', + 'maintainers': ['alexis-via'], + 'website': 'https://github.com/OCA/credit-control', + 'depends': ['account'], + 'data': [ + 'security/ir.model.access.csv', + 'security/rule.xml', + 'wizard/overdue_reminder_wizard_view.xml', + 'views/partner.xml', + 'views/report.xml', + 'views/report_overdue_reminder.xml', + 'views/account_invoice.xml', + 'views/account_invoice_overdue_reminder.xml', + 'views/overdue_reminder_result.xml', + 'views/overdue_reminder_action.xml', + 'views/config_settings.xml', + 'data/overdue_reminder_result.xml', + 'data/mail_template.xml', + ], + 'installable': True, + 'application': True, +} diff --git a/account_invoice_overdue_reminder/data/mail_template.xml b/account_invoice_overdue_reminder/data/mail_template.xml new file mode 100644 index 000000000..7f79eadd5 --- /dev/null +++ b/account_invoice_overdue_reminder/data/mail_template.xml @@ -0,0 +1,82 @@ + + + + + + + + Overdue Invoice Reminder + + + ${object.partner_id.lang} + + ${object.user_id.email or object.company_id.email} + ${object.partner_id.email} + ${object.company_id.name} - Overdue invoice reminder n°${object.counter} + +

Dear customer,

+ +

According to our books, the following invoices are overdue:

+ + + + + + + + + + + + + +% for inv in object.invoice_ids: + + + + + + + + + + + +% endfor +% for (currency, total_residual) in object.total_residual(): + + + + + + + + + + +% endfor +
Invoice NumberInvoice DatePayment TermsDue DateOrder Ref.Total UntaxedTotalResidualPast Reminders
${inv.number}${format_date(inv.date_invoice)}${inv.payment_term_id.name or ''}${format_date(inv.date_due)}${inv.name or ''}${format_amount(inv.amount_untaxed_invoice_signed, inv.currency_id)}${format_amount(inv.amount_total_signed, inv.currency_id)}${format_amount(inv.residual_signed, inv.currency_id)}${inv.overdue_reminder_counter}
Total Residual in ${currency.name}:${format_amount(total_residual, currency)}
+ +

If you made a payment for these invoices a few days ago, please ignore this email.

+ +% if object.company_id.overdue_reminder_attach_invoice: +

You will find enclosed the overdue invoices.

+% endif + +% if object.counter > 2: +

Despite several reminders, we are disappointed to see that these overdue invoices are still unpaid. In order to avoid legal proceedings, we urge you to paid these overdue invoices in the next days.

+% endif + +

Regards,

+ + +]]>
+
+ + +
diff --git a/account_invoice_overdue_reminder/data/overdue_reminder_result.xml b/account_invoice_overdue_reminder/data/overdue_reminder_result.xml new file mode 100644 index 000000000..dbd1c8f20 --- /dev/null +++ b/account_invoice_overdue_reminder/data/overdue_reminder_result.xml @@ -0,0 +1,47 @@ + + + + + + + + Message left on voicemail + 10 + + + + Unreachable + 20 + + + + Invoice not received + 30 + + + + Invoice waiting approval + 40 + + + + Invoice dispute + 50 + + + + Invoice in payment pipe + 60 + + + + Payment sent + 70 + + + + diff --git a/account_invoice_overdue_reminder/migrations/12.0.2.0.0/post-migration.py b/account_invoice_overdue_reminder/migrations/12.0.2.0.0/post-migration.py new file mode 100644 index 000000000..8b491d96a --- /dev/null +++ b/account_invoice_overdue_reminder/migrations/12.0.2.0.0/post-migration.py @@ -0,0 +1,52 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, SUPERUSER_ID + + +def migrate(cr, version): + if not version: + return + + with api.Environment.manage(): + env = api.Environment(cr, SUPERUSER_ID, {}) + orao = env['overdue.reminder.action'] + aioro = env['account.invoice.overdue.reminder'] + + # The system is designed so that you can't + # send 2 reminders for the same customer the + # same day + # So, in order to create overdue.reminder.action, we + # read account.invoice.overdue.reminder and we group by + # date/company/partner + cr.execute( + """ + SELECT id, partner_id as commercial_partner_id, date, user_id, + reminder_type, result_id, result_notes, mail_id, company_id + FROM account_invoice_overdue_reminder + """) + tmp = {} # (key = date, company, commercial_partner_id) + # value = vals with list of ids + for old in cr.dictfetchall(): + key = (old['date'], old['company_id'], old['commercial_partner_id']) + if key in tmp: + tmp[key]['reminder_ids'].append(old['id']) + else: + tmp[key] = { + 'reminder_ids': [old['id']], + 'date': old['date'], + 'commercial_partner_id': old['commercial_partner_id'], + 'partner_id': old['commercial_partner_id'], + 'user_id': old['user_id'], + 'reminder_type': old['reminder_type'], + 'result_id': old['result_id'], + 'result_notes': old['result_notes'], + 'mail_id': old['mail_id'], + 'company_id': old['company_id'], + } + for vals in tmp.values(): + reminder_ids = vals.pop('reminder_ids') + action = orao.create(vals) + reminders = aioro.browse(reminder_ids) + reminders.write({'action_id': action.id}) diff --git a/account_invoice_overdue_reminder/migrations/12.0.2.0.0/pre-migration.py b/account_invoice_overdue_reminder/migrations/12.0.2.0.0/pre-migration.py new file mode 100644 index 000000000..6b278bc9f --- /dev/null +++ b/account_invoice_overdue_reminder/migrations/12.0.2.0.0/pre-migration.py @@ -0,0 +1,11 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +def migrate(cr, version): + if not version: + return + + cr.execute( + 'DELETE from overdue_reminder_action') diff --git a/account_invoice_overdue_reminder/models/__init__.py b/account_invoice_overdue_reminder/models/__init__.py new file mode 100644 index 000000000..8799acc16 --- /dev/null +++ b/account_invoice_overdue_reminder/models/__init__.py @@ -0,0 +1,7 @@ +from . import company +from . import config_settings +from . import partner +from . import account_invoice +from . import overdue_reminder_result +from . import overdue_reminder_action +from . import account_invoice_overdue_reminder diff --git a/account_invoice_overdue_reminder/models/account_invoice.py b/account_invoice_overdue_reminder/models/account_invoice.py new file mode 100644 index 000000000..4237791fe --- /dev/null +++ b/account_invoice_overdue_reminder/models/account_invoice.py @@ -0,0 +1,60 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + no_overdue_reminder = fields.Boolean( + string='Disable Overdue Reminder', + track_visibility='onchange') + overdue_reminder_ids = fields.One2many( + 'account.invoice.overdue.reminder', + 'invoice_id', + string='Overdue Reminder Action History') + overdue_reminder_last_date = fields.Date( + compute='_compute_overdue_reminder', + string='Last Overdue Reminder Date', store=True) + overdue_reminder_counter = fields.Integer( + string='Overdue Reminder Count', store=True, + compute='_compute_overdue_reminder', + help="This counter is not increased in case of phone reminder.") + overdue = fields.Boolean(compute='_compute_overdue') + + _sql_constraints = [( + 'counter_positive', + 'CHECK(overdue_reminder_counter >= 0)', + 'Overdue Invoice Counter must always be positive')] + + @api.depends('type', 'state', 'date_due') + def _compute_overdue(self): + today = fields.Date.context_today(self) + for inv in self: + overdue = False + if ( + inv.type == 'out_invoice' and + inv.state == 'open' and + inv.date_due < today): + overdue = True + inv.overdue = overdue + + @api.depends( + 'overdue_reminder_ids.action_id.date', + 'overdue_reminder_ids.counter', + 'overdue_reminder_ids.action_id.reminder_type') + def _compute_overdue_reminder(self): + aioro = self.env['account.invoice.overdue.reminder'] + for inv in self: + reminder = aioro.search( + [('invoice_id', '=', inv.id)], order='action_date desc', limit=1) + date = reminder and reminder.action_date or False + counter_reminder = aioro.search([ + ('invoice_id', '=', inv.id), + ('action_reminder_type', 'in', ('mail', 'post'))], + order='action_date desc, id desc', limit=1) + counter = counter_reminder and counter_reminder.counter or False + inv.overdue_reminder_last_date = date + inv.overdue_reminder_counter = counter diff --git a/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py b/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py new file mode 100644 index 000000000..45178b8c0 --- /dev/null +++ b/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py @@ -0,0 +1,61 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class AccountInvoiceOverdueReminder(models.Model): + _name = 'account.invoice.overdue.reminder' + _description = 'Overdue Invoice Reminder Action History' + _order = 'id desc' + + # For the link to invoice: why a M2O and not a M2M ? + # Because of the "counter" field: a single reminder action for a customer, + # the "counter" may not be the same for each invoice + invoice_id = fields.Many2one( + 'account.invoice', string='Invoice', ondelete='cascade', readonly=True) + action_id = fields.Many2one( + 'overdue.reminder.action', string='Overdue Reminder Action', + ondelete='cascade') + action_commercial_partner_id = fields.Many2one( + related='action_id.commercial_partner_id', store=True) + action_partner_id = fields.Many2one( + related='action_id.partner_id', store=True) + action_date = fields.Date(related='action_id.date', store=True) + action_user_id = fields.Many2one(related='action_id.user_id') + action_reminder_type = fields.Selection( + related='action_id.reminder_type', store=True) + action_result_id = fields.Many2one( + related='action_id.result_id', readonly=False) + action_result_notes = fields.Text( + related='action_id.result_notes', readonly=False) + action_mail_id = fields.Many2one( + related='action_id.mail_id') + action_mail_state = fields.Selection( + related='action_id.mail_id.state', string='E-mail Status') + counter = fields.Integer(readonly=True) + company_id = fields.Many2one( + related='invoice_id.company_id', store=True) + + _sql_constraints = [( + 'counter_positive', + 'CHECK(counter >= 0)', + 'Counter must always be positive')] + + @api.constrains('invoice_id') + def invoice_id_check(self): + for action in self: + if action.invoice_id and action.invoice_id.type != 'out_invoice': + raise ValidationError(_( + "An overdue reminder can only be attached " + "to a customer invoice")) + + @api.depends('invoice_id', 'counter') + def name_get(self): + res = [] + for rec in self: + name = _('%s Reminder %d') % (rec.invoice_id.number, rec.counter) + res.append((rec.id, name)) + return res diff --git a/account_invoice_overdue_reminder/models/company.py b/account_invoice_overdue_reminder/models/company.py new file mode 100644 index 000000000..65904039c --- /dev/null +++ b/account_invoice_overdue_reminder/models/company.py @@ -0,0 +1,38 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ + + +class ResCompany(models.Model): + _inherit = 'res.company' + + overdue_reminder_attach_invoice = fields.Boolean( + string='Attach Invoices to Overdue Reminder E-mails', default=True) + overdue_reminder_start_days = fields.Integer( + string='Default Overdue Reminder Trigger Delay (days)') + overdue_reminder_min_interval_days = fields.Integer( + string='Default Overdue Reminder Minimum Interval (days)', default=5) + overdue_reminder_interface = fields.Selection( + '_overdue_reminder_interface_selection', + string='Default Overdue Reminder Wizard Interface', + default='onebyone') + + @api.model + def _overdue_reminder_interface_selection(self): + return [ + ('onebyone', _('One by One')), + ('mass', _('Mass')), + ] + + _sql_constraints = [ + ( + 'overdue_reminder_start_days_positive', + 'CHECK(overdue_reminder_start_days >= 0)', + 'Overdue Reminder Trigger Delay must always be positive'), + ( + 'overdue_reminder_min_interval_days_positive', + 'CHECK(overdue_reminder_min_interval_days > 0)', + 'Overdue Reminder Trigger Delay must always be strictly positive'), + ] diff --git a/account_invoice_overdue_reminder/models/config_settings.py b/account_invoice_overdue_reminder/models/config_settings.py new file mode 100644 index 000000000..2e2e34541 --- /dev/null +++ b/account_invoice_overdue_reminder/models/config_settings.py @@ -0,0 +1,20 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + overdue_reminder_attach_invoice = fields.Boolean( + related='company_id.overdue_reminder_attach_invoice', readonly=False) + overdue_reminder_start_days = fields.Integer( + related='company_id.overdue_reminder_start_days', readonly=False) + overdue_reminder_min_interval_days = fields.Integer( + related='company_id.overdue_reminder_min_interval_days', + readonly=False) + overdue_reminder_interface = fields.Selection( + related='company_id.overdue_reminder_interface', + readonly=False) diff --git a/account_invoice_overdue_reminder/models/overdue_reminder_action.py b/account_invoice_overdue_reminder/models/overdue_reminder_action.py new file mode 100644 index 000000000..bcb1eb6cf --- /dev/null +++ b/account_invoice_overdue_reminder/models/overdue_reminder_action.py @@ -0,0 +1,66 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ + + +class OverdueReminderAction(models.Model): + _name = 'overdue.reminder.action' + _description = 'Overdue Reminder Action History' + _order = 'date desc, id desc' + + commercial_partner_id = fields.Many2one( + 'res.partner', readonly=True, string='Customer', index=True, + domain=[('parent_id', '=', False)]) + partner_id = fields.Many2one( + 'res.partner', readonly=True, string='Contact') + date = fields.Date( + default=fields.Date.context_today, required=True, index=True, + readonly=True) + user_id = fields.Many2one( + 'res.users', string='Performed by', required=True, readonly=True, + ondelete='restrict', default=lambda self: self.env.user) + reminder_type = fields.Selection( + '_reminder_type_selection', default='mail', string='Type', + required=True, readonly=True) + result_id = fields.Many2one( + 'overdue.reminder.result', ondelete='restrict', + string='Info/Result') + result_notes = fields.Text(string='Info/Result Notes') + mail_id = fields.Many2one( + 'mail.mail', string='Reminder E-mail', readonly=True) + mail_state = fields.Selection( + related='mail_id.state', string='E-mail Status') + company_id = fields.Many2one( + 'res.company', string='Company', readonly=True) + reminder_count = fields.Integer( + compute='_compute_invoice_count', store=True, string='Number of invoices') + reminder_ids = fields.One2many( + 'account.invoice.overdue.reminder', 'action_id', readonly=True) + + @api.model + def _reminder_type_selection(self): + return [ + ('mail', _('E-mail')), + ('phone', _('Phone')), + ('post', _('Letter')), + ] + + @api.depends('reminder_ids') + def _compute_invoice_count(self): + rg_res = self.env['account.invoice.overdue.reminder'].read_group( + [('action_id', 'in', self.ids), ('invoice_id', '!=', False)], + ['action_id'], ['action_id']) + mapped_data = dict([(x['action_id'][0], x['action_id_count']) for x in rg_res]) + for rec in self: + rec.reminder_count = mapped_data.get(rec.id, 0) + + @api.depends('commercial_partner_id', 'date') + def name_get(self): + res = [] + for action in self: + name = _('%s, Reminder %s') % ( + action.commercial_partner_id.display_name, action.date) + res.append((action.id, name)) + return res diff --git a/account_invoice_overdue_reminder/models/overdue_reminder_result.py b/account_invoice_overdue_reminder/models/overdue_reminder_result.py new file mode 100644 index 000000000..4bbf342ce --- /dev/null +++ b/account_invoice_overdue_reminder/models/overdue_reminder_result.py @@ -0,0 +1,20 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class OverdueReminderResult(models.Model): + _name = 'overdue.reminder.result' + _description = 'Overdue Invoice Reminder Result/Info' + _order = 'sequence, id desc' + + name = fields.Char(required=True, translate=True) + active = fields.Boolean(default=True) + sequence = fields.Integer() + + _sql_constraints = [( + 'name_unique', + 'unique(name)', + 'This overdue reminder result already exists')] diff --git a/account_invoice_overdue_reminder/models/partner.py b/account_invoice_overdue_reminder/models/partner.py new file mode 100644 index 000000000..3f8afa07f --- /dev/null +++ b/account_invoice_overdue_reminder/models/partner.py @@ -0,0 +1,13 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + # Property of commercial partner, applies for the whole entity + no_overdue_reminder = fields.Boolean( + string='Disable Overdue Invoice Reminder', company_dependent=True) diff --git a/account_invoice_overdue_reminder/readme/CONFIGURATION.rst b/account_invoice_overdue_reminder/readme/CONFIGURATION.rst new file mode 100644 index 000000000..8ddc48931 --- /dev/null +++ b/account_invoice_overdue_reminder/readme/CONFIGURATION.rst @@ -0,0 +1,9 @@ +You should increase the **osv_memory_age_limit** (default value = 1, which means 1 hour) in the Odoo server config file: for example, you can set it to 12 (12 hours). The value must be superior to the duration of the invoicing reminder wizard from the start screen to the end. + +Go to the menu *Invoicing > Configuration > Settings* then go to the section *Overdue Invoice Reminder*: you will be able to configure if you want to attach the overdue invoice to the reminder emails and set default values for some parameters. + +Then, go to the menu *Settings > Technical > E-mail > Templates* and search for the mail template *Overdue Invoice Reminder*. You can edit the subject and the body of this email template. If you are in a multi-lang setup, don't forget to also update the translations. + +Go to the menu *Invoicing > Configuration > Management > Invoice Reminder Results* and customize the list of entries. + +If `py3o `_ is your favorite reporting engine for Odoo (with the module *report_py3o* of the project `OCA/reporting-engine `_), you can use the sample py3o report for the overdue reminder letter available in the module *account_invoice_overdue_reminder_py3o* of Akretion's `py3o report templates `_ project. diff --git a/account_invoice_overdue_reminder/readme/CONTRIBUTORS.rst b/account_invoice_overdue_reminder/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..ff65d68ce --- /dev/null +++ b/account_invoice_overdue_reminder/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/account_invoice_overdue_reminder/readme/DESCRIPTION.rst b/account_invoice_overdue_reminder/readme/DESCRIPTION.rst new file mode 100644 index 000000000..5aa9e9652 --- /dev/null +++ b/account_invoice_overdue_reminder/readme/DESCRIPTION.rst @@ -0,0 +1,31 @@ +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 `_ (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 `_. diff --git a/account_invoice_overdue_reminder/readme/USAGE.rst b/account_invoice_overdue_reminder/readme/USAGE.rst new file mode 100644 index 000000000..6709a03ca --- /dev/null +++ b/account_invoice_overdue_reminder/readme/USAGE.rst @@ -0,0 +1,12 @@ +Of course, before sending invoice reminders, you must import your bank statements and process them, so that you are up-to-date on customer payments. + +Then, go to the menu *Invoicing > Accounting > Actions > Overdue Invoice Remind*: you will get the start screen where you can: + +* filter the customers that you want to remind (filter by customer or by salesman), +* check that your bank journals are up-to-date, +* choose between the *one-by-one* and *mass* interfaces, +* customize some parameters. + +Then follow the process until the end. + +You can also start the invoice reminder wizard via the button *Overdue Reminder* on an overdue invoice. diff --git a/account_invoice_overdue_reminder/security/ir.model.access.csv b/account_invoice_overdue_reminder/security/ir.model.access.csv new file mode 100644 index 000000000..06b103e78 --- /dev/null +++ b/account_invoice_overdue_reminder/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_overdue_reminder_result_read,Read access on overdue.reminder.result,model_overdue_reminder_result,account.group_account_invoice,1,0,0,0 +access_overdue_reminder_result_full,Full access on overdue.reminder.result,model_overdue_reminder_result,account.group_account_manager,1,1,1,1 +access_overdue_reminder_action_user,Read/create/write on reminder actions,model_overdue_reminder_action,account.group_account_invoice,1,1,1,0 +access_overdue_reminder_action_manager,Full access on reminder actions,model_overdue_reminder_action,account.group_account_manager,1,1,1,1 +access_account_invoice_overdue_reminder_user,Read/create/write on reminder counters,model_account_invoice_overdue_reminder,account.group_account_invoice,1,1,1,0 +access_account_invoice_overdue_reminder_manager,Full access on reminder counters,model_account_invoice_overdue_reminder,account.group_account_manager,1,1,1,1 diff --git a/account_invoice_overdue_reminder/security/rule.xml b/account_invoice_overdue_reminder/security/rule.xml new file mode 100644 index 000000000..ddb45be5d --- /dev/null +++ b/account_invoice_overdue_reminder/security/rule.xml @@ -0,0 +1,18 @@ + + + + + + + + Overdue Invoice Reminder multi-company + + ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + + + diff --git a/account_invoice_overdue_reminder/views/account_invoice.xml b/account_invoice_overdue_reminder/views/account_invoice.xml new file mode 100644 index 000000000..9b0ad26bb --- /dev/null +++ b/account_invoice_overdue_reminder/views/account_invoice.xml @@ -0,0 +1,50 @@ + + + + + + + + overdue.reminder.customer.invoice.form + account.invoice + + + + + + + + + + + + + + + + + + + + + overdue.reminder.customer.invoice.search + account.invoice + + + + + + + + + + diff --git a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml new file mode 100644 index 000000000..f4d10d48b --- /dev/null +++ b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml @@ -0,0 +1,109 @@ + + + + + + + + account.invoice.overdue.reminder.form + account.invoice.overdue.reminder + +
+ + + + + + + + + + + + + + + +
+
+
+ + + account.invoice.overdue.reminder.norelated.form + account.invoice.overdue.reminder + 100 + +
+ + + + + +
+
+
+ + + account.invoice.overdue.reminder.tree + account.invoice.overdue.reminder + + + + + + + + + + + + + + + + account.invoice.overdue.reminder.norelated.tree + account.invoice.overdue.reminder + 100 + + + + + + + + + + account.invoice.overdue.reminder.search + account.invoice.overdue.reminder + + + + + + + + + + + + + + + + + + + + + Invoice Reminder Counters + account.invoice.overdue.reminder + tree,form + {'overdue_reminder_main_view': True} + + + +
diff --git a/account_invoice_overdue_reminder/views/config_settings.xml b/account_invoice_overdue_reminder/views/config_settings.xml new file mode 100644 index 000000000..2d1cfc876 --- /dev/null +++ b/account_invoice_overdue_reminder/views/config_settings.xml @@ -0,0 +1,46 @@ + + + + + + + + overdue.reminder.res.config.settings.form + res.config.settings + + + +

Overdue Invoice Reminder

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/account_invoice_overdue_reminder/views/overdue_reminder_action.xml b/account_invoice_overdue_reminder/views/overdue_reminder_action.xml new file mode 100644 index 000000000..4b7c96084 --- /dev/null +++ b/account_invoice_overdue_reminder/views/overdue_reminder_action.xml @@ -0,0 +1,101 @@ + + + + + + + + overdue.reminder.action.form + overdue.reminder.action + +
+ + + + + + + + + + + + + + + + +
+
+
+ + + overdue.reminder.action.tree + overdue.reminder.action + + + + + + + + + + + + + overdue.reminder.action.search + overdue.reminder.action + + + + + + + + + + + + + + + + + + + overdue.reminder.action.pivot + overdue.reminder.action + + + + + + + + + + overdue.reminder.action.graph + overdue.reminder.action + + + + + + + + + Invoice Reminder Actions + overdue.reminder.action + pivot,graph,tree,form + {'pivot_measures': ['__count', 'reminder_count']} + + + + +
diff --git a/account_invoice_overdue_reminder/views/overdue_reminder_result.xml b/account_invoice_overdue_reminder/views/overdue_reminder_result.xml new file mode 100644 index 000000000..ea431537e --- /dev/null +++ b/account_invoice_overdue_reminder/views/overdue_reminder_result.xml @@ -0,0 +1,62 @@ + + + + + + + + overdue.reminder.result.form + overdue.reminder.result + +
+ +
+ +
+ + + +
+
+
+
+ + + overdue.reminder.result.tree + overdue.reminder.result + + + + + + + + + + overdue.reminder.result.search + overdue.reminder.result + + + + + + + + + + Invoice Reminder Results + overdue.reminder.result + tree,form + + + + +
diff --git a/account_invoice_overdue_reminder/views/partner.xml b/account_invoice_overdue_reminder/views/partner.xml new file mode 100644 index 000000000..b7643bb4a --- /dev/null +++ b/account_invoice_overdue_reminder/views/partner.xml @@ -0,0 +1,25 @@ + + + + + + + + overdue.reminder.res.partner.form + res.partner + + + + + + + + + + + + diff --git a/account_invoice_overdue_reminder/views/report.xml b/account_invoice_overdue_reminder/views/report.xml new file mode 100644 index 000000000..aac57854a --- /dev/null +++ b/account_invoice_overdue_reminder/views/report.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/account_invoice_overdue_reminder/views/report_overdue_reminder.xml b/account_invoice_overdue_reminder/views/report_overdue_reminder.xml new file mode 100644 index 000000000..acac84946 --- /dev/null +++ b/account_invoice_overdue_reminder/views/report_overdue_reminder.xml @@ -0,0 +1,94 @@ + + + + + + diff --git a/account_invoice_overdue_reminder/wizard/__init__.py b/account_invoice_overdue_reminder/wizard/__init__.py new file mode 100644 index 000000000..62b5c3a6f --- /dev/null +++ b/account_invoice_overdue_reminder/wizard/__init__.py @@ -0,0 +1 @@ +from . import overdue_reminder_wizard diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py new file mode 100644 index 000000000..42b76047d --- /dev/null +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py @@ -0,0 +1,558 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, tools, _ +from odoo.exceptions import UserError +from dateutil.relativedelta import relativedelta +import base64 +import logging +logger = logging.getLogger(__name__) + +MOD = 'account_invoice_overdue_reminder' + + +class OverdueReminderStart(models.TransientModel): + _name = 'overdue.reminder.start' + _description = 'Wizard to reminder overdue customer invoice' + + partner_ids = fields.Many2many( + 'res.partner', string='Customers', + domain=[('customer', '=', True), ('parent_id', '=', False)]) + user_ids = fields.Many2many( + 'res.users', string='Salesman') + payment_ids = fields.Many2many( + 'overdue.reminder.start.payment', 'wizard_id', readonly=True) + start_days = fields.Integer( + string='Trigger Delay', + 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).") + min_interval_days = fields.Integer( + string='Minimum Delay Since Last Reminder', + 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).") + up_to_date = fields.Boolean( + string='I consider that payments are up-to-date') + company_id = fields.Many2one( + 'res.company', readonly=True, required=True, + default=lambda self: self.env['res.company']._company_default_get()) + interface = fields.Selection( + '_interface_selection', + string='Wizard Interface', + default='onebyone', required=True) + + @api.model + def _interface_selection(self): + return self.env['res.company']._overdue_reminder_interface_selection() + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + amo = self.env['account.move'] + company = self.env.user.company_id + journals = self.env['account.journal'].search([ + ('company_id', '=', company.id), + ('type', 'in', ('bank', 'cash'))]) + payments = [] + for journal in journals: + last = amo.search( + [('journal_id', '=', journal.id)], + order='date desc, id desc', limit=1) + vals = { + 'journal_id': journal.id, + 'last_entry_date': last and last.date or False, + 'last_entry_create_date': last and last.create_date or False, + 'last_entry_create_uid': last and last.create_uid.id or False, + } + payments.append((0, 0, vals)) + res.update({ + 'payment_ids': payments, + 'start_days': company.overdue_reminder_start_days, + 'min_interval_days': company.overdue_reminder_min_interval_days, + }) + return res + + def _prepare_base_domain(self): + base_domain = [ + ('company_id', '=', self.company_id.id), + ('type', '=', 'out_invoice'), + ('state', '=', 'open'), + ('no_overdue_reminder', '=', False), + ] + return base_domain + + def _prepare_remind_trigger_domain(self, base_domain): + today = fields.Date.context_today(self) + limit_date = today + if self.start_days: + limit_date -= relativedelta(days=self.start_days) + domain = base_domain + [('date_due', '<', limit_date)] + if self.partner_ids: + domain.append(('commercial_partner_id', 'in', self.partner_ids.ids)) + if self.user_ids: + domain.append(('user_id', 'in', self.user_ids.ids)) + return domain + + def run(self): + self.ensure_one() + if not self.up_to_date: + raise UserError(_( + "In order to start overdue reminders, you must make sure that " + "customer payments are up-to-date.")) + if self.start_days < 0: + raise UserError(_( + "The trigger delay cannot be negative.")) + if self.min_interval_days < 1: + raise UserError(_( + "The minimum delay since last reminder must be strictly positive.")) + aio = self.env['account.invoice'] + ajo = self.env['account.journal'] + rpo = self.env['res.partner'] + orso = self.env['overdue.reminder.step'] + user_id = self.env.user.id + existing_actions = orso.search([('user_id', '=', user_id)]) + existing_actions.unlink() + payment_journals = ajo.search([ + ('company_id', '=', self.company_id.id), + ('type', 'in', ('bank', 'cash')), + ]) + sale_journals = ajo.search([ + ('company_id', '=', self.company_id.id), + ('type', '=', 'sale'), + ]) + today = fields.Date.context_today(self) + min_interval_date = today - relativedelta(days=self.min_interval_days) + # It is important to understand this: there are 2 search on invoice : + # 1. a first search to know if a partner must be reminded or not + # 2. a second search to get the invoices to remind for that partner + # There are some slight differences between these 2 searches; + # for example: search 1 compares due_date to (today + start_days) + # whereas search 2 compares due_date to today + base_domain = self._prepare_base_domain() + domain = self._prepare_remind_trigger_domain(base_domain) + rg_res = aio.read_group( + domain, + ['commercial_partner_id', 'residual_company_signed'], + ['commercial_partner_id']) + # Sort by residual amount desc + rg_res_sorted = sorted( + rg_res, + key=lambda to_sort: to_sort['residual_company_signed'], + reverse=True) + action_ids = [] + for rg_re in rg_res_sorted: + commercial_partner_id = rg_re['commercial_partner_id'][0] + commercial_partner = rpo.browse(commercial_partner_id) + vals = self._prepare_reminder_step( + commercial_partner, base_domain, min_interval_date, + payment_journals, sale_journals) + if vals: + action = orso.create(vals) + action_ids.append(action.id) + if not action_ids: + raise UserError(_( + "There are no overdue reminders.")) + if self.interface == 'onebyone': + xid = MOD + '.overdue_reminder_step_onebyone_action' + action = self.env.ref(xid).read()[0] + action['res_id'] = action_ids[0] + elif self.interface == 'mass': + action = orso.goto_list_view() + return action + + def _prepare_reminder_step( + self, commercial_partner, base_domain, min_interval_date, + payment_journals, sale_journals): + amlo = self.env['account.move.line'] + if commercial_partner.no_overdue_reminder: + logger.info( + 'Skipping customer %s that has no_overdue_reminder=True', + commercial_partner.display_name) + return False + invs = self.env['account.invoice'].search( + base_domain + [ + ('commercial_partner_id', '=', commercial_partner.id), + ('date_due', '<', fields.Date.context_today(self))]) + assert invs + # Check min interval + if any([ + inv.overdue_reminder_last_date > min_interval_date + for inv in invs + if inv.overdue_reminder_last_date]): + logger.info( + 'Skipping customer %s that has at least one invoice ' + 'with last reminder after %s', + commercial_partner.display_name, + fields.Date.to_string(min_interval_date)) + return False + max_counter = max([inv.overdue_reminder_counter for inv in invs]) + unrec_domain = [ + ('account_id', '=', commercial_partner.property_account_receivable_id.id), + ('partner_id', '=', commercial_partner.id), + ('full_reconcile_id', '=', False), + ('matched_debit_ids', '=', False), + ('matched_credit_ids', '=', False), + ] + unrec_payments = amlo.search( + unrec_domain + [ + ('journal_id', 'in', payment_journals.ids), + ]) + unrec_refunds = amlo.search( + unrec_domain + [ + ('journal_id', 'in', sale_journals.ids), + ('credit', '>', 0), + ]) + warn_unrec = unrec_payments + unrec_refunds + vals = { + 'partner_id': invs[0].partner_id.id, + 'commercial_partner_id': commercial_partner.id, + 'user_id': self.env.user.id, + 'invoice_ids': [(6, 0, invs.ids)], + 'company_id': self.company_id.id, + 'warn_unreconciled_move_line_ids': [(6, 0, warn_unrec.ids)], + 'counter': max_counter + 1, + 'interface': self.interface, + } + return vals + + +class OverdueReminderStartPayment(models.TransientModel): + _name = 'overdue.reminder.start.payment' + _description = 'Status of payments' + + wizard_id = fields.Many2one( + 'overdue.reminder.start', ondelete='cascade') + journal_id = fields.Many2one( + 'account.journal', string='Journal', readonly=True) + last_entry_date = fields.Date( + string='Last Entry', readonly=True) + last_entry_create_date = fields.Datetime( + string='Last Entry Created on', readonly=True) + last_entry_create_uid = fields.Many2one( + 'res.users', string='Last Entry Created by', readonly=True) + + +class OverdueReminderStep(models.TransientModel): + _name = 'overdue.reminder.step' + _description = 'Overdue reminder wizard step' + + partner_id = fields.Many2one( + 'res.partner', required=True, string='Invoicing Contact') + partner_email = fields.Char(related='partner_id.email', readonly=True) + partner_phone = fields.Char(related='partner_id.phone', readonly=True) + partner_mobile = fields.Char(related='partner_id.mobile', readonly=True) + commercial_partner_id = fields.Many2one( + 'res.partner', string='Customer', readonly=True, required=True) + user_id = fields.Many2one('res.users', required=True, readonly=True) + counter = fields.Integer(string="New Remind Counter", readonly=True) + date = fields.Date(default=fields.Date.context_today, readonly=True) + reminder_type = fields.Selection( + '_reminder_type_selection', default='mail', + string='Reminder Type', required=True) + mail_subject = fields.Char(string='Subject') + mail_body = fields.Html() + result_id = fields.Many2one( + 'overdue.reminder.result', string='Call Result/Info') + result_notes = fields.Text(string='Call Notes') + create_activity = fields.Boolean() + activity_type_id = fields.Many2one( + 'mail.activity.type', string='Activity') + activity_summary = fields.Char(string='Summary') + activity_deadline = fields.Date('Deadline') + activity_note = fields.Html(string='Note') + activity_user_id = fields.Many2one( + 'res.users', string='Assigned to', default=lambda self: self.env.user) + letter_printed = fields.Boolean(readonly=True) + invoice_ids = fields.Many2many( + 'account.invoice', string='Overdue Invoices', readonly=True) + company_id = fields.Many2one( + 'res.company', readonly=True, required=True, + default=lambda self: self.env['res.company']._company_default_get()) + warn_unreconciled_move_line_ids = fields.Many2many( + 'account.move.line', string='Unreconciled Payments/Refunds', + readonly=True) + unreconciled_move_line_normal = fields.Boolean( + string='Check if unreconciled payments/refunds above have a good ' + 'reason not to be reconciled with an open invoice') + interface = fields.Char(readonly=True) + state = fields.Selection([ + ('draft', 'Draft'), + ('skipped', 'Skipped'), + ('done', 'Done'), + ], default='draft', readonly=True) + + @api.model + def _reminder_type_selection(self): + return self.env['overdue.reminder.action']._reminder_type_selection() + + @api.model + def create(self, vals): + action = super().create(vals) + commercial_partner = self.env['res.partner'].browse( + vals['commercial_partner_id']) + xmlid = MOD + '.overdue_invoice_reminder_mail_template' + mail_tpl = self.env.ref(xmlid) + mail_tpl_lang = mail_tpl.with_context(lang=commercial_partner.lang or 'en_US') + mail_subject = mail_tpl_lang._render_template( + mail_tpl_lang.subject, self._name, action.id) + mail_body = mail_tpl_lang._render_template( + mail_tpl_lang.body_html, self._name, action.id) + if mail_tpl.user_signature: + signature = self.env.user.signature + if signature: + mail_body = tools.append_content_to_html( + mail_body, signature, plaintext=False) + mail_body = tools.html_sanitize(mail_body) + action.write({ + 'mail_subject': mail_subject, + 'mail_body': mail_body, + }) + return action + + @api.onchange('reminder_type') + def reminder_type_change(self): + if self.reminder_type and self.reminder_type != 'phone': + self.result_id = False + self.result_notes = False + self.create_activity = False + + def next(self): + self.ensure_one() + left = self.search([ + ('state', '=', 'draft'), + ('user_id', '=', self.user_id.id), + ('company_id', '=', self.company_id.id)], limit=1) + if left: + action = self.env.ref( + MOD + '.overdue_reminder_step_onebyone_action').read()[0] + action['res_id'] = left.id + else: + action = self.env.ref( + MOD + '.overdue_reminder_end_action').read()[0] + return action + + def goto_list_view(self): + action = self.env.ref( + MOD + '.overdue_reminder_step_mass_action').read()[0] + return action + + def skip(self): + self.write({'state': 'skipped'}) + if len(self) == 1: + if self.interface == 'onebyone': + action = self.next() + else: + action = self.goto_list_view() + return action + + def _prepare_mail_activity(self): + self.ensure_one() + partner_model_id = self.env.ref('base.model_res_partner').id + if not self.activity_user_id: + raise UserError(_( + "For the reminder of customer '%s', you must assign someone " + "for the activity.") % self.commercial_partner_id.display_name) + if not self.activity_deadline: + raise UserError(_( + "For the reminder of customer '%s', the deadline is missing " + "for the activity.") % self.commercial_partner_id.display_name) + vals = { + 'activity_type_id': self.activity_type_id.id or False, + 'summary': self.activity_summary, + 'date_deadline': self.activity_deadline, + 'user_id': self.activity_user_id.id, + 'note': self.activity_note, + 'res_id': self.commercial_partner_id.id, + 'res_model_id': partner_model_id, + } + return vals + + def check_warnings(self): + self.ensure_one() + for rec in self: + if rec.company_id != self.env.user.company_id: + raise UserError(_( + "User company is different from action company. " + "This should never happen.")) + if ( + rec.warn_unreconciled_move_line_ids and + not rec.unreconciled_move_line_normal): + raise UserError(_( + "Customer '%s' has unreconciled payments/refunds. " + "You should reconcile these payments/refunds and start the " + "overdue remind process again " + "(or check the option to confirm that these unreconciled " + "payments/refunds have a good reason not to be " + "reconciled with an open invoice).") + % rec.commercial_partner_id.display_name) + + def validate(self): + orao = self.env['overdue.reminder.action'] + mao = self.env['mail.activity'] + self.check_warnings() + for rec in self: + vals = {} + if rec.reminder_type == 'mail': + vals = rec.validate_mail() + elif rec.reminder_type == 'phone': + vals = rec.validate_phone() + elif rec.reminder_type == 'post': + vals = rec.validate_post() + rec._prepare_overdue_reminder_action(vals) + orao.create(vals) + if rec.create_activity: + mao.create(self._prepare_mail_activity()) + self.write({'state': 'done'}) + if len(self) == 1: + if self.interface == 'onebyone': + action = self.next() + else: + action = self.goto_list_view() + return action + + def validate_mail(self): + self.ensure_one() + iao = self.env['ir.attachment'] + if not self.mail_subject: + raise UserError(_('Mail subject is empty.')) + if not self.mail_body: + raise UserError(_('Mail body is empty.')) + xmlid = MOD + '.overdue_invoice_reminder_mail_template' + mvals = self.env.ref(xmlid).generate_email(self.id) + mvals.update({ + 'subject': self.mail_subject, + 'body_html': self.mail_body, + }) + mvals.pop('attachment_ids', None) + mvals.pop('attachments', None) + mail = self.env['mail.mail'].create(mvals) + inv_report = self.env['ir.actions.report']._get_report_from_name( + 'account.report_invoice_with_payments') + if self.company_id.overdue_reminder_attach_invoice: + attachment_ids = [] + for inv in self.invoice_ids: + if inv_report.report_type in ('qweb-html', 'qweb-pdf'): + report_bin, report_format = inv_report.render_qweb_pdf([inv.id]) + else: + res = inv_report.render([inv.id]) + if not res: + raise UserError(_( + "Report format '%s' is not supported.") + % inv_report.report_type) + report_bin, report_format = res + # WARN : update when backporting + filename = '%s.%s' % (inv._get_report_base_filename(), report_format) + attach = iao.create({ + 'name': filename, + 'datas_fname': filename, + 'datas': base64.b64encode(report_bin), + 'res_model': 'mail.message', + 'res_id': mail.mail_message_id.id, + }) + attachment_ids.append(attach.id) + mail.write({'attachment_ids': [(6, 0, attachment_ids)]}) + vals = {'mail_id': mail.id} + return vals + + def validate_phone(self): + self.ensure_one() + assert self.reminder_type == 'phone' + vals = { + 'result_id': self.result_id.id or False, + 'result_notes': self.result_notes, + } + return vals + + def validate_post(self): + self.ensure_one() + assert self.reminder_type == 'post' + if not self.letter_printed: + raise UserError(_( + "Remind letter hasn't been printed!")) + return {} + + def _prepare_overdue_reminder_action(self, vals): + vals.update({ + 'user_id': self.user_id.id, + 'reminder_type': self.reminder_type, + 'reminder_ids': [], + 'company_id': self.company_id.id, + 'commercial_partner_id': self.commercial_partner_id.id, + 'partner_id': self.partner_id.id, + }) + for inv in self.invoice_ids: + rvals = {'invoice_id': inv.id} + if self.reminder_type != 'phone': + rvals['counter'] = inv.overdue_reminder_counter + 1 + vals['reminder_ids'].append((0, 0, rvals)) + + def print_letter(self): + self.check_warnings() + self.write({'letter_printed': True}) + action = action = self.env.ref( + MOD + '.overdue_reminder_step_report').with_context( + {'discard_logo_check': True}).report_action(self) + return action + + def print_invoices(self): + # in v12, it seems printing several invoices at the same time + # doesn't work + action = self.env.ref('account.account_invoices')\ + .with_context( + {'discard_logo_check': True}).report_action(self.invoice_ids.ids) + return action + + def total_residual(self): + self.ensure_one() + res = {} + for inv in self.invoice_ids: + if inv.currency_id in res: + res[inv.currency_id] += inv.residual_signed + else: + res[inv.currency_id] = inv.residual_signed + return res.items() + + def _get_report_base_filename(self): + self.ensure_one() + fname = 'overdue_letter-%s' % self.commercial_partner_id.name.replace(' ', '_') + return fname + + +class OverdueReminderEnd(models.TransientModel): + _name = 'overdue.reminder.end' + _description = 'Congratulation end screen for overdue reminder wizard' + + +class OverdueRemindMassUpdate(models.TransientModel): + _name = 'overdue.reminder.mass.update' + _description = 'Update several actions at the same time' + + update_action = fields.Selection([ + ('validate', 'Validate'), + ('reminder_type', 'Change Reminder Type'), + ('skip', 'Skip')], + required=True, readonly=True) + reminder_type = fields.Selection( + '_reminder_type_selection', + string='New Reminder Type') + + @api.model + def _reminder_type_selection(self): + return self.env['overdue.reminder.action']._reminder_type_selection() + + def run(self): + self.ensure_one() + assert self._context.get('active_model') == 'overdue.reminder.step' + actions = self.env['overdue.reminder.step'].browse( + self._context.get('active_ids')) + if self.update_action == 'validate': + actions.validate() + elif self.update_action == 'skip': + actions.skip() + elif self.update_action == 'reminder_type': + if not self.reminder_type: + raise UserError(_("You must select the new reminder type.")) + actions.write({'reminder_type': self.reminder_type}) + return diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml new file mode 100644 index 000000000..a3c2aefc9 --- /dev/null +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml @@ -0,0 +1,241 @@ + + + + + + + + overdue.reminder.start.form + overdue.reminder.start + +
+ + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+ + + Overdue Invoice Remind + overdue.reminder.start + form + new + + + + + + overdue.reminder.step.form + overdue.reminder.step + +
+ + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + From d7ee2002384155b607175d8017efa3f05c20ca94 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 12 Nov 2020 23:55:58 +0100 Subject: [PATCH 06/50] overdue_reminder: Order overdue invoices starting from oldest (NOTE: update your mail templates) Add ability to add contacts as Cc of the reminder email (added to the Cc of the mail template) Add partner_policy with 3 options to give some choice about which contact should be selected to send reminders Access reminders from partner via Action menu --- .../data/mail_template.xml | 2 +- .../account_invoice_overdue_reminder.py | 2 + .../models/company.py | 11 ++++++ .../models/config_settings.py | 5 ++- .../models/overdue_reminder_action.py | 3 +- .../account_invoice_overdue_reminder.xml | 3 +- .../views/config_settings.xml | 4 ++ .../views/overdue_reminder_action.xml | 3 +- .../views/partner.xml | 7 ++++ .../views/report_overdue_reminder.xml | 2 +- .../wizard/overdue_reminder_wizard.py | 38 ++++++++++++++++++- .../wizard/overdue_reminder_wizard_view.xml | 4 +- 12 files changed, 75 insertions(+), 9 deletions(-) diff --git a/account_invoice_overdue_reminder/data/mail_template.xml b/account_invoice_overdue_reminder/data/mail_template.xml index 7f79eadd5..70a2bad17 100644 --- a/account_invoice_overdue_reminder/data/mail_template.xml +++ b/account_invoice_overdue_reminder/data/mail_template.xml @@ -35,7 +35,7 @@ Residual Past Reminders -% for inv in object.invoice_ids: +% for inv in object.invoice_ids.sorted(key='date_invoice'): ${inv.number} ${format_date(inv.date_invoice)} diff --git a/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py b/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py index 45178b8c0..d94e92a91 100644 --- a/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py +++ b/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py @@ -33,6 +33,8 @@ class AccountInvoiceOverdueReminder(models.Model): related='action_id.result_notes', readonly=False) action_mail_id = fields.Many2one( related='action_id.mail_id') + action_mail_cc = fields.Char( + related='action_id.mail_id.email_cc', readonly=True, string='Cc') action_mail_state = fields.Selection( related='action_id.mail_id.state', string='E-mail Status') counter = fields.Integer(readonly=True) diff --git a/account_invoice_overdue_reminder/models/company.py b/account_invoice_overdue_reminder/models/company.py index 65904039c..80b96bd2b 100644 --- a/account_invoice_overdue_reminder/models/company.py +++ b/account_invoice_overdue_reminder/models/company.py @@ -18,6 +18,9 @@ class ResCompany(models.Model): '_overdue_reminder_interface_selection', string='Default Overdue Reminder Wizard Interface', default='onebyone') + overdue_reminder_partner_policy = fields.Selection( + '_overdue_reminder_partner_policy_selection', + default='last_reminder', string='Contact to Remind') @api.model def _overdue_reminder_interface_selection(self): @@ -26,6 +29,14 @@ def _overdue_reminder_interface_selection(self): ('mass', _('Mass')), ] + @api.model + def _overdue_reminder_partner_policy_selection(self): + return [ + ('last_reminder', 'Last Reminder'), + ('last_invoice', 'Last Invoice'), + ('invoice_contact', 'Invoice Contact'), + ] + _sql_constraints = [ ( 'overdue_reminder_start_days_positive', diff --git a/account_invoice_overdue_reminder/models/config_settings.py b/account_invoice_overdue_reminder/models/config_settings.py index 2e2e34541..5c1946286 100644 --- a/account_invoice_overdue_reminder/models/config_settings.py +++ b/account_invoice_overdue_reminder/models/config_settings.py @@ -16,5 +16,6 @@ class ResConfigSettings(models.TransientModel): related='company_id.overdue_reminder_min_interval_days', readonly=False) overdue_reminder_interface = fields.Selection( - related='company_id.overdue_reminder_interface', - readonly=False) + related='company_id.overdue_reminder_interface', readonly=False) + overdue_reminder_partner_policy = fields.Selection( + related='company_id.overdue_reminder_partner_policy', readonly=False) diff --git a/account_invoice_overdue_reminder/models/overdue_reminder_action.py b/account_invoice_overdue_reminder/models/overdue_reminder_action.py index bcb1eb6cf..2ab659902 100644 --- a/account_invoice_overdue_reminder/models/overdue_reminder_action.py +++ b/account_invoice_overdue_reminder/models/overdue_reminder_action.py @@ -17,7 +17,7 @@ class OverdueReminderAction(models.Model): 'res.partner', readonly=True, string='Contact') date = fields.Date( default=fields.Date.context_today, required=True, index=True, - readonly=True) + readonly=False) user_id = fields.Many2one( 'res.users', string='Performed by', required=True, readonly=True, ondelete='restrict', default=lambda self: self.env.user) @@ -32,6 +32,7 @@ class OverdueReminderAction(models.Model): 'mail.mail', string='Reminder E-mail', readonly=True) mail_state = fields.Selection( related='mail_id.state', string='E-mail Status') + mail_cc = fields.Char(related='mail_id.email_cc', readonly=True) company_id = fields.Many2one( 'res.company', string='Company', readonly=True) reminder_count = fields.Integer( diff --git a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml index f4d10d48b..40dea6662 100644 --- a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml +++ b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml @@ -16,12 +16,13 @@ - + + diff --git a/account_invoice_overdue_reminder/views/config_settings.xml b/account_invoice_overdue_reminder/views/config_settings.xml index 2d1cfc876..5f986859f 100644 --- a/account_invoice_overdue_reminder/views/config_settings.xml +++ b/account_invoice_overdue_reminder/views/config_settings.xml @@ -23,6 +23,10 @@
- + + Overdue Reminder Actions + {'search_default_commercial_partner_id': [active_id]} + overdue.reminder.action + + form +
diff --git a/account_invoice_overdue_reminder/wizard/__init__.py b/account_invoice_overdue_reminder/wizard/__init__.py index 62b5c3a6f..c4ac6ccc8 100644 --- a/account_invoice_overdue_reminder/wizard/__init__.py +++ b/account_invoice_overdue_reminder/wizard/__init__.py @@ -1 +1,2 @@ +from . import res_config_settings from . import overdue_reminder_wizard diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py index 0872c1b89..f59161854 100644 --- a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py @@ -1,10 +1,11 @@ -# Copyright 2020 Akretion France (http://www.akretion.com/) +# Copyright 2020-2021 Akretion France (http://www.akretion.com/) # @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models, tools, _ from odoo.exceptions import UserError from dateutil.relativedelta import relativedelta +from collections import defaultdict import base64 import logging logger = logging.getLogger(__name__) @@ -18,7 +19,7 @@ class OverdueReminderStart(models.TransientModel): partner_ids = fields.Many2many( 'res.partner', string='Customers', - domain=[('customer', '=', True), ('parent_id', '=', False)]) + domain=[('customer_rank', '>', 0), ('parent_id', '=', False)]) user_ids = fields.Many2many( 'res.users', string='Salesman') payment_ids = fields.Many2many( @@ -37,7 +38,7 @@ class OverdueReminderStart(models.TransientModel): string='I consider that payments are up-to-date') company_id = fields.Many2one( 'res.company', readonly=True, required=True, - default=lambda self: self.env['res.company']._company_default_get()) + default=lambda self: self.env.company) interface = fields.Selection( '_interface_selection', string='Wizard Interface', @@ -59,7 +60,7 @@ def _partner_policy_selection(self): def default_get(self, fields_list): res = super().default_get(fields_list) amo = self.env['account.move'] - company = self.env.user.company_id + company = self.env.company journals = self.env['account.journal'].search([ ('company_id', '=', company.id), ('type', 'in', ('bank', 'cash'))]) @@ -86,8 +87,9 @@ def default_get(self, fields_list): def _prepare_base_domain(self): base_domain = [ ('company_id', '=', self.company_id.id), - ('type', '=', 'out_invoice'), - ('state', '=', 'open'), + ('move_type', '=', 'out_invoice'), + ('state', '=', 'posted'), + ('payment_state', 'not in', ('paid', 'reversed', 'in_payment')), ('no_overdue_reminder', '=', False), ] return base_domain @@ -97,7 +99,7 @@ def _prepare_remind_trigger_domain(self, base_domain): limit_date = today if self.start_days: limit_date -= relativedelta(days=self.start_days) - domain = base_domain + [('date_due', '<', limit_date)] + domain = base_domain + [('invoice_date_due', '<', limit_date)] if self.partner_ids: domain.append(('commercial_partner_id', 'in', self.partner_ids.ids)) if self.user_ids: @@ -116,7 +118,7 @@ def run(self): if self.min_interval_days < 1: raise UserError(_( "The minimum delay since last reminder must be strictly positive.")) - aio = self.env['account.invoice'] + amo = self.env['account.move'] ajo = self.env['account.journal'] rpo = self.env['res.partner'] orso = self.env['overdue.reminder.step'] @@ -141,14 +143,14 @@ def run(self): # whereas search 2 compares due_date to today base_domain = self._prepare_base_domain() domain = self._prepare_remind_trigger_domain(base_domain) - rg_res = aio.read_group( + rg_res = amo.read_group( domain, - ['commercial_partner_id', 'residual_company_signed'], + ['commercial_partner_id', 'amount_residual_signed'], ['commercial_partner_id']) # Sort by residual amount desc rg_res_sorted = sorted( rg_res, - key=lambda to_sort: to_sort['residual_company_signed'], + key=lambda to_sort: to_sort['amount_residual_signed'], reverse=True) action_ids = [] for rg_re in rg_res_sorted: @@ -165,7 +167,7 @@ def run(self): "There are no overdue reminders.")) if self.interface == 'onebyone': xid = MOD + '.overdue_reminder_step_onebyone_action' - action = self.env.ref(xid).read()[0] + action = self.env.ref(xid).sudo().read()[0] action['res_id'] = action_ids[0] elif self.interface == 'mass': action = orso.goto_list_view() @@ -180,10 +182,10 @@ def _prepare_reminder_step( 'Skipping customer %s that has no_overdue_reminder=True', commercial_partner.display_name) return False - invs = self.env['account.invoice'].search( + invs = self.env['account.move'].search( base_domain + [ ('commercial_partner_id', '=', commercial_partner.id), - ('date_due', '<', fields.Date.context_today(self))]) + ('invoice_date_due', '<', fields.Date.context_today(self))]) assert invs # Check min interval if any([ @@ -225,12 +227,12 @@ def _prepare_reminder_step( partner_id = commercial_partner.address_get( ['invoice'])['invoice'] elif self.partner_policy == 'last_invoice': - last_inv = self.env['account.invoice'].search([ + last_inv = self.env['account.move'].search([ ('company_id', '=', self.company_id.id), - ('type', 'in', ('out_invoice', 'out_refund')), + ('move_type', 'in', ('out_invoice', 'out_refund')), ('commercial_partner_id', '=', commercial_partner.id), - ('state', 'in', ('open', 'in_payment', 'paid')), - ], order='date_invoice desc', limit=1) + ('state', '=', 'posted'), + ], order='invoice_date desc', limit=1) partner_id = last_inv.partner_id.id elif self.partner_policy == 'invoice_contact': partner_id = commercial_partner.address_get( @@ -298,10 +300,10 @@ class OverdueReminderStep(models.TransientModel): 'res.users', string='Assigned to', default=lambda self: self.env.user) letter_printed = fields.Boolean(readonly=True) invoice_ids = fields.Many2many( - 'account.invoice', string='Overdue Invoices', readonly=True) + 'account.move', string='Overdue Invoices', readonly=True) company_id = fields.Many2one( 'res.company', readonly=True, required=True, - default=lambda self: self.env['res.company']._company_default_get()) + default=lambda self: self.env.company) warn_unreconciled_move_line_ids = fields.Many2many( 'account.move.line', string='Unreconciled Payments/Refunds', readonly=True) @@ -321,27 +323,22 @@ def _reminder_type_selection(self): @api.model def create(self, vals): - action = super().create(vals) + step = super().create(vals) commercial_partner = self.env['res.partner'].browse( vals['commercial_partner_id']) xmlid = MOD + '.overdue_invoice_reminder_mail_template' mail_tpl = self.env.ref(xmlid) mail_tpl_lang = mail_tpl.with_context(lang=commercial_partner.lang or 'en_US') mail_subject = mail_tpl_lang._render_template( - mail_tpl_lang.subject, self._name, action.id) + mail_tpl_lang.subject, self._name, [step.id])[step.id] mail_body = mail_tpl_lang._render_template( - mail_tpl_lang.body_html, self._name, action.id) - if mail_tpl.user_signature: - signature = self.env.user.signature - if signature: - mail_body = tools.append_content_to_html( - mail_body, signature, plaintext=False) + mail_tpl_lang.body_html, self._name, [step.id])[step.id] mail_body = tools.html_sanitize(mail_body) - action.write({ + step.write({ 'mail_subject': mail_subject, 'mail_body': mail_body, }) - return action + return step @api.onchange('reminder_type') def reminder_type_change(self): @@ -358,16 +355,16 @@ def next(self): ('company_id', '=', self.company_id.id)], limit=1) if left: action = self.env.ref( - MOD + '.overdue_reminder_step_onebyone_action').read()[0] + MOD + '.overdue_reminder_step_onebyone_action').sudo().read()[0] action['res_id'] = left.id else: action = self.env.ref( - MOD + '.overdue_reminder_end_action').read()[0] + MOD + '.overdue_reminder_end_action').sudo().read()[0] return action def goto_list_view(self): action = self.env.ref( - MOD + '.overdue_reminder_step_mass_action').read()[0] + MOD + '.overdue_reminder_step_mass_action').sudo().read()[0] return action def skip(self): @@ -404,7 +401,7 @@ def _prepare_mail_activity(self): def check_warnings(self): self.ensure_one() for rec in self: - if rec.company_id != self.env.user.company_id: + if rec.company_id != self.env.company: raise UserError(_( "User company is different from action company. " "This should never happen.")) @@ -455,7 +452,8 @@ def validate_mail(self): if not self.mail_body: raise UserError(_('Mail body is empty.')) xmlid = MOD + '.overdue_invoice_reminder_mail_template' - mvals = self.env.ref(xmlid).generate_email(self.id) + mvals = self.env.ref(xmlid).generate_email( + self.id, ['email_from', 'email_to', 'partner_to', 'reply_to']) cc_list = [p.email for p in self.mail_cc_partner_ids if p.email] if mvals.get('email_cc'): cc_list.append(mvals['email_cc']) @@ -475,7 +473,7 @@ def validate_mail(self): attachment_ids = [] for inv in self.invoice_ids: if inv_report.report_type in ('qweb-html', 'qweb-pdf'): - report_bin, report_format = inv_report.render_qweb_pdf([inv.id]) + report_bin, report_format = inv_report._render_qweb_pdf([inv.id]) else: res = inv_report.render([inv.id]) if not res: @@ -483,11 +481,9 @@ def validate_mail(self): "Report format '%s' is not supported.") % inv_report.report_type) report_bin, report_format = res - # WARN : update when backporting filename = '%s.%s' % (inv._get_report_base_filename(), report_format) attach = iao.create({ 'name': filename, - 'datas_fname': filename, 'datas': base64.b64encode(report_bin), 'res_model': 'mail.message', 'res_id': mail.mail_message_id.id, @@ -547,12 +543,9 @@ def print_invoices(self): def total_residual(self): self.ensure_one() - res = {} + res = defaultdict(float) for inv in self.invoice_ids: - if inv.currency_id in res: - res[inv.currency_id] += inv.residual_signed - else: - res[inv.currency_id] = inv.residual_signed + res[inv.currency_id] += inv.amount_residual * (inv.move_type == 'out_refund' and -1 or 1) return res.items() def _get_report_base_filename(self): diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml index 292e5f41f..ca077259c 100644 --- a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml @@ -1,13 +1,12 @@ - overdue.reminder.start.form overdue.reminder.start @@ -58,7 +57,7 @@ new - + overdue.reminder.step.form @@ -83,23 +82,25 @@ - - + + - - - - - + + + + + - + + - + + @@ -166,7 +167,6 @@ [('state', '=', 'draft'), ('user_id', '=', uid)] - overdue.reminder.end.form overdue.reminder.end @@ -208,36 +208,34 @@ - - - - - + + Change Reminder Type + overdue.reminder.mass.update + form + {'default_update_action': 'reminder_type'} + + list + new + + + Validate + overdue.reminder.mass.update + form + {'default_update_action': 'validate'} + + list + new + + + Skip + overdue.reminder.mass.update + form + {'default_update_action': 'skip'} + + list + new + diff --git a/account_invoice_overdue_reminder/models/config_settings.py b/account_invoice_overdue_reminder/wizard/res_config_settings.py similarity index 93% rename from account_invoice_overdue_reminder/models/config_settings.py rename to account_invoice_overdue_reminder/wizard/res_config_settings.py index 5c1946286..4f71cb136 100644 --- a/account_invoice_overdue_reminder/models/config_settings.py +++ b/account_invoice_overdue_reminder/wizard/res_config_settings.py @@ -1,4 +1,4 @@ -# Copyright 2020 Akretion France (http://www.akretion.com/) +# Copyright 2020-2021 Akretion France (http://www.akretion.com/) # @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). diff --git a/account_invoice_overdue_reminder/views/config_settings.xml b/account_invoice_overdue_reminder/wizard/res_config_settings_view.xml similarity index 65% rename from account_invoice_overdue_reminder/views/config_settings.xml rename to account_invoice_overdue_reminder/wizard/res_config_settings_view.xml index 5f986859f..a9ea73deb 100644 --- a/account_invoice_overdue_reminder/views/config_settings.xml +++ b/account_invoice_overdue_reminder/wizard/res_config_settings_view.xml @@ -1,6 +1,6 @@ @@ -13,31 +13,37 @@ res.config.settings - +

Overdue Invoice Reminder

-
-
+
+
+ +
-
+
+
+
+
+
+
-
-
-
-
From 37dd561d36f1a905fbb4b785de760dbd235bb31c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 11 Feb 2021 19:04:15 +0100 Subject: [PATCH 12/50] account_invoice_overdue_reminder: black, isort and other reformatting [UPD] Update account_invoice_overdue_reminder.pot [UPD] README.rst [ADD] icon.png --- account_invoice_overdue_reminder/README.rst | 127 ++ .../__manifest__.py | 50 +- .../data/mail_template.xml | 18 +- .../data/overdue_reminder_result.xml | 3 +- .../i18n/account_invoice_overdue_reminder.pot | 1182 +++++++++++++++++ .../account_invoice_overdue_reminder.py | 70 +- .../models/account_move.py | 75 +- .../models/overdue_reminder_action.py | 91 +- .../models/overdue_reminder_result.py | 13 +- .../models/res_company.py | 56 +- .../models/res_partner.py | 5 +- .../readme/CONFIGURATION.rst | 2 +- .../security/ir.model.access.csv | 1 - .../security/ir_rule.xml | 9 +- .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 460 +++++++ .../account_invoice_overdue_reminder.xml | 136 +- .../views/account_move.xml | 43 +- .../views/overdue_reminder_action.xml | 110 +- .../views/overdue_reminder_result.xml | 33 +- .../views/report.xml | 11 +- .../views/report_overdue_reminder.xml | 70 +- .../views/res_partner.xml | 15 +- .../wizard/overdue_reminder_wizard.py | 766 ++++++----- .../wizard/overdue_reminder_wizard_view.xml | 238 ++-- .../wizard/res_config_settings.py | 18 +- .../wizard/res_config_settings_view.xml | 66 +- 27 files changed, 2928 insertions(+), 740 deletions(-) create mode 100644 account_invoice_overdue_reminder/README.rst create mode 100644 account_invoice_overdue_reminder/i18n/account_invoice_overdue_reminder.pot create mode 100644 account_invoice_overdue_reminder/static/description/icon.png create mode 100644 account_invoice_overdue_reminder/static/description/index.html diff --git a/account_invoice_overdue_reminder/README.rst b/account_invoice_overdue_reminder/README.rst new file mode 100644 index 000000000..bc3bf1a1a --- /dev/null +++ b/account_invoice_overdue_reminder/README.rst @@ -0,0 +1,127 @@ +======================== +Overdue Invoice Reminder +======================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcredit--control-lightgray.png?logo=github + :target: https://github.com/OCA/credit-control/tree/14.0/account_invoice_overdue_reminder + :alt: OCA/credit-control +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/credit-control-14-0/credit-control-14-0-account_invoice_overdue_reminder + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/262/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +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 `_ (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 `_. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Of course, before sending invoice reminders, you must import your bank statements and process them, so that you are up-to-date on customer payments. + +Then, go to the menu *Invoicing > Customers > Overdue Invoice Remind*: you will get the start screen where you can: + +* filter the customers that you want to remind (filter by customer or by salesman), +* check that your bank journals are up-to-date, +* choose between the *one-by-one* and *mass* interfaces, +* customize some parameters. + +Then follow the process until the end. + +You can also start the invoice reminder wizard via the button *Overdue Reminder* on an overdue invoice. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* Alexis de Lattre + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-alexis-via| image:: https://github.com/alexis-via.png?size=40px + :target: https://github.com/alexis-via + :alt: alexis-via + +Current `maintainer `__: + +|maintainer-alexis-via| + +This module is part of the `OCA/credit-control `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_invoice_overdue_reminder/__manifest__.py b/account_invoice_overdue_reminder/__manifest__.py index ab1c08a22..0abe4aa44 100644 --- a/account_invoice_overdue_reminder/__manifest__.py +++ b/account_invoice_overdue_reminder/__manifest__.py @@ -3,30 +3,30 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Overdue Invoice Reminder', - 'version': '14.0.1.0.0', - 'category': 'Accounting', - 'license': 'AGPL-3', - 'summary': 'Simple mail/letter/phone overdue customer invoice reminder ', - 'author': 'Akretion,Odoo Community Association (OCA)', - 'maintainers': ['alexis-via'], - 'website': 'https://github.com/OCA/credit-control', - 'depends': ['account'], - 'data': [ - 'security/ir.model.access.csv', - 'security/ir_rule.xml', - 'wizard/overdue_reminder_wizard_view.xml', - 'views/res_partner.xml', - 'views/report.xml', - 'views/report_overdue_reminder.xml', - 'views/account_move.xml', - 'views/account_invoice_overdue_reminder.xml', - 'views/overdue_reminder_result.xml', - 'views/overdue_reminder_action.xml', - 'wizard/res_config_settings_view.xml', - 'data/overdue_reminder_result.xml', - 'data/mail_template.xml', + "name": "Overdue Invoice Reminder", + "version": "14.0.1.0.0", + "category": "Accounting", + "license": "AGPL-3", + "summary": "Simple mail/letter/phone overdue customer invoice reminder ", + "author": "Akretion,Odoo Community Association (OCA)", + "maintainers": ["alexis-via"], + "website": "https://github.com/OCA/credit-control", + "depends": ["account"], + "data": [ + "security/ir.model.access.csv", + "security/ir_rule.xml", + "wizard/overdue_reminder_wizard_view.xml", + "views/res_partner.xml", + "views/report.xml", + "views/report_overdue_reminder.xml", + "views/account_move.xml", + "views/account_invoice_overdue_reminder.xml", + "views/overdue_reminder_result.xml", + "views/overdue_reminder_action.xml", + "wizard/res_config_settings_view.xml", + "data/overdue_reminder_result.xml", + "data/mail_template.xml", ], - 'installable': True, - 'application': True, + "installable": True, + "application": True, } diff --git a/account_invoice_overdue_reminder/data/mail_template.xml b/account_invoice_overdue_reminder/data/mail_template.xml index fb6c5906b..d0b893a2b 100644 --- a/account_invoice_overdue_reminder/data/mail_template.xml +++ b/account_invoice_overdue_reminder/data/mail_template.xml @@ -1,22 +1,28 @@ - + - Overdue Invoice Reminder - - + + ${object.partner_id.lang} ${object.user_id.email or object.company_id.email} ${object.partner_id.email} - ${object.company_id.name} - Overdue invoice reminder n°${object.counter} - ${object.company_id.name} - Overdue invoice reminder n°${object.counter} +

Dear customer,

diff --git a/account_invoice_overdue_reminder/data/overdue_reminder_result.xml b/account_invoice_overdue_reminder/data/overdue_reminder_result.xml index 548b6388f..5e4d5c5f1 100644 --- a/account_invoice_overdue_reminder/data/overdue_reminder_result.xml +++ b/account_invoice_overdue_reminder/data/overdue_reminder_result.xml @@ -1,10 +1,9 @@ - + - diff --git a/account_invoice_overdue_reminder/i18n/account_invoice_overdue_reminder.pot b/account_invoice_overdue_reminder/i18n/account_invoice_overdue_reminder.pot new file mode 100644 index 000000000..af4674614 --- /dev/null +++ b/account_invoice_overdue_reminder/i18n/account_invoice_overdue_reminder.pot @@ -0,0 +1,1182 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_invoice_overdue_reminder +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_invoice_overdue_reminder +#: model:mail.template,body_html:account_invoice_overdue_reminder.overdue_invoice_reminder_mail_template +msgid "" +"\n" +"
\n" +"

Dear customer,

\n" +"\n" +"

According to our books, the following invoices are overdue:

\n" +"\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"% for inv in object.invoice_ids.sorted(key='invoice_date'):\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"% endfor\n" +"% for (currency, total_residual) in object.total_residual():\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"% endfor\n" +"
Invoice NumberInvoice DatePayment TermsDue DateOrder Ref.Total UntaxedTotalResidualPast Reminders
${inv.name}${format_date(inv.invoice_date)}${inv.invoice_payment_term_id.name or ''}${format_date(inv.invoice_date_due)}${inv.ref or ''}${format_amount(inv.amount_untaxed * (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)}${format_amount(inv.amount_total * (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)}${format_amount(inv.amount_residual * (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)}${inv.overdue_reminder_counter}
Total Residual in ${currency.name}:${format_amount(total_residual, currency)}
\n" +"\n" +"

If you made a payment for these invoices a few days ago, please ignore this email.

\n" +"\n" +"% if object.company_id.overdue_reminder_attach_invoice:\n" +"

You will find enclosed the overdue invoices.

\n" +"% endif\n" +"\n" +"% if object.counter > 2:\n" +"

Despite several reminders, we are disappointed to see that these overdue invoices are still unpaid. In order to avoid legal proceedings, we urge you to paid these overdue invoices in the next days.

\n" +"% endif\n" +"\n" +"

Regards,

\n" +"\n" +"% if user.signature:\n" +"

\n" +"${user.signature | safe}\n" +"

\n" +"% endif\n" +"\n" +"
\n" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:mail.template,subject:account_invoice_overdue_reminder.overdue_invoice_reminder_mail_template +msgid "" +"${object.company_id.name} - Overdue invoice reminder n°${object.counter}" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 +#, python-format +msgid "%s Reminder %d" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 +#, python-format +msgid "%s, Reminder %s" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.report,print_report_name:account_invoice_overdue_reminder.overdue_reminder_step_report +msgid "(object._get_report_base_filename())" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "According to our books, the following invoices are overdue:" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__active +msgid "Active" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__activity_type_id +msgid "Activity" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Amount Due" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 +#, python-format +msgid "An overdue reminder can only be attached to a customer invoice" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_result_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_result_search +msgid "Archived" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__activity_user_id +msgid "Assigned to" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_attach_invoice +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_attach_invoice +msgid "Attach Invoices to Overdue Reminder E-mails" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__result_notes +msgid "Call Notes" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__result_id +msgid "Call Result/Info" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_mass_update_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Cancel" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_mail_cc +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_overdue_reminder_action__mail_cc +msgid "Carbon copy message recipients" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_mail_cc +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__mail_cc +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__mail_cc_partner_ids +msgid "Cc" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.mass_update_reminder_type_action +#: model:ir.model.fields.selection,name:account_invoice_overdue_reminder.selection__overdue_reminder_mass_update__update_action__reminder_type +msgid "Change Reminder Type" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_end_form +msgid "Close" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__company_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__company_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__company_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__company_id +msgid "Company" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_end +msgid "Congratulation end screen for overdue reminder wizard" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_res_partner +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_partner_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__partner_id +msgid "Contact" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__partner_policy +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_partner_policy +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_partner_policy +msgid "Contact to Remind" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__counter +msgid "Counter" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.constraint,message:account_invoice_overdue_reminder.constraint_account_invoice_overdue_reminder_counter_positive +msgid "Counter must always be positive" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__create_activity +msgid "Create Activity" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__create_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__create_uid +msgid "Created by" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__create_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__create_date +msgid "Created on" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Current Remind Counter" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_commercial_partner_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__commercial_partner_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__commercial_partner_id +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +msgid "Customer" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "" +"Customer '%s' has unreconciled payments/refunds. You should reconcile these " +"payments/refunds and start the overdue remind process again (or check the " +"option to confirm that these unreconciled payments/refunds have a good " +"reason not to be reconciled with an open invoice)." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__partner_ids +msgid "Customers" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__date +msgid "Date" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Date:" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__activity_deadline +msgid "Deadline" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Dear Customer," +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days +msgid "Default Overdue Reminder Minimum Interval (days)" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days +msgid "Default Overdue Reminder Trigger Delay (days)" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_interface +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_interface +msgid "Default Overdue Reminder Wizard Interface" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid "Default Reminder Minimum Interval" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid "Default Reminder Trigger Delay" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid "Default Wizard Interface" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "" +"Despite several reminders, we are disappointed to see that these overdue " +"invoices are still unpaid. In order to avoid legal proceedings, we urge you " +"to paid these overdue invoices in the next days." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_partner__no_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_users__no_overdue_reminder +msgid "Disable Overdue Invoice Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__no_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__no_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__no_overdue_reminder +msgid "Disable Overdue Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_partner__display_name +msgid "Display Name" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields.selection,name:account_invoice_overdue_reminder.selection__overdue_reminder_step__state__done +msgid "Done" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields.selection,name:account_invoice_overdue_reminder.selection__overdue_reminder_step__state__draft +msgid "Draft" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Due Date" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#, python-format +msgid "E-mail" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_mail_state +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__mail_state +msgid "E-mail Status" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "E-mail missing on partner '%s'." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_email +msgid "Email" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form +msgid "Filters" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "" +"For the reminder of customer '%s', the deadline is missing for the activity." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "" +"For the reminder of customer '%s', you must assign someone for the activity." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_end_form +msgid "Good job !" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__up_to_date +msgid "I consider that payments are up-to-date" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_partner__id +msgid "ID" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "" +"If you made a payment for these invoices a few days ago, please ignore this " +"letter." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "" +"In order to start overdue reminders, you must make sure that customer " +"payments are up-to-date." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_result_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__result_id +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_form +msgid "Info/Result" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_result_notes +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__result_notes +msgid "Info/Result Notes" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__interface +msgid "Interface" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__invoice_id +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +msgid "Invoice" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 +#, python-format +msgid "Invoice Contact" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Invoice Date" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Invoice Number" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.overdue_reminder_action_action +#: model:ir.ui.menu,name:account_invoice_overdue_reminder.overdue_reminder_action_menu +msgid "Invoice Reminder Actions" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.account_invoice_overdue_reminder_action +msgid "Invoice Reminder Counters" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.overdue_reminder_result_action +#: model:ir.ui.menu,name:account_invoice_overdue_reminder.overdue_reminder_result_menu +msgid "Invoice Reminder Results" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.invoice_dispute +msgid "Invoice dispute" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.invoice_in_payment_pipe +msgid "Invoice in payment pipe" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.invoice_not_received +msgid "Invoice not received" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.invoice_wait_approval +msgid "Invoice waiting approval" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_form +msgid "Invoices" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_id +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Invoicing Contact" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__journal_id +msgid "Journal" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__last_entry_date +msgid "Last Entry" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__last_entry_create_uid +msgid "Last Entry Created by" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__last_entry_create_date +msgid "Last Entry Created on" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 +#, python-format +msgid "Last Invoice" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_partner____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_last_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_last_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_last_date +msgid "Last Overdue Reminder Date" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +#, python-format +msgid "Last Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__write_uid +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_end__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__write_date +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 +#, python-format +msgid "Letter" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__letter_printed +msgid "Letter Printed" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__mail_body +msgid "Mail Body" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "Mail body is empty." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "Mail subject is empty." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 +#, python-format +msgid "Mass" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.voicemail +msgid "Message left on voicemail" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__min_interval_days +msgid "Minimum Delay Since Last Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_mobile +msgid "Mobile" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__name +msgid "Name" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__counter +msgid "New Remind Counter" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__reminder_type +msgid "New Reminder Type" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__activity_note +msgid "Note" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_form +msgid "Notes" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_count +msgid "Number of invoices" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_overdue_reminder_start__min_interval_days +msgid "" +"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)." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_overdue_reminder_start__start_days +msgid "" +"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)." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 +#, python-format +msgid "One by One" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form +msgid "Options" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Order Ref" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Order Ref." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue +msgid "Overdue" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.constraint,message:account_invoice_overdue_reminder.constraint_account_move_counter_positive +msgid "Overdue Invoice Counter must always be positive" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.overdue_reminder_end_action +msgid "Overdue Invoice End" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.overdue_reminder_start_action +#: model:ir.ui.menu,name:account_invoice_overdue_reminder.overdue_reminder_start_menu +msgid "Overdue Invoice Remind" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid "Overdue Invoice Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_account_invoice_overdue_reminder +msgid "Overdue Invoice Reminder Action History" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_result +msgid "Overdue Invoice Reminder Result/Info" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.overdue_reminder_step_mass_action +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.overdue_reminder_step_onebyone_action +msgid "Overdue Invoice Step" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__invoice_ids +msgid "Overdue Invoices" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.report,name:account_invoice_overdue_reminder.overdue_reminder_step_report +msgid "Overdue Letter" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_move_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_partner_property_form +msgid "Overdue Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_id +msgid "Overdue Reminder Action" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_action +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_ids +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_ids +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_ids +msgid "Overdue Reminder Action History" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.action_overdue_reminder_action +msgid "Overdue Reminder Actions" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_invoice_filter +msgid "Overdue Reminder Count" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.constraint,message:account_invoice_overdue_reminder.constraint_res_company_overdue_reminder_start_days_positive +msgid "Overdue Reminder Trigger Delay must always be positive" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.constraint,message:account_invoice_overdue_reminder.constraint_res_company_overdue_reminder_min_interval_days_positive +msgid "Overdue Reminder Trigger Delay must always be strictly positive" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_step +msgid "Overdue reminder wizard step" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Past Reminders" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__payment_ids +msgid "Payment" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Payment Terms" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.invoice_payment_sent +msgid "Payment sent" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form +msgid "Payments up-to-date ?" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_user_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__user_id +msgid "Performed by" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_phone +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#, python-format +msgid "Phone" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +msgid "Post" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Print Letter" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Print Overdue Invoices" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "Remind letter hasn't been printed!" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_ids +msgid "Reminder" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_mail_id +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__mail_id +msgid "Reminder E-mail" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__reminder_type +msgid "Reminder Type" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "Report format '%s' is not supported." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Residual" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +msgid "Result/Info" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_mass_update_form +msgid "Run" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__user_ids +msgid "Salesman" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result__sequence +msgid "Sequence" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.mass_update_skip_action +#: model:ir.model.fields.selection,name:account_invoice_overdue_reminder.selection__overdue_reminder_mass_update__update_action__skip +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Skip" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields.selection,name:account_invoice_overdue_reminder.selection__overdue_reminder_step__state__skipped +msgid "Skipped" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form +msgid "Start" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__state +msgid "State" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_start_payment +msgid "Status of payments" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__mail_subject +msgid "Subject" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Subject: Overdue invoice reminder n°" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__activity_summary +msgid "Summary" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Tax Excluded" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "The minimum delay since last reminder must be strictly positive." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "The trigger delay cannot be negative." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "There are no overdue reminders." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter +msgid "This counter is not increased in case of phone reminder." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.constraint,message:account_invoice_overdue_reminder.constraint_overdue_reminder_result_name_unique +msgid "This overdue reminder result already exists" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__unreconciled_move_line_normal +msgid "" +"To check if unreconciled payments/refunds above have a good reason not to be" +" reconciled with an open invoice" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Total" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Total Untaxed" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Total in" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__start_days +msgid "Trigger Delay" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder__action_reminder_type +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_type +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +msgid "Type" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:overdue.reminder.result,name:account_invoice_overdue_reminder.unreachable +msgid "Unreachable" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__warn_unreconciled_move_line_ids +msgid "Unreconciled Payments/Refunds" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update__update_action +msgid "Update Action" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_mass_update +msgid "Update several actions at the same time" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__user_id +msgid "User" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "" +"User company is different from action company. This should never happen." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.actions.act_window,name:account_invoice_overdue_reminder.mass_update_validate_action +#: model:ir.model.fields.selection,name:account_invoice_overdue_reminder.selection__overdue_reminder_mass_update__update_action__validate +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "Validate" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form +msgid "WARNING: unreconciled payments/refunds" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment__wizard_id +msgid "Wizard" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start__interface +msgid "Wizard Interface" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_start +msgid "Wizard to reminder overdue customer invoice" +msgstr "" + +#. module: account_invoice_overdue_reminder +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +#, python-format +msgid "You must select the new reminder type." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_end_form +msgid "You processed all your overdue invoice reminders." +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document +msgid "Yours faithfully," +msgstr "" + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid "days" +msgstr "" diff --git a/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py b/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py index ef0b14a27..98bdf925e 100644 --- a/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py +++ b/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py @@ -2,62 +2,64 @@ # @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError class AccountInvoiceOverdueReminder(models.Model): - _name = 'account.invoice.overdue.reminder' - _description = 'Overdue Invoice Reminder Action History' - _order = 'id desc' + _name = "account.invoice.overdue.reminder" + _description = "Overdue Invoice Reminder Action History" + _order = "id desc" # For the link to invoice: why a M2O and not a M2M ? # Because of the "counter" field: a single reminder action for a customer, # the "counter" may not be the same for each invoice invoice_id = fields.Many2one( - 'account.move', string='Invoice', ondelete='cascade', readonly=True) + "account.move", string="Invoice", ondelete="cascade", readonly=True + ) action_id = fields.Many2one( - 'overdue.reminder.action', string='Overdue Reminder Action', - ondelete='cascade') + "overdue.reminder.action", string="Overdue Reminder Action", ondelete="cascade" + ) action_commercial_partner_id = fields.Many2one( - related='action_id.commercial_partner_id', store=True) - action_partner_id = fields.Many2one( - related='action_id.partner_id', store=True) - action_date = fields.Date(related='action_id.date', store=True) - action_user_id = fields.Many2one(related='action_id.user_id') + related="action_id.commercial_partner_id", store=True + ) + action_partner_id = fields.Many2one(related="action_id.partner_id", store=True) + action_date = fields.Date(related="action_id.date", store=True) + action_user_id = fields.Many2one(related="action_id.user_id") action_reminder_type = fields.Selection( - related='action_id.reminder_type', store=True) - action_result_id = fields.Many2one( - related='action_id.result_id', readonly=False) - action_result_notes = fields.Text( - related='action_id.result_notes', readonly=False) - action_mail_id = fields.Many2one( - related='action_id.mail_id') + related="action_id.reminder_type", store=True + ) + action_result_id = fields.Many2one(related="action_id.result_id", readonly=False) + action_result_notes = fields.Text(related="action_id.result_notes", readonly=False) + action_mail_id = fields.Many2one(related="action_id.mail_id") action_mail_cc = fields.Char( - related='action_id.mail_id.email_cc', readonly=True, string='Cc') + related="action_id.mail_id.email_cc", readonly=True, string="Cc" + ) action_mail_state = fields.Selection( - related='action_id.mail_id.state', string='E-mail Status') + related="action_id.mail_id.state", string="E-mail Status" + ) counter = fields.Integer(readonly=True) - company_id = fields.Many2one( - related='invoice_id.company_id', store=True) + company_id = fields.Many2one(related="invoice_id.company_id", store=True) - _sql_constraints = [( - 'counter_positive', - 'CHECK(counter >= 0)', - 'Counter must always be positive')] + _sql_constraints = [ + ("counter_positive", "CHECK(counter >= 0)", "Counter must always be positive") + ] - @api.constrains('invoice_id') + @api.constrains("invoice_id") def invoice_id_check(self): for action in self: - if action.invoice_id and action.invoice_id.move_type != 'out_invoice': - raise ValidationError(_( - "An overdue reminder can only be attached " - "to a customer invoice")) + if action.invoice_id and action.invoice_id.move_type != "out_invoice": + raise ValidationError( + _( + "An overdue reminder can only be attached " + "to a customer invoice" + ) + ) - @api.depends('invoice_id', 'counter') + @api.depends("invoice_id", "counter") def name_get(self): res = [] for rec in self: - name = _('%s Reminder %d') % (rec.invoice_id.name, rec.counter) + name = _("%s Reminder %d") % (rec.invoice_id.name, rec.counter) res.append((rec.id, name)) return res diff --git a/account_invoice_overdue_reminder/models/account_move.py b/account_invoice_overdue_reminder/models/account_move.py index 9776ba5d1..3c1716786 100644 --- a/account_invoice_overdue_reminder/models/account_move.py +++ b/account_invoice_overdue_reminder/models/account_move.py @@ -6,56 +6,71 @@ class AccountMove(models.Model): - _inherit = 'account.move' + _inherit = "account.move" no_overdue_reminder = fields.Boolean( - string='Disable Overdue Reminder', - tracking=True) + string="Disable Overdue Reminder", tracking=True + ) overdue_reminder_ids = fields.One2many( - 'account.invoice.overdue.reminder', - 'invoice_id', - string='Overdue Reminder Action History') + "account.invoice.overdue.reminder", + "invoice_id", + string="Overdue Reminder Action History", + ) overdue_reminder_last_date = fields.Date( - compute='_compute_overdue_reminder', - string='Last Overdue Reminder Date', store=True) + compute="_compute_overdue_reminder", + string="Last Overdue Reminder Date", + store=True, + ) overdue_reminder_counter = fields.Integer( - string='Overdue Reminder Count', store=True, - compute='_compute_overdue_reminder', - help="This counter is not increased in case of phone reminder.") - overdue = fields.Boolean(compute='_compute_overdue') + string="Overdue Reminder Count", + store=True, + compute="_compute_overdue_reminder", + help="This counter is not increased in case of phone reminder.", + ) + overdue = fields.Boolean(compute="_compute_overdue") - _sql_constraints = [( - 'counter_positive', - 'CHECK(overdue_reminder_counter >= 0)', - 'Overdue Invoice Counter must always be positive')] + _sql_constraints = [ + ( + "counter_positive", + "CHECK(overdue_reminder_counter >= 0)", + "Overdue Invoice Counter must always be positive", + ) + ] - @api.depends('move_type', 'state', 'payment_state', 'invoice_date_due') + @api.depends("move_type", "state", "payment_state", "invoice_date_due") def _compute_overdue(self): today = fields.Date.context_today(self) for move in self: overdue = False if ( - move.move_type == 'out_invoice' and - move.state == 'posted' and - move.payment_state not in ('paid', 'reversed', 'in_payment') and - move.invoice_date_due < today): + move.move_type == "out_invoice" + and move.state == "posted" + and move.payment_state not in ("paid", "reversed", "in_payment") + and move.invoice_date_due < today + ): overdue = True move.overdue = overdue @api.depends( - 'overdue_reminder_ids.action_id.date', - 'overdue_reminder_ids.counter', - 'overdue_reminder_ids.action_id.reminder_type') + "overdue_reminder_ids.action_id.date", + "overdue_reminder_ids.counter", + "overdue_reminder_ids.action_id.reminder_type", + ) def _compute_overdue_reminder(self): - aioro = self.env['account.invoice.overdue.reminder'] + aioro = self.env["account.invoice.overdue.reminder"] for move in self: reminder = aioro.search( - [('invoice_id', '=', move.id)], order='action_date desc', limit=1) + [("invoice_id", "=", move.id)], order="action_date desc", limit=1 + ) date = reminder and reminder.action_date or False - counter_reminder = aioro.search([ - ('invoice_id', '=', move.id), - ('action_reminder_type', 'in', ('mail', 'post'))], - order='action_date desc, id desc', limit=1) + counter_reminder = aioro.search( + [ + ("invoice_id", "=", move.id), + ("action_reminder_type", "in", ("mail", "post")), + ], + order="action_date desc, id desc", + limit=1, + ) counter = counter_reminder and counter_reminder.counter or False move.overdue_reminder_last_date = date move.overdue_reminder_counter = counter diff --git a/account_invoice_overdue_reminder/models/overdue_reminder_action.py b/account_invoice_overdue_reminder/models/overdue_reminder_action.py index 401146d7e..a5c15e5e4 100644 --- a/account_invoice_overdue_reminder/models/overdue_reminder_action.py +++ b/account_invoice_overdue_reminder/models/overdue_reminder_action.py @@ -2,66 +2,81 @@ # @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models class OverdueReminderAction(models.Model): - _name = 'overdue.reminder.action' - _description = 'Overdue Reminder Action History' - _order = 'date desc, id desc' + _name = "overdue.reminder.action" + _description = "Overdue Reminder Action History" + _order = "date desc, id desc" commercial_partner_id = fields.Many2one( - 'res.partner', readonly=True, string='Customer', index=True, - domain=[('parent_id', '=', False)]) - partner_id = fields.Many2one( - 'res.partner', readonly=True, string='Contact') + "res.partner", + readonly=True, + string="Customer", + index=True, + domain=[("parent_id", "=", False)], + ) + partner_id = fields.Many2one("res.partner", readonly=True, string="Contact") date = fields.Date( - default=fields.Date.context_today, required=True, index=True, - readonly=False) + default=fields.Date.context_today, required=True, index=True, readonly=False + ) user_id = fields.Many2one( - 'res.users', string='Performed by', required=True, readonly=True, - ondelete='restrict', default=lambda self: self.env.user) + "res.users", + string="Performed by", + required=True, + readonly=True, + ondelete="restrict", + default=lambda self: self.env.user, + ) reminder_type = fields.Selection( - '_reminder_type_selection', default='mail', string='Type', - required=True, readonly=True) + "_reminder_type_selection", + default="mail", + string="Type", + required=True, + readonly=True, + ) result_id = fields.Many2one( - 'overdue.reminder.result', ondelete='restrict', - string='Info/Result') - result_notes = fields.Text(string='Info/Result Notes') - mail_id = fields.Many2one( - 'mail.mail', string='Reminder E-mail', readonly=True) - mail_state = fields.Selection( - related='mail_id.state', string='E-mail Status') - mail_cc = fields.Char(related='mail_id.email_cc', readonly=True) - company_id = fields.Many2one( - 'res.company', string='Company', readonly=True) + "overdue.reminder.result", ondelete="restrict", string="Info/Result" + ) + result_notes = fields.Text(string="Info/Result Notes") + mail_id = fields.Many2one("mail.mail", string="Reminder E-mail", readonly=True) + mail_state = fields.Selection(related="mail_id.state", string="E-mail Status") + mail_cc = fields.Char(related="mail_id.email_cc", readonly=True) + company_id = fields.Many2one("res.company", string="Company", readonly=True) reminder_count = fields.Integer( - compute='_compute_invoice_count', store=True, string='Number of invoices') + compute="_compute_invoice_count", store=True, string="Number of invoices" + ) reminder_ids = fields.One2many( - 'account.invoice.overdue.reminder', 'action_id', readonly=True) + "account.invoice.overdue.reminder", "action_id", readonly=True + ) @api.model def _reminder_type_selection(self): return [ - ('mail', _('E-mail')), - ('phone', _('Phone')), - ('post', _('Letter')), - ] + ("mail", _("E-mail")), + ("phone", _("Phone")), + ("post", _("Letter")), + ] - @api.depends('reminder_ids') + @api.depends("reminder_ids") def _compute_invoice_count(self): - rg_res = self.env['account.invoice.overdue.reminder'].read_group( - [('action_id', 'in', self.ids), ('invoice_id', '!=', False)], - ['action_id'], ['action_id']) - mapped_data = dict([(x['action_id'][0], x['action_id_count']) for x in rg_res]) + rg_res = self.env["account.invoice.overdue.reminder"].read_group( + [("action_id", "in", self.ids), ("invoice_id", "!=", False)], + ["action_id"], + ["action_id"], + ) + mapped_data = {x["action_id"][0]: x["action_id_count"] for x in rg_res} for rec in self: rec.reminder_count = mapped_data.get(rec.id, 0) - @api.depends('commercial_partner_id', 'date') + @api.depends("commercial_partner_id", "date") def name_get(self): res = [] for action in self: - name = _('%s, Reminder %s') % ( - action.commercial_partner_id.display_name, action.date) + name = _("%s, Reminder %s") % ( + action.commercial_partner_id.display_name, + action.date, + ) res.append((action.id, name)) return res diff --git a/account_invoice_overdue_reminder/models/overdue_reminder_result.py b/account_invoice_overdue_reminder/models/overdue_reminder_result.py index d6c705353..d246250e3 100644 --- a/account_invoice_overdue_reminder/models/overdue_reminder_result.py +++ b/account_invoice_overdue_reminder/models/overdue_reminder_result.py @@ -6,15 +6,14 @@ class OverdueReminderResult(models.Model): - _name = 'overdue.reminder.result' - _description = 'Overdue Invoice Reminder Result/Info' - _order = 'sequence, id desc' + _name = "overdue.reminder.result" + _description = "Overdue Invoice Reminder Result/Info" + _order = "sequence, id desc" name = fields.Char(required=True, translate=True) active = fields.Boolean(default=True) sequence = fields.Integer() - _sql_constraints = [( - 'name_unique', - 'unique(name)', - 'This overdue reminder result already exists')] + _sql_constraints = [ + ("name_unique", "unique(name)", "This overdue reminder result already exists") + ] diff --git a/account_invoice_overdue_reminder/models/res_company.py b/account_invoice_overdue_reminder/models/res_company.py index fcd0a684a..73c715810 100644 --- a/account_invoice_overdue_reminder/models/res_company.py +++ b/account_invoice_overdue_reminder/models/res_company.py @@ -2,48 +2,56 @@ # @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models class ResCompany(models.Model): - _inherit = 'res.company' + _inherit = "res.company" overdue_reminder_attach_invoice = fields.Boolean( - string='Attach Invoices to Overdue Reminder E-mails', default=True) + string="Attach Invoices to Overdue Reminder E-mails", default=True + ) overdue_reminder_start_days = fields.Integer( - string='Default Overdue Reminder Trigger Delay (days)') + string="Default Overdue Reminder Trigger Delay (days)" + ) overdue_reminder_min_interval_days = fields.Integer( - string='Default Overdue Reminder Minimum Interval (days)', default=5) + string="Default Overdue Reminder Minimum Interval (days)", default=5 + ) overdue_reminder_interface = fields.Selection( - '_overdue_reminder_interface_selection', - string='Default Overdue Reminder Wizard Interface', - default='onebyone') + "_overdue_reminder_interface_selection", + string="Default Overdue Reminder Wizard Interface", + default="onebyone", + ) overdue_reminder_partner_policy = fields.Selection( - '_overdue_reminder_partner_policy_selection', - default='last_reminder', string='Contact to Remind') + "_overdue_reminder_partner_policy_selection", + default="last_reminder", + string="Contact to Remind", + ) @api.model def _overdue_reminder_interface_selection(self): return [ - ('onebyone', _('One by One')), - ('mass', _('Mass')), - ] + ("onebyone", _("One by One")), + ("mass", _("Mass")), + ] @api.model def _overdue_reminder_partner_policy_selection(self): return [ - ('last_reminder', _('Last Reminder')), - ('last_invoice', _('Last Invoice')), - ('invoice_contact', _('Invoice Contact')), - ] + ("last_reminder", _("Last Reminder")), + ("last_invoice", _("Last Invoice")), + ("invoice_contact", _("Invoice Contact")), + ] _sql_constraints = [ ( - 'overdue_reminder_start_days_positive', - 'CHECK(overdue_reminder_start_days >= 0)', - 'Overdue Reminder Trigger Delay must always be positive'), + "overdue_reminder_start_days_positive", + "CHECK(overdue_reminder_start_days >= 0)", + "Overdue Reminder Trigger Delay must always be positive", + ), ( - 'overdue_reminder_min_interval_days_positive', - 'CHECK(overdue_reminder_min_interval_days > 0)', - 'Overdue Reminder Trigger Delay must always be strictly positive'), - ] + "overdue_reminder_min_interval_days_positive", + "CHECK(overdue_reminder_min_interval_days > 0)", + "Overdue Reminder Trigger Delay must always be strictly positive", + ), + ] diff --git a/account_invoice_overdue_reminder/models/res_partner.py b/account_invoice_overdue_reminder/models/res_partner.py index 90cba9cf7..1b6a6d717 100644 --- a/account_invoice_overdue_reminder/models/res_partner.py +++ b/account_invoice_overdue_reminder/models/res_partner.py @@ -6,8 +6,9 @@ class ResPartner(models.Model): - _inherit = 'res.partner' + _inherit = "res.partner" # Property of commercial partner, applies for the whole entity no_overdue_reminder = fields.Boolean( - string='Disable Overdue Invoice Reminder', company_dependent=True) + string="Disable Overdue Invoice Reminder", company_dependent=True + ) diff --git a/account_invoice_overdue_reminder/readme/CONFIGURATION.rst b/account_invoice_overdue_reminder/readme/CONFIGURATION.rst index 8ddc48931..45b71ca32 100644 --- a/account_invoice_overdue_reminder/readme/CONFIGURATION.rst +++ b/account_invoice_overdue_reminder/readme/CONFIGURATION.rst @@ -1,4 +1,4 @@ -You should increase the **osv_memory_age_limit** (default value = 1, which means 1 hour) in the Odoo server config file: for example, you can set it to 12 (12 hours). The value must be superior to the duration of the invoicing reminder wizard from the start screen to the end. +You should increase the **transient_age_limit** (default value = 1, which means 1 hour) in the Odoo server config file: for example, you can set it to 12 (12 hours). The value must be superior to the duration of the invoicing reminder wizard from the start screen to the end. Go to the menu *Invoicing > Configuration > Settings* then go to the section *Overdue Invoice Reminder*: you will be able to configure if you want to attach the overdue invoice to the reminder emails and set default values for some parameters. diff --git a/account_invoice_overdue_reminder/security/ir.model.access.csv b/account_invoice_overdue_reminder/security/ir.model.access.csv index 9c2540cc8..91a3322f3 100644 --- a/account_invoice_overdue_reminder/security/ir.model.access.csv +++ b/account_invoice_overdue_reminder/security/ir.model.access.csv @@ -10,4 +10,3 @@ access_overdue_reminder_start_payment,Full access on overdue.reminder.start.paym access_overdue_reminder_step,Full access on overdue.reminder.step (wizard),model_overdue_reminder_step,account.group_account_invoice,1,1,1,1 access_overdue_reminder_end,Full access on overdue.reminder.end (wizard),model_overdue_reminder_end,account.group_account_invoice,1,1,1,1 access_overdue_reminder_mass_update,Full access on overdue.reminder.mass.update (wizard),model_overdue_reminder_mass_update,account.group_account_invoice,1,1,1,1 - diff --git a/account_invoice_overdue_reminder/security/ir_rule.xml b/account_invoice_overdue_reminder/security/ir_rule.xml index 607756400..45c3a62d7 100644 --- a/account_invoice_overdue_reminder/security/ir_rule.xml +++ b/account_invoice_overdue_reminder/security/ir_rule.xml @@ -1,17 +1,18 @@ - + - Overdue Invoice Reminder multi-company - - ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] diff --git a/account_invoice_overdue_reminder/static/description/icon.png b/account_invoice_overdue_reminder/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_invoice_overdue_reminder/static/description/index.html b/account_invoice_overdue_reminder/static/description/index.html new file mode 100644 index 000000000..638a5b092 --- /dev/null +++ b/account_invoice_overdue_reminder/static/description/index.html @@ -0,0 +1,460 @@ + + + + + + +Overdue Invoice Reminder + + + +
+

Overdue Invoice Reminder

+ + +

Beta License: AGPL-3 OCA/credit-control Translate me on Weblate Try me on Runbot

+

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

+

Table of contents

+ +
+

Usage

+

Of course, before sending invoice reminders, you must import your bank statements and process them, so that you are up-to-date on customer payments.

+

Then, go to the menu Invoicing > Customers > Overdue Invoice Remind: you will get the start screen where you can:

+
    +
  • filter the customers that you want to remind (filter by customer or by salesman),
  • +
  • check that your bank journals are up-to-date,
  • +
  • choose between the one-by-one and mass interfaces,
  • +
  • customize some parameters.
  • +
+

Then follow the process until the end.

+

You can also start the invoice reminder wizard via the button Overdue Reminder on an overdue invoice.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

Current maintainer:

+

alexis-via

+

This module is part of the OCA/credit-control project on GitHub.

+

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

+
+
+
+ + diff --git a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml index 8987b1d99..b434e6d11 100644 --- a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml +++ b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml @@ -1,10 +1,9 @@ - + - @@ -14,20 +13,38 @@
- - - - - - - - - - + + + + + + + + + + - - + +
@@ -40,9 +57,12 @@
- - - + + +
@@ -53,14 +73,26 @@ account.invoice.overdue.reminder - - - - - - - - + + + + + + + +
@@ -71,8 +103,8 @@ 100 - - + + @@ -82,18 +114,46 @@ account.invoice.overdue.reminder - - - - - - - + + + + + + + - - - - + + + + diff --git a/account_invoice_overdue_reminder/views/account_move.xml b/account_invoice_overdue_reminder/views/account_move.xml index a0202b1e2..bebac21d0 100644 --- a/account_invoice_overdue_reminder/views/account_move.xml +++ b/account_invoice_overdue_reminder/views/account_move.xml @@ -1,34 +1,41 @@ - + - overdue.reminder.customer.invoice.form account.move - + - + - - - - + + + + - + @@ -37,10 +44,10 @@ account.move - + - + @@ -48,11 +55,15 @@ overdue.reminder.customer.invoice.search account.move - + - - + + diff --git a/account_invoice_overdue_reminder/views/overdue_reminder_action.xml b/account_invoice_overdue_reminder/views/overdue_reminder_action.xml index cb8bdfaa5..a1d80ab33 100644 --- a/account_invoice_overdue_reminder/views/overdue_reminder_action.xml +++ b/account_invoice_overdue_reminder/views/overdue_reminder_action.xml @@ -1,10 +1,9 @@ - + - @@ -14,22 +13,34 @@
- - - - - - - - + + + + + + + + - - + + - +
@@ -40,11 +51,17 @@ overdue.reminder.action - - - - - + + + + +
@@ -54,16 +71,40 @@ overdue.reminder.action - - - - - - + + + + + + - - - + + + @@ -74,8 +115,8 @@ overdue.reminder.action - - + + @@ -85,7 +126,7 @@ overdue.reminder.action - + @@ -97,6 +138,11 @@ {'pivot_measures': ['__count', 'reminder_count']} - +
diff --git a/account_invoice_overdue_reminder/views/overdue_reminder_result.xml b/account_invoice_overdue_reminder/views/overdue_reminder_result.xml index 90ebde524..e6a2f0c50 100644 --- a/account_invoice_overdue_reminder/views/overdue_reminder_result.xml +++ b/account_invoice_overdue_reminder/views/overdue_reminder_result.xml @@ -1,10 +1,9 @@ - + - @@ -14,10 +13,15 @@
- + - - + +
@@ -29,8 +33,8 @@ overdue.reminder.result - - + + @@ -40,8 +44,12 @@ overdue.reminder.result - - + + @@ -52,6 +60,11 @@ tree,form - +
diff --git a/account_invoice_overdue_reminder/views/report.xml b/account_invoice_overdue_reminder/views/report.xml index af5ed4bd4..df63c5ea1 100644 --- a/account_invoice_overdue_reminder/views/report.xml +++ b/account_invoice_overdue_reminder/views/report.xml @@ -1,18 +1,21 @@ - + - Overdue Letter overdue.reminder.step qweb-pdf - account_invoice_overdue_reminder.report_overdue_reminder - account_invoice_overdue_reminder.report_overdue_reminder + account_invoice_overdue_reminder.report_overdue_reminder + account_invoice_overdue_reminder.report_overdue_reminder (object._get_report_base_filename()) diff --git a/account_invoice_overdue_reminder/views/report_overdue_reminder.xml b/account_invoice_overdue_reminder/views/report_overdue_reminder.xml index 77154e072..2bd040f2a 100644 --- a/account_invoice_overdue_reminder/views/report_overdue_reminder.xml +++ b/account_invoice_overdue_reminder/views/report_overdue_reminder.xml @@ -1,15 +1,20 @@ - + - + diff --git a/account_invoice_overdue_reminder/views/res_partner.xml b/account_invoice_overdue_reminder/views/res_partner.xml index 058cec640..54edc71a6 100644 --- a/account_invoice_overdue_reminder/views/res_partner.xml +++ b/account_invoice_overdue_reminder/views/res_partner.xml @@ -5,33 +5,31 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - - - - overdue.reminder.res.partner.form - res.partner - - - - + overdue.reminder.res.partner.form + res.partner + + + + - - + + + - - - - - - Overdue Reminder Actions - {'search_default_commercial_partner_id': [active_id]} - overdue.reminder.action - - form - - + + + + Overdue Reminder Actions + {'search_default_commercial_partner_id': [active_id]} + overdue.reminder.action + + form + diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py index 21c2c63c5..00da1174e 100644 --- a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py @@ -540,7 +540,7 @@ def _get_attachment_ids(self, mail): report_bin, report_format = iaro._render( "account.report_invoice_with_payments", [inv.id] ) - filename = "{}.{}".format(inv._get_report_base_filename(), report_format) + filename = f"{inv._get_report_base_filename()}.{report_format}" attach = iao.create( { "name": filename, diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml index 02be1408f..788949a12 100644 --- a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard_view.xml @@ -5,310 +5,329 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - - - overdue.reminder.start.form - overdue.reminder.start - -
- - - - - - - -
\n" " " +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid " days" +msgstr " giorni" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder by phone. Result/Info: %(result)s." +msgstr "" +"Promemoria scadenza da telefono. Risultato/Info: %(result)s." + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "" +"Overdue reminder sent by mail: %(mail_subject)s." +msgstr "" +"Promemoria scadenza inviato per e-mail: %(mail_subject)s." + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder sent by post." +msgstr "Promemoria scadenza inviata per posta." + #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document msgid "According to our books, the following invoices are overdue:" @@ -332,7 +359,6 @@ msgstr "Importo dovuto" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format msgid "" "An overdue reminder can only be attached to a customer invoice or credit note" msgstr "" @@ -523,14 +549,14 @@ msgstr "Gentile Cliente," #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days -msgid "Default Overdue Reminder Minimum Interval (days)" -msgstr "Intervallo minimo predefinito per sollecito (giorni)" +msgid "Default Overdue Reminder Minimum Interval" +msgstr "Intervallo minimo promemoria scadenza predefinito" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days -msgid "Default Overdue Reminder Trigger Delay (days)" -msgstr "Ritardo predefinito per attivazione del sollecito (giorni)" +msgid "Default Overdue Reminder Trigger Delay" +msgstr "Ritardo attivazione promemoria scadenza predefinito" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_interface @@ -539,19 +565,16 @@ msgid "Default Overdue Reminder Wizard Interface" msgstr "Interfaccia procedura guidata per sollecito predefinito" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Minimum Interval" -msgstr "Intervallo minimo predefinito per sollecito" - -#. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Trigger Delay" -msgstr "Ritardo predefinito attivazione promemoria" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days +msgid "Default overdue reminder minimum interval in days" +msgstr "Intervallo minimo predefinito per sollecito in giorni" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Wizard Interface" -msgstr "Interfaccia predefinita procedura guidata" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days +msgid "Default overdue reminder trigger delay in days" +msgstr "Ritardo attivazione promemoria scadenza predefinito in giorni" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document @@ -573,7 +596,6 @@ msgstr "Disabilitare solleciti fatture scadute" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__no_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__no_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__no_overdue_reminder msgid "Disable Overdue Reminder" msgstr "Disabilitare sollecito" @@ -608,7 +630,7 @@ msgstr "Scadenza" #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "E-mail" msgstr "E-mail" @@ -621,7 +643,6 @@ msgstr "Stato e-mail" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "E-mail missing on partner '%s'." msgstr "E-mail mancante sul partner '%s'." @@ -638,7 +659,6 @@ msgstr "Filtri" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', the deadline is missing for the activity." msgstr "Per il sollecito del cliente '%s', manca la scadenza per l'attività." @@ -646,7 +666,6 @@ msgstr "Per il sollecito del cliente '%s', manca la scadenza per l'attività." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', you must assign someone for the activity." msgstr "" @@ -655,7 +674,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Good job!" msgstr "Ottimo lavoro!" @@ -707,7 +725,6 @@ msgstr "Fattura" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Invoice Contact" msgstr "Contatto fattura" @@ -797,25 +814,12 @@ msgstr "Ultima registrazione creata il" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Last Invoice" msgstr "Ultima fattura" -#. module: account_invoice_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step____last_update -msgid "Last Modified on" -msgstr "Ultima modifica il" - #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_last_date #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_last_date -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_last_date msgid "Last Overdue Reminder Date" msgstr "Data ultimo sollecito" @@ -823,7 +827,6 @@ msgstr "Data ultimo sollecito" #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form -#, python-format msgid "Last Reminder" msgstr "Ultimo promemoria" @@ -852,7 +855,6 @@ msgstr "Ultimo aggiornamento il" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "Letter" msgstr "Lettera" @@ -869,21 +871,18 @@ msgstr "Corpo e-mail" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail body is empty." msgstr "Corpo e-mail vuoto." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail subject is empty." msgstr "Oggetto e-mail vuoto." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Mass" msgstr "Massivo" @@ -909,6 +908,7 @@ msgstr "Nome" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__counter +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "New Remind Counter" msgstr "Contatore nuovi promemoria" @@ -956,7 +956,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "One by One" msgstr "Uno per uno" @@ -978,7 +977,6 @@ msgstr "Rif. ordine" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue msgid "Overdue" msgstr "Scaduta" @@ -1028,13 +1026,11 @@ msgstr "Lettera scadenza" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_remind_sent #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_remind_sent -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_remind_sent msgid "Overdue Remind Sent" msgstr "Promemoria scadenza inviato" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_move_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_partner_property_form msgid "Overdue Reminder" msgstr "Promemoria scadenza" @@ -1047,7 +1043,6 @@ msgstr "Azione promemoria scadenza" #: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_action #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_ids #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_ids -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_ids msgid "Overdue Reminder Action History" msgstr "Storico azione promemoria scadenza" @@ -1059,7 +1054,6 @@ msgstr "Azioni promemoria scadenza" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_invoice_filter msgid "Overdue Reminder Count" msgstr "Conteggio promemoria scadenza" @@ -1117,13 +1111,14 @@ msgstr "Eseguito da" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_phone #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Phone" msgstr "Telefono" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Post" msgstr "Invia" @@ -1140,7 +1135,6 @@ msgstr "Stampa fatture scadute" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Remind letter hasn't been printed!" msgstr "La lettera promemoria non è stata stampata!" @@ -1242,35 +1236,30 @@ msgstr "Imponibile" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The minimum delay since last reminder must be strictly positive." msgstr "Il ritardo minimo dall'ultimo promemoria deve essere positivo." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The trigger delay cannot be negative." msgstr "Il ritardo di azione non può essere negativo." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no invoices to remind for customer '%s'." msgstr "Non ci sono fatture da sollecitare al cliente '%s'." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no overdue reminders." msgstr "Non ci sono promemoria di scadenza." #. module: account_invoice_overdue_reminder #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter msgid "This counter is not increased in case of phone reminder." msgstr "" "Questo contatore non viene incrementato nel caso di promemoria telefonico." @@ -1311,6 +1300,7 @@ msgstr "Ritardo di attivazione" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_type #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Type" msgstr "Tipo" @@ -1342,7 +1332,6 @@ msgstr "Utente" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "User company is different from action company. This should never happen." msgstr "" @@ -1380,14 +1369,12 @@ msgstr "Procedura guidata per ricordare le fatture scadute dei clienti" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You must select the new reminder type." msgstr "Bisogna selezionare il nuovo tipo di promemoria." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You processed all your overdue invoice reminders." msgstr "Sono stati elaborati tutti i promemoria di fatture scadute." @@ -1398,13 +1385,319 @@ msgstr "Distinti saluti," #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings msgid "days" msgstr "giorni" +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "overdue_letter-%s" +msgstr "overdue_letter-%s" + #. module: account_invoice_overdue_reminder #: model:mail.template,subject:account_invoice_overdue_reminder.overdue_invoice_reminder_mail_template msgid "" "{{object.company_id.name}} - Overdue invoice reminder n°{{object.counter}}" msgstr "" "{{object.company_id.name}} - Sollecito fatture scadute n°{{object.counter}}" + +#, python-format +#~ msgid "%(invoice_name)s Reminder %(counter)d" +#~ msgstr "%(invoice_name)s Promemoria %(counter)d" + +#~ msgid "" +#~ "
\n" +#~ "

Dear customer,

\n" +#~ "

According to our books, the following invoices are " +#~ "overdue:

\n" +#~ "\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
Invoice NumberInvoice DatePayment TermsDue DateOrder Ref.TypeTotal UntaxedTotalResidualPast Reminders
\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ " Total\n" +#~ " Residual in\n" +#~ " :\n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ "\n" +#~ "

If you made a payment for these invoices a few days " +#~ "ago, please ignore this email.

\n" +#~ "\n" +#~ " \n" +#~ "

You will find enclosed the overdue invoices.

\n" +#~ "
\n" +#~ "\n" +#~ " \n" +#~ "

Despite several reminders, we are disappointed to " +#~ "see that these overdue invoices are still\n" +#~ " unpaid.\n" +#~ " In order to avoid legal proceedings, we urge you " +#~ "to paid these overdue invoices in the next\n" +#~ " days.\n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "

Regards,

\n" +#~ "\n" +#~ " \n" +#~ "

\n" +#~ " \n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "
\n" +#~ " " +#~ msgstr "" +#~ "
\n" +#~ "

Spettabile cliente,

\n" +#~ "

secondo i nostri registri, la seguente fattura è " +#~ "scaduta:

\n" +#~ "\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
Numero fatturaData fatturaTermini di pagamentoScadenzaRif. ordineTipoTotale nettoTotaleResiduoPromemoria antecedenti
\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ " Totale\n" +#~ " residuo in\n" +#~ " :\n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ "\n" +#~ "

Se avete effettuato un pagamento per questa fattura " +#~ "alcuni giorni fa, ignorate questa e-mail.

\n" +#~ "\n" +#~ " \n" +#~ "

Troverà in allegato la fattura scaduta.

\n" +#~ "
\n" +#~ "\n" +#~ " \n" +#~ "

Nonostante diversi promemoria, siamo dispiaciuti " +#~ "nel vedere che queste fatture scadute sono ancora\n" +#~ " insolute.\n" +#~ " Per evitare procedimenti legali, La sollecitiamo " +#~ "a saldare queste fatture scadute nei prossimi\n" +#~ " giorni.\n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "

Cordialmente,

\n" +#~ "\n" +#~ " \n" +#~ "

\n" +#~ " \n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "
\n" +#~ " " + +#~ msgid "Default Overdue Reminder Minimum Interval (days)" +#~ msgstr "Intervallo minimo predefinito per sollecito (giorni)" + +#~ msgid "Default Overdue Reminder Trigger Delay (days)" +#~ msgstr "Ritardo predefinito per attivazione del sollecito (giorni)" + +#~ msgid "Default Reminder Minimum Interval" +#~ msgstr "Intervallo minimo predefinito per sollecito" + +#~ msgid "Default Reminder Trigger Delay" +#~ msgstr "Ritardo predefinito attivazione promemoria" + +#~ msgid "Default Wizard Interface" +#~ msgstr "Interfaccia predefinita procedura guidata" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" diff --git a/account_invoice_overdue_reminder/i18n/nl.po b/account_invoice_overdue_reminder/i18n/nl.po index b9defa9b4..db45f134b 100644 --- a/account_invoice_overdue_reminder/i18n/nl.po +++ b/account_invoice_overdue_reminder/i18n/nl.po @@ -19,14 +19,12 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format -msgid "%(invoice_name)s Reminder %(counter)d" -msgstr "%(invoice_name)s Herinnering %(counter)d" +msgid "%(invoice_name)s Reminder n°%(counter)d" +msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "%(partner_name)s, Reminder %(date)s" msgstr "%(partner_name)s, Herinnering %(date)s" @@ -75,71 +73,73 @@ msgid "" "LightGray % endif \">\n" " \n" -" \n" +" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" +"or ''\"/>\n" " \n" " \n" -" \n" +" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" +"black;\">\n" +" \n" +" \n" " \n" " \n" +"* (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)\"/>\n" " \n" " \n" " \n" +"(inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)\"/>\n" " \n" " \n" " \n" +"* (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)\"/>\n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" -" \n" +" \n" " \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " Total\n" " Residual in\n" -" :\n" +" :\n" " \n" " \n" " \n" +"total_residual[0])\"/>\n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -147,8 +147,8 @@ msgid "" "

If you made a payment for these invoices a few days ago, " "please ignore this email.

\n" "\n" -" \n" +" \n" "

You will find enclosed the overdue invoices.

\n" "
\n" "\n" @@ -166,14 +166,38 @@ msgid "" "\n" " \n" "

\n" -" \n" +" \n" "

\n" "
\n" -"\n" "
\n" " " msgstr "" +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid " days" +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder by phone. Result/Info: %(result)s." +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "" +"Overdue reminder sent by mail: %(mail_subject)s." +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder sent by post." +msgstr "" + #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document msgid "According to our books, the following invoices are overdue:" @@ -197,7 +221,6 @@ msgstr "Te betalen bedrag" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format msgid "" "An overdue reminder can only be attached to a customer invoice or credit note" msgstr "" @@ -379,14 +402,14 @@ msgstr "Beste klant," #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days -msgid "Default Overdue Reminder Minimum Interval (days)" -msgstr "Standaard minimuminterval voor achterstallige herinneringen (dagen)" +msgid "Default Overdue Reminder Minimum Interval" +msgstr "" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days -msgid "Default Overdue Reminder Trigger Delay (days)" -msgstr "Standaard achterstallige herinnering Triggervertraging (dagen)" +msgid "Default Overdue Reminder Trigger Delay" +msgstr "" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_interface @@ -395,19 +418,16 @@ msgid "Default Overdue Reminder Wizard Interface" msgstr "Standaardinterface voor de wizard voor achterstallige herinneringen" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Minimum Interval" -msgstr "Standaard herinneringsminimuminterval" - -#. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Trigger Delay" -msgstr "Standaardherinneringsvertraging" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days +msgid "Default overdue reminder minimum interval in days" +msgstr "" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Wizard Interface" -msgstr "Standaard wizardinterface" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days +msgid "Default overdue reminder trigger delay in days" +msgstr "" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document @@ -430,7 +450,6 @@ msgstr "Schakel de herinnering voor achterstallige facturen uit" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__no_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__no_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__no_overdue_reminder msgid "Disable Overdue Reminder" msgstr "Herinnering voor achterstallige betalingen uitschakelen" @@ -465,7 +484,7 @@ msgstr "Vervaldatum" #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "E-mail" msgstr "" @@ -478,7 +497,6 @@ msgstr "E-mailstatus" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "E-mail missing on partner '%s'." msgstr "Missende e-mail op relatie '%s'." @@ -495,7 +513,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', the deadline is missing for the activity." msgstr "" @@ -504,7 +521,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', you must assign someone for the activity." msgstr "" @@ -514,7 +530,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Good job!" msgstr "Goed gedaan!" @@ -564,7 +579,6 @@ msgstr "Factuur" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Invoice Contact" msgstr "Factuurrelatie" @@ -654,25 +668,12 @@ msgstr "Laatste boeking aangemaakt op" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Last Invoice" msgstr "Laatste factuur" -#. module: account_invoice_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step____last_update -msgid "Last Modified on" -msgstr "Laatst bewerkt op" - #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_last_date #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_last_date -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_last_date msgid "Last Overdue Reminder Date" msgstr "Laatste betaalherinneringsdatum" @@ -680,7 +681,6 @@ msgstr "Laatste betaalherinneringsdatum" #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form -#, python-format msgid "Last Reminder" msgstr "Laatste herinnering" @@ -709,7 +709,6 @@ msgstr "Laatst bewerkt op" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "Letter" msgstr "Brief" @@ -726,21 +725,18 @@ msgstr "Mailinhoud" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail body is empty." msgstr "Mailinhoud is leeg." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail subject is empty." msgstr "Mailonderwerp is leeg." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Mass" msgstr "Massa" @@ -766,6 +762,7 @@ msgstr "Naam" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__counter +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "New Remind Counter" msgstr "Volgende aantal herinneringen" @@ -815,7 +812,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "One by One" msgstr "Eén voor één" @@ -837,7 +833,6 @@ msgstr "Orderref." #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue msgid "Overdue" msgstr "Achterstallig" @@ -887,13 +882,11 @@ msgstr "Achterstallige brief" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_remind_sent #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_remind_sent -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_remind_sent msgid "Overdue Remind Sent" msgstr "" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_move_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_partner_property_form msgid "Overdue Reminder" msgstr "Betalingsherinnering" @@ -906,7 +899,6 @@ msgstr "Actie betalingsherinnering" #: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_action #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_ids #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_ids -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_ids msgid "Overdue Reminder Action History" msgstr "Actiehistorie betalingsherinnering" @@ -918,7 +910,6 @@ msgstr "Acties betalingsherinnering" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_invoice_filter msgid "Overdue Reminder Count" msgstr "Aantal betalingsherinneringen" @@ -975,13 +966,14 @@ msgstr "Uitgevoerd door" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_phone #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Phone" msgstr "Telefoon" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Post" msgstr "" @@ -998,7 +990,6 @@ msgstr "Print achterstallige facturen" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Remind letter hasn't been printed!" msgstr "Herinneringsbrief is niet uitgeprint!" @@ -1100,7 +1091,6 @@ msgstr "Exclusief BTW" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The minimum delay since last reminder must be strictly positive." msgstr "" "De minimale vertraging sinds de laatste herinnering moet strikt positief " @@ -1109,28 +1099,24 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The trigger delay cannot be negative." msgstr "De triggervertraging kan niet negatief zijn." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no invoices to remind for customer '%s'." msgstr "Er zijn geen facturen om aan te herinneren voor klant '%s'." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no overdue reminders." msgstr "Er zijn geen betalingsherinneringen." #. module: account_invoice_overdue_reminder #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter msgid "This counter is not increased in case of phone reminder." msgstr "Deze teller loopt niet op bij telefonische herinneringen." @@ -1170,6 +1156,7 @@ msgstr "Triggervertraging" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_type #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Type" msgstr "" @@ -1201,7 +1188,6 @@ msgstr "Gebruiker" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "User company is different from action company. This should never happen." msgstr "" @@ -1239,14 +1225,12 @@ msgstr "Wizard voor betalingsherinnering klantfactuur" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You must select the new reminder type." msgstr "Je moet een nieuw herinneringstype kiezen." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You processed all your overdue invoice reminders." msgstr "Alle betalingsherinneringen zijn verwerkt." @@ -1257,16 +1241,43 @@ msgstr "Met vriendelijke groet," #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings msgid "days" msgstr "dagen" +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "overdue_letter-%s" +msgstr "" + #. module: account_invoice_overdue_reminder #: model:mail.template,subject:account_invoice_overdue_reminder.overdue_invoice_reminder_mail_template msgid "" "{{object.company_id.name}} - Overdue invoice reminder n°{{object.counter}}" msgstr "{{object.company_id.name}} - Betalingsherinnering n°{{object.counter}}" +#, python-format +#~ msgid "%(invoice_name)s Reminder %(counter)d" +#~ msgstr "%(invoice_name)s Herinnering %(counter)d" + +#~ msgid "Default Overdue Reminder Minimum Interval (days)" +#~ msgstr "Standaard minimuminterval voor achterstallige herinneringen (dagen)" + +#~ msgid "Default Overdue Reminder Trigger Delay (days)" +#~ msgstr "Standaard achterstallige herinnering Triggervertraging (dagen)" + +#~ msgid "Default Reminder Minimum Interval" +#~ msgstr "Standaard herinneringsminimuminterval" + +#~ msgid "Default Reminder Trigger Delay" +#~ msgstr "Standaardherinneringsvertraging" + +#~ msgid "Default Wizard Interface" +#~ msgstr "Standaard wizardinterface" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst bewerkt op" + #~ msgid "" #~ "
\n" #~ "

Dear customer,

\n" @@ -1338,13 +1349,13 @@ msgstr "{{object.company_id.name}} - Betalingsherinnering n°{{object.counter}}" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" @@ -1360,8 +1371,8 @@ msgstr "{{object.company_id.name}} - Betalingsherinnering n°{{object.counter}}" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" @@ -1467,13 +1478,13 @@ msgstr "{{object.company_id.name}} - Betalingsherinnering n°{{object.counter}}" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" @@ -1489,8 +1500,8 @@ msgstr "{{object.company_id.name}} - Betalingsherinnering n°{{object.counter}}" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" diff --git a/account_invoice_overdue_reminder/i18n/pt.po b/account_invoice_overdue_reminder/i18n/pt.po index 28bb3fed2..774c0bc8d 100644 --- a/account_invoice_overdue_reminder/i18n/pt.po +++ b/account_invoice_overdue_reminder/i18n/pt.po @@ -19,14 +19,12 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format -msgid "%(invoice_name)s Reminder %(counter)d" -msgstr "Lembrete %(counter)d - %(invoice_name)s" +msgid "%(invoice_name)s Reminder n°%(counter)d" +msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "%(partner_name)s, Reminder %(date)s" msgstr "%(partner_name)s, Lembrete %(date)s" @@ -75,71 +73,73 @@ msgid "" "LightGray % endif \">\n" " \n" -" \n" +" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" +"or ''\"/>\n" " \n" " \n" -" \n" +" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" +"black;\">\n" +" \n" +" \n" " \n" " \n" +"* (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)\"/>\n" " \n" " \n" " \n" +"(inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)\"/>\n" " \n" " \n" " \n" +"* (inv.move_type == 'out_refund' and -1 or 1), inv.currency_id)\"/>\n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" -" \n" +" \n" " \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " Total\n" " Residual in\n" -" :\n" +" :\n" " \n" " \n" " \n" +"total_residual[0])\"/>\n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -147,8 +147,8 @@ msgid "" "

If you made a payment for these invoices a few days ago, " "please ignore this email.

\n" "\n" -" \n" +" \n" "

You will find enclosed the overdue invoices.

\n" "
\n" "\n" @@ -166,14 +166,38 @@ msgid "" "\n" " \n" "

\n" -" \n" +" \n" "

\n" "
\n" -"\n" "
\n" " " msgstr "" +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid " days" +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder by phone. Result/Info: %(result)s." +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "" +"Overdue reminder sent by mail: %(mail_subject)s." +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder sent by post." +msgstr "" + #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document msgid "According to our books, the following invoices are overdue:" @@ -197,7 +221,6 @@ msgstr "Valor em Dívida" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format msgid "" "An overdue reminder can only be attached to a customer invoice or credit note" msgstr "" @@ -379,14 +402,14 @@ msgstr "Caro Cliente," #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days -msgid "Default Overdue Reminder Minimum Interval (days)" -msgstr "Intervalo Mínimo Pré definido para o Aviso de Cobrança (dias)" +msgid "Default Overdue Reminder Minimum Interval" +msgstr "" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days -msgid "Default Overdue Reminder Trigger Delay (days)" -msgstr "Atraso Máximo Pré definido para o Aviso de Cobrança (dias)" +msgid "Default Overdue Reminder Trigger Delay" +msgstr "" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_interface @@ -395,19 +418,16 @@ msgid "Default Overdue Reminder Wizard Interface" msgstr "Interface do assistente de Aviso de cobrança pré definido" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Minimum Interval" -msgstr "Intervalo Mínimo Pré definido para o Aviso de Cobrança" - -#. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Trigger Delay" -msgstr "Atraso Máximo Pré definido para o Aviso de Cobrança" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days +msgid "Default overdue reminder minimum interval in days" +msgstr "" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Wizard Interface" -msgstr "Interface do assistente pré definido" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days +msgid "Default overdue reminder trigger delay in days" +msgstr "" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document @@ -429,7 +449,6 @@ msgstr "Desligar o Aviso de Cobrança de faturas" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__no_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__no_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__no_overdue_reminder msgid "Disable Overdue Reminder" msgstr "Desligar o Aviso de Cobrança" @@ -464,7 +483,7 @@ msgstr "Data de vencimento" #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "E-mail" msgstr "E-mail" @@ -477,7 +496,6 @@ msgstr "Estado do E-mail" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "E-mail missing on partner '%s'." msgstr "E-mail em falta no parceiro '%s'." @@ -494,7 +512,6 @@ msgstr "Filtros" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', the deadline is missing for the activity." msgstr "" @@ -504,7 +521,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', you must assign someone for the activity." msgstr "" @@ -513,7 +529,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Good job!" msgstr "Bom trabalho!" @@ -563,7 +578,6 @@ msgstr "Fatura" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Invoice Contact" msgstr "Contacto da Fatura" @@ -653,25 +667,12 @@ msgstr "Ultimo Lançamento criado em" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Last Invoice" msgstr "Ultima Fatura" -#. module: account_invoice_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step____last_update -msgid "Last Modified on" -msgstr "Última Modificação em" - #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_last_date #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_last_date -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_last_date msgid "Last Overdue Reminder Date" msgstr "Última Data de Vencimento no Aviso de cobrança" @@ -679,7 +680,6 @@ msgstr "Última Data de Vencimento no Aviso de cobrança" #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form -#, python-format msgid "Last Reminder" msgstr "Último Aviso de cobrança" @@ -708,7 +708,6 @@ msgstr "Última Atualização em" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "Letter" msgstr "Carta" @@ -725,21 +724,18 @@ msgstr "Corpo do mail" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail body is empty." msgstr "O corpo do mail está vazio." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail subject is empty." msgstr "O assunto do mail está vazio." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Mass" msgstr "Massa" @@ -765,6 +761,7 @@ msgstr "Nome" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__counter +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "New Remind Counter" msgstr "Novo Contador de Avisos de cobrança" @@ -812,7 +809,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "One by One" msgstr "Um por Um" @@ -834,7 +830,6 @@ msgstr "Ref. da Ordem." #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue msgid "Overdue" msgstr "Vencido" @@ -884,13 +879,11 @@ msgstr "Carta Aviso de Cobrança" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_remind_sent #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_remind_sent -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_remind_sent msgid "Overdue Remind Sent" msgstr "" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_move_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_partner_property_form msgid "Overdue Reminder" msgstr "Aviso de Cobrança" @@ -903,7 +896,6 @@ msgstr "Ação de Aviso de Cobrança" #: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_action #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_ids #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_ids -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_ids msgid "Overdue Reminder Action History" msgstr "História das Ações de Aviso de Cobrança" @@ -915,7 +907,6 @@ msgstr "Ações de Avisos de Cobrança" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_invoice_filter msgid "Overdue Reminder Count" msgstr "Contagem de Avisos de Cobrança" @@ -974,13 +965,14 @@ msgstr "Realizado por" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_phone #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Phone" msgstr "Telefone" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Post" msgstr "Publicar" @@ -997,7 +989,6 @@ msgstr "Imprimir Faturas Vencidas" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Remind letter hasn't been printed!" msgstr "A carta de aviso não foi impressa!" @@ -1099,7 +1090,6 @@ msgstr "Impostos Excluídas" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The minimum delay since last reminder must be strictly positive." msgstr "" "O mínimo atraso desde o último aviso de cobrança deve ser sempre positivo." @@ -1107,7 +1097,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The trigger delay cannot be negative." msgstr "" "Atraso máximo pré definido para o Aviso de Cobrança não pode ser negativo." @@ -1115,21 +1104,18 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no invoices to remind for customer '%s'." msgstr "Não há faturas para lembrar ao cliente '%s'." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no overdue reminders." msgstr "Não existem avisos de faturas vencidas." #. module: account_invoice_overdue_reminder #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter msgid "This counter is not increased in case of phone reminder." msgstr "Este contador não é aumentado em caso de lembrete telefónico." @@ -1169,6 +1155,7 @@ msgstr "Atraso Máximo" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_type #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Type" msgstr "Tipo" @@ -1200,7 +1187,6 @@ msgstr "Utilizador" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "User company is different from action company. This should never happen." msgstr "" @@ -1238,14 +1224,12 @@ msgstr "Assistente de aviso de cobrança de faturas de cliente" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You must select the new reminder type." msgstr "Deve selecionar o novo tipo de aviso de cobrança." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You processed all your overdue invoice reminders." msgstr "Processou todos os avisos de cobrança." @@ -1256,10 +1240,15 @@ msgstr "Cumprimentos," #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings msgid "days" msgstr "dias" +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "overdue_letter-%s" +msgstr "" + #. module: account_invoice_overdue_reminder #: model:mail.template,subject:account_invoice_overdue_reminder.overdue_invoice_reminder_mail_template msgid "" @@ -1268,6 +1257,28 @@ msgstr "" "{{object.company_id.name}} - Lembrete de vencimento de faturas nº {{object." "counter}}" +#, python-format +#~ msgid "%(invoice_name)s Reminder %(counter)d" +#~ msgstr "Lembrete %(counter)d - %(invoice_name)s" + +#~ msgid "Default Overdue Reminder Minimum Interval (days)" +#~ msgstr "Intervalo Mínimo Pré definido para o Aviso de Cobrança (dias)" + +#~ msgid "Default Overdue Reminder Trigger Delay (days)" +#~ msgstr "Atraso Máximo Pré definido para o Aviso de Cobrança (dias)" + +#~ msgid "Default Reminder Minimum Interval" +#~ msgstr "Intervalo Mínimo Pré definido para o Aviso de Cobrança" + +#~ msgid "Default Reminder Trigger Delay" +#~ msgstr "Atraso Máximo Pré definido para o Aviso de Cobrança" + +#~ msgid "Default Wizard Interface" +#~ msgstr "Interface do assistente pré definido" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" + #~ msgid "" #~ "
\n" #~ "

Dear customer,

\n" @@ -1339,13 +1350,13 @@ msgstr "" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" @@ -1361,8 +1372,8 @@ msgstr "" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" @@ -1468,13 +1479,13 @@ msgstr "" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" @@ -1490,8 +1501,8 @@ msgstr "" #~ " \n" #~ " \n" -#~ " \n" +#~ " \n" #~ " \n" #~ " \n" #~ " \n" diff --git a/account_invoice_overdue_reminder/i18n/pt_BR.po b/account_invoice_overdue_reminder/i18n/pt_BR.po index b70b4dba8..bf2aaa28e 100644 --- a/account_invoice_overdue_reminder/i18n/pt_BR.po +++ b/account_invoice_overdue_reminder/i18n/pt_BR.po @@ -19,14 +19,12 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format -msgid "%(invoice_name)s Reminder %(counter)d" -msgstr "%(invoice_name)s Lembrete %(counter)d" +msgid "%(invoice_name)s Reminder n°%(counter)d" +msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "%(partner_name)s, Reminder %(date)s" msgstr "%(partner_name)s, Lembrete %(date)s" @@ -40,84 +38,126 @@ msgstr "(object._get_report_base_filename())" msgid "" "
\n" "

Dear customer,

\n" -"

According to our books, the following invoices are overdue:

\n" +"

According to our books, the following invoices are " +"overdue:

\n" "\n" -" \n" +"
\n" " \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" -" \n" -" \n" -" \n" +" \n" +" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" " \n" " \n" -" \n" +" \n" " \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" +" \n" " \n" "
Invoice NumberInvoice DatePayment TermsDue DateOrder Ref.TypeTotal UntaxedTotalResidualPast RemindersInvoice NumberInvoice DatePayment TermsDue DateOrder Ref.TypeTotal UntaxedTotalResidualPast Reminders
\n" -" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" " \n" -" \n" +" \n" +" \n" "
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " Total\n" " Residual in\n" -" :\n" +" :\n" " \n" -" \n" +" \n" +" \n" " \n" "
\n" "\n" -"

If you made a payment for these invoices a few days ago, please ignore this email.

\n" +"

If you made a payment for these invoices a few days ago, " +"please ignore this email.

\n" "\n" -" \n" +" \n" "

You will find enclosed the overdue invoices.

\n" "
\n" "\n" " \n" -"

Despite several reminders, we are disappointed to see that these overdue invoices are still\n" +"

Despite several reminders, we are disappointed to see " +"that these overdue invoices are still\n" " unpaid.\n" -" In order to avoid legal proceedings, we urge you to paid these overdue invoices in the next\n" +" In order to avoid legal proceedings, we urge you to " +"paid these overdue invoices in the next\n" " days.\n" "

\n" "
\n" @@ -126,136 +166,37 @@ msgid "" "\n" " \n" "

\n" -" \n" +" \n" "

\n" "
\n" -"\n" "
\n" " " msgstr "" -"```html\n" -"
\n" -"

Caro cliente,

\n" -"

De acordo com nossos registros, as seguintes faturas estão " -"vencidas:

\n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
Número da " -"FaturaData da " -"FaturaCondições " -"de PagamentoData de " -"VencimentoRef. do " -"PedidoTipoTotal Sem " -"ImpostosTotalSaldo " -"DevedorLembretes " -"Enviados
\n" -" \n" -" \n" -" \n" -" \n" -" " -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" Total\n" -" Devedor em\n" -" :\n" -" \n" -" \n" -"
\n" -"\n" -"

Se você realizou o pagamento dessas faturas há alguns dias, por " -"favor, ignore este e-mail.

\n" -"\n" -" \n" -"

Você encontrará anexadas as faturas vencidas.

\n" -"
\n" -"\n" -" \n" -"

Apesar de vários lembretes, lamentamos ver que essas faturas " -"vencidas ainda não foram pagas.\n" -" Para evitar medidas legais, solicitamos que você pague essas " -"faturas nos próximos dias.\n" -"

\n" -"
\n" -"\n" -"

Atenciosamente,

\n" -"\n" -" \n" -"

\n" -" \n" -"

\n" -"
\n" -"\n" -"
\n" -"```\n" -" " + +#. module: account_invoice_overdue_reminder +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings +msgid " days" +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder by phone. Result/Info: %(result)s." +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "" +"Overdue reminder sent by mail: %(mail_subject)s." +msgstr "" + +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "Overdue reminder sent by post." +msgstr "" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document @@ -280,10 +221,8 @@ msgstr "Valor devido" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/account_invoice_overdue_reminder.py:0 -#, python-format msgid "" -"An overdue reminder can only be attached to a customer invoice or credit " -"note" +"An overdue reminder can only be attached to a customer invoice or credit note" msgstr "" "Um lembrete de atraso somente pode ser anexado a uma fatura ou nota de " "crédito de cliente" @@ -437,8 +376,8 @@ msgstr "" "O cliente possui pagamentos/reembolsos não conciliados. Você deve \n" " conciliar esses pagamentos/reembolsos e reiniciar o " "processo \n" -" de lembrete de atraso, ou verificar manualmente se esses " -"\n" +" de lembrete de atraso, ou verificar manualmente se " +"esses \n" " pagamentos/reembolsos não conciliados têm uma razão " "válida para \n" " não estarem conciliados com uma fatura em aberto." @@ -473,14 +412,14 @@ msgstr "Prezado Cliente," #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days -msgid "Default Overdue Reminder Minimum Interval (days)" -msgstr "Intervalo Mínimo Padrão de Lembrete de Atraso (dias)" +msgid "Default Overdue Reminder Minimum Interval" +msgstr "" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days -msgid "Default Overdue Reminder Trigger Delay (days)" -msgstr "Intervalo Padrão de Disparo do Lembrete de Vencimento (dias)" +msgid "Default Overdue Reminder Trigger Delay" +msgstr "" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_res_company__overdue_reminder_interface @@ -489,19 +428,16 @@ msgid "Default Overdue Reminder Wizard Interface" msgstr "Interface Padrão do Assistente de Lembrete de Atraso" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Minimum Interval" -msgstr "Intervalo Padrão Mínimo de Lembrete" - -#. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Reminder Trigger Delay" -msgstr "Intervalo Padrão de Disparo do Lembrete" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_min_interval_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_min_interval_days +msgid "Default overdue reminder minimum interval in days" +msgstr "" #. module: account_invoice_overdue_reminder -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings -msgid "Default Wizard Interface" -msgstr "Interface Padrão do Assistente" +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_company__overdue_reminder_start_days +#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_res_config_settings__overdue_reminder_start_days +msgid "Default overdue reminder trigger delay in days" +msgstr "" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.report_overdue_reminder_document @@ -523,7 +459,6 @@ msgstr "Desativar Lembrete de Fatura Vencida" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__no_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__no_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__no_overdue_reminder msgid "Disable Overdue Reminder" msgstr "Desativar Lembrete de Vencimento" @@ -558,7 +493,7 @@ msgstr "Data de Vencimento" #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "E-mail" msgstr "E-mail" @@ -571,7 +506,6 @@ msgstr "Status do E-mail" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "E-mail missing on partner '%s'." msgstr "E-mail ausente do parceiro '%s'." @@ -588,15 +522,14 @@ msgstr "Filtros" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', the deadline is missing for the activity." -msgstr "Para o lembrete do cliente '%s', o prazo está ausente para a atividade." +msgstr "" +"Para o lembrete do cliente '%s', o prazo está ausente para a atividade." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "For the reminder of customer '%s', you must assign someone for the activity." msgstr "" @@ -605,7 +538,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Good job!" msgstr "Bom trabalho!" @@ -657,7 +589,6 @@ msgstr "Fatura" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Invoice Contact" msgstr "Contato da Fatura" @@ -747,25 +678,12 @@ msgstr "Último Lançamento Criado em" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Last Invoice" msgstr "Última Fatura" -#. module: account_invoice_overdue_reminder -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_invoice_overdue_reminder____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_mass_update____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_result____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_start_payment____last_update -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step____last_update -msgid "Last Modified on" -msgstr "Última Modificação em" - #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_last_date #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_last_date -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_last_date msgid "Last Overdue Reminder Date" msgstr "Data do Último Lembrete de Atraso" @@ -773,7 +691,6 @@ msgstr "Data do Último Lembrete de Atraso" #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_form -#, python-format msgid "Last Reminder" msgstr "Último Lembrete" @@ -802,7 +719,6 @@ msgstr "Última Atualização em" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/overdue_reminder_action.py:0 -#, python-format msgid "Letter" msgstr "Carta" @@ -819,21 +735,18 @@ msgstr "Corpo do E-mail" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail body is empty." msgstr "O corpo do e-mail está vazio." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Mail subject is empty." msgstr "O assunto do e-mail está vazio." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "Mass" msgstr "Massa" @@ -859,6 +772,7 @@ msgstr "Nome" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__counter +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "New Remind Counter" msgstr "Novo Contador de Lembretes" @@ -907,7 +821,6 @@ msgstr "" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/models/res_company.py:0 -#, python-format msgid "One by One" msgstr "Um por Um" @@ -929,7 +842,6 @@ msgstr "Referência do Pedido" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue msgid "Overdue" msgstr "Vencido" @@ -979,13 +891,11 @@ msgstr "Carta de Cobrança de Fatura Vencida" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_remind_sent #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_remind_sent -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_remind_sent msgid "Overdue Remind Sent" msgstr "Lembrete de Fatura Vencida Enviado" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_move_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_partner_property_form msgid "Overdue Reminder" msgstr "Lembrete de Vencimento" @@ -998,7 +908,6 @@ msgstr "Ação do Lembrete de Vencimento" #: model:ir.model,name:account_invoice_overdue_reminder.model_overdue_reminder_action #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_ids #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_ids -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_ids msgid "Overdue Reminder Action History" msgstr "Histórico de Ações do Lembrete de Vencimento" @@ -1010,7 +919,6 @@ msgstr "Ação do Lembrete de Vencimento" #. module: account_invoice_overdue_reminder #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_invoice_filter msgid "Overdue Reminder Count" msgstr "Contagem de Lembretes de Vencimento" @@ -1070,13 +978,14 @@ msgstr "Realizado por" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_step__partner_phone #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search -#, python-format +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Phone" msgstr "Telefone" #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Post" msgstr "Correio" @@ -1093,7 +1002,6 @@ msgstr "Imprimir Faturas Vencidas" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "Remind letter hasn't been printed!" msgstr "A Carta de Lembrete Não Foi Impressa!" @@ -1195,35 +1103,31 @@ msgstr "Imposto Excluído" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The minimum delay since last reminder must be strictly positive." -msgstr "O atraso mínimo desde o último lembrete deve ser estritamente positivo." +msgstr "" +"O atraso mínimo desde o último lembrete deve ser estritamente positivo." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "The trigger delay cannot be negative." msgstr "O atraso para acionamento não pode ser negativo." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no invoices to remind for customer '%s'." msgstr "Não há faturas para lembrar para o cliente '%s'." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "There are no overdue reminders." msgstr "Não há lembretes de vencimento." #. module: account_invoice_overdue_reminder #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_bank_statement_line__overdue_reminder_counter #: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_move__overdue_reminder_counter -#: model:ir.model.fields,help:account_invoice_overdue_reminder.field_account_payment__overdue_reminder_counter msgid "This counter is not increased in case of phone reminder." msgstr "Este contador não é incrementado em caso de lembrete por telefone." @@ -1263,6 +1167,7 @@ msgstr "Atraso para Acionamento" #: model:ir.model.fields,field_description:account_invoice_overdue_reminder.field_overdue_reminder_action__reminder_type #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.account_invoice_overdue_reminder_search #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_action_search +#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_step_search msgid "Type" msgstr "Tipo" @@ -1294,7 +1199,6 @@ msgstr "Usuário" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "" "User company is different from action company. This should never happen." msgstr "" @@ -1332,14 +1236,12 @@ msgstr "Assistente para lembrete de fatura vencida de cliente" #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You must select the new reminder type." msgstr "Você deve selecionar o novo tipo de lembrete." #. module: account_invoice_overdue_reminder #. odoo-python #: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 -#, python-format msgid "You processed all your overdue invoice reminders." msgstr "Você processou todos os seus lembretes de faturas vencidas." @@ -1350,13 +1252,307 @@ msgstr "Atenciosamente," #. module: account_invoice_overdue_reminder #: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.overdue_reminder_start_form -#: model_terms:ir.ui.view,arch_db:account_invoice_overdue_reminder.view_account_config_settings msgid "days" msgstr "dias" +#. module: account_invoice_overdue_reminder +#. odoo-python +#: code:addons/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py:0 +msgid "overdue_letter-%s" +msgstr "" + #. module: account_invoice_overdue_reminder #: model:mail.template,subject:account_invoice_overdue_reminder.overdue_invoice_reminder_mail_template msgid "" "{{object.company_id.name}} - Overdue invoice reminder n°{{object.counter}}" msgstr "" "{{object.company_id.name}} - Lembrete de fatura vencida nº{{object.counter}}" + +#, python-format +#~ msgid "%(invoice_name)s Reminder %(counter)d" +#~ msgstr "%(invoice_name)s Lembrete %(counter)d" + +#~ msgid "" +#~ "
\n" +#~ "

Dear customer,

\n" +#~ "

According to our books, the following invoices are " +#~ "overdue:

\n" +#~ "\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
Invoice NumberInvoice DatePayment TermsDue DateOrder Ref.TypeTotal UntaxedTotalResidualPast Reminders
\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ " Total\n" +#~ " Residual in\n" +#~ " :\n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ "\n" +#~ "

If you made a payment for these invoices a few days " +#~ "ago, please ignore this email.

\n" +#~ "\n" +#~ " \n" +#~ "

You will find enclosed the overdue invoices.

\n" +#~ "
\n" +#~ "\n" +#~ " \n" +#~ "

Despite several reminders, we are disappointed to " +#~ "see that these overdue invoices are still\n" +#~ " unpaid.\n" +#~ " In order to avoid legal proceedings, we urge you " +#~ "to paid these overdue invoices in the next\n" +#~ " days.\n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "

Regards,

\n" +#~ "\n" +#~ " \n" +#~ "

\n" +#~ " \n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "
\n" +#~ " " +#~ msgstr "" +#~ "```html\n" +#~ "
\n" +#~ "

Caro cliente,

\n" +#~ "

De acordo com nossos registros, as seguintes faturas estão " +#~ "vencidas:

\n" +#~ "\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
Número " +#~ "da FaturaData da " +#~ "FaturaCondições de PagamentoData de " +#~ "VencimentoRef. do " +#~ "PedidoTipo\n" +#~ " Total " +#~ "Sem ImpostosTotal\n" +#~ " Saldo " +#~ "DevedorLembretes Enviados
\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ " Total\n" +#~ " Devedor em\n" +#~ " :\n" +#~ " \n" +#~ " \n" +#~ "
\n" +#~ "\n" +#~ "

Se você realizou o pagamento dessas faturas há alguns dias, por " +#~ "favor, ignore este e-mail.

\n" +#~ "\n" +#~ " \n" +#~ "

Você encontrará anexadas as faturas vencidas.

\n" +#~ "
\n" +#~ "\n" +#~ " \n" +#~ "

Apesar de vários lembretes, lamentamos ver que essas faturas " +#~ "vencidas ainda não foram pagas.\n" +#~ " Para evitar medidas legais, solicitamos que você pague essas " +#~ "faturas nos próximos dias.\n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "

Atenciosamente,

\n" +#~ "\n" +#~ " \n" +#~ "

\n" +#~ " \n" +#~ "

\n" +#~ "
\n" +#~ "\n" +#~ "
\n" +#~ "```\n" +#~ " " + +#~ msgid "Default Overdue Reminder Minimum Interval (days)" +#~ msgstr "Intervalo Mínimo Padrão de Lembrete de Atraso (dias)" + +#~ msgid "Default Overdue Reminder Trigger Delay (days)" +#~ msgstr "Intervalo Padrão de Disparo do Lembrete de Vencimento (dias)" + +#~ msgid "Default Reminder Minimum Interval" +#~ msgstr "Intervalo Padrão Mínimo de Lembrete" + +#~ msgid "Default Reminder Trigger Delay" +#~ msgstr "Intervalo Padrão de Disparo do Lembrete" + +#~ msgid "Default Wizard Interface" +#~ msgstr "Interface Padrão do Assistente" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" diff --git a/account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py b/account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py new file mode 100644 index 000000000..2c6d78ec1 --- /dev/null +++ b/account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py @@ -0,0 +1,8 @@ +# Copyright 2025 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from openupgradelib import openupgrade, openupgrade_180 + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade_180.convert_company_dependent(env, "res.partner", "no_overdue_reminder") diff --git a/account_invoice_overdue_reminder/static/description/index.html b/account_invoice_overdue_reminder/static/description/index.html index 02100b605..fa1b287c6 100644 --- a/account_invoice_overdue_reminder/static/description/index.html +++ b/account_invoice_overdue_reminder/static/description/index.html @@ -372,7 +372,7 @@

Overdue Invoice Reminder

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:006cf07eb6933a542371333fb8ef7353d0e1fafa11027dd4c85935f7718cd71b +!! source digest: sha256:3ae47b6dcc00b3cc6b53b13a5ce8299babfc7c7f72e970130d13042f6d74feb3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/credit-control Translate me on Weblate Try me on Runboat

This Odoo module is designed to send overdue invoice reminders to diff --git a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml index d846c0eb4..cf390cee9 100644 --- a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml +++ b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml @@ -64,7 +64,7 @@ account.invoice.overdue.reminder.list account.invoice.overdue.reminder - + account.invoice.overdue.reminder 100 - + diff --git a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py index dfcf1755c..51d26b024 100644 --- a/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py +++ b/account_invoice_overdue_reminder/wizard/overdue_reminder_wizard.py @@ -7,8 +7,9 @@ from collections import defaultdict from dateutil.relativedelta import relativedelta +from markupsafe import Markup -from odoo import _, api, fields, models, tools +from odoo import Command, _, api, fields, models, tools from odoo.exceptions import UserError logger = logging.getLogger(__name__) @@ -82,7 +83,7 @@ def default_get(self, fields_list): "last_entry_create_date": last and last.create_date or False, "last_entry_create_uid": last and last.create_uid.id or False, } - payments.append((0, 0, vals)) + payments.append(Command.create(vals)) res.update( { "payment_ids": payments, @@ -276,9 +277,9 @@ def _prepare_reminder_step( "partner_id": partner_id, "commercial_partner_id": commercial_partner.id, "user_id": self.env.user.id, - "invoice_ids": [(6, 0, invs.ids)], + "invoice_ids": [Command.set(invs.ids)], "company_id": self.company_id.id, - "warn_unreconciled_move_line_ids": [(6, 0, warn_unrec.ids)], + "warn_unreconciled_move_line_ids": [Command.set(warn_unrec.ids)], "interface": self.interface, } return vals @@ -586,7 +587,7 @@ def generate_mail_vals(self): mail = self.env["mail.mail"].sudo().create(mvals) if self.company_id.overdue_reminder_attach_invoice: attachment_ids = self._get_attachment_ids(mail) - mail.write({"attachment_ids": [(6, 0, attachment_ids)]}) + mail.write({"attachment_ids": [Command.set(attachment_ids)]}) vals = {"mail_id": mail.id} return vals @@ -621,7 +622,33 @@ def _prepare_overdue_reminder_action(self, vals): rvals = {"invoice_id": inv.id} if self.reminder_type != "phone": rvals["counter"] = inv.overdue_reminder_counter + 1 - vals["reminder_ids"].append((0, 0, rvals)) + vals["reminder_ids"].append(Command.create(rvals)) + if self.reminder_type == "mail": + inv.message_post( + body=Markup( + _( + "Overdue reminder sent by mail: " + "%(mail_subject)s.", + mail_id=vals["mail_id"], + mail_subject=self.mail_subject, + ) + ) + ) + elif self.reminder_type == "phone": + inv.message_post( + body=Markup( + _( + "Overdue reminder by phone. " + "Result/Info: %(result)s.", + result=self.result_id.name, + ) + ) + ) + elif self.reminder_type == "post": + inv.message_post( + body=Markup(_("Overdue reminder sent by post.")) + ) def print_letter(self): self.check_warnings() From c34802524602335bf434ff2f8f2509bc81576493 Mon Sep 17 00:00:00 2001 From: Nils Coenen Date: Sun, 23 Nov 2025 12:02:44 +0100 Subject: [PATCH 48/50] [IMP] account_invoice_overdue_reminder: pre-commit auto fixes --- .../views/account_move.xml | 14 +++++++------- .../views/report_overdue_reminder.xml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/account_invoice_overdue_reminder/views/account_move.xml b/account_invoice_overdue_reminder/views/account_move.xml index ce32f9eee..416f42a45 100644 --- a/account_invoice_overdue_reminder/views/account_move.xml +++ b/account_invoice_overdue_reminder/views/account_move.xml @@ -14,13 +14,13 @@

diff --git a/account_invoice_overdue_reminder/views/report_overdue_reminder.xml b/account_invoice_overdue_reminder/views/report_overdue_reminder.xml index efc2ae63f..cdab76101 100644 --- a/account_invoice_overdue_reminder/views/report_overdue_reminder.xml +++ b/account_invoice_overdue_reminder/views/report_overdue_reminder.xml @@ -9,8 +9,8 @@ t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
:
+ t-esc="o.company_id.account_fiscal_country_id.vat_label or 'Tax ID'" + />:

Date:

From 01a01713851761a3b16ae2c5ec61e04d0762c898 Mon Sep 17 00:00:00 2001 From: Nils Coenen Date: Sun, 23 Nov 2025 12:21:09 +0100 Subject: [PATCH 49/50] [MIG] account_invoice_overdue_reminder: backport migration to 17.0 --- account_invoice_overdue_reminder/README.rst | 103 +++++++++--------- .../__manifest__.py | 2 +- .../migrations/18.0.1.0.0/post-migration.py | 8 -- .../readme/CONTRIBUTORS.md | 2 + .../static/description/index.html | 51 ++++----- .../account_invoice_overdue_reminder.xml | 12 +- .../views/account_move.xml | 4 +- .../views/overdue_reminder_action.xml | 8 +- .../views/overdue_reminder_result.xml | 9 +- .../views/res_partner.xml | 8 +- .../wizard/overdue_reminder_wizard_view.xml | 22 ++-- 11 files changed, 110 insertions(+), 119 deletions(-) delete mode 100644 account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py diff --git a/account_invoice_overdue_reminder/README.rst b/account_invoice_overdue_reminder/README.rst index 6b13c2432..8197ef939 100644 --- a/account_invoice_overdue_reminder/README.rst +++ b/account_invoice_overdue_reminder/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ======================== Overdue Invoice Reminder ======================== @@ -17,17 +13,17 @@ Overdue Invoice Reminder .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcredit--control-lightgray.png?logo=github - :target: https://github.com/OCA/credit-control/tree/18.0/account_invoice_overdue_reminder + :target: https://github.com/OCA/credit-control/tree/17.0/account_invoice_overdue_reminder :alt: OCA/credit-control .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/credit-control-18-0/credit-control-18-0-account_invoice_overdue_reminder + :target: https://translation.odoo-community.org/projects/credit-control-17-0/credit-control-17-0-account_invoice_overdue_reminder :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/credit-control&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/credit-control&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,22 +41,22 @@ 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. +- **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 @@ -77,25 +73,25 @@ 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. +- 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). +- 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 @@ -116,11 +112,11 @@ payments. Then, go to the menu *Invoicing > Customers > Overdue Invoice Remind*: you will get the start screen where you can: -- filter the customers that you want to remind (filter by customer or by - salesman), -- check that your bank journals are up-to-date, -- choose between the *one-by-one* and *mass* interfaces, -- customize some parameters. +- filter the customers that you want to remind (filter by customer or + by salesman), +- check that your bank journals are up-to-date, +- choose between the *one-by-one* and *mass* interfaces, +- customize some parameters. Then follow the process until the end. @@ -135,12 +131,12 @@ Changelog **Features** -- Credit notes have been added to the e-mail summary that are sent to - the customer. They are marked in a different colour. +- Credit notes have been added to the e-mail summary that are sent to + the customer. They are marked in a different colour. - Furthermore, the button toggle to allow to send a reminder with - unreconciled payments has been removed. The warning remains. - (`#226 `__) + Furthermore, the button toggle to allow to send a reminder with + unreconciled payments has been removed. The warning remains. + (`#226 `__) Bug Tracker =========== @@ -148,7 +144,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -163,7 +159,8 @@ Authors Contributors ------------ -- Alexis de Lattre +- Alexis de Lattre +- Nils Coenen Maintainers ----------- @@ -186,6 +183,6 @@ Current `maintainer `__: |maintainer-alexis-via| -This module is part of the `OCA/credit-control `_ project on GitHub. +This module is part of the `OCA/credit-control `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_invoice_overdue_reminder/__manifest__.py b/account_invoice_overdue_reminder/__manifest__.py index 777138e43..54df81198 100644 --- a/account_invoice_overdue_reminder/__manifest__.py +++ b/account_invoice_overdue_reminder/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Overdue Invoice Reminder", - "version": "18.0.1.2.0", + "version": "17.0.1.0.0", "category": "Accounting", "license": "AGPL-3", "summary": "Simple mail/letter/phone overdue customer invoice reminder ", diff --git a/account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py b/account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py deleted file mode 100644 index 2c6d78ec1..000000000 --- a/account_invoice_overdue_reminder/migrations/18.0.1.0.0/post-migration.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2025 Tecnativa - Víctor Martínez -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from openupgradelib import openupgrade, openupgrade_180 - - -@openupgrade.migrate() -def migrate(env, version): - openupgrade_180.convert_company_dependent(env, "res.partner", "no_overdue_reminder") diff --git a/account_invoice_overdue_reminder/readme/CONTRIBUTORS.md b/account_invoice_overdue_reminder/readme/CONTRIBUTORS.md index b61afe5d0..7700c9538 100644 --- a/account_invoice_overdue_reminder/readme/CONTRIBUTORS.md +++ b/account_invoice_overdue_reminder/readme/CONTRIBUTORS.md @@ -1 +1,3 @@ - Alexis de Lattre \<\> +- Nils Coenen \<\> + diff --git a/account_invoice_overdue_reminder/static/description/index.html b/account_invoice_overdue_reminder/static/description/index.html index fa1b287c6..2fde0e90f 100644 --- a/account_invoice_overdue_reminder/static/description/index.html +++ b/account_invoice_overdue_reminder/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Overdue Invoice Reminder -
+
+

Overdue Invoice Reminder

- - -Odoo Community Association - -
-

Overdue Invoice Reminder

-

Beta License: AGPL-3 OCA/credit-control Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/credit-control Translate me on Weblate Try me on Runboat

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 @@ -395,9 +390,9 @@

Overdue Invoice Reminder

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.
  • +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 @@ -419,9 +414,9 @@

    Overdue Invoice Reminder

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

      @@ -456,15 +451,15 @@

      Overdue Invoice Reminder

    -

    Usage

    +

    Usage

    Of course, before sending invoice reminders, you must import your bank statements and process them, so that you are up-to-date on customer payments.

    Then, go to the menu Invoicing > Customers > Overdue Invoice Remind: you will get the start screen where you can:

      -
    • filter the customers that you want to remind (filter by customer or by -salesman),
    • +
    • filter the customers that you want to remind (filter by customer or +by salesman),
    • check that your bank journals are up-to-date,
    • choose between the one-by-one and mass interfaces,
    • customize some parameters.
    • @@ -474,9 +469,9 @@

      Usage

      Reminder on an overdue invoice.

    -

    Changelog

    +

    Changelog

    -

    16.0.1.2.0 (2023-12-11)

    +

    16.0.1.2.0 (2023-12-11)

    Features

    • Credit notes have been added to the e-mail summary that are sent to @@ -489,29 +484,30 @@

      16.0.1.2.0 (2023-12-11)

    -

    Bug Tracker

    +

    Bug Tracker

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

    +feedback.

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Akretion
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -521,11 +517,10 @@

    Maintainers

    promote its widespread use.

    Current maintainer:

    alexis-via

    -

    This module is part of the OCA/credit-control project on GitHub.

    +

    This module is part of the OCA/credit-control project on GitHub.

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

    -
    diff --git a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml index cf390cee9..3cf25b07d 100644 --- a/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml +++ b/account_invoice_overdue_reminder/views/account_invoice_overdue_reminder.xml @@ -61,10 +61,10 @@ - account.invoice.overdue.reminder.list + account.invoice.overdue.reminder.tree account.invoice.overdue.reminder - + - + @@ -103,10 +103,10 @@ account.invoice.overdue.reminder 100 - + - + @@ -163,7 +163,7 @@ Invoice Reminder Counters account.invoice.overdue.reminder - list,form + tree,form {'overdue_reminder_main_view': True} diff --git a/account_invoice_overdue_reminder/views/account_move.xml b/account_invoice_overdue_reminder/views/account_move.xml index 416f42a45..f2e81d364 100644 --- a/account_invoice_overdue_reminder/views/account_move.xml +++ b/account_invoice_overdue_reminder/views/account_move.xml @@ -11,6 +11,8 @@
    + +