From c09f9b32b8606572fa8204265d3e0da21cf1887e Mon Sep 17 00:00:00 2001 From: "@" <@> Date: Mon, 22 Oct 2012 13:06:14 +0200 Subject: [PATCH 001/134] [MIG] account_credit_control: Renamed and migrated to 6.1 --- account_credit_control/__init__.py | 28 + account_credit_control/__openerp__.py | 80 ++ account_credit_control/account.py | 73 ++ account_credit_control/account_view.xml | 30 + account_credit_control/company.py | 40 + account_credit_control/company_view.xml | 16 + .../credit_control_demo.xml | 33 + account_credit_control/data.xml | 236 ++++ .../i18n/account_credit_control.pot | 787 +++++++++++++ account_credit_control/i18n/en.po | 1026 +++++++++++++++++ account_credit_control/i18n/fr.po | 965 ++++++++++++++++ account_credit_control/line.py | 196 ++++ account_credit_control/line_view.xml | 148 +++ account_credit_control/partner.py | 44 + account_credit_control/partner_view.xml | 25 + account_credit_control/policy.py | 379 ++++++ account_credit_control/policy_view.xml | 121 ++ account_credit_control/report/__init__.py | 1 + .../report/credit_control_summary.html.mako | 22 + .../report/credit_control_summary.py | 37 + account_credit_control/report/report.xml | 12 + account_credit_control/run.py | 153 +++ account_credit_control/run_view.xml | 65 ++ .../security/ir.model.access.csv | 18 + account_credit_control/wizard/__init__.py | 24 + .../wizard/credit_control_communication.py | 181 +++ .../wizard/credit_control_emailer.py | 83 ++ .../wizard/credit_control_emailer_view.xml | 44 + .../wizard/credit_control_marker.py | 101 ++ .../wizard/credit_control_marker_view.xml | 45 + .../wizard/credit_control_printer.py | 89 ++ .../wizard/credit_control_printer_view.xml | 49 + 32 files changed, 5151 insertions(+) create mode 100644 account_credit_control/__init__.py create mode 100644 account_credit_control/__openerp__.py create mode 100644 account_credit_control/account.py create mode 100644 account_credit_control/account_view.xml create mode 100644 account_credit_control/company.py create mode 100644 account_credit_control/company_view.xml create mode 100644 account_credit_control/credit_control_demo.xml create mode 100644 account_credit_control/data.xml create mode 100644 account_credit_control/i18n/account_credit_control.pot create mode 100644 account_credit_control/i18n/en.po create mode 100644 account_credit_control/i18n/fr.po create mode 100644 account_credit_control/line.py create mode 100644 account_credit_control/line_view.xml create mode 100644 account_credit_control/partner.py create mode 100644 account_credit_control/partner_view.xml create mode 100644 account_credit_control/policy.py create mode 100644 account_credit_control/policy_view.xml create mode 100644 account_credit_control/report/__init__.py create mode 100644 account_credit_control/report/credit_control_summary.html.mako create mode 100644 account_credit_control/report/credit_control_summary.py create mode 100644 account_credit_control/report/report.xml create mode 100644 account_credit_control/run.py create mode 100644 account_credit_control/run_view.xml create mode 100644 account_credit_control/security/ir.model.access.csv create mode 100644 account_credit_control/wizard/__init__.py create mode 100644 account_credit_control/wizard/credit_control_communication.py create mode 100644 account_credit_control/wizard/credit_control_emailer.py create mode 100644 account_credit_control/wizard/credit_control_emailer_view.xml create mode 100644 account_credit_control/wizard/credit_control_marker.py create mode 100644 account_credit_control/wizard/credit_control_marker_view.xml create mode 100644 account_credit_control/wizard/credit_control_printer.py create mode 100644 account_credit_control/wizard/credit_control_printer_view.xml diff --git a/account_credit_control/__init__.py b/account_credit_control/__init__.py new file mode 100644 index 000000000..fcbbd9b69 --- /dev/null +++ b/account_credit_control/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import run +from . import line +from . import account +from . import partner +from . import policy +from . import company +import wizard +import report diff --git a/account_credit_control/__openerp__.py b/account_credit_control/__openerp__.py new file mode 100644 index 000000000..b37ce24d9 --- /dev/null +++ b/account_credit_control/__openerp__.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{'name' : 'Account Credit Control', + 'version' : '0.1', + 'author' : 'Camptocamp', + 'maintainer': 'Camptocamp', + 'category': 'Finance', + 'complexity': "normal", + 'depends' : ['base', 'account', 'email_template', 'report_webkit'], + 'description': """ +Credit Control +============== + +Configuration +------------- + +Configure the policies and policy levels in ``Accounting > Configuration > +Credit Control > Credit Policies``. +You can define as many policy levels as you need. + +Configure a tolerance for the Credit control and a default policy +applied on all partners in each company, under the Accounting tab. + +You are able to specify a particular policy for one partner or one invoice. + +Usage +----- + +Menu entries are located in ``Accounting > Periodical Processing > Credit +Control``. + +Create a new "run" in the ``Credit Control Run`` menu with the controlling date. +Then, use the ``Compute credit lines`` button. All the credit control lines will +be generated. You can find them in the ``Credit Control Lines`` menu. + +On each generated line, you have many choices: + * Send a email + * Print a letter + * Change the state (so you can ignore or reopen lines) + """, + 'website': 'http://www.camptocamp.com', + 'init_xml': ["data.xml", + ], + 'update_xml': ["line_view.xml", + "account_view.xml", + "partner_view.xml", + "policy_view.xml", + "run_view.xml", + "company_view.xml", + "wizard/credit_control_emailer_view.xml", + "wizard/credit_control_marker_view.xml", + "wizard/credit_control_printer_view.xml", + "report/report.xml", + "security/ir.model.access.csv", + ], + 'demo_xml': ["credit_control_demo.xml"], + 'tests': [], + 'installable': True, + 'license': 'AGPL-3', + 'application': True +} + diff --git a/account_credit_control/account.py b/account_credit_control/account.py new file mode 100644 index 000000000..a515bb9b0 --- /dev/null +++ b/account_credit_control/account.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv.orm import Model, fields + + +class AccountAccount(Model): + """Add a link to a credit control policy on account.account""" + + _inherit = "account.account" + + _columns = { + 'credit_control_line_ids': fields.one2many('credit.control.line', + 'account_id', + string='Credit Lines', + readonly=True) + } + + +class AccountInvoice(Model): + """Add a link to a credit control policy on account.account""" + + _inherit = "account.invoice" + _columns = { + 'credit_policy_id': fields.many2one('credit.control.policy', + 'Credit Control Policy', + help=("The Credit Control Policy " + "used for this invoice. " + "If nothing is defined, " + "it will use the account " + "setting or the partner " + "setting.")), + + 'credit_control_line_ids': fields.one2many('credit.control.line', + 'invoice_id', + string='Credit Lines', + readonly=True) + } + + def action_move_create(self, cr, uid, ids, context=None): + """ Write the id of the invoice in the generated moves. """ + res = super(AccountInvoice, self).action_move_create(cr, uid, ids, context=context) + for inv in self.browse(cr, uid, ids, context=context): + if inv.move_id: + for line in inv.move_id.line_id: + line.write({'invoice_id': inv.id}) + return res + + +class AccountMoveLine(Model): + + _inherit = "account.move.line" + + _columns = {'invoice_id': fields.many2one('account.invoice', 'Invoice')} + diff --git a/account_credit_control/account_view.xml b/account_credit_control/account_view.xml new file mode 100644 index 000000000..cb44a7c67 --- /dev/null +++ b/account_credit_control/account_view.xml @@ -0,0 +1,30 @@ + + + + + + + invoice.followup.form.view + account.invoice + + form + + + + + + + + + + + + + diff --git a/account_credit_control/company.py b/account_credit_control/company.py new file mode 100644 index 000000000..7a31b7d84 --- /dev/null +++ b/account_credit_control/company.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp.osv.orm import Model, fields + + +class ResCompany(Model): + + _inherit = 'res.company' + + _columns = { + 'credit_control_tolerance': fields.float('Credit Control Tolerance'), + # This is not a property on the partner because we cannot search + # on fields.property (subclass fields.function). + 'credit_policy_id': fields.many2one( + 'credit.control.policy', + 'Credit Control Policy', + help=("The Credit Control Policy used on partners by default. This " + "setting can be overriden on partners or invoices.")), + } + + _defaults = {"credit_control_tolerance": 0.1} + diff --git a/account_credit_control/company_view.xml b/account_credit_control/company_view.xml new file mode 100644 index 000000000..75139b9be --- /dev/null +++ b/account_credit_control/company_view.xml @@ -0,0 +1,16 @@ + + + + credit.control.company.form + res.company + form + + + + + + + + + + diff --git a/account_credit_control/credit_control_demo.xml b/account_credit_control/credit_control_demo.xml new file mode 100644 index 000000000..96734fbea --- /dev/null +++ b/account_credit_control/credit_control_demo.xml @@ -0,0 +1,33 @@ + + + + X11002-a + B2B Debtors - (test) + + receivable + + + + + + + X11002-b + B2C Debtors - (test) + + receivable + + + + + + + X11002-c + New Debtors - (test) + + receivable + + + + + + diff --git a/account_credit_control/data.xml b/account_credit_control/data.xml new file mode 100644 index 000000000..de9e8ee7e --- /dev/null +++ b/account_credit_control/data.xml @@ -0,0 +1,236 @@ + + + + + Credit Control Email + noreply@localhost + Credit Control: (${object.current_policy_level.name or 'n/a' }) + ${object.get_email() or ''} + + + + %if mode != 'pdf': + + + %endif +
+ +

Dear ${object.partner_id.name or ''},

+ +
${object.current_policy_level.custom_text}
+ + + + + + + + + +%for line in object.credit_control_line_ids: + + + + + %if line.invoice_id: + + %else: + + %endif +%endfor +
Summary
date dueAmount dueAmount balanceInvoice number
${line.date_due}${line.amount_due}${line.balance_due}${line.invoice_id.number}n/a
+
+
+ +

If you have any question, do not hesitate to contact us.

+ +

Thank you for choosing ${object.company_id.name}!

+ + -- more info here -- +

${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''}
+ ${object.company_id.name}
+ % if object.company_id.street: + ${object.company_id.street or ''}
+ + % endif + + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip or ''} ${object.company_id.city or ''}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone: ${object.company_id.phone}
+ % endif + % if object.company_id.website: + ${object.company_id.website or ''}
+ % endif + ]]> + + + + + No follow + + + + + + 3 time policy + + + + 10 days net + + net_days + + + + email + Dear Sir or Madam, + +Our records indicate that we have not received the payment of the +above mentioned invoice (copy attached for your convenience). If it +has already been sent, please disregard this notice. If not, please +proceed with payment within 10 days. + +Thank you in advance for your anticipated cooperation in this matter. + +Best regards, + + + + + 30 days end of month + + end_of_month + + + + email + Dear Sir or Madam, + +Our records indicate that we have not yet received the payment of the +above mentioned invoice (copy attached for your convenience) despite +our first reminder. If it has already been sent, please disregard +this notice. If not, please proceed with payment within 5 days. + +Thank you in advance for your anticipated cooperation in this matter. + +Best regards, + + + + + 10 days last reminder + + previous_date + + + + letter + Dear Sir or Madam, + +Our records indicate that we still have not received the payment of +the above mentioned invoice (copy attached) despite our two reminders. +If payment have already been sent, please disregard this notice. If +not, please proceed with payment. If your payment has not been +received in the next 5 days, your file will be transfered to our debt +collection agency. + +Should you need us to arrange a payment plan for you, please advise. +A customer account statement is enclosed for you convenience. + +Thank you in advance for your anticipated cooperation in this matter. + +Best regards, + + + + + + 2 time policy + + + + 30 days end of month + + end_of_month + + + + email + Dear Sir or Madam, + +Our records indicate that we have not received the payment of the +above mentioned invoice (copy attached for your convenience). If it +has already been sent, please disregard this notice. If not, please +proceed with payment within 10 days. + +Thank you in advance for your anticipated cooperation in this matter. + +Best regards, + + + + + 60 days last reminder + + previous_date + + + + letter + Dear Sir or Madam, + +Our records indicate that we still have not received the payment of +the above mentioned invoice (copy attached) despite our reminder. +If payment have already been sent, please disregard this notice. If +not, please proceed with payment. If your payment has not been +received in the next 5 days, your file will be transfered to our debt +collection agency. + +Should you need us to arrange a payment plan for you, please advise. +A customer account statement is enclosed for you convenience. + +Thank you in advance for your anticipated cooperation in this matter. + +Best regards, + + + + + Credit Control Manager + + + + + Credit Control User + + + + + Credit Control Info + + + + + + + + + diff --git a/account_credit_control/i18n/account_credit_control.pot b/account_credit_control/i18n/account_credit_control.pot new file mode 100644 index 000000000..2cc7c34c8 --- /dev/null +++ b/account_credit_control/i18n/account_credit_control.pot @@ -0,0 +1,787 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_credit_control +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-07 13:23+0000\n" +"PO-Revision-Date: 2012-11-07 13:23+0000\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_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.2_time_1 +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_1 +msgid "Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not received the payment of the\n" +"above mentioned invoice (copy attached for your convenience). If it\n" +"has already been sent, please disregard this notice. If not, please\n" +"proceed with payment within 10 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +"" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy.level,custom_text:0 +msgid "Custom Message" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_mailer +msgid "Mass credit line mailer" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "More..." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Group By..." +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.credit_control_run +#: model:ir.ui.menu,name:account_credit_control.credit_control_run_menu +msgid "Credit Control Run" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy.level,computation_mode:0 +msgid "Compute Mode" +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_emailer_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_emailer_wizard_menu_action +msgid "Send By Email" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_line +msgid "A credit control line" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,move_line_id:0 +msgid "Move line" +msgstr "" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_info +msgid "Credit Control Info" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_emailer +msgid "Mass credit line emailer" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,account_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_account_account +msgid "Account" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Due Date" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.communication,current_policy_level:0 +#: field:credit.control.line,level:0 +#: view:credit.control.lines:0 +#: field:credit.control.policy.level,level:0 +msgid "Level" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy.level,delay_days:0 +msgid "Delay (in days)" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_communication +msgid "credit control communication" +msgstr "" + +#. module: account_credit_control +#: sql_constraint:account.move.line:0 +msgid "Wrong credit or debit value in accounting entry !" +msgstr "" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "Error ! You can not create recursive accounts." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +msgid "Send emails for the selected lines" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_marker +msgid "Mass marker" +msgstr "" + +#. module: account_credit_control +#: field:account.invoice,credit_policy_id:0 +#: field:res.company,credit_policy_id:0 +#: field:res.partner,credit_policy_id:0 +msgid "Credit Control Policy" +msgstr "" + +#. module: account_credit_control +#: view:account.invoice:0 +msgid "Credit control" +msgstr "" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "The date of your Journal Entry is not in the defined period! You should change the date or remove this constraint from the journal." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "New lines" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,date_sent:0 +msgid "Sent date" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: field:credit.control.policy,account_ids:0 +msgid "Accounts" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.communication,partner_id:0 +#: field:credit.control.line,partner_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_res_partner +msgid "Partner" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +msgid "Send the emails" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.marker:0 +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_marker_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_marker_wizard_menu_action +msgid "Change Lines' State" +msgstr "" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_2 +msgid "Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not yet received the payment of the\n" +"above mentioned invoice (copy attached for your convenience) despite\n" +"our first reminder. If it has already been sent, please disregard\n" +"this notice. If not, please proceed with payment within 5 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +"" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy.level,policy_id:0 +msgid "Related Policy" +msgstr "" + +#. module: account_credit_control +#: sql_constraint:account.account:0 +msgid "The code of the account must be unique per company !" +msgstr "" + +#. module: account_credit_control +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: view:credit.control.policy.level:0 +msgid "Mail and reporting" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Print" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,channel:0 +#: selection:credit.control.policy.level,channel:0 +msgid "Email" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,channel:0 +#: view:credit.control.lines:0 +#: field:credit.control.policy.level,channel:0 +msgid "Channel" +msgstr "" + +#. module: account_credit_control +#: help:credit.control.run,manual_ids:0 +msgid "If a credit control line has been generated on a policy and the policy has been changed meantime, it has to be handled manually" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.printer,state:0 +msgid "state" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.run,report:0 +msgid "Report" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Due Date, End Of Month" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.marker,name:0 +msgid "Mark as" +msgstr "" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.2_time_2 +msgid "Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our reminder.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +"" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.run:0 +#: field:credit.control.run,policy_ids:0 +msgid "Policies" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,date_due:0 +msgid "Due date" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy,do_nothing:0 +msgid "Do nothing" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,currency_id:0 +msgid "Currency" +msgstr "" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "Configuration Error! \n" +"You can not define children to an account with internal type different of \"View\"! " +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_printer +msgid "Mass printer" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.communication,company_id:0 +#: field:credit.control.line,company_id:0 +#: field:credit.control.policy,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.marker:0 +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_marker_wizard +msgid "Change the state of the selected lines." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Print the selected lines" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +#: selection:credit.control.marker,name:0 +#: selection:credit.control.run,state:0 +msgid "Draft" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Credit policy" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: view:credit.control.policy.level:0 +msgid "Delay Setting" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,balance_due:0 +msgid "Due balance" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Credit policy level" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_run +msgid "Credit control line generator" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.communication,user_id:0 +msgid "User" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,channel:0 +#: selection:credit.control.policy.level,channel:0 +msgid "Letter" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_account_move_line +msgid "Journal Items" +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_printer_wizard +msgid "Print selected lines" +msgstr "" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "You can not create journal items on an account of type view." +msgstr "" + +#. module: account_credit_control +#: field:credit.control.emailer,line_ids:0 +#: field:credit.control.marker,line_ids:0 +#: field:credit.control.printer,line_ids:0 +#: model:ir.actions.act_window,name:account_credit_control.credit_control_line_action +#: model:ir.ui.menu,name:account_credit_control.credit_control_line_action_menu +#: field:res.partner,credit_control_line_ids:0 +msgid "Credit Control Lines" +msgstr "" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_3 +msgid "Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our two reminders.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +"" +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_printer_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_printer_wizard_menu_action +msgid "Print Lines" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.run,date:0 +msgid "Controlling Date" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_policy +msgid "Define a reminder policy" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy.level,email_template_id:0 +msgid "Email Template" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +#: selection:credit.control.marker,name:0 +msgid "Ready To Send" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.printer,mark_as_sent:0 +msgid "Mark letter lines as sent" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Compute Credit Control Lines" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Previous Reminder" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +msgid "Error" +msgstr "" + +#. module: account_credit_control +#: sql_constraint:account.invoice:0 +msgid "Invoice Number must be unique per Company!" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Report and Errors" +msgstr "" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "Configuration Error! \n" +"You can not select an account type with a deferral method different of \"Unreconciled\" for accounts with internal type \"Payable/Receivable\"! " +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,state:0 +#: field:credit.control.run,state:0 +msgid "State" +msgstr "" + +#. module: account_credit_control +#: help:credit.control.policy,do_nothing:0 +msgid "For policies which should not generate lines or are obsolete" +msgstr "" + +#. module: account_credit_control +#: field:account.account,credit_control_line_ids:0 +#: field:account.invoice,credit_control_line_ids:0 +#: field:credit.control.communication,credit_control_line_ids:0 +#: model:ir.actions.act_window,name:account_credit_control.act_account_credit_relation_relation +#: model:ir.actions.act_window,name:account_credit_control.act_partner_credit_relation_relation +msgid "Credit Lines" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: selection:credit.control.marker,name:0 +#: selection:credit.control.run,state:0 +msgid "Done" +msgstr "" + +#. module: account_credit_control +#: field:account.move.line,invoice_id:0 +#: field:credit.control.line,invoice_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +#: view:credit.control.marker:0 +#: view:credit.control.printer:0 +msgid "Cancel" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Close" +msgstr "" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +msgid "Emailing Error" +msgstr "" + +#. module: account_credit_control +#: help:account.invoice,credit_policy_id:0 +msgid "The Credit Control Policy used for this invoice. If nothing is defined, it will use the account setting or the partner setting." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Run date" +msgstr "" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_user +msgid "Credit Control User" +msgstr "" + +#. module: account_credit_control +#: model:email.template,body_html:account_credit_control.email_template_credit_control_base +msgid "\n" +" <%page args=\"object, user=None, ctx=None, quote=None, format_exception=True, mode='mail'\" />\n" +" %if mode != 'pdf':\n" +" \n" +" \n" +" %endif\n" +"

