Hello Odoo Community,
I'm currently working on optimizing my delivery and picking processes in Odoo, and I'm seeking guidance on implementing a specific logic using Automated Actions and Python code.
Objective:
When a customer places an order, I want Odoo to intelligently determine from which warehouse the order should be picked based on the availability of the products in different warehouses.
Logic Overview:
I've already devised a Python function that efficiently distributes the order quantity among different warehouses based on their availability. Here's a simplified version of the logic:
def fulfill_order(main_qty, C_qty, B_qty, A_qty, order_qty):
def find_most_products(warehouses):
# Prioritize C > B > A
warehouse_order = [C_qty, B_qty, A_qty]
max_index = max(range(len(warehouses)), key=lambda i: (warehouses[i], -warehouse_order[i]))
return max_index
total_available_qty = main_qty + C_qty + B_qty + A_qty
print(f"Order Quantity: {order_qty}")
print("Initial product availability:")
print(f"- Main Warehouse: {main_qty}")
print(f"- Warehouse C: {C_qty}")
print(f"- Warehouse B: {B_qty}")
print(f"- Warehouse A: {A_qty}\n")
main_taken = min(main_qty, order_qty)
main_qty -= main_taken
order_qty -= main_taken
def distribute_from_warehouses(qty, warehouses):
distributed = [0, 0, 0]
for _ in range(qty):
if sum(warehouses) == 0:
break
most_products_index = find_most_products(warehouses)
distributed[most_products_index] += 1
warehouses[most_products_index] -= 1
return distributed
distributed_qty = distribute_from_warehouses(order_qty, [C_qty, B_qty, A_qty])
C_qty -= distributed_qty[0]
B_qty -= distributed_qty[1]
A_qty -= distributed_qty[2]
print("Products distributed:")
if main_taken > 0:
print(f"- {main_taken} products from Main Warehouse")
if distributed_qty[0] > 0:
print(f"- {distributed_qty[0]} products from Warehouse C")
if distributed_qty[1] > 0:
print(f"- {distributed_qty[1]} products from Warehouse B")
if distributed_qty[2] > 0:
print(f"- {distributed_qty[2]} products from Warehouse A")
print(f"\nRemaining product availability:")
print(f"- Main Warehouse: {main_qty}")
print(f"- Warehouse C: {C_qty}")
print(f"- Warehouse B: {B_qty}")
print(f"- Warehouse A: {A_qty}")
remaining_qty = order_qty - sum(distributed_qty)
if remaining_qty > 0:
print(f"\n{remaining_qty} products are not available")
# Example usage
main_qty = int(input("How many products are available in Main Warehouse? "))
C_qty = int(input("How many products are available in Warehouse C? "))
B_qty = int(input("How many products are available in Warehouse B? "))
A_qty = int(input("How many products are available in Warehouse A? "))
order_qty = int(input("How many products did the customer order? "))
fulfill_order(main_qty, C_qty, B_qty, A_qty, order_qty)
Scenario: I have multiple warehouses where A, B, and C also function as points of sale with a depot inside, while the main warehouse is solely for storage and not a point of sale.
Question: How can I integrate this Python logic into Odoo using Automated Actions? Specifically, I want Odoo to automatically execute this Python function whenever a new order is placed, so the system can determine the optimal warehouse for picking.
Additional Notes:
- I understand that Automated Actions allow for triggering actions based on specific events in Odoo.
- I'm not entirely sure about the process of executing custom Python code within an Automated Action in Odoo.
- Any insights, examples, or pointers on how to achieve this integration would be greatly appreciated.
- You can copy paste the code and try it for your self with different scenarios so you can better understand the logic I want to impliment
- You can ask me any questions for more clarifications I'll answer as soon as I can
- Any help is greatly appreciated
Thank you in advance for your assistance!
Best regards,
Skander
very good question! did you find the solution "to intelligently determine from which warehouse the order should be picked based on the availability of the products in different warehouses"?