botserver/templates/erp.gbai/erp.gbdialog/inventory-management.bas
Rodrigo Rodriguez (Pragmatismo) 5d21bba1e1 ``` Add KB Statistics keywords and infrastructure documentation
- 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
2025-11-30 16:25:51 -03:00

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