\n" +"\n" +"

Dear ${object.partner_id.name or ''},

\n" +"\n" +"
${object.current_policy_level.custom_text}
\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"%for line in object.credit_control_line_ids:\n" +" \n" +" \n" +" \n" +" \n" +" %if line.invoice_id:\n" +" \n" +" %else:\n" +" \n" +" %endif\n" +"%endfor\n" +"
Summary
date dueAmount dueAmount balanceInvoice number
${line.date_due}${line.amount_due}${line.balance_due}${line.invoice_id.number}n/a
\n" +"
\n" +"
\n" +"\n" +"

If you have any question, do not hesitate to contact us.

\n" +"\n" +"

Thank you for choosing ${object.company_id.name}!

\n" +"\n" +" -- more info here --\n" +"

${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''}
\n" +" ${object.company_id.name}
\n" +" % if object.company_id.street:\n" +" ${object.company_id.street or ''}
\n" +"\n" +" % endif\n" +"\n" +" % if object.company_id.street2:\n" +" ${object.company_id.street2}
\n" +" % endif\n" +" % if object.company_id.city or object.company_id.zip:\n" +" ${object.company_id.zip or ''} ${object.company_id.city or ''}
\n" +" % endif\n" +" % if object.company_id.country_id:\n" +" ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
\n" +" % endif\n" +" % if object.company_id.phone:\n" +" Phone: ${object.company_id.phone}
\n" +" % endif\n" +" % if object.company_id.website:\n" +" ${object.company_id.website or ''}
\n" +" % endif\n" +" " +msgstr "" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "Company must be the same for its related account and period." +msgstr "" + +#. module: account_credit_control +#: field:credit.control.run,manual_ids:0 +msgid "Lines to handle manually" +msgstr "" + +#. module: account_credit_control +#: model:ir.ui.menu,name:account_credit_control.base_credit_control_configuration_menu +#: model:ir.ui.menu,name:account_credit_control.base_credit_control_menu +msgid "Credit Control" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: field:credit.control.policy,level_ids:0 +msgid "Policy Levels" +msgstr "" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "The selected account of your Journal Entry forces to provide a secondary currency. You should remove the secondary currency on the account or select a multi-currency view on the journal." +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,policy_id:0 +msgid "Policy" +msgstr "" + +#. module: account_credit_control +#: model:email.template,subject:account_credit_control.email_template_credit_control_base +msgid "Credit Control: (${object.current_policy_level.name or 'n/a' })" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.printer,report_file:0 +msgid "Generated Report" +msgstr "" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Move lines To be treated manually" +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.credit_policy_configuration_action +#: model:ir.ui.menu,name:account_credit_control.credit_policy_configuration_action_menu +msgid "Credit Control Policies" +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_emailer_wizard +msgid "Send an email for the selected lines." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Sent" +msgstr "" + +#. module: account_credit_control +#: constraint:credit.control.policy.level:0 +msgid "The smallest level can not be of type Previous Reminder" +msgstr "" + +#. module: account_credit_control +#: help:credit.control.policy,account_ids:0 +msgid "This policy will be active only for the selected accounts" +msgstr "" + +#. module: account_credit_control +#: help:credit.control.printer,mark_as_sent:0 +msgid "Only letter lines will be marked." +msgstr "" + +#. module: account_credit_control +#: view:credit.control.line:0 +#: view:credit.control.lines:0 +msgid "Control Credit Lines" +msgstr "" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_manager +msgid "Credit Control Manager" +msgstr "" + +#. module: account_credit_control +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.policy,name:0 +#: field:credit.control.policy.level,name:0 +msgid "Name" +msgstr "" + +#. module: account_credit_control +#: help:res.partner,credit_policy_id:0 +msgid "The Credit Control Policyused for this partner. This setting can be forced on the invoice. If nothing is defined, it will use the company setting." +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,mail_message_id:0 +msgid "Sent Email" +msgstr "" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_policy_level +msgid "A credit control policy level" +msgstr "" + +#. module: account_credit_control +#: model:ir.actions.report.xml,name:account_credit_control.report_webkit_html +msgid "Credit Summary" +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,date:0 +msgid "Controlling date" +msgstr "" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "You can not create journal items on closed account." +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,amount_due:0 +msgid "Due Amount Tax incl." +msgstr "" + +#. module: account_credit_control +#: field:res.company,credit_control_tolerance:0 +msgid "Credit Control Tolerance" +msgstr "" + +#. module: account_credit_control +#: help:res.company,credit_policy_id:0 +msgid "The Credit Control Policy used on partners by default. This setting can be overriden on partners or invoices." +msgstr "" + +#. module: account_credit_control +#: field:credit.control.line,policy_level_id:0 +msgid "Overdue Level" +msgstr "" + diff --git a/account_credit_control/i18n/en.po b/account_credit_control/i18n/en.po new file mode 100644 index 000000000..e93794f55 --- /dev/null +++ b/account_credit_control/i18n/en.po @@ -0,0 +1,1026 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_credit_control +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-07 15:35+0000\n" +"PO-Revision-Date: 2012-11-07 14:24+0100\n" +"Last-Translator: Guewen Baconnier \n" +"Language-Team: EN\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.2_time_1 +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_1 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not received the payment of the\n" +"above mentioned invoice (copy attached for your convenience). If it\n" +"has already been sent, please disregard this notice. If not, please\n" +"proceed with payment within 10 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not received the payment of the\n" +"above mentioned invoice (copy attached for your convenience). If it\n" +"has already been sent, please disregard this notice. If not, please\n" +"proceed with payment within 10 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: field:credit.control.policy.level,custom_text:0 +msgid "Custom Message" +msgstr "Custom Message" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "More..." +msgstr "More..." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Group By..." +msgstr "Group By..." + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.credit_control_run +#: model:ir.ui.menu,name:account_credit_control.credit_control_run_menu +msgid "Credit Control Run" +msgstr "Credit Control Run" + +#. module: account_credit_control +#: field:credit.control.policy.level,computation_mode:0 +msgid "Compute Mode" +msgstr "Compute Mode" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_emailer_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_emailer_wizard_menu_action +msgid "Send By Email" +msgstr "Send By Email" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_line +msgid "A credit control line" +msgstr "A credit control line" + +#. module: account_credit_control +#: field:credit.control.line,move_line_id:0 +msgid "Move line" +msgstr "Move line" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_info +msgid "Credit Control Info" +msgstr "Credit Control Info" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_emailer +msgid "Mass credit line emailer" +msgstr "Mass credit line emailer" + +#. module: account_credit_control +#: field:credit.control.line,account_id:0 view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_account_account +msgid "Account" +msgstr "Account" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Due Date" +msgstr "Due Date" + +#. module: account_credit_control +#: field:credit.control.communication,current_policy_level:0 +#: field:credit.control.line,level:0 view:credit.control.lines:0 +#: field:credit.control.policy.level,level:0 +msgid "Level" +msgstr "Level" + +#. module: account_credit_control +#: field:credit.control.policy.level,delay_days:0 +msgid "Delay (in days)" +msgstr "Delay (in days)" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_communication +msgid "credit control communication" +msgstr "credit control communication" + +#. module: account_credit_control +#: sql_constraint:account.move.line:0 +msgid "Wrong credit or debit value in accounting entry !" +msgstr "Wrong credit or debit value in accounting entry!" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "These lines are ready to send by email or by letter using the Actions." +msgstr "These lines are ready to send by email or by letter using the Actions." + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_marker +msgid "Mass marker" +msgstr "Mass marker" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 view:credit.control.lines:0 +#: selection:credit.control.marker,name:0 +msgid "Ignored" +msgstr "Ignored" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +msgid "Send emails for the selected lines" +msgstr "Send emails for the selected lines" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "Error ! You can not create recursive accounts." +msgstr "Error! You can not create recursive accounts." + +#. module: account_credit_control +#: field:account.invoice,credit_policy_id:0 +#: field:res.company,credit_policy_id:0 field:res.partner,credit_policy_id:0 +msgid "Credit Control Policy" +msgstr "Credit Control Policy" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "" +"The date of your Journal Entry is not in the defined period! You should " +"change the date or remove this constraint from the journal." +msgstr "" +"The date of your Journal Entry is not in the defined period! You should " +"change the date or remove this constraint from the journal." + +#. module: account_credit_control +#: field:credit.control.line,date_sent:0 +msgid "Sent date" +msgstr "Sent date" + +#. module: account_credit_control +#: view:credit.control.policy:0 field:credit.control.policy,account_ids:0 +msgid "Accounts" +msgstr "Accounts" + +#. module: account_credit_control +#: field:credit.control.communication,partner_id:0 +#: field:credit.control.line,partner_id:0 view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_res_partner +msgid "Partner" +msgstr "Partner" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +msgid "Send the emails" +msgstr "Send the emails" + +#. module: account_credit_control +#: view:credit.control.marker:0 +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_marker_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_marker_wizard_menu_action +msgid "Change Lines' State" +msgstr "Change Lines' State" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_2 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not yet received the payment of the\n" +"above mentioned invoice (copy attached for your convenience) despite\n" +"our first reminder. If it has already been sent, please disregard\n" +"this notice. If not, please proceed with payment within 5 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not yet received the payment of the\n" +"above mentioned invoice (copy attached for your convenience) despite\n" +"our first reminder. If it has already been sent, please disregard\n" +"this notice. If not, please proceed with payment within 5 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: field:credit.control.policy.level,policy_id:0 +msgid "Related Policy" +msgstr "Related Policy" + +#. module: account_credit_control +#: sql_constraint:account.account:0 +msgid "The code of the account must be unique per company !" +msgstr "The code of the account must be unique per company!" + +#. module: account_credit_control +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Error! You can not create recursive companies." + +#. module: account_credit_control +#: view:credit.control.policy:0 view:credit.control.policy.level:0 +msgid "Mail and reporting" +msgstr "Mail and reporting" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Print" +msgstr "Print" + +#. module: account_credit_control +#: selection:credit.control.line,channel:0 +#: selection:credit.control.policy.level,channel:0 +msgid "Email" +msgstr "Email" + +#. module: account_credit_control +#: field:credit.control.line,channel:0 view:credit.control.lines:0 +#: field:credit.control.policy.level,channel:0 +msgid "Channel" +msgstr "Channel" + +#. module: account_credit_control +#: help:credit.control.run,manual_ids:0 +msgid "" +"If a credit control line has been generated on a policy and the policy has " +"been changed meantime, it has to be handled manually" +msgstr "" +"If a credit control line has been generated on a policy and the policy has " +"been changed meantime, it has to be handled manually" + +#. module: account_credit_control +#: field:credit.control.printer,state:0 +msgid "state" +msgstr "state" + +#. module: account_credit_control +#: field:credit.control.run,report:0 +msgid "Report" +msgstr "Report" + +#. module: account_credit_control +#: help:credit.control.line,state:0 +msgid "" +"Draft lines need to be triaged.\n" +"Ignored lines are lines for which we do not want to send something.\n" +"Draft and ignored lines will be generated again on the next run." +msgstr "" +"Draft lines need to be triaged.\n" +"Ignored lines are lines for which we do not want to send something.\n" +"Draft and ignored lines will be generated again on the next run." + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Due Date, End Of Month" +msgstr "Due Date, End Of Month" + +#. module: account_credit_control +#: field:credit.control.marker,name:0 +msgid "Mark as" +msgstr "Mark as" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.2_time_2 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our reminder.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our reminder.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "An error has occured during the sending of the email." +msgstr "An error has occured during the sending of the email." + +#. module: account_credit_control +#: view:credit.control.run:0 field:credit.control.run,policy_ids:0 +msgid "Policies" +msgstr "Policies" + +#. module: account_credit_control +#: field:credit.control.line,date_due:0 +msgid "Due date" +msgstr "Due date" + +#. module: account_credit_control +#: field:credit.control.policy,do_nothing:0 +msgid "Do nothing" +msgstr "Do nothing" + +#. module: account_credit_control +#: field:credit.control.line,currency_id:0 +msgid "Currency" +msgstr "Currency" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "" +"Configuration Error! \n" +"You can not define children to an account with internal type different of " +"\"View\"! " +msgstr "" +"Configuration Error! \n" +"You can not define children to an account with internal type different of " +"\"View\"! " + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_printer +msgid "Mass printer" +msgstr "Mass printer" + +#. module: account_credit_control +#: field:credit.control.communication,company_id:0 +#: field:credit.control.line,company_id:0 +#: field:credit.control.policy,company_id:0 +msgid "Company" +msgstr "Company" + +#. module: account_credit_control +#: view:credit.control.marker:0 +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_marker_wizard +msgid "Change the state of the selected lines." +msgstr "Change the state of the selected lines." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Lines which have been ignored from previous runs." +msgstr "Lines which have been ignored from previous runs." + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Print the selected lines" +msgstr "Print the selected lines" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 view:credit.control.lines:0 +#: selection:credit.control.run,state:0 +msgid "Draft" +msgstr "Draft" + +#. module: account_credit_control +#: view:credit.control.marker:0 +msgid "Warning: you will maybe not be able to revert this operation." +msgstr "Warning: you will maybe not be able to revert this operation." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Credit policy" +msgstr "Credit policy" + +#. module: account_credit_control +#: view:credit.control.policy:0 view:credit.control.policy.level:0 +msgid "Delay Setting" +msgstr "Delay Setting" + +#. module: account_credit_control +#: field:credit.control.line,balance_due:0 +msgid "Due balance" +msgstr "Due balance" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Credit policy level" +msgstr "Credit policy level" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_run +msgid "Credit control line generator" +msgstr "Credit control line generator" + +#. module: account_credit_control +#: field:credit.control.communication,user_id:0 +msgid "User" +msgstr "User" + +#. module: account_credit_control +#: selection:credit.control.line,channel:0 +#: selection:credit.control.policy.level,channel:0 +msgid "Letter" +msgstr "Letter" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_account_move_line +msgid "Journal Items" +msgstr "Journal Items" + +#. module: account_credit_control +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_printer_wizard +msgid "Print selected lines" +msgstr "Print selected lines" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "You can not create journal items on an account of type view." +msgstr "You can not create journal items on an account of type view." + +#. module: account_credit_control +#: field:credit.control.emailer,line_ids:0 +#: field:credit.control.marker,line_ids:0 +#: field:credit.control.printer,line_ids:0 +#: model:ir.actions.act_window,name:account_credit_control.credit_control_line_action +#: model:ir.ui.menu,name:account_credit_control.credit_control_line_action_menu +#: field:res.partner,credit_control_line_ids:0 +msgid "Credit Control Lines" +msgstr "Credit Control Lines" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_3 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our two reminders.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our two reminders.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_printer_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_printer_wizard_menu_action +msgid "Print Lines" +msgstr "Print Lines" + +#. module: account_credit_control +#: field:credit.control.run,date:0 +msgid "Controlling Date" +msgstr "Controlling Date" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_policy +msgid "Define a reminder policy" +msgstr "Define a reminder policy" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Lines already sent." +msgstr "Lines already sent." + +#. module: account_credit_control +#: field:credit.control.policy.level,email_template_id:0 +msgid "Email Template" +msgstr "Email Template" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 view:credit.control.lines:0 +#: selection:credit.control.marker,name:0 +msgid "Ready To Send" +msgstr "Ready To Send" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_res_company +msgid "Companies" +msgstr "Companies" + +#. module: account_credit_control +#: field:credit.control.printer,mark_as_sent:0 +msgid "Mark letter lines as sent" +msgstr "Mark letter lines as sent" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Compute Credit Control Lines" +msgstr "Compute Credit Control Lines" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Previous Reminder" +msgstr "Previous Reminder" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 view:credit.control.lines:0 +msgid "Error" +msgstr "Error" + +#. module: account_credit_control +#: sql_constraint:account.invoice:0 +msgid "Invoice Number must be unique per Company!" +msgstr "Invoice Number must be unique per Company!" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Report and Errors" +msgstr "Report and Errors" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "" +"Configuration Error! \n" +"You can not select an account type with a deferral method different of " +"\"Unreconciled\" for accounts with internal type \"Payable/Receivable\"! " +msgstr "" +"Configuration Error! \n" +"You can not select an account type with a deferral method different of " +"\"Unreconciled\" for accounts with internal type \"Payable/Receivable\"! " + +#. module: account_credit_control +#: field:credit.control.line,state:0 field:credit.control.run,state:0 +msgid "State" +msgstr "State" + +#. module: account_credit_control +#: help:credit.control.policy,do_nothing:0 +msgid "For policies which should not generate lines or are obsolete" +msgstr "For policies which should not generate lines or are obsolete" + +#. module: account_credit_control +#: field:account.account,credit_control_line_ids:0 +#: field:account.invoice,credit_control_line_ids:0 +#: field:credit.control.communication,credit_control_line_ids:0 +#: model:ir.actions.act_window,name:account_credit_control.act_account_credit_relation_relation +#: model:ir.actions.act_window,name:account_credit_control.act_partner_credit_relation_relation +msgid "Credit Lines" +msgstr "Credit Lines" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: selection:credit.control.marker,name:0 selection:credit.control.run,state:0 +msgid "Done" +msgstr "Done" + +#. module: account_credit_control +#: field:account.move.line,invoice_id:0 field:credit.control.line,invoice_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_account_invoice +msgid "Invoice" +msgstr "Invoice" + +#. module: account_credit_control +#: view:credit.control.emailer:0 view:credit.control.marker:0 +#: view:credit.control.printer:0 +msgid "Cancel" +msgstr "Cancel" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Close" +msgstr "Close" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +msgid "Emailing Error" +msgstr "Emailing Error" + +#. module: account_credit_control +#: help:account.invoice,credit_policy_id:0 +msgid "" +"The Credit Control Policy used for this invoice. If nothing is defined, it " +"will use the account setting or the partner setting." +msgstr "" +"The Credit Control Policy used for this invoice. If nothing is defined, it " +"will use the account setting or the partner setting." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Run date" +msgstr "Run date" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_user +msgid "Credit Control User" +msgstr "Credit Control User" + +#. module: account_credit_control +#: model:email.template,body_html:account_credit_control.email_template_credit_control_base +msgid "" +"\n" +" <%page args=\"object, user=None, ctx=None, quote=None, " +"format_exception=True, mode='mail'\" />\n" +" %if mode != 'pdf':\n" +" \n" +" \n" +" %endif\n" +"

