- Add KB Statistics keywords for Qdrant vector database monitoring: KB STATISTICS, KB COLLECTION STATS, KB DOCUMENTS COUNT, KB DOCUMENTS ADDED SINCE, KB LIST COLLECTIONS, KB STORAGE SIZE - Add comprehensive infrastructure documentation: - Scaling and load balancing with LXC containers - Infrastructure design with encryption, sharding strategies - Observ
343 lines
12 KiB
QBasic
343 lines
12 KiB
QBasic
PARAM action AS STRING LIKE "check_stock" DESCRIPTION "Action: receive_inventory, ship_inventory, check_stock, transfer_stock, cycle_count"
|
|
PARAM item_data AS OBJECT LIKE "{po_number: 'PO-123'}" DESCRIPTION "Data object with action-specific parameters"
|
|
|
|
DESCRIPTION "Manage inventory operations - receive, ship, check stock, transfer between warehouses, and cycle counts"
|
|
|
|
user_id = GET "session.user_id"
|
|
warehouse_id = GET "session.warehouse_id"
|
|
|
|
IF action = "receive_inventory" THEN
|
|
po_number = item_data.po_number
|
|
po = FIND "purchase_orders", "po_number = '" + po_number + "'"
|
|
|
|
IF NOT po THEN
|
|
TALK "Purchase order not found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
IF po.status = "received" THEN
|
|
TALK "This PO has already been received."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
po_lines = FIND "purchase_order_lines", "po_id = '" + po.id + "'"
|
|
|
|
FOR EACH line IN po_lines
|
|
item = FIND "items", "id = '" + line.item_id + "'"
|
|
|
|
TALK "Receiving " + item.name + " - Ordered: " + line.quantity_ordered
|
|
TALK "Enter quantity received:"
|
|
HEAR qty_received AS INTEGER
|
|
|
|
stock = FIND "inventory_stock", "item_id = '" + item.id + "' AND warehouse_id = '" + warehouse_id + "'"
|
|
|
|
IF NOT stock THEN
|
|
WITH newStock
|
|
id = FORMAT(GUID())
|
|
item_id = item.id
|
|
warehouse_id = warehouse_id
|
|
quantity_on_hand = qty_received
|
|
last_movement_date = NOW()
|
|
END WITH
|
|
SAVE "inventory_stock", newStock
|
|
ELSE
|
|
new_qty = stock.quantity_on_hand + qty_received
|
|
UPDATE "inventory_stock" SET quantity_on_hand = new_qty, last_movement_date = NOW() WHERE id = stock.id
|
|
END IF
|
|
|
|
WITH transaction
|
|
id = FORMAT(GUID())
|
|
transaction_type = "receipt"
|
|
transaction_number = "REC-" + FORMAT(NOW(), "YYYYMMDD") + "-" + FORMAT(RANDOM(1000, 9999))
|
|
item_id = item.id
|
|
warehouse_id = warehouse_id
|
|
quantity = qty_received
|
|
unit_cost = line.unit_price
|
|
total_cost = qty_received * line.unit_price
|
|
reference_type = "purchase_order"
|
|
reference_id = po.id
|
|
created_by = user_id
|
|
created_at = NOW()
|
|
END WITH
|
|
|
|
SAVE "inventory_transactions", transaction
|
|
UPDATE "purchase_order_lines" SET quantity_received = line.quantity_received + qty_received WHERE id = line.id
|
|
UPDATE "items" SET last_cost = line.unit_price WHERE id = item.id
|
|
NEXT
|
|
|
|
UPDATE "purchase_orders" SET status = "received" WHERE id = po.id
|
|
|
|
TALK "Purchase order " + po_number + " received."
|
|
SEND EMAIL po.buyer_id, "PO Received", "PO " + po_number + " received at warehouse " + warehouse_id
|
|
|
|
RETURN po_number
|
|
END IF
|
|
|
|
IF action = "ship_inventory" THEN
|
|
so_number = item_data.so_number
|
|
so = FIND "sales_orders", "order_number = '" + so_number + "'"
|
|
|
|
IF NOT so THEN
|
|
TALK "Sales order not found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
so_lines = FIND "sales_order_lines", "order_id = '" + so.id + "'"
|
|
can_ship = true
|
|
|
|
FOR EACH line IN so_lines
|
|
item = FIND "items", "id = '" + line.item_id + "'"
|
|
stock = FIND "inventory_stock", "item_id = '" + item.id + "' AND warehouse_id = '" + warehouse_id + "'"
|
|
|
|
IF NOT stock OR stock.quantity_available < line.quantity_ordered THEN
|
|
TALK "Insufficient stock for " + item.name
|
|
can_ship = false
|
|
END IF
|
|
NEXT
|
|
|
|
IF NOT can_ship THEN
|
|
TALK "Cannot ship order due to insufficient inventory."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
shipment_number = "SHIP-" + FORMAT(NOW(), "YYYYMMDD") + "-" + FORMAT(RANDOM(1000, 9999))
|
|
|
|
FOR EACH line IN so_lines
|
|
item = FIND "items", "id = '" + line.item_id + "'"
|
|
stock = FIND "inventory_stock", "item_id = '" + item.id + "' AND warehouse_id = '" + warehouse_id + "'"
|
|
|
|
new_qty = stock.quantity_on_hand - line.quantity_ordered
|
|
UPDATE "inventory_stock" SET quantity_on_hand = new_qty, last_movement_date = NOW() WHERE id = stock.id
|
|
|
|
WITH transaction
|
|
id = FORMAT(GUID())
|
|
transaction_type = "shipment"
|
|
transaction_number = shipment_number
|
|
item_id = item.id
|
|
warehouse_id = warehouse_id
|
|
quantity = 0 - line.quantity_ordered
|
|
unit_cost = item.average_cost
|
|
total_cost = line.quantity_ordered * item.average_cost
|
|
reference_type = "sales_order"
|
|
reference_id = so.id
|
|
created_by = user_id
|
|
created_at = NOW()
|
|
END WITH
|
|
|
|
SAVE "inventory_transactions", transaction
|
|
UPDATE "sales_order_lines" SET quantity_shipped = line.quantity_ordered, cost_of_goods_sold = transaction.total_cost WHERE id = line.id
|
|
NEXT
|
|
|
|
UPDATE "sales_orders" SET status = "shipped" WHERE id = so.id
|
|
|
|
TALK "Order " + so_number + " shipped. Tracking: " + shipment_number
|
|
|
|
customer = FIND "customers", "id = '" + so.customer_id + "'"
|
|
IF customer AND customer.email THEN
|
|
SEND EMAIL customer.email, "Order Shipped", "Your order " + so_number + " has been shipped. Tracking: " + shipment_number
|
|
END IF
|
|
|
|
RETURN shipment_number
|
|
END IF
|
|
|
|
IF action = "check_stock" THEN
|
|
item_search = item_data.item_search
|
|
items = FIND "items", "name LIKE '%" + item_search + "%' OR item_code = '" + item_search + "'"
|
|
|
|
IF NOT items THEN
|
|
TALK "No items found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
FOR EACH item IN items
|
|
TALK "Item: " + item.name + " (" + item.item_code + ")"
|
|
|
|
stocks = FIND "inventory_stock", "item_id = '" + item.id + "'"
|
|
|
|
total_on_hand = 0
|
|
total_available = 0
|
|
|
|
FOR EACH stock IN stocks
|
|
warehouse = FIND "warehouses", "id = '" + stock.warehouse_id + "'"
|
|
TALK " " + warehouse.name + ": " + stock.quantity_on_hand + " on hand"
|
|
total_on_hand = total_on_hand + stock.quantity_on_hand
|
|
total_available = total_available + stock.quantity_available
|
|
NEXT
|
|
|
|
TALK " TOTAL: " + total_on_hand + " on hand, " + total_available + " available"
|
|
|
|
IF total_available < item.minimum_stock_level THEN
|
|
TALK " WARNING: Below minimum stock level (" + item.minimum_stock_level + ")"
|
|
IF item.reorder_point > 0 AND total_available <= item.reorder_point THEN
|
|
TALK " REORDER NEEDED! Qty: " + item.reorder_quantity
|
|
CREATE_TASK "Reorder " + item.name, "high", user_id
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
RETURN items
|
|
END IF
|
|
|
|
IF action = "transfer_stock" THEN
|
|
TALK "Enter item code:"
|
|
HEAR item_code AS STRING
|
|
|
|
item = FIND "items", "item_code = '" + item_code + "'"
|
|
|
|
IF NOT item THEN
|
|
TALK "Item not found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
TALK "From warehouse code:"
|
|
HEAR from_warehouse_code AS STRING
|
|
|
|
from_warehouse = FIND "warehouses", "code = '" + from_warehouse_code + "'"
|
|
|
|
IF NOT from_warehouse THEN
|
|
TALK "Source warehouse not found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
from_stock = FIND "inventory_stock", "item_id = '" + item.id + "' AND warehouse_id = '" + from_warehouse.id + "'"
|
|
|
|
IF NOT from_stock THEN
|
|
TALK "No stock in source warehouse."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
TALK "Available: " + from_stock.quantity_available
|
|
TALK "Transfer quantity:"
|
|
HEAR transfer_qty AS INTEGER
|
|
|
|
IF transfer_qty > from_stock.quantity_available THEN
|
|
TALK "Insufficient available quantity."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
TALK "To warehouse code:"
|
|
HEAR to_warehouse_code AS STRING
|
|
|
|
to_warehouse = FIND "warehouses", "code = '" + to_warehouse_code + "'"
|
|
|
|
IF NOT to_warehouse THEN
|
|
TALK "Destination warehouse not found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
transfer_number = "TRAN-" + FORMAT(NOW(), "YYYYMMDD") + "-" + FORMAT(RANDOM(1000, 9999))
|
|
|
|
new_from_qty = from_stock.quantity_on_hand - transfer_qty
|
|
UPDATE "inventory_stock" SET quantity_on_hand = new_from_qty, last_movement_date = NOW() WHERE id = from_stock.id
|
|
|
|
WITH from_transaction
|
|
id = FORMAT(GUID())
|
|
transaction_type = "transfer_out"
|
|
transaction_number = transfer_number
|
|
item_id = item.id
|
|
warehouse_id = from_warehouse.id
|
|
quantity = 0 - transfer_qty
|
|
unit_cost = item.average_cost
|
|
created_by = user_id
|
|
created_at = NOW()
|
|
END WITH
|
|
|
|
SAVE "inventory_transactions", from_transaction
|
|
|
|
to_stock = FIND "inventory_stock", "item_id = '" + item.id + "' AND warehouse_id = '" + to_warehouse.id + "'"
|
|
|
|
IF NOT to_stock THEN
|
|
WITH newToStock
|
|
id = FORMAT(GUID())
|
|
item_id = item.id
|
|
warehouse_id = to_warehouse.id
|
|
quantity_on_hand = transfer_qty
|
|
last_movement_date = NOW()
|
|
END WITH
|
|
SAVE "inventory_stock", newToStock
|
|
ELSE
|
|
new_to_qty = to_stock.quantity_on_hand + transfer_qty
|
|
UPDATE "inventory_stock" SET quantity_on_hand = new_to_qty, last_movement_date = NOW() WHERE id = to_stock.id
|
|
END IF
|
|
|
|
WITH to_transaction
|
|
id = FORMAT(GUID())
|
|
transaction_type = "transfer_in"
|
|
transaction_number = transfer_number
|
|
item_id = item.id
|
|
warehouse_id = to_warehouse.id
|
|
quantity = transfer_qty
|
|
unit_cost = item.average_cost
|
|
created_by = user_id
|
|
created_at = NOW()
|
|
END WITH
|
|
|
|
SAVE "inventory_transactions", to_transaction
|
|
|
|
TALK "Transfer " + transfer_number + " completed: " + transfer_qty + " units from " + from_warehouse.name + " to " + to_warehouse.name
|
|
|
|
RETURN transfer_number
|
|
END IF
|
|
|
|
IF action = "cycle_count" THEN
|
|
TALK "Enter warehouse code:"
|
|
HEAR warehouse_code AS STRING
|
|
|
|
warehouse = FIND "warehouses", "code = '" + warehouse_code + "'"
|
|
|
|
IF NOT warehouse THEN
|
|
TALK "Warehouse not found."
|
|
RETURN NULL
|
|
END IF
|
|
|
|
stocks = FIND "inventory_stock", "warehouse_id = '" + warehouse.id + "'"
|
|
|
|
count_number = "COUNT-" + FORMAT(NOW(), "YYYYMMDD") + "-" + FORMAT(RANDOM(1000, 9999))
|
|
adjustments = 0
|
|
|
|
FOR EACH stock IN stocks
|
|
item = FIND "items", "id = '" + stock.item_id + "'"
|
|
|
|
TALK "Item: " + item.name + " (" + item.item_code + ")"
|
|
TALK "System quantity: " + stock.quantity_on_hand
|
|
TALK "Enter physical count:"
|
|
HEAR physical_count AS INTEGER
|
|
|
|
IF physical_count <> stock.quantity_on_hand THEN
|
|
variance = physical_count - stock.quantity_on_hand
|
|
|
|
WITH adjustment
|
|
id = FORMAT(GUID())
|
|
transaction_type = "adjustment"
|
|
transaction_number = count_number
|
|
item_id = item.id
|
|
warehouse_id = warehouse.id
|
|
quantity = variance
|
|
notes = "Cycle count adjustment"
|
|
created_by = user_id
|
|
created_at = NOW()
|
|
END WITH
|
|
|
|
SAVE "inventory_transactions", adjustment
|
|
|
|
UPDATE "inventory_stock" SET quantity_on_hand = physical_count, last_counted_date = NOW(), last_movement_date = NOW() WHERE id = stock.id
|
|
|
|
adjustments = adjustments + 1
|
|
TALK " Adjusted by " + variance + " units"
|
|
ELSE
|
|
UPDATE "inventory_stock" SET last_counted_date = NOW() WHERE id = stock.id
|
|
TALK " Count confirmed"
|
|
END IF
|
|
NEXT
|
|
|
|
TALK "Cycle count " + count_number + " completed with " + adjustments + " adjustments"
|
|
|
|
IF adjustments > 0 THEN
|
|
SEND EMAIL "inventory-manager@company.com", "Cycle Count Results", "Cycle count " + count_number + " at " + warehouse.name + " with " + adjustments + " adjustments"
|
|
END IF
|
|
|
|
RETURN count_number
|
|
END IF
|
|
|
|
TALK "Unknown action: " + action
|
|
RETURN NULL
|