From f885ff3cf11f86f160cc9825b117bc7a61fd9ec3 Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Fri, 7 Sep 2018 11:58:02 +0200 Subject: [PATCH] [IMP] account_credit_control: UX improvements --- account_credit_control/__manifest__.py | 1 + .../i18n/account_credit_control.pot | 75 +++++++++++++++---- .../models/credit_control_line.py | 53 +++++++++++-- .../models/credit_control_run.py | 69 ++++++++++++++++- account_credit_control/models/res_partner.py | 20 ++++- .../security/account_security.xml | 41 ++++++++++ .../views/credit_control_line.xml | 17 ++++- .../views/credit_control_run.xml | 17 ++++- account_credit_control/views/res_partner.xml | 28 +++++-- 9 files changed, 281 insertions(+), 40 deletions(-) create mode 100644 account_credit_control/security/account_security.xml diff --git a/account_credit_control/__manifest__.py b/account_credit_control/__manifest__.py index aef1e12ce..9d3fd4181 100644 --- a/account_credit_control/__manifest__.py +++ b/account_credit_control/__manifest__.py @@ -20,6 +20,7 @@ 'data': [ # Security "security/res_groups.xml", + "security/account_security.xml", "security/ir.model.access.csv", # Reports diff --git a/account_credit_control/i18n/account_credit_control.pot b/account_credit_control/i18n/account_credit_control.pot index e8bef049b..1c99c7d92 100644 --- a/account_credit_control/i18n/account_credit_control.pot +++ b/account_credit_control/i18n/account_credit_control.pot @@ -6,6 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-11-26 12:28+0000\n" +"PO-Revision-Date: 2018-11-26 12:28+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -39,6 +41,13 @@ msgid "\n" " " msgstr "" +#. module: account_credit_control +#: model:ir.model.fields,field_description:account_credit_control.field_credit_control_run_credit_control_count +#: model:ir.model.fields,field_description:account_credit_control.field_res_partner_credit_control_count +#: model:ir.model.fields,field_description:account_credit_control.field_res_users_credit_control_count +msgid "# of Credit Control Lines" +msgstr "" + #. module: account_credit_control #: model:credit.control.policy.level,name:account_credit_control.3_time_3 msgid "10 days last reminder" @@ -76,7 +85,7 @@ msgid "A credit control line" msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_run.py:73 +#: code:addons/account_credit_control/models/credit_control_run.py:100 #, python-format msgid "A credit control line more recent than %s exists at %s" msgstr "" @@ -87,13 +96,13 @@ msgid "A credit control policy level" msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_run.py:139 +#: code:addons/account_credit_control/models/credit_control_run.py:166 #, python-format msgid "A credit control run is already running in background, please try later." msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_run.py:66 +#: code:addons/account_credit_control/models/credit_control_run.py:93 #, python-format msgid "A run has already been executed more recently than %s" msgstr "" @@ -126,6 +135,16 @@ msgstr "" msgid "An error has occured during the sending of the email." msgstr "" +#. module: account_credit_control +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_run_form +msgid "Are you sure you want to run all ready lines channel action?" +msgstr "" + +#. module: account_credit_control +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_run_form +msgid "Are you sure you want to set all Draft lines as Ready To Send?" +msgstr "" + #. module: account_credit_control #: code:addons/account_credit_control/models/credit_control_policy.py:292 #, python-format @@ -184,6 +203,7 @@ msgstr "" #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_communication_company_id #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_line_company_id #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_policy_company_id +#: model:ir.model.fields,field_description:account_credit_control.field_credit_control_run_company_id msgid "Company" msgstr "" @@ -214,6 +234,11 @@ msgstr "" msgid "Control Credit Lines" msgstr "" +#. module: account_credit_control +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_run_form +msgid "Control Lines" +msgstr "" + #. module: account_credit_control #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_run_date msgid "Controlling Date" @@ -255,6 +280,7 @@ msgstr "" #: 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 #: model:ir.ui.view,arch_db:account_credit_control.invoice_followup_form_view +#: model:ir.ui.view,arch_db:account_credit_control.partner_view_buttons #: model:ir.ui.view,arch_db:account_credit_control.res_config_settings_view_form msgid "Credit Control" msgstr "" @@ -264,8 +290,6 @@ msgstr "" #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_emailer_line_ids #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_marker_line_ids #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_printer_line_ids -#: model:ir.model.fields,field_description:account_credit_control.field_res_partner_credit_control_line_ids -#: model:ir.model.fields,field_description:account_credit_control.field_res_users_credit_control_line_ids #: model:ir.ui.menu,name:account_credit_control.credit_control_line_action_menu #: model:ir.ui.view,arch_db:account_credit_control.invoice_followup_form_view msgid "Credit Control Lines" @@ -561,6 +585,11 @@ msgstr "" msgid "Group By" msgstr "" +#. module: account_credit_control +#: model:ir.model.fields,field_description:account_credit_control.field_credit_control_run_hide_change_state_button +msgid "Hide Change State Button" +msgstr "" + #. module: account_credit_control #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_communication_id #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_emailer_id @@ -859,11 +888,6 @@ msgstr "" msgid "Only letter lines will be marked." msgstr "" -#. module: account_credit_control -#: model:ir.ui.view,arch_db:account_credit_control.credit_control_run_form -msgid "Open Credit Control Lines" -msgstr "" - #. module: account_credit_control #: model:ir.ui.view,arch_db:account_credit_control.report_credit_control_summary_document msgid "Open amount" @@ -1000,7 +1024,7 @@ msgid "Payment Note" msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_run.py:87 +#: code:addons/account_credit_control/models/credit_control_run.py:114 #, python-format msgid "Please select a policy" msgstr "" @@ -1023,13 +1047,13 @@ msgid "Policy" msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_run.py:110 +#: code:addons/account_credit_control/models/credit_control_run.py:137 #, python-format msgid "Policy \"%s\" has generated %d Credit Control Lines.
" msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_run.py:114 +#: code:addons/account_credit_control/models/credit_control_run.py:141 #, python-format msgid "Policy \"%s\" has not generated any Credit Control Lines.
" msgstr "" @@ -1100,11 +1124,29 @@ msgstr "" msgid "Report Date" msgstr "" +#. module: account_credit_control +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_run_form +msgid "Run channel action" +msgstr "" + #. module: account_credit_control #: model:ir.ui.view,arch_db:account_credit_control.credit_control_line_search msgid "Run date" msgstr "" +#. module: account_credit_control +#: model:ir.model.fields,field_description:account_credit_control.field_credit_control_line_partner_user_id +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_line_search +msgid "Salesperson" +msgstr "" + +#. module: account_credit_control +#: code:addons/account_credit_control/models/credit_control_line.py:244 +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_line_tree +#, python-format +msgid "Schedule activity" +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 @@ -1151,6 +1193,11 @@ msgstr "" msgid "Set new policy" msgstr "" +#. module: account_credit_control +#: model:ir.ui.view,arch_db:account_credit_control.credit_control_run_form +msgid "Set to ready all" +msgstr "" + #. module: account_credit_control #: model:ir.model.fields,field_description:account_credit_control.field_credit_control_line_run_id msgid "Source" @@ -1264,7 +1311,7 @@ msgid "Warning: you will maybe not be able to revert this operation." msgstr "" #. module: account_credit_control -#: code:addons/account_credit_control/models/credit_control_line.py:194 +#: code:addons/account_credit_control/models/credit_control_line.py:216 #, python-format msgid "You are not allowed to delete a credit control line that is not in draft state." msgstr "" diff --git a/account_credit_control/models/credit_control_line.py b/account_credit_control/models/credit_control_line.py index 4c38015f5..2a113d0b6 100644 --- a/account_credit_control/models/credit_control_line.py +++ b/account_credit_control/models/credit_control_line.py @@ -18,13 +18,18 @@ class CreditControlLine(models.Model): """ _name = "credit.control.line" + _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "A credit control line" _rec_name = "id" _order = "date DESC" - date = fields.Date(string='Controlling date', - required=True, - index=True) + date = fields.Date( + string='Controlling date', + required=True, + index=True, + readonly=True, + states={'draft': [('readonly', False)]}, + ) # maturity date of related move line we do not use # a related field in order to # allow manual changes @@ -61,9 +66,13 @@ class CreditControlLine(models.Model): invoice_id = fields.Many2one('account.invoice', string='Invoice', readonly=True) - partner_id = fields.Many2one('res.partner', - string='Partner', - required=True) + partner_id = fields.Many2one( + comodel_name='res.partner', + string='Partner', + required=True, + readonly=True, + states={'draft': [('readonly', False)]}, + ) amount_due = fields.Float(string='Due Amount Tax incl.', required=True, readonly=True) balance_due = fields.Float(string='Due balance', required=True, @@ -103,6 +112,19 @@ class CreditControlLine(models.Model): run_id = fields.Many2one(comodel_name='credit.control.run', string='Source') manual_followup = fields.Boolean() + partner_user_id = fields.Many2one( + comodel_name='res.users', + string="Salesperson", + # Use compute instead of related because it raises access error if the + # user is in other company even using related_sudo + compute='_compute_partner_user_id', + store=True, + ) + + @api.depends('partner_id.user_id') + def _compute_partner_user_id(self): + for line in self: + line.partner_user_id = line.partner_id.user_id @api.model def _prepare_from_move_line(self, move_line, level, controlling_date, @@ -194,7 +216,6 @@ class CreditControlLine(models.Model): _('You are not allowed to delete a credit control ' 'line that is not in draft state.') ) - return super(CreditControlLine, self).unlink() @api.multi @@ -211,3 +232,21 @@ class CreditControlLine(models.Model): line = super(CreditControlLine, self).create(values) line.manual_followup = line.partner_id.manual_followup return line + + def button_schedule_activity(self): + ctx = self.env.context.copy() + ctx.update({ + 'default_res_id': self.ids[0], + 'default_res_model': self._name, + }) + return { + 'type': 'ir.actions.act_window', + 'name': _("Schedule activity"), + 'res_model': 'mail.activity', + 'view_type': 'form', + 'view_mode': 'form', + 'res_id': self.activity_ids and self.activity_ids.ids[0] or False, + 'views': [[False, 'form']], + 'context': ctx, + 'target': 'new', + } diff --git a/account_credit_control/models/credit_control_run.py b/account_credit_control/models/credit_control_run.py index 99f6b11fc..2d6e6bb34 100644 --- a/account_credit_control/models/credit_control_run.py +++ b/account_credit_control/models/credit_control_run.py @@ -53,6 +53,29 @@ class CreditControlRun(models.Model): readonly=True, copy=False, ) + credit_control_count = fields.Integer( + compute='_compute_credit_control_count', + string='# of Credit Control Lines', + ) + hide_change_state_button = fields.Boolean() + company_id = fields.Many2one( + comodel_name='res.company', + string='Company', + default=lambda self: self.env['res.company']._company_default_get( + 'account.account'), + index=True, + ) + + def _compute_credit_control_count(self): + fetch_data = self.env['credit.control.line'].read_group( + domain=[('run_id', 'in', self.ids)], + fields=['run_id'], + groupby=['run_id'], + ) + result = {data['run_id'][0]: data['run_id_count'] + for data in fetch_data} + for rec in self: + rec.credit_control_count = result.get(rec.id, 0) @api.model def _check_run_date(self, controlling_date): @@ -60,8 +83,12 @@ class CreditControlRun(models.Model): using controlling_date """ - runs = self.search([('date', '>', controlling_date)], - order='date DESC', limit=1) + runs = self.search( + [('date', '>', controlling_date), + ('company_id', '=', self.env.user.company_id.id)], + order='date DESC', + limit=1, + ) if runs: raise UserError(_('A run has already been executed more ' 'recently than %s') % (runs.date)) @@ -142,7 +169,11 @@ class CreditControlRun(models.Model): self._generate_credit_lines() return True - @api.multi + def unlink(self): + # Ondelete cascade don't check unlink lines restriction + self.mapped('line_ids').unlink() + return super().unlink() + def open_credit_lines(self): """ Open the generated lines """ self.ensure_one() @@ -151,3 +182,35 @@ class CreditControlRun(models.Model): action = action.read()[0] action['domain'] = [('id', 'in', self.line_ids.ids)] return action + + def set_to_ready_lines(self): + self.ensure_one() + draft_lines = self.line_ids.filtered(lambda x: x.state == 'draft') + draft_lines.write({'state': 'to_be_sent'}) + self.hide_change_state_button = True + # if not draft_lines: + # raise UserError(_('No lines in draft state')) + # action_name = ('account_credit_control' + # '.open_credit_line_marker_wizard_menu_action') + # action = self.env.ref(action_name) + # action = action.read()[0] + # action['context'] = { + # 'active_model': 'credit.control.line', + # 'active_ids': draft_lines.ids, + # } + # return action + + def run_channel_action(self): + self.ensure_one() + lines = self.line_ids.filtered(lambda x: x.state == 'to_be_sent') + letter_lines = lines.filtered(lambda x: x.channel == 'letter') + email_lines = lines.filtered(lambda x: x.channel == 'email') + if email_lines: + comm_obj = self.env['credit.control.communication'] + comms = comm_obj._generate_comm_from_credit_lines(email_lines) + comms._generate_emails() + if letter_lines: + wiz = self.env['credit.control.printer'].create({ + 'line_ids': letter_lines.ids, + }) + return wiz.print_lines diff --git a/account_credit_control/models/res_partner.py b/account_credit_control/models/res_partner.py index 2bc20e8a8..b4e602003 100644 --- a/account_credit_control/models/res_partner.py +++ b/account_credit_control/models/res_partner.py @@ -21,10 +21,10 @@ class ResPartner(models.Model): "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) + credit_control_count = fields.Integer( + compute='_compute_credit_control_count', + string='# of Credit Control Lines', + ) payment_responsible_id = fields.Many2one( comodel_name='res.users', ondelete='set null', @@ -49,6 +49,18 @@ class ResPartner(models.Model): ) manual_followup = fields.Boolean() + def _compute_credit_control_count(self): + partners = self.filtered(lambda x: not x.parent_id) + fetch_data = self.env['credit.control.line'].read_group( + domain=[('partner_id', 'in', partners.ids)], + fields=['partner_id'], + groupby=['partner_id'], + ) + result = {data['partner_id'][0]: data['partner_id_count'] + for data in fetch_data} + for partner in self: + partner.credit_control_count = result.get(partner.id, 0) + @api.constrains('credit_policy_id', 'property_account_receivable_id') def _check_credit_policy(self): """ Ensure that policy on partner are limited to the account policy """ diff --git a/account_credit_control/security/account_security.xml b/account_credit_control/security/account_security.xml new file mode 100644 index 000000000..a7510405e --- /dev/null +++ b/account_credit_control/security/account_security.xml @@ -0,0 +1,41 @@ + + + + + Credit Control + + + + + Info + + + + + User + + + + + + Manager + + + + + + + + Credit Control Run + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + Credit Control Line + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + diff --git a/account_credit_control/views/credit_control_line.xml b/account_credit_control/views/credit_control_line.xml index 494f575dc..1f0a7946f 100644 --- a/account_credit_control/views/credit_control_line.xml +++ b/account_credit_control/views/credit_control_line.xml @@ -39,6 +39,11 @@ +
+ + + +
@@ -54,6 +59,7 @@ + @@ -85,7 +91,7 @@ help="The line was deprecated by a manual change of policy on invoice."/> @@ -113,6 +119,7 @@ + @@ -122,9 +129,11 @@ credit.control.line.tree credit.control.line - + + + diff --git a/account_credit_control/views/res_partner.xml b/account_credit_control/views/res_partner.xml index 550b60250..cedf00201 100644 --- a/account_credit_control/views/res_partner.xml +++ b/account_credit_control/views/res_partner.xml @@ -1,5 +1,26 @@ + + + res.partner + + + + + + + partner.credit_control.form.view res.partner @@ -18,13 +39,6 @@ - res.partner.followup.inherit.tree res.partner