\n" +"\n" +"

Dear ${object.partner_id.name or ''},

\n" +"\n" +"
${object.current_policy_level.custom_text}\n"
+"\n"
+"      \n"
+"      \n"
+"      \n"
+"        \n"
+"         \n"
+"         \n"
+"         \n"
+"      \n"
+"%for line in object.credit_control_line_ids:\n"
+"      \n"
+"        \n"
+"        \n"
+"        \n"
+"      %if line.invoice_id:\n"
+"          \n"
+"      %else:\n"
+"          \n"
+"      %endif\n"
+"%endfor\n"
+"      
Summary
date dueAmount dueAmount balanceInvoice number
${line.date_due}${line.amount_due}${line.balance_due}${line.invoice_id.number}n/a
\n" +"
\n" +"
\n" +"\n" +"

If you have any question, do not hesitate to contact us.

\n" +"\n" +"

Thank you for choosing ${object.company_id.name}!

\n" +"\n" +" -- more info here --\n" +"

${object.user_id.name} ${object.user_id.user_email and '<" +"%s>'%(object.user_id.user_email) or ''}
\n" +" ${object.company_id.name}
\n" +" % if object.company_id.street:\n" +" ${object.company_id.street or ''}
\n" +"\n" +" % endif\n" +"\n" +" % if object.company_id.street2:\n" +" ${object.company_id.street2}
\n" +" % endif\n" +" % if object.company_id.city or object.company_id.zip:\n" +" ${object.company_id.zip or ''} ${object.company_id.city or ''}
\n" +" % endif\n" +" % if object.company_id.country_id:\n" +" ${object.company_id.state_id and ('%s, ' % object.company_id.state_id." +"name) or ''} ${object.company_id.country_id.name or ''}
\n" +" % endif\n" +" % if object.company_id.phone:\n" +" Phone: ${object.company_id.phone}
\n" +" % endif\n" +" % if object.company_id.website:\n" +" ${object.company_id.website or ''}
\n" +" % endif\n" +" " +msgstr "" +"\n" +" <%page args=\"object, user=None, ctx=None, quote=None, " +"format_exception=True, mode='mail'\" />\n" +" %if mode != 'pdf':\n" +" \n" +" \n" +" %endif\n" +"

