diff --git a/wms_connector/__manifest__.py b/wms_connector/__manifest__.py
index 8cb405b8912..9e98ded6e97 100644
--- a/wms_connector/__manifest__.py
+++ b/wms_connector/__manifest__.py
@@ -17,6 +17,6 @@
"views/stock_warehouse.xml",
],
"demo": [
- "demo/storage_backend.xml",
+ "demo/fs_storage.xml",
],
}
diff --git a/wms_connector/demo/storage_backend.xml b/wms_connector/demo/fs_storage.xml
similarity index 59%
rename from wms_connector/demo/storage_backend.xml
rename to wms_connector/demo/fs_storage.xml
index 265fa10a05f..55804823e0b 100644
--- a/wms_connector/demo/storage_backend.xml
+++ b/wms_connector/demo/fs_storage.xml
@@ -3,9 +3,10 @@
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
-
+
Demo WMS backend
- /
+ odoofs
+ demo_wms_storage
diff --git a/wms_connector/models/attachment_queue.py b/wms_connector/models/attachment_queue.py
index 5293e468e5e..ca9facff0cb 100644
--- a/wms_connector/models/attachment_queue.py
+++ b/wms_connector/models/attachment_queue.py
@@ -6,6 +6,7 @@
WMS_IMPORT_FILETYPES = [
("wms_reception_confirmed", "WMS Reception confirmed"),
("wms_delivery_confirmed", "WMS Delivery confirmed"),
+ ("wms_update_inventory", "WMS inventory update"),
]
@@ -13,6 +14,24 @@ class AttachmentQueue(models.Model):
_inherit = "attachment.queue"
file_type = fields.Selection(selection_add=WMS_IMPORT_FILETYPES)
+ default_warehouse_id = fields.Many2one(
+ "stock.warehouse", compute="_compute_default_warehouse", store=True
+ )
+
+ def _compute_default_warehouse(self):
+ for rec in self:
+ task_queue_prefix = None
+ if rec.file_type == "wms_reception_confirmed":
+ task_queue_prefix = "wms_import_confirm_reception"
+ elif rec.file_type == "wms_delivery_confirmed":
+ task_queue_prefix = "wms_import_confirm_delivery"
+ elif rec.file_type == "wms_update_inventory":
+ task_queue_prefix = "wms_import_update_inventory"
+
+ if task_queue_prefix is not None:
+ rec.default_warehouse_id = rec.env["stock.warehouse"].search(
+ [(f"{task_queue_prefix}_task_id.attachment_ids", "=", rec.id)]
+ )
def _run(self):
for filetype in [el[0] for el in WMS_IMPORT_FILETYPES]:
@@ -25,3 +44,6 @@ def _run_wms_reception_confirmed(self):
def _run_wms_delivery_confirmed(self):
raise NotImplementedError
+
+ def _run_wms_update_inventory(self):
+ raise NotImplementedError
diff --git a/wms_connector/models/attachment_synchronize_task.py b/wms_connector/models/attachment_synchronize_task.py
index b1263521671..db252a943ef 100644
--- a/wms_connector/models/attachment_synchronize_task.py
+++ b/wms_connector/models/attachment_synchronize_task.py
@@ -7,10 +7,19 @@
class AttachmentSynchronizeTask(models.Model):
_inherit = "attachment.synchronize.task"
+ default_warehouse_id = fields.Many2one("stock.warehouse")
+
file_type = fields.Selection(
selection_add=[
("export", "Export"),
("wms_reception_confirmed", "Reception confirmed"),
("wms_delivery_confirmed", "Delivery confirmed"),
+ ("wms_update_inventory", "Inventory update"),
]
)
+
+ def _prepare_attachment_vals(self, data, filename):
+ self.ensure_one()
+ vals = super()._prepare_attachment_vals(data, filename)
+ vals["default_warehouse_id"] = self.default_warehouse_id.id
+ return vals
diff --git a/wms_connector/models/stock_warehouse.py b/wms_connector/models/stock_warehouse.py
index 54f56dd4af0..e2cbf4e14a9 100644
--- a/wms_connector/models/stock_warehouse.py
+++ b/wms_connector/models/stock_warehouse.py
@@ -80,6 +80,15 @@
"name_fragment": "delivery confirmation",
"code": "env['stock.warehouse'].browse({}).{}.run_import()",
},
+ "inventory": {
+ "fieldname_task": "wms_import_update_inventory_task_id",
+ "fieldname_cron": "wms_import_update_inventory_cron_id",
+ "filetype": "wms_update_inventory",
+ "method_type": "import",
+ "filepath": "OUT/",
+ "name_fragment": "Update inventory",
+ "code": "env['stock.warehouse'].browse({}).{}.run_import()",
+ },
}
@@ -96,11 +105,15 @@ class StockWarehouse(models.Model):
wms_import_confirm_delivery_task_id = fields.Many2one(
"attachment.synchronize.task", readonly=True
)
+ wms_import_update_inventory_task_id = fields.Many2one(
+ "attachment.synchronize.task", readonly=True
+ )
wms_export_product_cron_id = fields.Many2one("ir.cron", readonly=True)
wms_export_picking_in_cron_id = fields.Many2one("ir.cron", readonly=True)
wms_export_picking_out_cron_id = fields.Many2one("ir.cron", readonly=True)
wms_import_confirm_reception_cron_id = fields.Many2one("ir.cron", readonly=True)
wms_import_confirm_delivery_cron_id = fields.Many2one("ir.cron", readonly=True)
+ wms_import_update_inventory_cron_id = fields.Many2one("ir.cron", readonly=True)
wms_export_product_filter_id = fields.Many2one("ir.filters")
wms_export_picking_in_filter_id = fields.Many2one("ir.filters")
wms_export_picking_out_filter_id = fields.Many2one("ir.filters")
@@ -185,8 +198,8 @@ def _prepare_wms_task_vals(
"name": "WMS task for {} {}".format(self.name, name_fragment),
"method_type": method_type,
"filepath": filepath,
- "backend_id": self.env.ref("storage_backend.default_storage_backend").id,
"file_type": filetype,
+ "default_warehouse_id": self.id,
}
def _prepare_wms_cron_vals(self, code="", name_fragment=""):
diff --git a/wms_connector/models/synchronize_exportable_mixin.py b/wms_connector/models/synchronize_exportable_mixin.py
index cf409e251e1..e7b892af61c 100644
--- a/wms_connector/models/synchronize_exportable_mixin.py
+++ b/wms_connector/models/synchronize_exportable_mixin.py
@@ -6,7 +6,7 @@
import datetime
from io import StringIO
-from odoo import fields, models
+from odoo import api, fields, models
from odoo.tools import config
@@ -56,7 +56,7 @@ def _get_export_data(self, raise_error=False):
def synchronize_export(self, raise_error=False):
attachments = self.env["attachment.queue"]
for records, data in self._get_export_data(raise_error=raise_error):
- vals = self._format_to_exportfile(data)
+ vals = records._format_to_exportfile(data)
attachment = self.env["attachment.queue"].create(vals)
records.track_export(attachment)
attachments |= attachment
@@ -75,8 +75,8 @@ def _get_wms_export_task(self):
# TODO cleanup this code
# We should just have a method that return the data
# and a generic one that return the vals
- def _format_to_exportfile(self, name, data):
- return self._format_to_exportfile_csv(name, data)
+ def _format_to_exportfile(self, data):
+ return self._format_to_exportfile_csv(data)
def _format_to_exportfile_csv(self, data):
csv_file = StringIO()
@@ -98,10 +98,11 @@ def _format_to_exportfile_csv(self, data):
def _get_export_name(self):
raise NotImplementedError
+ @api.model
def _schedule_export(self, warehouse, domain=False):
if not domain:
domain = []
recs = self.search(domain)
if not recs:
- return
- recs.with_context(warehouse=warehouse).synchronize_export()
+ return self.env["attachment.queue"]
+ return recs.with_context(warehouse=warehouse).synchronize_export()
diff --git a/wms_connector/models/wms_product_sync.py b/wms_connector/models/wms_product_sync.py
index cc9bef3b5f8..9264c528e8c 100644
--- a/wms_connector/models/wms_product_sync.py
+++ b/wms_connector/models/wms_product_sync.py
@@ -23,6 +23,7 @@ def _compute_to_export(self):
for record in self:
record.to_export = True
+ @api.model
def _schedule_export(self, warehouse, domain=False):
warehouse.refresh_wms_products()
return super()._schedule_export(warehouse, domain)
diff --git a/wms_connector/tests/common.py b/wms_connector/tests/common.py
index 4428dd60c4e..19d083eadbc 100644
--- a/wms_connector/tests/common.py
+++ b/wms_connector/tests/common.py
@@ -17,7 +17,7 @@ def setUp(self):
@classmethod
def setUpClass(cls):
super().setUpClass()
- cls.backend = cls.env.ref("wms_connector.demo_wms_backend")
+ cls.backend = cls.env.ref("wms_connector.demo_wms_storage")
cls.backend.directory_path = str(uuid.uuid1()) + "/"
cls.aq_before = cls.env["attachment.queue"].search([])
cls.warehouse = cls.env.ref("stock.warehouse0")
diff --git a/wms_connector/views/stock_warehouse.xml b/wms_connector/views/stock_warehouse.xml
index 61f547f9d49..f106eaab273 100644
--- a/wms_connector/views/stock_warehouse.xml
+++ b/wms_connector/views/stock_warehouse.xml
@@ -46,6 +46,7 @@
+
@@ -53,6 +54,7 @@
+