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 @@
+
+