\n" +"\n" +"

Dear ${object.partner_id.name or ''},

\n" +"\n" +"
${object.current_policy_level.custom_text}\n"
+"\n"
+"      \n"
+"      \n"
+"      \n"
+"        \n"
+"         \n"
+"         \n"
+"         \n"
+"      \n"
+"%for line in object.credit_control_line_ids:\n"
+"      \n"
+"        \n"
+"        \n"
+"        \n"
+"      %if line.invoice_id:\n"
+"          \n"
+"      %else:\n"
+"          \n"
+"      %endif\n"
+"%endfor\n"
+"      
Summary
date dueAmount dueAmount balanceInvoice number
${line.date_due}${line.amount_due}${line.balance_due}${line.invoice_id.number}n/a
\n" +"
\n" +"
\n" +"\n" +"

If you have any question, do not hesitate to contact us.

\n" +"\n" +"

Thank you for choosing ${object.company_id.name}!

\n" +"\n" +" -- more info here --\n" +"

${object.user_id.name} ${object.user_id.user_email and '<" +"%s>'%(object.user_id.user_email) or ''}
\n" +" ${object.company_id.name}
\n" +" % if object.company_id.street:\n" +" ${object.company_id.street or ''}
\n" +"\n" +" % endif\n" +"\n" +" % if object.company_id.street2:\n" +" ${object.company_id.street2}
\n" +" % endif\n" +" % if object.company_id.city or object.company_id.zip:\n" +" ${object.company_id.zip or ''} ${object.company_id.city or ''}
\n" +" % endif\n" +" % if object.company_id.country_id:\n" +" ${object.company_id.state_id and ('%s, ' % object.company_id.state_id." +"name) or ''} ${object.company_id.country_id.name or ''}
\n" +" % endif\n" +" % if object.company_id.phone:\n" +" Phone: ${object.company_id.phone}
\n" +" % endif\n" +" % if object.company_id.website:\n" +" ${object.company_id.website or ''}
\n" +" % endif\n" +" " + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "Company must be the same for its related account and period." +msgstr "Company must be the same for its related account and period." + +#. module: account_credit_control +#: field:credit.control.run,manual_ids:0 +msgid "Lines to handle manually" +msgstr "Lines to handle manually" + +#. module: account_credit_control +#: view:account.invoice:0 +#: model:ir.ui.menu,name:account_credit_control.base_credit_control_configuration_menu +#: model:ir.ui.menu,name:account_credit_control.base_credit_control_menu +msgid "Credit Control" +msgstr "Credit Control" + +#. module: account_credit_control +#: view:credit.control.policy:0 field:credit.control.policy,level_ids:0 +msgid "Policy Levels" +msgstr "Policy Levels" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "" +"The selected account of your Journal Entry forces to provide a secondary " +"currency. You should remove the secondary currency on the account or select " +"a multi-currency view on the journal." +msgstr "" +"The selected account of your Journal Entry forces to provide a secondary " +"currency. You should remove the secondary currency on the account or select " +"a multi-currency view on the journal." + +#. module: account_credit_control +#: field:credit.control.line,policy_id:0 +msgid "Policy" +msgstr "Policy" + +#. module: account_credit_control +#: model:email.template,subject:account_credit_control.email_template_credit_control_base +msgid "Credit Control: (${object.current_policy_level.name or 'n/a' })" +msgstr "Credit Control: (${object.current_policy_level.name or 'n/a' })" + +#. module: account_credit_control +#: field:credit.control.printer,report_file:0 +msgid "Generated Report" +msgstr "Generated Report" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Move lines To be treated manually" +msgstr "Move lines To be treated manually" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.credit_policy_configuration_action +#: model:ir.ui.menu,name:account_credit_control.credit_policy_configuration_action_menu +msgid "Credit Control Policies" +msgstr "Credit Control Policies" + +#. module: account_credit_control +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_emailer_wizard +msgid "Send an email for the selected lines." +msgstr "Send an email for the selected lines." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Sent" +msgstr "Sent" + +#. module: account_credit_control +#: constraint:credit.control.policy.level:0 +msgid "The smallest level can not be of type Previous Reminder" +msgstr "The smallest level can not be of type Previous Reminder" + +#. module: account_credit_control +#: help:credit.control.policy,account_ids:0 +msgid "This policy will be active only for the selected accounts" +msgstr "This policy will be active only for the selected accounts" + +#. module: account_credit_control +#: help:credit.control.printer,mark_as_sent:0 +msgid "Only letter lines will be marked." +msgstr "Only letter lines will be marked." + +#. module: account_credit_control +#: view:credit.control.line:0 view:credit.control.lines:0 +msgid "Control Credit Lines" +msgstr "Control Credit Lines" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_manager +msgid "Credit Control Manager" +msgstr "Credit Control Manager" + +#. module: account_credit_control +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "The company name must be unique!" + +#. module: account_credit_control +#: field:credit.control.policy,name:0 field:credit.control.policy.level,name:0 +msgid "Name" +msgstr "Name" + +#. module: account_credit_control +#: help:res.partner,credit_policy_id:0 +msgid "" +"The Credit Control Policyused for this partner. This setting can be forced " +"on the invoice. If nothing is defined, it will use the company setting." +msgstr "" +"The Credit Control Policy used for this partner. This setting can be forced " +"on the invoice. If nothing is defined, it will use the company setting." + +#. module: account_credit_control +#: field:credit.control.line,mail_message_id:0 +msgid "Sent Email" +msgstr "Sent Email" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_policy_level +msgid "A credit control policy level" +msgstr "A credit control policy level" + +#. module: account_credit_control +#: model:ir.actions.report.xml,name:account_credit_control.report_webkit_html +msgid "Credit Summary" +msgstr "Credit Summary" + +#. module: account_credit_control +#: field:credit.control.line,date:0 +msgid "Controlling date" +msgstr "Controlling date" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "You can not create journal items on closed account." +msgstr "You can not create journal items on closed account." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Draft lines have to be triaged." +msgstr "Draft lines have to be triaged." + +#. module: account_credit_control +#: field:credit.control.line,amount_due:0 +msgid "Due Amount Tax incl." +msgstr "Due Amount Tax incl." + +#. module: account_credit_control +#: field:res.company,credit_control_tolerance:0 +msgid "Credit Control Tolerance" +msgstr "Credit Control Tolerance" + +#. module: account_credit_control +#: help:res.company,credit_policy_id:0 +msgid "" +"The Credit Control Policy used on partners by default. This setting can be " +"overriden on partners or invoices." +msgstr "" +"The Credit Control Policy used on partners by default. This setting can be " +"overriden on partners or invoices." + +#. module: account_credit_control +#: field:credit.control.line,policy_level_id:0 +msgid "Overdue Level" +msgstr "Overdue Level" + +#~ msgid "Mass credit line mailer" +#~ msgstr "Mass credit line mailer" + +#~ msgid "Credit control" +#~ msgstr "Credit control" + +#~ msgid "New lines" +#~ msgstr "New lines" + +#~ msgid "Please select a policy" +#~ msgstr "Please select a policy" + +#~ msgid "" +#~ "A credit control run is already running in background, please try later." +#~ msgstr "" +#~ "A credit control run is already running in background, please try later." + +#~ msgid "Mark Lines" +#~ msgstr "Mark Lines" + +#~ msgid "Change the status of all draft lines" +#~ msgstr "Change the status of all draft lines" + +#~ msgid "state can not be empty" +#~ msgstr "state can not be empty" + +#~ msgid "Manual" +#~ msgstr "Manual" + +#~ msgid "No credit control lines selected." +#~ msgstr "No credit control lines selected." + +#~ msgid "Canal" +#~ msgstr "Canal" + +#~ msgid "E-Mail" +#~ msgstr "E-Mail" + +#~ msgid "%s marked line" +#~ msgstr "%s marked line" + +#~ msgid "Policy \"%s\" has generated %d Credit Control Lines.\n" +#~ msgstr "Policy \"%s\" has generated %d Credit Control Lines.\n" + +#~ msgid "Information" +#~ msgstr "Information" + +#~ msgid "A run has already been executed more recently than %s" +#~ msgstr "A run has already been executed more recently than %s" + +#~ msgid "Can not get function for computation mode: %s is not implemented" +#~ msgstr "Can not get function for computation mode: %s is not implemented" + +#~ msgid "Mail" +#~ msgstr "Mail" + +#~ msgid "No lines will be changed. All the selected lines are already done." +#~ msgstr "No lines will be changed. All the selected lines are already done." + +#~ msgid "" +#~ "Send an e-mail for all \"Ready To Send\" lines of the \"E-Mail\" channel" +#~ msgstr "" +#~ "Send an e-mail for all \"Ready To Send\" lines of the \"E-Mail\" channel" + +#~ msgid "Print all \"Ready To Send\" lines of the \"Manual\" channel" +#~ msgstr "Print all \"Ready To Send\" lines of the \"Manual\" channel" diff --git a/account_credit_control/i18n/fr.po b/account_credit_control/i18n/fr.po new file mode 100644 index 000000000..67e64ae9a --- /dev/null +++ b/account_credit_control/i18n/fr.po @@ -0,0 +1,965 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_credit_control +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-07 15:35+0000\n" +"PO-Revision-Date: 2012-11-07 16:41+0100\n" +"Last-Translator: Guewen Baconnier \n" +"Language-Team: FR\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.2_time_1 +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_1 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not received the payment of the\n" +"above mentioned invoice (copy attached for your convenience). If it\n" +"has already been sent, please disregard this notice. If not, please\n" +"proceed with payment within 10 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Madame, Monsieur,\n" +"\n" +"Il résulte d'une récente révision de nos comptes que la facture\n" +"susmentionnée (copie ci-jointe) reste, sauf erreur, impayée à ce\n" +"jour. Si tel est bien le cas, nous vous invitons à réparer cet oubli\n" +"sous 10 jours. Dans le cas contraire, nous vous prions de nous\n" +"indiquer la date de votre paiement et vous remercions d'excuser le\n" +"présent courriel.\n" +"\n" +"Pour toute question, nous restons à votre disposition.\n" +"\n" +"Bien cordialement,\n" + +#. module: account_credit_control +#: field:credit.control.policy.level,custom_text:0 +msgid "Custom Message" +msgstr "Message Personnalisé" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "More..." +msgstr "Plus..." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Group By..." +msgstr "Group By..." + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.credit_control_run +#: model:ir.ui.menu,name:account_credit_control.credit_control_run_menu +msgid "Credit Control Run" +msgstr "Contrôles de Crédit" + +#. module: account_credit_control +#: field:credit.control.policy.level,computation_mode:0 +msgid "Compute Mode" +msgstr "Mode de calcul" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_emailer_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_emailer_wizard_menu_action +msgid "Send By Email" +msgstr "Envoyer par courrier électronique" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_line +msgid "A credit control line" +msgstr "Ligne de contrôle de crédit" + +#. module: account_credit_control +#: field:credit.control.line,move_line_id:0 +msgid "Move line" +msgstr "Écritures comptables" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_info +msgid "Credit Control Info" +msgstr "Informations de contrôle de crédit" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_emailer +msgid "Mass credit line emailer" +msgstr "Envoi de courriers électroniques en masse" + +#. module: account_credit_control +#: field:credit.control.line,account_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_account_account +msgid "Account" +msgstr "Compte" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Due Date" +msgstr "Date d'échéance" + +#. module: account_credit_control +#: field:credit.control.communication,current_policy_level:0 +#: field:credit.control.line,level:0 +#: view:credit.control.lines:0 +#: field:credit.control.policy.level,level:0 +msgid "Level" +msgstr "Niveau" + +#. module: account_credit_control +#: field:credit.control.policy.level,delay_days:0 +msgid "Delay (in days)" +msgstr "Délai (en jours)" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_communication +msgid "credit control communication" +msgstr "Communication de contrôle de crédit" + +#. module: account_credit_control +#: sql_constraint:account.move.line:0 +msgid "Wrong credit or debit value in accounting entry !" +msgstr "Mauvaise entrée de crédit ou de débit dans la comptabilité !" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "These lines are ready to send by email or by letter using the Actions." +msgstr "These lines are ready to send by email or by letter using the Actions." + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_marker +msgid "Mass marker" +msgstr "Changer d'état en masse" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +#: selection:credit.control.marker,name:0 +msgid "Ignored" +msgstr "Ignoré" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +msgid "Send emails for the selected lines" +msgstr "Envoyer des courriers électroniques pour les lignes sélectionnées" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "Error ! You can not create recursive accounts." +msgstr "La création de comptes récursifs est interdite" + +#. module: account_credit_control +#: field:account.invoice,credit_policy_id:0 +#: field:res.company,credit_policy_id:0 +#: field:res.partner,credit_policy_id:0 +msgid "Credit Control Policy" +msgstr "Politique de contrôle de crédit" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "The date of your Journal Entry is not in the defined period! You should change the date or remove this constraint from the journal." +msgstr "" +"La date de l'entrée de journal n'est pas dans la période choisie. Il\n" +"faut changer la date ou supprimer la contrainte du journal." + +#. module: account_credit_control +#: field:credit.control.line,date_sent:0 +msgid "Sent date" +msgstr "Date d'envoi" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: field:credit.control.policy,account_ids:0 +msgid "Accounts" +msgstr "Comptes" + +#. module: account_credit_control +#: field:credit.control.communication,partner_id:0 +#: field:credit.control.line,partner_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_res_partner +msgid "Partner" +msgstr "Partenaire" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +msgid "Send the emails" +msgstr "Envoyer les courriers électroniques" + +#. module: account_credit_control +#: view:credit.control.marker:0 +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_marker_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_marker_wizard_menu_action +msgid "Change Lines' State" +msgstr "Changer l'état des lignes" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_2 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not yet received the payment of the\n" +"above mentioned invoice (copy attached for your convenience) despite\n" +"our first reminder. If it has already been sent, please disregard\n" +"this notice. If not, please proceed with payment within 5 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we have not yet received the payment of the\n" +"above mentioned invoice (copy attached for your convenience) despite\n" +"our first reminder. If it has already been sent, please disregard\n" +"this notice. If not, please proceed with payment within 5 days.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: field:credit.control.policy.level,policy_id:0 +msgid "Related Policy" +msgstr "Politique liée" + +#. module: account_credit_control +#: sql_constraint:account.account:0 +msgid "The code of the account must be unique per company !" +msgstr "Le code du compte doit être unique pour une société donnée." + +#. module: account_credit_control +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Il est interdit de créer des sociétés récursives." + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: view:credit.control.policy.level:0 +msgid "Mail and reporting" +msgstr "Courriers et rapports" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Print" +msgstr "Imprimer" + +#. module: account_credit_control +#: selection:credit.control.line,channel:0 +#: selection:credit.control.policy.level,channel:0 +msgid "Email" +msgstr "Email" + +#. module: account_credit_control +#: field:credit.control.line,channel:0 +#: view:credit.control.lines:0 +#: field:credit.control.policy.level,channel:0 +msgid "Channel" +msgstr "Canal" + +#. module: account_credit_control +#: help:credit.control.run,manual_ids:0 +msgid "If a credit control line has been generated on a policy and the policy has been changed meantime, it has to be handled manually" +msgstr "" +"Si une ligne de contrôle de crédit a été générée sur une politique et\n" +"que la politique a changé entre temps, il faut traiter cette ligne manuellement." + +#. module: account_credit_control +#: field:credit.control.printer,state:0 +msgid "state" +msgstr "état" + +#. module: account_credit_control +#: field:credit.control.run,report:0 +msgid "Report" +msgstr "Rapport" + +#. module: account_credit_control +#: help:credit.control.line,state:0 +msgid "" +"Draft lines need to be triaged.\n" +"Ignored lines are lines for which we do not want to send something.\n" +"Draft and ignored lines will be generated again on the next run." +msgstr "" +"Les lignes \"Brouillon\" nécessitent d'être triées.\n" +"Les lignes \"Ignorées\" sont celles pour lesquelles rien ne doit être envoyé.\n" +"Les lignes brouillon et ignorées seront régénérées lors du prochain lancement du contrôle de crédit." + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Due Date, End Of Month" +msgstr "Date due, fin de mois" + +#. module: account_credit_control +#: field:credit.control.marker,name:0 +msgid "Mark as" +msgstr "Marquer comme" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.2_time_2 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our reminder.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our reminder.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "An error has occured during the sending of the email." +msgstr "Une erreur s'est produit durant l'envoi du mail." + +#. module: account_credit_control +#: view:credit.control.run:0 +#: field:credit.control.run,policy_ids:0 +msgid "Policies" +msgstr "Politiques" + +#. module: account_credit_control +#: field:credit.control.line,date_due:0 +msgid "Due date" +msgstr "Date d'échéance" + +#. module: account_credit_control +#: field:credit.control.policy,do_nothing:0 +msgid "Do nothing" +msgstr "Ne rien faire" + +#. module: account_credit_control +#: field:credit.control.line,currency_id:0 +msgid "Currency" +msgstr "Devise" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "" +"Configuration Error! \n" +"You can not define children to an account with internal type different of \"View\"! " +msgstr "" +"Configuration Error! \n" +"You can not define children to an account with internal type different of \"View\"! " + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_printer +msgid "Mass printer" +msgstr "Impression groupée" + +#. module: account_credit_control +#: field:credit.control.communication,company_id:0 +#: field:credit.control.line,company_id:0 +#: field:credit.control.policy,company_id:0 +msgid "Company" +msgstr "Société" + +#. module: account_credit_control +#: view:credit.control.marker:0 +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_marker_wizard +msgid "Change the state of the selected lines." +msgstr "Changer l'état des lignes sélectionnées." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Lines which have been ignored from previous runs." +msgstr "Lignes qui ont été ignorées lors des précédents lancement." + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Print the selected lines" +msgstr "Imprimer les lignes sélectionnées" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +#: selection:credit.control.run,state:0 +msgid "Draft" +msgstr "Brouillon" + +#. module: account_credit_control +#: view:credit.control.marker:0 +msgid "Warning: you will maybe not be able to revert this operation." +msgstr "Attention: vous ne pourrez peut-être pas annuler cette opération." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Credit policy" +msgstr "Politique de crédit" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: view:credit.control.policy.level:0 +msgid "Delay Setting" +msgstr "Réglage du délai" + +#. module: account_credit_control +#: field:credit.control.line,balance_due:0 +msgid "Due balance" +msgstr "Solde du" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Credit policy level" +msgstr "Niveau de politique de crédit" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_run +msgid "Credit control line generator" +msgstr "Générateur de ligne de contrôle de crédit" + +#. module: account_credit_control +#: field:credit.control.communication,user_id:0 +msgid "User" +msgstr "Utilisateur" + +#. module: account_credit_control +#: selection:credit.control.line,channel:0 +#: selection:credit.control.policy.level,channel:0 +msgid "Letter" +msgstr "Lettre" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_account_move_line +msgid "Journal Items" +msgstr "Écritures comptables" + +#. module: account_credit_control +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_printer_wizard +msgid "Print selected lines" +msgstr "Imprimer les lignes sélectionnées" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "You can not create journal items on an account of type view." +msgstr "La création de comptes récursifs est interdite" + +#. module: account_credit_control +#: field:credit.control.emailer,line_ids:0 +#: field:credit.control.marker,line_ids:0 +#: field:credit.control.printer,line_ids:0 +#: model:ir.actions.act_window,name:account_credit_control.credit_control_line_action +#: model:ir.ui.menu,name:account_credit_control.credit_control_line_action_menu +#: field:res.partner,credit_control_line_ids:0 +msgid "Credit Control Lines" +msgstr "Lignes de contrôle de crédit" + +#. module: account_credit_control +#: model:credit.control.policy.level,custom_text:account_credit_control.3_time_3 +msgid "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our two reminders.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" +msgstr "" +"Dear Sir or Madam,\n" +"\n" +"Our records indicate that we still have not received the payment of\n" +"the above mentioned invoice (copy attached) despite our two reminders.\n" +"If payment have already been sent, please disregard this notice. If\n" +"not, please proceed with payment. If your payment has not been\n" +"received in the next 5 days, your file will be transfered to our debt\n" +"collection agency.\n" +"\n" +"Should you need us to arrange a payment plan for you, please advise.\n" +"A customer account statement is enclosed for you convenience.\n" +"\n" +"Thank you in advance for your anticipated cooperation in this matter.\n" +"\n" +"Best regards,\n" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_printer_wizard +#: model:ir.actions.act_window,name:account_credit_control.open_credit_line_printer_wizard_menu_action +msgid "Print Lines" +msgstr "Imprimer les lignes" + +#. module: account_credit_control +#: field:credit.control.run,date:0 +msgid "Controlling Date" +msgstr "Date de contrôle" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_policy +msgid "Define a reminder policy" +msgstr "Définir une politique de rappel" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Lines already sent." +msgstr "Déjà envoyé." + +#. module: account_credit_control +#: field:credit.control.policy.level,email_template_id:0 +msgid "Email Template" +msgstr "Modèle de courrier électronique" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +#: selection:credit.control.marker,name:0 +msgid "Ready To Send" +msgstr "Prêt à envoyer" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: account_credit_control +#: field:credit.control.printer,mark_as_sent:0 +msgid "Mark letter lines as sent" +msgstr "Marquer les lignes \"lettre\" comme envoyées" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Compute Credit Control Lines" +msgstr "Calcul des lignes de contrôle de crédit" + +#. module: account_credit_control +#: selection:credit.control.policy.level,computation_mode:0 +msgid "Previous Reminder" +msgstr "Rappel précédent" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: view:credit.control.lines:0 +msgid "Error" +msgstr "Erreur" + +#. module: account_credit_control +#: sql_constraint:account.invoice:0 +msgid "Invoice Number must be unique per Company!" +msgstr "Le code du compte doit être unique pour une société donnée." + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Report and Errors" +msgstr "Rapport et erreurs" + +#. module: account_credit_control +#: constraint:account.account:0 +msgid "" +"Configuration Error! \n" +"You can not select an account type with a deferral method different of \"Unreconciled\" for accounts with internal type \"Payable/Receivable\"! " +msgstr "" +"Configuration Error! \n" +"You can not select an account type with a deferral method different of \"Unreconciled\" for accounts with internal type \"Payable/Receivable\"! " + +#. module: account_credit_control +#: field:credit.control.line,state:0 +#: field:credit.control.run,state:0 +msgid "State" +msgstr "État" + +#. module: account_credit_control +#: help:credit.control.policy,do_nothing:0 +msgid "For policies which should not generate lines or are obsolete" +msgstr "" +"Pour les politiques qui ne devraient pas générer de lignes ou qui sont\n" +"obsolètes" + +#. module: account_credit_control +#: field:account.account,credit_control_line_ids:0 +#: field:account.invoice,credit_control_line_ids:0 +#: field:credit.control.communication,credit_control_line_ids:0 +#: model:ir.actions.act_window,name:account_credit_control.act_account_credit_relation_relation +#: model:ir.actions.act_window,name:account_credit_control.act_partner_credit_relation_relation +msgid "Credit Lines" +msgstr "Lignes de crédit" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +#: selection:credit.control.marker,name:0 +#: selection:credit.control.run,state:0 +msgid "Done" +msgstr "Terminé" + +#. module: account_credit_control +#: field:account.move.line,invoice_id:0 +#: field:credit.control.line,invoice_id:0 +#: view:credit.control.lines:0 +#: model:ir.model,name:account_credit_control.model_account_invoice +msgid "Invoice" +msgstr "Facture" + +#. module: account_credit_control +#: view:credit.control.emailer:0 +#: view:credit.control.marker:0 +#: view:credit.control.printer:0 +msgid "Cancel" +msgstr "Annuler" + +#. module: account_credit_control +#: view:credit.control.printer:0 +msgid "Close" +msgstr "Fermer" + +#. module: account_credit_control +#: selection:credit.control.line,state:0 +msgid "Emailing Error" +msgstr "Erreur d'envoi de message" + +#. module: account_credit_control +#: help:account.invoice,credit_policy_id:0 +msgid "The Credit Control Policy used for this invoice. If nothing is defined, it will use the account setting or the partner setting." +msgstr "" +"La politique de contrôle de crédit utilisée par cette facture. Par\n" +"défault, la politique définie au niveau du Compte ou du Partenaire est\n" +"utilisée." + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Run date" +msgstr "Date de lancement" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_user +msgid "Credit Control User" +msgstr "Utilisateur du contrôle de crédit" + +#. module: account_credit_control +#: model:email.template,body_html:account_credit_control.email_template_credit_control_base +msgid "" +"\n" +" <%page args=\"object, user=None, ctx=None, quote=None, format_exception=True, mode='mail'\" />\n" +" %if mode != 'pdf':\n" +" \n" +" \n" +" %endif\n" +"

