From 6cebb35ffb0d575f115828ba43087efefe7568cd Mon Sep 17 00:00:00 2001 From: Carmen Bianca Bakker Date: Mon, 13 Dec 2021 17:05:16 +0100 Subject: [PATCH 1/2] [ADD] bees_custom: Send an e-mail when a stock picking is incomplete Signed-off-by: Carmen Bianca Bakker --- bees_custom/__manifest__.py | 2 + bees_custom/data/mail_template.xml | 58 +++++++++++++++++++++ bees_custom/models/__init__.py | 1 + bees_custom/models/stock_picking.py | 79 +++++++++++++++++++++++++++++ bees_custom/readme/CONTRIBUTORS.rst | 1 + 5 files changed, 141 insertions(+) create mode 100644 bees_custom/data/mail_template.xml create mode 100644 bees_custom/models/stock_picking.py diff --git a/bees_custom/__manifest__.py b/bees_custom/__manifest__.py index 184d81b7..d9127b45 100644 --- a/bees_custom/__manifest__.py +++ b/bees_custom/__manifest__.py @@ -5,6 +5,7 @@ "name": "BEES Customizations", "version": "12.0.1.0.1", "depends": [ + "mail", "beesdoo_account", "beesdoo_product_info_screen", "pos_mail_receipt", @@ -17,6 +18,7 @@ Specifics customizations for BEES coop. """, "data": [ + "data/mail_template.xml", "views/account_invoice.xml", "views/products.xml", ], diff --git a/bees_custom/data/mail_template.xml b/bees_custom/data/mail_template.xml new file mode 100644 index 00000000..df758d19 --- /dev/null +++ b/bees_custom/data/mail_template.xml @@ -0,0 +1,58 @@ + + + + + + Incorrect Delivery + + ${ctx.get('company').email|safe} + + Incorrect Delivery (${object.name}) + ${ctx.get('company').email|safe} + ${ctx.get('company').email|safe} + + + ${ctx.get("lang")} + + +

Hello

+ + + % if object.zero_received_move_ids: +

Zero

+
    + % for move in object.zero_received_move_ids: +
  • ${move.name} - ${move.quantity_done} / ${move.product_qty} + % endfor +
+ % endif + + % if object.too_few_received_move_ids: +

Too few

+
    + % for move in object.too_few_received_move_ids: +
  • ${move.name} - ${move.quantity_done} / ${move.product_qty} + % endfor +
+ % endif + + % if object.too_many_received_move_ids: +

Too many

+
    + % for move in object.too_many_received_move_ids: +
  • ${move.name} - ${move.quantity_done} / ${move.product_qty} + % endfor +
+ % endif + +

Goodbye.

+ + + ]]>
+
+
+
diff --git a/bees_custom/models/__init__.py b/bees_custom/models/__init__.py index 0aafc173..93f20f3d 100644 --- a/bees_custom/models/__init__.py +++ b/bees_custom/models/__init__.py @@ -1,3 +1,4 @@ from . import account_invoice from . import product_template from . import pos_order +from . import stock_picking diff --git a/bees_custom/models/stock_picking.py b/bees_custom/models/stock_picking.py new file mode 100644 index 00000000..87232ab5 --- /dev/null +++ b/bees_custom/models/stock_picking.py @@ -0,0 +1,79 @@ +# Copyright 2021 Coop IT Easy SCRL fs +# Carmen Bianca Bakker +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class Picking(models.Model): + _inherit = "stock.picking" + + zero_received_move_ids = fields.One2many( + "stock.move", + string="Stock moves that were not received", + compute="_compute_zero_received", + ) + too_few_received_move_ids = fields.One2many( + "stock.move", + string="Stock moves of which too few were received", + compute="_compute_too_few_received", + ) + too_many_received_move_ids = fields.One2many( + "stock.move", + string="Stock moves of which too many were received", + compute="_compute_too_many_received", + ) + + @api.depends("move_lines") + def _compute_zero_received(self): + for pick in self: + pick.zero_received_move_ids = pick._filtered_moves().filtered( + lambda move: move.quantity_done == 0 and move.product_qty + ) + + @api.depends("move_lines") + def _compute_too_few_received(self): + for pick in self: + pick.too_few_received_move_ids = pick._filtered_moves().filtered( + lambda move: move.quantity_done < move.product_qty + ) + + @api.depends("move_lines") + def _compute_too_many_received(self): + for pick in self: + pick.too_many_received_move_ids = pick._filtered_moves().filtered( + lambda move: move.quantity_done > move.product_qty + ) + + @api.multi + def action_done(self): + self._notify_incorrect_delivery() + + return super(Picking, self).action_done() + + @api.multi + def _notify_incorrect_delivery(self): + """Send a notification e-mail about the incorrect delivery.""" + for pick in self: + if not any( + ( + pick.zero_received_move_ids, + pick.too_few_received_move_ids, + pick.too_many_received_move_ids, + ) + ): + # TODO: Handle this case. + continue + + self.env.ref("bees_custom.mail_template_incorrect_delivery").send_mail( + pick.id + ) + + return True + + @api.multi + def _filtered_moves(self): + return self.mapped("move_lines").filtered( + lambda move: move.state + in ["draft", "waiting", "partially_available", "assigned", "confirmed"] + ) diff --git a/bees_custom/readme/CONTRIBUTORS.rst b/bees_custom/readme/CONTRIBUTORS.rst index e90159c0..43ee7c9d 100644 --- a/bees_custom/readme/CONTRIBUTORS.rst +++ b/bees_custom/readme/CONTRIBUTORS.rst @@ -1,2 +1,3 @@ * Robin Keunen * Houssine Bakkali +* Carmen Bianca Bakker From 9d7e9cc7d77e5dfd3723e6ea95429d3916610815 Mon Sep 17 00:00:00 2001 From: Carmen Bianca Bakker Date: Mon, 13 Dec 2021 18:00:27 +0100 Subject: [PATCH 2/2] fixup! [ADD] bees_custom: Send an e-mail when a stock picking is incomplete --- bees_custom/data/mail_template.xml | 28 +++++++++++----------------- bees_custom/models/stock_picking.py | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/bees_custom/data/mail_template.xml b/bees_custom/data/mail_template.xml index df758d19..351eefa9 100644 --- a/bees_custom/data/mail_template.xml +++ b/bees_custom/data/mail_template.xml @@ -10,49 +10,43 @@ Incorrect Delivery (${object.name}) ${ctx.get('company').email|safe} - ${ctx.get('company').email|safe} ${ctx.get("lang")} - - -

Hello

- + +
+

One or several products in ${object.name} were received in incorrect amounts.

% if object.zero_received_move_ids: -

Zero

+

Zero received:

    % for move in object.zero_received_move_ids: -
  • ${move.name} - ${move.quantity_done} / ${move.product_qty} +
  • ${move.name} --- Received ${move.quantity_done} out of expected ${move.product_qty}
  • % endfor
% endif % if object.too_few_received_move_ids: -

Too few

+

Received too few:

    % for move in object.too_few_received_move_ids: -
  • ${move.name} - ${move.quantity_done} / ${move.product_qty} +
  • ${move.name} --- Received ${move.quantity_done} out of expected ${move.product_qty}
  • % endfor
% endif % if object.too_many_received_move_ids: -

Too many

+

Received too many:

    % for move in object.too_many_received_move_ids: -
  • ${move.name} - ${move.quantity_done} / ${move.product_qty} +
  • ${move.name} --- Received ${move.quantity_done} out of expected ${move.product_qty}
  • % endfor
% endif -

Goodbye.

- +

Please follow up accordingly.

- ]]>
+
diff --git a/bees_custom/models/stock_picking.py b/bees_custom/models/stock_picking.py index 87232ab5..6104dbb5 100644 --- a/bees_custom/models/stock_picking.py +++ b/bees_custom/models/stock_picking.py @@ -24,6 +24,11 @@ class Picking(models.Model): compute="_compute_too_many_received", ) + form_view_url = fields.Char( + string="Form View URL", compute="_compute_form_view_url" + ) + + @api.multi @api.depends("move_lines") def _compute_zero_received(self): for pick in self: @@ -31,6 +36,7 @@ def _compute_zero_received(self): lambda move: move.quantity_done == 0 and move.product_qty ) + @api.multi @api.depends("move_lines") def _compute_too_few_received(self): for pick in self: @@ -38,6 +44,7 @@ def _compute_too_few_received(self): lambda move: move.quantity_done < move.product_qty ) + @api.multi @api.depends("move_lines") def _compute_too_many_received(self): for pick in self: @@ -45,6 +52,16 @@ def _compute_too_many_received(self): lambda move: move.quantity_done > move.product_qty ) + @api.multi + def _compute_form_view_url(self): + for pick in self: + pick.form_view_url = ( + "{}/web#id={}&model=stock.picking&view_type=form".format( + pick.env["ir.config_parameter"].sudo().get_param("web.base.url"), + pick.id, + ) + ) + @api.multi def action_done(self): self._notify_incorrect_delivery()