From a4f0a0846924f91bc215131f6fd6e84c8723c2fe Mon Sep 17 00:00:00 2001
From: laurentbarontini
Date: Mon, 2 Feb 2026 17:27:14 +0100
Subject: [PATCH] 02.02.26
---
modules/automation/cron.py | 2 +-
modules/purchase_trade/stock.py | 53 ++++++++++++++-----
.../purchase_trade/view/shipment_in_form.xml | 2 +-
3 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/modules/automation/cron.py b/modules/automation/cron.py
index 0f321bc..1c5c491 100644
--- a/modules/automation/cron.py
+++ b/modules/automation/cron.py
@@ -310,7 +310,7 @@ class AutomationCron(ModelSQL, ModelView):
ShipmentIn.save([shipment])
shipment._create_lots_from_fintrade()
shipment.controller = shipment.get_controller()
- shipment.instructions = shipment.get_instructions()
+ shipment.instructions = shipment.get_instructions_html()
ShipmentIn.save([shipment])
trans_shipment.commit()
successful_shipments += 1
diff --git a/modules/purchase_trade/stock.py b/modules/purchase_trade/stock.py
index 28e6d08..f379cca 100755
--- a/modules/purchase_trade/stock.py
+++ b/modules/purchase_trade/stock.py
@@ -23,6 +23,9 @@ import io
import base64
import logging
import json
+import re
+import html
+
logger = logging.getLogger(__name__)
@@ -462,26 +465,46 @@ class ShipmentIn(metaclass=PoolMeta):
for c in controllers:
if c.party.IsAvailableForControl(self):
return c.party
-
- def get_instructions(self):
+
+ def get_instructions_html(self):
lines = [
- "Hi,",
- "",
- "Please find details below for the requested control",
- f"BL number: {self.bl_number}",
- ""
+ "Hi,
",
+ "Please find details below for the requested control
",
+ f"BL number: {self.bl_number}
",
]
if self.incoming_moves:
for m in self.incoming_moves:
if m.lot:
lines.append(
- f"Lot nb: {m.lot.lot_name} | "
- f"Net Qt: {m.lot.get_current_quantity()} {m.lot.lot_unit.symbol} | "
- f"Gross Qt: {m.lot.get_current_gross_quantity()} {m.lot.lot_unit.symbol}"
+ ""
+ f"Lot nb: {m.lot.lot_name} | "
+ f"Net Qt: {m.lot.get_current_quantity()} {m.lot.lot_unit.symbol} | "
+ f"Gross Qt: {m.lot.get_current_gross_quantity()} {m.lot.lot_unit.symbol}"
+ "
"
)
- return "\n".join(lines)
+ return "".join(lines)
+
+ # def get_instructions(self):
+ # lines = [
+ # "Hi,",
+ # "",
+ # "Please find details below for the requested control",
+ # f"BL number: {self.bl_number}",
+ # ""
+ # ]
+
+ # if self.incoming_moves:
+ # for m in self.incoming_moves:
+ # if m.lot:
+ # lines.append(
+ # f"Lot nb: {m.lot.lot_name} | "
+ # f"Net Qt: {m.lot.get_current_quantity()} {m.lot.lot_unit.symbol} | "
+ # f"Gross Qt: {m.lot.get_current_gross_quantity()} {m.lot.lot_unit.symbol}"
+ # )
+
+ # return "\n".join(lines)
def _create_lots_from_fintrade(self):
t = Table('freight_booking_lots')
@@ -653,6 +676,12 @@ class ShipmentIn(metaclass=PoolMeta):
return sale_line
+ def html_to_text(self,html_content):
+ text = re.sub(r"
", "\n", html_content, flags=re.IGNORECASE)
+ text = re.sub(r"
", "\n\n", text, flags=re.IGNORECASE)
+ text = re.sub(r"<[^>]+>", "", text)
+ return html.unescape(text).strip()
+
@classmethod
@ModelView.button
def send(cls, shipments):
@@ -668,7 +697,7 @@ class ShipmentIn(metaclass=PoolMeta):
payload = {
"to": [contact[0].value],
"subject": "Request for control",
- "body": sh.instructions,
+ "body": sh.html_to_text(sh.instructions),
# "attachments": [
# {
# "filename": "instruction.pdf",
diff --git a/modules/purchase_trade/view/shipment_in_form.xml b/modules/purchase_trade/view/shipment_in_form.xml
index 8c2a3d9..1e0e20f 100755
--- a/modules/purchase_trade/view/shipment_in_form.xml
+++ b/modules/purchase_trade/view/shipment_in_form.xml
@@ -125,7 +125,7 @@ this repository contains the full copyright notices and license terms. -->
-
+