\n" +"\n" +"

Dear ${object.partner_id.name or ''},

\n" +"\n" +"
${object.current_policy_level.custom_text}
\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"%for line in object.credit_control_line_ids:\n" +" \n" +" \n" +" \n" +" \n" +" %if line.invoice_id:\n" +" \n" +" %else:\n" +" \n" +" %endif\n" +"%endfor\n" +"
Summary
date dueAmount dueAmount balanceInvoice number
${line.date_due}${line.amount_due}${line.balance_due}${line.invoice_id.number}n/a
\n" +"
\n" +"
\n" +"\n" +"

If you have any question, do not hesitate to contact us.

\n" +"\n" +"

Thank you for choosing ${object.company_id.name}!

\n" +"\n" +" -- more info here --\n" +"

${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''}
\n" +" ${object.company_id.name}
\n" +" % if object.company_id.street:\n" +" ${object.company_id.street or ''}
\n" +"\n" +" % endif\n" +"\n" +" % if object.company_id.street2:\n" +" ${object.company_id.street2}
\n" +" % endif\n" +" % if object.company_id.city or object.company_id.zip:\n" +" ${object.company_id.zip or ''} ${object.company_id.city or ''}
\n" +" % endif\n" +" % if object.company_id.country_id:\n" +" ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
\n" +" % endif\n" +" % if object.company_id.phone:\n" +" Phone: ${object.company_id.phone}
\n" +" % endif\n" +" % if object.company_id.website:\n" +" ${object.company_id.website or ''}
\n" +" % endif\n" +" " +msgstr "" +"\n" +" <%page args=\"object, user=None, ctx=None, quote=None, format_exception=True, mode='mail'\" />\n" +" %if mode != 'pdf':\n" +" \n" +" \n" +" %endif\n" +"

\n" +"\n" +"

Cher ${object.partner_id.name or ''},

\n" +"\n" +"
${object.current_policy_level.custom_text}
\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"%for line in object.credit_control_line_ids:\n" +" \n" +" \n" +" \n" +" \n" +" %if line.invoice_id:\n" +" \n" +" %else:\n" +" \n" +" %endif\n" +"%endfor\n" +"
Summary
Date dueSomme dueSolde duNuméro de facture
${line.date_due}${line.amount_due}${line.balance_due}${line.invoice_id.number}n/a
\n" +"
\n" +"
\n" +"\n" +"

Si vous avez des questions n'hésitez pas à nous contacter.

\n" +"\n" +"

Merci d'avoir choisi ${object.company_id.name}!

\n" +"\n" +" -- more info here --\n" +"

${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''}
\n" +" ${object.company_id.name}
\n" +" % if object.company_id.street:\n" +" ${object.company_id.street or ''}
\n" +"\n" +" % endif\n" +"\n" +" % if object.company_id.street2:\n" +" ${object.company_id.street2}
\n" +" % endif\n" +" % if object.company_id.city or object.company_id.zip:\n" +" ${object.company_id.zip or ''} ${object.company_id.city or ''}
\n" +" % endif\n" +" % if object.company_id.country_id:\n" +" ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
\n" +" % endif\n" +" % if object.company_id.phone:\n" +" Téléphone : ${object.company_id.phone}
\n" +" % endif\n" +" % if object.company_id.website:\n" +" ${object.company_id.website or ''}
\n" +" % endif\n" +" " + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "Company must be the same for its related account and period." +msgstr "Company must be the same for its related account and period." + +#. module: account_credit_control +#: field:credit.control.run,manual_ids:0 +msgid "Lines to handle manually" +msgstr "Lignes à traiter manuellement" + +#. module: account_credit_control +#: view:account.invoice:0 +#: model:ir.ui.menu,name:account_credit_control.base_credit_control_configuration_menu +#: model:ir.ui.menu,name:account_credit_control.base_credit_control_menu +msgid "Credit Control" +msgstr "Contrôle de crédit" + +#. module: account_credit_control +#: view:credit.control.policy:0 +#: field:credit.control.policy,level_ids:0 +msgid "Policy Levels" +msgstr "Niveaux de politique" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "The selected account of your Journal Entry forces to provide a secondary currency. You should remove the secondary currency on the account or select a multi-currency view on the journal." +msgstr "The selected account of your Journal Entry forces to provide a secondary currency. You should remove the secondary currency on the account or select a multi-currency view on the journal." + +#. module: account_credit_control +#: field:credit.control.line,policy_id:0 +msgid "Policy" +msgstr "Politique" + +#. module: account_credit_control +#: model:email.template,subject:account_credit_control.email_template_credit_control_base +msgid "Credit Control: (${object.current_policy_level.name or 'n/a' })" +msgstr "Contrôle de crédit : (${object.current_policy_level.name or 'n/a' })" + +#. module: account_credit_control +#: field:credit.control.printer,report_file:0 +msgid "Generated Report" +msgstr "Rapport généré" + +#. module: account_credit_control +#: view:credit.control.run:0 +msgid "Move lines To be treated manually" +msgstr "Lignes à traiter manuellement" + +#. module: account_credit_control +#: model:ir.actions.act_window,name:account_credit_control.credit_policy_configuration_action +#: model:ir.ui.menu,name:account_credit_control.credit_policy_configuration_action_menu +msgid "Credit Control Policies" +msgstr "Politique de contrôle de crédit" + +#. module: account_credit_control +#: model:ir.actions.act_window,help:account_credit_control.open_credit_line_emailer_wizard +msgid "Send an email for the selected lines." +msgstr "Envoyer un courrier électronique pour les lignes sélectionnées" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Sent" +msgstr "Envoyer" + +#. module: account_credit_control +#: constraint:credit.control.policy.level:0 +msgid "The smallest level can not be of type Previous Reminder" +msgstr "Le niveau le plus bas ne peut pas être de type \"Rappel Précédent\"" + +#. module: account_credit_control +#: help:credit.control.policy,account_ids:0 +msgid "This policy will be active only for the selected accounts" +msgstr "Cette politique sera activée pour les comptes sélectionnés" + +#. module: account_credit_control +#: help:credit.control.printer,mark_as_sent:0 +msgid "Only letter lines will be marked." +msgstr "Seules les lignes \"lettre\" seront marquées." + +#. module: account_credit_control +#: view:credit.control.line:0 +#: view:credit.control.lines:0 +msgid "Control Credit Lines" +msgstr "Lignes de contrôle de crédit" + +#. module: account_credit_control +#: model:res.groups,name:account_credit_control.group_account_credit_control_manager +msgid "Credit Control Manager" +msgstr "Gestionnaire de contrôle de crédit" + +#. module: account_credit_control +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "The company name must be unique !" + +#. module: account_credit_control +#: field:credit.control.policy,name:0 +#: field:credit.control.policy.level,name:0 +msgid "Name" +msgstr "Nom" + +#. module: account_credit_control +#: help:res.partner,credit_policy_id:0 +msgid "The Credit Control Policyused for this partner. This setting can be forced on the invoice. If nothing is defined, it will use the company setting." +msgstr "" +"Politique de contrôle de crédit pour ce partenaire. Il est possible de\n" +"forcer ce réglage pour une facture donnée. Par défaut, la politique de\n" +"la société est utilisée." + +#. module: account_credit_control +#: field:credit.control.line,mail_message_id:0 +msgid "Sent Email" +msgstr "Envoyer le courrier électronique" + +#. module: account_credit_control +#: model:ir.model,name:account_credit_control.model_credit_control_policy_level +msgid "A credit control policy level" +msgstr "Un niveau de politique de contrôle de crédit" + +#. module: account_credit_control +#: model:ir.actions.report.xml,name:account_credit_control.report_webkit_html +msgid "Credit Summary" +msgstr "Synthèse du crédit" + +#. module: account_credit_control +#: field:credit.control.line,date:0 +msgid "Controlling date" +msgstr "Date de contrôle" + +#. module: account_credit_control +#: constraint:account.move.line:0 +msgid "You can not create journal items on closed account." +msgstr "La création de comptes récursifs est interdite" + +#. module: account_credit_control +#: view:credit.control.lines:0 +msgid "Draft lines have to be triaged." +msgstr "Les lignes en brouillon doivent être triées." + +#. module: account_credit_control +#: field:credit.control.line,amount_due:0 +msgid "Due Amount Tax incl." +msgstr "Somme dûe TTC" + +#. module: account_credit_control +#: field:res.company,credit_control_tolerance:0 +msgid "Credit Control Tolerance" +msgstr "Tolérance de contrôle de crédit" + +#. module: account_credit_control +#: help:res.company,credit_policy_id:0 +msgid "The Credit Control Policy used on partners by default. This setting can be overriden on partners or invoices." +msgstr "" +"Politique de contrôle de crédit par défaut. Elle peut être redéfinie\n" +"au niveau des partenaires ou des factures." + +#. module: account_credit_control +#: field:credit.control.line,policy_level_id:0 +msgid "Overdue Level" +msgstr "Niveau de créance" + +#~ msgid "Mass credit line mailer" +#~ msgstr "Envoi de mails en masse" +#~ msgid "Credit control" +#~ msgstr "Contrôle de crédit" +#~ msgid "New lines" +#~ msgstr "Nouvelles lignes" + diff --git a/account_credit_control/line.py b/account_credit_control/line.py new file mode 100644 index 000000000..208818127 --- /dev/null +++ b/account_credit_control/line.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging +import pooler + +from openerp.osv.orm import Model, fields +from openerp.osv import osv +from openerp.tools.translate import _ + +logger = logging.getLogger('credit.line.control') + + +class CreditControlLine(Model): + """A credit control line describes an amount due by a customer for a due date. + + A line is created once the due date of the payment is exceeded. + It is created in "draft" and some actions are available (send by email, + print, ...) + """ + + _name = "credit.control.line" + _description = "A credit control line" + _rec_name = "id" + + _columns = { + 'date': fields.date('Controlling date', required=True), + # maturity date of related move line we do not use a related field in order to + # allow manual changes + 'date_due': fields.date('Due date', + required=True, + readonly=True, + states={'draft': [('readonly', False)]}), + + 'date_sent': fields.date('Sent date', + readonly=True, + states={'draft': [('readonly', False)]}), + + 'state': fields.selection([('draft', 'Draft'), + ('ignored', 'Ignored'), + ('to_be_sent', 'Ready To Send'), + ('sent', 'Done'), + ('error', 'Error'), + ('email_error', 'Emailing Error')], + 'State', required=True, readonly=True, + help=("Draft lines need to be triaged.\n" + "Ignored lines are lines for which we do " + "not want to send something.\n" + "Draft and ignored lines will be " + "generated again on the next run.")), + + 'channel': fields.selection([('letter', 'Letter'), + ('email', 'Email')], + 'Channel', required=True, + readonly=True, + states={'draft': [('readonly', False)]}), + + 'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True), + 'partner_id': fields.many2one('res.partner', "Partner", required=True), + 'amount_due': fields.float('Due Amount Tax incl.', required=True, readonly=True), + 'balance_due': fields.float('Due balance', required=True, readonly=True), + 'mail_message_id': fields.many2one('mail.message', 'Sent Email', readonly=True), + + 'move_line_id': fields.many2one('account.move.line', 'Move line', + required=True, readonly=True), + + 'account_id': fields.related('move_line_id', 'account_id', type='many2one', + relation='account.account', string='Account', + store=True, readonly=True), + + 'currency_id': fields.related('move_line_id', 'currency_id', type='many2one', + relation='res.currency', string='Currency', + store=True, readonly=True), + + 'company_id': fields.related('move_line_id', 'company_id', type='many2one', + relation='res.company', string='Company', + store=True, readonly=True), + + # we can allow a manual change of policy in draft state + 'policy_level_id':fields.many2one('credit.control.policy.level', + 'Overdue Level', required=True, readonly=True, + states={'draft': [('readonly', False)]}), + + 'policy_id': fields.related('policy_level_id', + 'policy_id', + type='many2one', + relation='credit.control.policy', + string='Policy', + store=True, + readonly=True), + + 'level': fields.related('policy_level_id', + 'level', + type='integer', + relation='credit.control.policy', + string='Level', + store=True, + readonly=True), + } + + + _defaults = {'state': 'draft'} + + def _prepare_from_move_line(self, cr, uid, move_line, + level, controlling_date, open_amount, + context=None): + """Create credit control line""" + data = {} + data['date'] = controlling_date + data['date_due'] = move_line.date_maturity + data['state'] = 'draft' + data['channel'] = level.channel + data['invoice_id'] = move_line.invoice_id.id if move_line.invoice_id else False + data['partner_id'] = move_line.partner_id.id + data['amount_due'] = (move_line.amount_currency or move_line.debit or + move_line.credit) + data['balance_due'] = open_amount + data['policy_level_id'] = level.id + data['company_id'] = move_line.company_id.id + data['move_line_id'] = move_line.id + return data + + def create_or_update_from_mv_lines(self, cr, uid, ids, lines, + level_id, controlling_date, context=None): + """Create or update line based on levels""" + currency_obj = self.pool.get('res.currency') + level_obj = self.pool.get('credit.control.policy.level') + ml_obj = self.pool.get('account.move.line') + user = self.pool.get('res.users').browse(cr, uid, uid) + currency_ids = currency_obj.search(cr, uid, [], context=context) + + tolerance = {} + tolerance_base = user.company_id.credit_control_tolerance + for c_id in currency_ids: + tolerance[c_id] = currency_obj.compute( + cr, uid, + c_id, + user.company_id.currency_id.id, + tolerance_base, + context=context) + + level = level_obj.browse(cr, uid, level_id, context) + line_ids = [] + for line in ml_obj.browse(cr, uid, lines, context): + + open_amount = line.amount_residual_currency + + if open_amount > tolerance.get(line.currency_id.id, tolerance_base): + vals = self._prepare_from_move_line( + cr, uid, line, level, controlling_date, open_amount, context=context) + line_id = self.create(cr, uid, vals, context=context) + line_ids.append(line_id) + + # when we have lines generated earlier in draft, + # on the same level, it means that we have left + # them, so they are to be considered as ignored + previous_draft_ids = self.search( + cr, uid, + [('move_line_id', '=', line.id), + ('level', '=', level.id), + ('state', '=', 'draft'), + ('id', '!=', line_id)], + context=context) + if previous_draft_ids: + self.write(cr, uid, previous_draft_ids, + {'state': 'ignored'}, context=context) + + return line_ids + + def unlink(self, cr, uid, ids, context=None, check=True): + for line in self.browse(cr, uid, ids, context=context): + if line.state != 'draft': + raise osv.except_osv( + _('Error !'), + _('You are not allowed to delete a credit control line that ' + 'is not in draft state.')) + + return super(CreditControlLine, self).unlink(cr, uid, ids, context=context) + diff --git a/account_credit_control/line_view.xml b/account_credit_control/line_view.xml new file mode 100644 index 000000000..a66f64c4d --- /dev/null +++ b/account_credit_control/line_view.xml @@ -0,0 +1,148 @@ + + + + credit.control.line.form + credit.control.line + form + +

+ + + + + + + + + + + + + + + + + + + + + + Credit Control Lines + credit.control.lines + search + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + credit.control.line.tree + credit.control.line + tree + + + + + + + + + + + + + + + + + + + + + + + + + Credit Control Lines + ir.actions.act_window + credit.control.line + + form + tree,form + + {'search_default_filter_draft': 1, 'search_default_filter_to_be_sent': 1} + + + + + + + + + diff --git a/account_credit_control/partner.py b/account_credit_control/partner.py new file mode 100644 index 000000000..5cc33c32f --- /dev/null +++ b/account_credit_control/partner.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp.osv.orm import Model, fields + + +class ResPartner(Model): + """Add a settings on the credit control policy to use on the partners, + and links to the credit control lines.""" + + _inherit = "res.partner" + + _columns = { + 'credit_policy_id': fields.many2one('credit.control.policy', + 'Credit Control Policy', + help=("The Credit Control Policy" + "used for this partner. This " + "setting can be forced on the " + "invoice. If nothing is defined, " + "it will use the company " + "setting.")), + 'credit_control_line_ids': fields.one2many('credit.control.line', + 'invoice_id', + string='Credit Control Lines', + readonly=True) + } + diff --git a/account_credit_control/partner_view.xml b/account_credit_control/partner_view.xml new file mode 100644 index 000000000..71030aa2d --- /dev/null +++ b/account_credit_control/partner_view.xml @@ -0,0 +1,25 @@ + + + + partner.credit_control.form.view + res.partner + + form + + + + + + + + + + + diff --git a/account_credit_control/policy.py b/account_credit_control/policy.py new file mode 100644 index 000000000..6f97176db --- /dev/null +++ b/account_credit_control/policy.py @@ -0,0 +1,379 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp.osv.orm import Model, fields +from openerp.tools.translate import _ + + +class CreditControlPolicy(Model): + """Define a policy of reminder""" + + _name = "credit.control.policy" + _description = """Define a reminder policy""" + _columns = {'name': fields.char('Name', required=True, size=128), + + 'level_ids': fields.one2many('credit.control.policy.level', + 'policy_id', + 'Policy Levels'), + + 'do_nothing': fields.boolean('Do nothing', + help=('For policies which should not ' + 'generate lines or are obsolete')), + + 'company_id': fields.many2one('res.company', 'Company'), + + 'account_ids': fields.many2many( + 'account.account', + string='Accounts', + required=True, + domain="[('reconcile', '=', True)]", + help='This policy will be active only for the selected accounts'), + } + + def _move_lines_domain(self, cr, uid, policy, controlling_date, context=None): + """Build the default domain for searching move lines""" + account_ids = [a.id for a in policy.account_ids] + return [('account_id', 'in', account_ids), + ('date_maturity', '<=', controlling_date), + ('reconcile_id', '=', False), + ('partner_id', '!=', False)] + + def _due_move_lines(self, cr, uid, policy, controlling_date, context=None): + """ Get the due move lines for the policy of the company. + + The set of ids will be reduced and extended according to the specific policies + defined on partners and invoices. + + Do not use direct SQL in order to respect security rules. + + Assume that only the receivable lines have a maturity date and that + accounts used in the policy are reconcilable. + """ + move_l_obj = self.pool.get('account.move.line') + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + if user.company_id.credit_policy_id.id != policy.id: + return set() + + return set(move_l_obj.search( + cr, uid, + self._move_lines_domain(cr, uid, policy, controlling_date, context=context), + context=context)) + + def _move_lines_subset(self, cr, uid, policy, controlling_date, + model, move_relation_field, context=None): + """ Get the move lines related to one model for a policy. + + Do not use direct SQL in order to respect security rules. + + Assume that only the receivable lines have a maturity date and that + accounts used in the policy are reconcilable. + + The policy relation field must be named credit_policy_id. + + :param browse_record policy: policy + :param str controlling_date: date of credit control + :param str model: name of the model where is defined a credit_policy_id + :param str move_relation_field: name of the field in account.move.line + which is a many2one to `model` + :return: set of ids to add in the process, set of ids to remove from + the process + """ + # MARK possible place for a good optimisation + my_obj = self.pool.get(model) + move_l_obj = self.pool.get('account.move.line') + + default_domain = self._move_lines_domain(cr, uid, policy, controlling_date, context=context) + to_add_ids = set() + to_remove_ids = set() + + # The lines which are linked to this policy have to be included in the + # run for this policy. + # If another object override the credit_policy_id (ie. invoice after + add_obj_ids = my_obj.search( + cr, uid, + [('credit_policy_id', '=', policy.id)], + context=context) + if add_obj_ids: + domain = list(default_domain) + domain.append((move_relation_field, 'in', add_obj_ids)) + to_add_ids = set(move_l_obj.search(cr, uid, domain, context=context)) + + # The lines which are linked to another policy do not have to be + # included in the run for this policy. + neg_obj_ids = my_obj.search( + cr, uid, + [('credit_policy_id', '!=', policy.id), + ('credit_policy_id', '!=', False)], + context=context) + if neg_obj_ids: + domain = list(default_domain) + domain.append((move_relation_field, 'in', neg_obj_ids)) + to_remove_ids = set(move_l_obj.search(cr, uid, domain, context=context)) + return to_add_ids, to_remove_ids + + def _get_partner_related_lines(self, cr, uid, policy, controlling_date, context=None): + """ Get the move lines for a policy related to a partner. + + :param browse_record policy: policy + :param str controlling_date: date of credit control + :param str model: name of the model where is defined a credit_policy_id + :param str move_relation_field: name of the field in account.move.line + which is a many2one to `model` + :return: set of ids to add in the process, set of ids to remove from + the process + """ + return self._move_lines_subset( + cr, uid, policy, controlling_date, + 'res.partner', 'partner_id', context=context) + + def _get_invoice_related_lines(self, cr, uid, policy, controlling_date, context=None): + """ Get the move lines for a policy related to an invoice. + + :param browse_record policy: policy + :param str controlling_date: date of credit control + :param str model: name of the model where is defined a credit_policy_id + :param str move_relation_field: name of the field in account.move.line + which is a many2one to `model` + :return: set of ids to add in the process, set of ids to remove from + the process + """ + return self._move_lines_subset( + cr, uid, policy, controlling_date, + 'account.invoice', 'invoice', context=context) + + def _get_move_lines_to_process(self, cr, uid, policy_id, controlling_date, context=None): + """Build a list of move lines ids to include in a run for a policy at a given date. + + :param int/long policy: id of the policy + :param str controlling_date: date of credit control + :return: set of ids to include in the run + """ + assert not (isinstance(policy_id, list) and len(policy_id) > 1), \ + "policy_id: only one id expected" + if isinstance(policy_id, list): + policy_id = policy_id[0] + + policy = self.browse(cr, uid, policy_id, context=context) + # there is a priority between the lines, depicted by the calls below + # warning, side effect method called on lines + lines = self._due_move_lines( + cr, uid, policy, controlling_date, context=context) + add_ids, remove_ids = self._get_partner_related_lines( + cr, uid, policy, controlling_date, context=context) + lines = lines.union(add_ids).difference(remove_ids) + add_ids, remove_ids = self._get_invoice_related_lines( + cr, uid, policy, controlling_date, context=context) + lines = lines.union(add_ids).difference(remove_ids) + return lines + + def _lines_different_policy(self, cr, uid, policy_id, lines, context=None): + """ Return a set of move lines ids for which there is an existing credit line + but with a different policy. + """ + different_lines = set() + if not lines: + return different_lines + assert not (isinstance(policy_id, list) and len(policy_id) > 1), \ + "policy_id: only one id expected" + if isinstance(policy_id, list): + policy_id = policy_id[0] + cr.execute("SELECT move_line_id FROM credit_control_line" + " WHERE policy_id != %s and move_line_id in %s", + (policy_id, tuple(lines))) + res = cr.fetchall() + if res: + different_lines.update([x[0] for x in res]) + return different_lines + + +class CreditControlPolicyLevel(Model): + """Define a policy level. A level allows to determine if + a move line is due and the level of overdue of the line""" + + _name = "credit.control.policy.level" + _order = 'level' + _description = """A credit control policy level""" + _columns = { + 'policy_id': fields.many2one('credit.control.policy', + 'Related Policy', required=True), + 'name': fields.char('Name', size=128, required=True), + 'level': fields.integer('Level', required=True), + + 'computation_mode': fields.selection([('net_days', 'Due Date'), + ('end_of_month', 'Due Date, End Of Month'), + ('previous_date', 'Previous Reminder')], + 'Compute Mode', + required=True), + + 'delay_days': fields.integer('Delay (in days)', required='True'), + 'email_template_id': fields.many2one('email.template', 'Email Template', + required=True), + 'channel': fields.selection([('letter', 'Letter'), + ('email', 'Email')], + 'Channel', required=True), + 'custom_text': fields.text('Custom Message', required=True, translate=True), + } + + def _check_level_mode(self, cr, uid, rids, context=None): + """ The smallest level of a policy cannot be computed on the + "previous_date". Return False if this happens. """ + if isinstance(rids, (int, long)): + rids = [rids] + for level in self.browse(cr, uid, rids, context): + smallest_level_id = self.search( + cr, uid, + [('policy_id', '=', level.policy_id.id)], + order='level asc', limit=1, context=context) + smallest_level = self.browse(cr, uid, smallest_level_id[0], context) + if smallest_level.computation_mode == 'previous_date': + return False + return True + + _sql_constraint = [('unique level', + 'UNIQUE (policy_id, level)', + 'Level must be unique per policy')] + + _constraints = [(_check_level_mode, + 'The smallest level can not be of type Previous Reminder', + ['level'])] + + def _previous_level(self, cr, uid, policy_level, context=None): + """ For one policy level, returns the id of the previous level + + If there is no previous level, it returns None, it means that's the + first policy level + + :param browse_record policy_level: policy level + :return: previous level id or None if there is no previous level + """ + previous_level_ids = self.search( + cr, + uid, + [('policy_id', '=', policy_level.policy_id.id), + ('level', '<', policy_level.level)], + order='level desc', + limit=1, + context=context) + return previous_level_ids[0] if previous_level_ids else None + + # ----- sql time related methods --------- + + def _net_days_get_boundary(self): + return " (mv_line.date_maturity + %(delay)s)::date <= date(%(controlling_date)s)" + + def _end_of_month_get_boundary(self): + return ("(date_trunc('MONTH', (mv_line.date_maturity + %(delay)s))+INTERVAL '1 MONTH - 1 day')::date" + "<= date(%(controlling_date)s)") + + def _previous_date_get_boundary(self): + return "(cr_line.date + %(delay)s)::date <= date(%(controlling_date)s)" + + def _get_sql_date_boundary_for_computation_mode(self, cr, uid, level, controlling_date, context=None): + """Return a where clauses statement for the given + controlling date and computation mode of the level""" + fname = "_%s_get_boundary" % (level.computation_mode,) + if hasattr(self, fname): + fnc = getattr(self, fname) + return fnc() + else: + raise NotImplementedError(_('Can not get function for computation mode: ' + '%s is not implemented') % (fname,)) + + # ----------------------------------------- + + def _get_first_level_move_line_ids(self, cr, uid, level, controlling_date, lines, context=None): + """Retrieve all the move lines that are linked to a first level. + We use Raw SQL for performance. Security rule where applied in + policy object when the first set of lines were retrieved""" + level_lines = set() + if not lines: + return level_lines + sql = ("SELECT DISTINCT mv_line.id\n" + " FROM account_move_line mv_line\n" + " WHERE mv_line.id in %(line_ids)s\n" + " AND NOT EXISTS (SELECT id\n" + " FROM credit_control_line\n" + " WHERE move_line_id = mv_line.id\n" + # lines from a previous level with a draft or ignored state + # have to be generated again for the previous level + " AND state not in ('draft', 'ignored'))") + sql += " AND" + self._get_sql_date_boundary_for_computation_mode( + cr, uid, level, controlling_date, context) + data_dict = {'controlling_date': controlling_date, 'line_ids': tuple(lines), + 'delay': level.delay_days} + + cr.execute(sql, data_dict) + res = cr.fetchall() + if res: + level_lines.update([x[0] for x in res]) + return level_lines + + def _get_other_level_move_line_ids(self, cr, uid, level, controlling_date, lines, context=None): + """ Retrieve the move lines for other levels than first level. + """ + level_lines = set() + if not lines: + return level_lines + sql = ("SELECT mv_line.id\n" + " FROM account_move_line mv_line\n" + " JOIN credit_control_line cr_line\n" + " ON (mv_line.id = cr_line.move_line_id)\n" + " WHERE cr_line.id = (SELECT credit_control_line.id FROM credit_control_line\n" + " WHERE credit_control_line.move_line_id = mv_line.id\n" + " ORDER BY credit_control_line.level desc limit 1)\n" + " AND cr_line.level = %(previous_level)s\n" + # lines from a previous level with a draft or ignored state + # have to be generated again for the previous level + " AND cr_line.state not in ('draft', 'ignored')\n" + " AND mv_line.id in %(line_ids)s\n") + sql += " AND " + self._get_sql_date_boundary_for_computation_mode( + cr, uid, level, controlling_date, context) + previous_level_id = self._previous_level( + cr, uid, level, context=context) + previous_level = self.browse( + cr, uid, previous_level_id, context=context) + data_dict = {'controlling_date': controlling_date, 'line_ids': tuple(lines), + 'delay': level.delay_days, 'previous_level': previous_level.level} + + # print cr.mogrify(sql, data_dict) + cr.execute(sql, data_dict) + res = cr.fetchall() + if res: + level_lines.update([x[0] for x in res]) + return level_lines + + def get_level_lines(self, cr, uid, level_id, controlling_date, lines, context=None): + """get all move lines in entry lines that match the current level""" + assert not (isinstance(level_id, list) and len(level_id) > 1), \ + "level_id: only one id expected" + if isinstance(level_id, list): + level_id = level_id[0] + matching_lines = set() + level = self.browse(cr, uid, level_id, context=context) + if self._previous_level(cr, uid, level, context=context) is None: + method = self._get_first_level_move_line_ids + else: + method = self._get_other_level_move_line_ids + + matching_lines.update( + method(cr, uid, level, controlling_date, lines, context=context)) + + return matching_lines + diff --git a/account_credit_control/policy_view.xml b/account_credit_control/policy_view.xml new file mode 100644 index 000000000..99daac65e --- /dev/null +++ b/account_credit_control/policy_view.xml @@ -0,0 +1,121 @@ + + + + + credit.control.policy.form + credit.control.policy + form + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + credit.control.policy.tree + credit.control.policy + tree + + + + + + + + + + + + Credit Control Policies + ir.actions.act_window + credit.control.policy + + form + tree,form + + + + + + + credit.mangement.policy.level.form + credit.control.policy.level + form + +
+ + + + + + + + + + + + + + +
+
+ + + credit.control.policy.level.tree + credit.control.policy.level + tree + + + + + + + + + + + +
+
diff --git a/account_credit_control/report/__init__.py b/account_credit_control/report/__init__.py new file mode 100644 index 000000000..b7e5edadc --- /dev/null +++ b/account_credit_control/report/__init__.py @@ -0,0 +1 @@ +from . import credit_control_summary diff --git a/account_credit_control/report/credit_control_summary.html.mako b/account_credit_control/report/credit_control_summary.html.mako new file mode 100644 index 000000000..5f3b602f4 --- /dev/null +++ b/account_credit_control/report/credit_control_summary.html.mako @@ -0,0 +1,22 @@ + + + + + + + %for comm in objects : + <% + setLang(comm.partner_id.lang) + current_uri = '%s_policy_template' % (comm.partner_id.lang) + if not context.lookup.has_template(current_uri): + context.lookup.put_string(current_uri, comm.current_policy_level.email_template_id.body_html) + %> + <%include file="${current_uri}" args="object=comm,user=user,ctx=ctx,quote=quote,format_exception=format_exception,mode='pdf'"/> + +

+ %endfor + + + diff --git a/account_credit_control/report/credit_control_summary.py b/account_credit_control/report/credit_control_summary.py new file mode 100644 index 000000000..6a19659b7 --- /dev/null +++ b/account_credit_control/report/credit_control_summary.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import time + +from openerp.report import report_sxw + +class CreditSummaryReport(report_sxw.rml_parse): + def __init__(self, cr, uid, name, context): + super(CreditSummaryReport, self).__init__(cr, uid, name, context=context) + self.localcontext.update({ + 'time': time, + 'cr':cr, + 'uid': uid, + }) + +report_sxw.report_sxw('report.credit_control_summary', + 'credit.control.communication', + 'addons/account_credit_control/report/credit_control_summary.html.mako', + parser=CreditSummaryReport) diff --git a/account_credit_control/report/report.xml b/account_credit_control/report/report.xml new file mode 100644 index 000000000..04e84f277 --- /dev/null +++ b/account_credit_control/report/report.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/account_credit_control/run.py b/account_credit_control/run.py new file mode 100644 index 000000000..db5120bfe --- /dev/null +++ b/account_credit_control/run.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Nicolas Bessi, Guewen Baconnier +# Copyright 2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging + +from openerp.osv.orm import Model, fields +from openerp.tools.translate import _ +from openerp.osv.osv import except_osv + +logger = logging.getLogger('credit.control.run') + + +class CreditControlRun(Model): + """Credit Control run generate all credit control lines and reject""" + + _name = "credit.control.run" + _rec_name = 'date' + _description = """Credit control line generator""" + _columns = { + 'date': fields.date('Controlling Date', required=True), + 'policy_ids': fields.many2many('credit.control.policy', + rel="credit_run_policy_rel", + id1='run_id', id2='policy_id', + string='Policies', + readonly=True, + states={'draft': [('readonly', False)]}), + + 'report': fields.text('Report', readonly=True), + + 'state': fields.selection([('draft', 'Draft'), + ('done', 'Done'), + ], + string='State', + required=True, + readonly=True), + + 'manual_ids': fields.many2many( + 'account.move.line', + rel="credit_runreject_rel", + string='Lines to handle manually', + help=('If a credit control line has been generated on a policy ' + 'and the policy has been changed meantime, ' + 'it has to be handled manually'), + readonly=True), + } + + def _get_policies(self, cr, uid, context=None): + return self.pool.get('credit.control.policy').\ + search(cr, uid, [], context=context) + + _defaults = { + 'state': 'draft', + 'policy_ids': _get_policies, + } + + def _check_run_date(self, cr, uid, ids, controlling_date, context=None): + """Ensure that there is no credit line in the future using controlling_date""" + line_obj = self.pool.get('credit.control.line') + lines = line_obj.search(cr, uid, [('date', '>', controlling_date)], + order='date DESC', limit=1, context=context) + if lines: + line = line_obj.browse(cr, uid, lines[0], context=context) + raise except_osv( + _('Error'), + _('A run has already been executed more recently than %s') % (line.date)) + return True + + def _generate_credit_lines(self, cr, uid, run_id, context=None): + """ Generate credit control lines. """ + cr_line_obj = self.pool.get('credit.control.line') + assert not (isinstance(run_id, list) and len(run_id) > 1), \ + "run_id: only one id expected" + if isinstance(run_id, list): + run_id = run_id[0] + + run = self.browse(cr, uid, run_id, context=context) + manually_managed_lines = set() # line who changed policy + credit_line_ids = [] # generated lines + run._check_run_date(run.date, context=context) + + policies = run.policy_ids + if not policies: + raise except_osv( + _('Error'), + _('Please select a policy')) + + report = '' + for policy in policies: + if policy.do_nothing: + continue + + lines = policy._get_move_lines_to_process(run.date, context=context) + manual_lines = policy._lines_different_policy(lines, context=context) + lines.difference_update(manual_lines) + manually_managed_lines.update(manual_lines) + + if lines: + policy_generated_ids = [] + # policy levels are sorted by level so iteration is in the correct order + for level in reversed(policy.level_ids): + level_lines = level.get_level_lines(run.date, lines, context=context) + policy_generated_ids += cr_line_obj.create_or_update_from_mv_lines( + cr, uid, [], list(level_lines), level.id, run.date, context=context) + + if policy_generated_ids: + report += _("Policy \"%s\" has generated %d Credit Control Lines.\n") % \ + (policy.name, len(policy_generated_ids)) + credit_line_ids += policy_generated_ids + else: + report += _("Policy \"%s\" has not generated any Credit Control Lines.\n" % + policy.name) + + vals = {'state': 'done', + 'report': report, + 'manual_ids': [(6, 0, manually_managed_lines)]} + run.write(vals, context=context) + + def generate_credit_lines(self, cr, uid, run_id, context=None): + """Generate credit control lines + + Lock the ``credit_control_run`` Postgres table to avoid concurrent + calls of this method. + """ + try: + cr.execute('SELECT id FROM credit_control_run' + ' LIMIT 1 FOR UPDATE NOWAIT' ) + except Exception, exc: + # in case of exception openerp will do a rollback for us and free the lock + raise except_osv( + _('Error'), + _('A credit control run is already running' + ' in background, please try later.'), str(exc)) + + self._generate_credit_lines(cr, uid, run_id, context) + return True + diff --git a/account_credit_control/run_view.xml b/account_credit_control/run_view.xml new file mode 100644 index 000000000..b3a7be8ae --- /dev/null +++ b/account_credit_control/run_view.xml @@ -0,0 +1,65 @@ + + + + + credit.control.run.tree + credit.control.run + tree + + + + + + + + + + credit.control.run.form + credit.control.run + form + +
+ + + + + + + + + + + + + +
+ +

+ +

diff --git a/account_credit_control/views/credit_control_policy.xml b/account_credit_control/views/credit_control_policy.xml index b3651fc90..ae3625a41 100644 --- a/account_credit_control/views/credit_control_policy.xml +++ b/account_credit_control/views/credit_control_policy.xml @@ -40,6 +40,9 @@ + + From 9d3f0ef9628f78933901f91649ec99c7e7f7b99d Mon Sep 17 00:00:00 2001 From: cubells Date: Wed, 20 Sep 2017 13:21:55 +0200 Subject: [PATCH 033/134] [FIX] account_credit_control: missing permission --- account_credit_control/__manifest__.py | 2 +- account_credit_control/views/account_invoice.xml | 11 ++++------- account_credit_control/views/res_partner.xml | 4 ++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/account_credit_control/__manifest__.py b/account_credit_control/__manifest__.py index 2bd3da483..981b115fd 100644 --- a/account_credit_control/__manifest__.py +++ b/account_credit_control/__manifest__.py @@ -3,7 +3,7 @@ # Copyright 2017 Okia SPRL (https://okia.be) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). {'name': 'Account Credit Control', - 'version': '10.0.1.1.0', + 'version': '10.0.1.2.0', 'author': "Camptocamp,Odoo Community Association (OCA),Okia", 'maintainer': 'Camptocamp', 'category': 'Finance', diff --git a/account_credit_control/views/account_invoice.xml b/account_credit_control/views/account_invoice.xml index 2b9dcbbf3..bac4ad157 100644 --- a/account_credit_control/views/account_invoice.xml +++ b/account_credit_control/views/account_invoice.xml @@ -12,20 +12,17 @@ invoice.followup.form.view account.invoice + - + + attrs="{'invisible': [('credit_policy_id', '=', False)]}"/> - + diff --git a/account_credit_control/views/res_partner.xml b/account_credit_control/views/res_partner.xml index cdb4888ae..c54ef03c7 100644 --- a/account_credit_control/views/res_partner.xml +++ b/account_credit_control/views/res_partner.xml @@ -4,10 +4,10 @@ partner.credit_control.form.view res.partner + - + From 95b5473dde65efce7c479709f07e5bcee7ee9590 Mon Sep 17 00:00:00 2001 From: "Benjamin Willig (ACSONE)" Date: Sat, 30 Sep 2017 11:51:37 +0200 Subject: [PATCH 034/134] [10.0][FIX] account_credit_control report (#545) * [FIX] Fixed policy level custom text alignment and added space between blocks --- account_credit_control/__manifest__.py | 2 +- account_credit_control/i18n/fr.po | 2 +- .../report/report_credit_control_summary.xml | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/account_credit_control/__manifest__.py b/account_credit_control/__manifest__.py index 981b115fd..1f355b8b7 100644 --- a/account_credit_control/__manifest__.py +++ b/account_credit_control/__manifest__.py @@ -3,7 +3,7 @@ # Copyright 2017 Okia SPRL (https://okia.be) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). {'name': 'Account Credit Control', - 'version': '10.0.1.2.0', + 'version': '10.0.1.2.1', 'author': "Camptocamp,Odoo Community Association (OCA),Okia", 'maintainer': 'Camptocamp', 'category': 'Finance', diff --git a/account_credit_control/i18n/fr.po b/account_credit_control/i18n/fr.po index 19512d8a3..d4f04c932 100644 --- a/account_credit_control/i18n/fr.po +++ b/account_credit_control/i18n/fr.po @@ -1175,7 +1175,7 @@ msgstr "État" #. module: account_credit_control #: model:ir.ui.view,arch_db:account_credit_control.report_credit_control_summary_document msgid "Summary" -msgstr "Listes des factures en attente de règlement" +msgstr "Liste des factures en attente de règlement" #. module: account_credit_control #: model:ir.model.fields,help:account_credit_control.field_account_invoice_credit_policy_id diff --git a/account_credit_control/report/report_credit_control_summary.xml b/account_credit_control/report/report_credit_control_summary.xml index 75191a422..e9c7e85ae 100644 --- a/account_credit_control/report/report_credit_control_summary.xml +++ b/account_credit_control/report/report_credit_control_summary.xml @@ -7,8 +7,8 @@
+ "fields": ["address", "name"], + "no_marker": true}'/>
@@ -19,8 +19,10 @@ -
- +
+
+ +

Summary

@@ -91,7 +93,11 @@
-

+

+
+

+

+
From d5784ee0a602739b3326bcc7eb8e5b44cc9752ba Mon Sep 17 00:00:00 2001 From: "Adrien Peiffer (ACSONE)" Date: Thu, 14 Sep 2017 13:12:29 +0200 Subject: [PATCH 035/134] [FIX] account_credit_control: fix translation in report. --- account_credit_control/__manifest__.py | 2 +- account_credit_control/report/report_credit_control_summary.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/account_credit_control/__manifest__.py b/account_credit_control/__manifest__.py index 1f355b8b7..2edccdf06 100644 --- a/account_credit_control/__manifest__.py +++ b/account_credit_control/__manifest__.py @@ -3,7 +3,7 @@ # Copyright 2017 Okia SPRL (https://okia.be) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). {'name': 'Account Credit Control', - 'version': '10.0.1.2.1', + 'version': '10.0.1.3.0', 'author': "Camptocamp,Odoo Community Association (OCA),Okia", 'maintainer': 'Camptocamp', 'category': 'Finance', diff --git a/account_credit_control/report/report_credit_control_summary.xml b/account_credit_control/report/report_credit_control_summary.xml index e9c7e85ae..24e36f291 100644 --- a/account_credit_control/report/report_credit_control_summary.xml +++ b/account_credit_control/report/report_credit_control_summary.xml @@ -2,6 +2,7 @@