Chatbot-Backend / public_api /field_mapping.py
srilakshu012456's picture
Create field_mapping.py
3020731 verified
from public_api.public_api_item import get_item
from public_api.utils import humanize_value, translate_velocity, format_hold_type, format_reason_code, format_backend_date, translate_loc_sts
from public_api.public_api_inventory import get_inventory_holds
from public_api.public_api_location import get_location_status
# field_mapping.py
##################################################################
# --- A. Define your translations ---
# Helper for simple flags
#def boolean_to_yesno(val):
# return "Yes" if val is True else "No"
# --- B. Your Configuration Maps ---
# 1. Which fields do you want? (Display Name -> JSON Path)
ITEM_MAPPING = {
"Item": "itemNumber",
"Ignore Pick Consolidation Flag":"itemPickingConfiguration.ignorePickConsolidationFlag",
"Threshold Pick Variance":"itemPickingConfiguration.thresholdPickVariance",
"Color":"color",
"Supplier Lot Flag":"itemAttributes.supplierLotFlag",
#"Lot Format ID":"itemAttributes.lotFormatId",
"Lot Flag":"itemAttributes.lotFlag",
"Revision Flag":"itemAttributes.revisionFlag",
"Origin Flag":"itemAttributes.originFlag",
"Ship Restricted Lot Flag":"itemAttributes.shipRestrictedLotFlag",
"Item Class Name":"itemClassName",
"Department Code":"departmentCode",
"Description": "description",
"Item type":"type",
"Commodity Code":"itemTransportation.commodityCode",
"Is Hazardous": "itemTransportation.hazardousMaterialFlag", # Needs translation
"Report UoM":"reportUom",
"Fit":"fit",
"Aging Profile Name":"itemDateControl.agingProfileName",
"Date Window Value":"itemDateControl.dateWindowValue",
"Shelf Life Time Code":"itemDateControl.shelfLifeTimeCode",
"Date Code":"itemDateControl.dateCode",
"Time To Warn For Expiration":"itemDateControl.timeToWarnForExpiration",
"Date Window Time Code":"itemDateControl.dateWindowTimeCode",
"Shelf Life":"itemDateControl.shelfLife",
"Date Window Type":"itemDateControl.dateWindowType",
"Conveyable Flag":"conveyableFlag",
"Count Near Zero Amount":"itemCountingConfiguration.countNearZeroAmount",
"Adjustment Flag":"itemCountingConfiguration.adjustmentFlag",
"Count Back Flag":"itemCountingConfiguration.countBackFlag",
"Count Near Zero Flag":"itemCountingConfiguration.countNearZeroFlag",
"Count Threshold Unit":"itemCountingConfiguration.countThresholdUnit",
"Count Threshold Cost":"itemCountingConfiguration.countThresholdCost",
"Maximum Extreme Tolerance":"catchConfiguration.maximumExtremeTolerance",
"Catch Unit Type":"catchConfiguration.catchUnitType",
"Maximum Item Tolerance":"catchConfiguration.maximumItemTolerance",
"Minimum Item Tolerance":"catchConfiguration.minimumItemTolerance",
"Average Catch Capture":"catchConfiguration.averageCatchCapture",
"Skip Prompt":"catchConfiguration.skipPrompt",
"Minimum Extreme Tolerance":"catchConfiguration.minimumExtremeTolerance",
"Catch Unit Weight":"catchConfiguration.catchUnitWeight",
"Catch Code":"catchConfiguration.catchCode",
"Catch Unit Cost":"catchConfiguration.catchUnitCost",
"Weight Code":"weightCode",
"Item Hierarchy Name":"itemHierarchyName",
"Receive Flag":"itemReceivingConfiguration.receiveFlag",
"Receive Status":"itemReceivingConfiguration.receiveStatus",
"Item Client ID":"itemClientId",
"ABC Code":"abcCode",
"Unit Cost":"itemCost.unitCost",
"Currency Code":"itemCost.currencyCode",
"Replace Pick Flag":"itemPutawayConfiguration.replacePickFlag",
"Opportunistic Cross Dock Flag":"itemPutawayConfiguration.opportunisticCrossDockFlag",
"Is Default Footprint":"footprints.0.isDefaultFootprint",
"Level Units":"footprints.0.levelUnits",
"Footprint Code":"footprints.0.footprintCode",
"Default LPN Attribute 1":"footprints.0.defaultLpnAttribute1",
"Default LPN Attribute 2":"footprints.0.defaultLpnAttribute2",
"Default LPN Attribute 5":"footprints.0.defaultLpnAttribute5",
#pallet
"Pallet UoM Code":"footprints.0.footprintDetails.0.uomCode",
"Is Pallet Stocking UoM":"footprints.0.footprintDetails.0.isStockingUom",
"Pallet Length":"footprints.0.footprintDetails.0.length",
"Pallet UoM Level":"footprints.0.footprintDetails.0.uomLevel",
"Pallet Net Weight":"footprints.0.footprintDetails.0.netWeight",
"Pallet Gross Weight":"footprints.0.footprintDetails.0.grossWeight",
"Is Pallet Default Receiving UoM":"footprints.0.footprintDetails.0.isDefaultReceivingUom",
"Pallet Unit Quantity":"footprints.0.footprintDetails.0.unitQuantity",
"Pallet Width":"footprints.0.footprintDetails.0.width",
"Is Pallet UoM":"footprints.0.footprintDetails.0.isPalletUom",
"Is Pallet Package UoM":"footprints.0.footprintDetails.0.isPackageUom",
"Is Pallet Case UoM":"footprints.0.footprintDetails.0.isCaseUom",
"Is Pallet Layer UoM":"footprints.0.footprintDetails.0.isLayerUom",
"Pallet Height":"footprints.0.footprintDetails.0.height",
#each
"Each UoM Code":"footprints.0.footprintDetails.1.uomCode",
"Is Each Stocking UoM":"footprints.0.footprintDetails.1.isStockingUom",
"Each Length":"footprints.0.footprintDetails.1.length",
"Each UoM Level":"footprints.0.footprintDetails.1.uomLevel",
"Each Net Weight":"footprints.0.footprintDetails.1.netWeight",
"Each Gross Weight":"footprints.0.footprintDetails.1.grossWeight",
"Is Each Default Receiving UoM":"footprints.0.footprintDetails.1.isDefaultReceivingUom",
"Each Unit Quantity":"footprints.0.footprintDetails.1.unitQuantity",
"Each Width":"footprints.0.footprintDetails.1.width",
"Is Each UoM":"footprints.0.footprintDetails.1.isPalletUom",
"Is Each Package UoM":"footprints.0.footprintDetails.1.isPackageUom",
"Is Each Case UoM":"footprints.0.footprintDetails.1.isCaseUom",
"Is Each Layer UoM":"footprints.0.footprintDetails.1.isLayerUom",
"Each Height":"footprints.0.footprintDetails.1.height",
#case
"Case UoM Code":"footprints.0.footprintDetails.2.uomCode",
"Is Case Stocking UoM":"footprints.0.footprintDetails.2.isStockingUom",
"Case Length":"footprints.0.footprintDetails.2.length",
"Case UoM Level":"footprints.0.footprintDetails.2.uomLevel",
"Case Net Weight":"footprints.0.footprintDetails.2.netWeight",
"Case Gross Weight":"footprints.0.footprintDetails.2.grossWeight",
"Is Case Default Receiving UoM":"footprints.0.footprintDetails.2.isDefaultReceivingUom",
"Case Unit Quantity":"footprints.0.footprintDetails.2.unitQuantity",
"Case Width":"footprints.0.footprintDetails.2.width",
"Is Case UoM":"footprints.0.footprintDetails.2.isPalletUom",
"Is Case Package UoM":"footprints.0.footprintDetails.2.isPackageUom",
"Is Case Case UoM":"footprints.0.footprintDetails.2.isCaseUom",
"Is Case Layer UoM":"footprints.0.footprintDetails.2.isLayerUom",
"Case Height":"footprints.0.footprintDetails.2.height",
"Description":"footprints.0.description",
"Case Level":"footprints.0.caseLevel",
"Default Lpn Attribute 3":"footprints.0.defaultLpnAttribute3",
"Default Lpn Attribute 4":"footprints.0.defaultLpnAttribute4",
"Default Handling Unit":"footprints.0.defaultHandlingUnit",
"Assorted Flag":"assortedFlag",
#"Warehouse ID":"itemId.warehouseId",
#"Item Number":"itemId.itemNumber",
#"Item Client ID":"itemId.itemClientId",
"Size":"size",
"Warehouse ID": "warehouseId",
"Delay Outbound Serial Capture Flag":"itemSerialization.delayOutboundSerialCaptureFlag",
"Serialization Level":"itemSerialization.serializationLevel",
"Serialization Type":"itemSerialization.serializationType",
"Style":"style",
"Velocity Zone Code": "itemVelocity.velocityZoneCode", # Needs translation
"Velocity Zone Recalculation Flag": "itemVelocity.velocityZoneRecalculationFlag", # Often Null
"Load Level":"loadLevel",
}
# 2. How should they look? (Display Name -> Transformer Function)
ITEM_FORMATTERS = {
"Ignore Pick Consolidation Flag":humanize_value,
"Color":humanize_value,
"Supplier Lot Flag":humanize_value,
#"Lot Format ID":"humanize_value,
"Lot Flag":humanize_value,
"Revision Flag":humanize_value,
"Origin Flag":humanize_value,
"Ship Restricted Lot Flag":humanize_value,
"Item Class Name":humanize_value,
"Department Code":humanize_value,
"Commodity Code":humanize_value,
"Is Hazardous":humanize_value,
"Report UoM":humanize_value,
"Fit":humanize_value,
"Aging Profile Name":humanize_value,
"Shelf Life":humanize_value,
"Date Window Type":humanize_value,
"Conveyable Flag":humanize_value,
"Count Near Zero Amount":humanize_value,
"Adjustment Flag":humanize_value,
"Count Back Flag":humanize_value,
"Count Near Zero Flag":humanize_value,
"Maximum Extreme Tolerance":humanize_value,
"Catch Unit Type":humanize_value,
"Maximum Item Tolerance":humanize_value,
"Minimum Item Tolerance":humanize_value,
"Average Catch Capture":humanize_value,
"Skip Prompt":humanize_value,
"Minimum Extreme Tolerance":humanize_value,
"Catch Unit Weight":humanize_value,
"Catch Unit Cost":humanize_value,
"Weight Code":humanize_value,
"Item Hierarchy Name":humanize_value,
"Receive Flag":humanize_value,
#"ABC Code":"abcCode",
"Replace Pick Flag":humanize_value,
"Opportunistic Cross Dock Flag":humanize_value,
"Is Default Footprint":humanize_value,
"Default LPN Attribute 1":humanize_value,
"Default LPN Attribute 2":humanize_value,
"Default LPN Attribute 5":humanize_value,
#pallet
"Is Pallet Stocking UoM":humanize_value,
"Is Pallet Default Receiving UoM":humanize_value,
"Is Pallet UoM":humanize_value,
"Is Pallet Package UoM":humanize_value,
"Is Pallet Case UoM":humanize_value,
"Is Pallet Layer UoM":humanize_value,
#each
"Is Each Stocking UoM":humanize_value,
"Is Each Default Receiving UoM":humanize_value,
"Is Each UoM":humanize_value,
"Is Each Package UoM":humanize_value,
"Is Each Case UoM":humanize_value,
"Is Each Layer UoM":humanize_value,
#case
"Is Case Stocking UoM":humanize_value,
"Is Case Default Receiving UoM":humanize_value,
"Is Case UoM":humanize_value,
"Is Case Package UoM":humanize_value,
"Is Case Case UoM":humanize_value,
"Is Case Layer UoM":humanize_value,
#"Case Level":"footprints.0.caseLevel",
"Default Lpn Attribute 3":humanize_value,
"Default Lpn Attribute 4":humanize_value,
"Assorted Flag":humanize_value,
"Size": humanize_value,
"Delay Outbound Serial Capture Flag":humanize_value,
"Style":humanize_value,
"Velocity Zone Code": translate_velocity, # Needs translation
"Velocity Zone Recalculation Flag": humanize_value # Often Null
}
# field_mapping.py (Add this)
#ITEM_TOOL = {
# "name": "get_item_data",
# "description": "Get real-time warehouse data for a specific item or article number.",
# "parameters": {
# "type": "object",
# "properties": {
# "item_number": {
# "type": "string",
# "description": "The unique item number (e.g., '100002')"
# }
# },
# "required": ["item_number"]
# }
#}
ITEM_TOOL = {
"name": "get_item_data",
"description": ("Retrieve complete real-time warehouse master data for a specific item. "
"Use this for any queries regarding: "
"1. Item Attributes (Lot, Supplier, Revision, Receivable/Receive, Origin flags). "
"2. Picking & Putting Configuration (Consolidation, Thresholds, Cross-dock). "
"3. Dimensions & Footprints (Weights, Heights, and Lengths for Each, Case, or Pallets). "
"4. Date Controls (Shelf life, Aging profiles, and Expiration windows). "
"5. Counting & Tolerance settings (Near zero flags, Catch weights, and extreme tolerances). "
"6. Transportation & Safety (Hazardous material flags and Commodity codes)."),
"parameters": {
"type": "object",
"properties": {
"item_number": {"type": "string", "description": "The item ID (e.g. '100002')"},
#"warehouse_id": {"type": "string", "description": "Warehouse ID. Optional: if not provided, the system uses the user's default session warehouse."},
"fields": {
"type": "array",
"items": {"type": "string"},
"description": "The specific display names of the fields requested by the user (e.g., ['Supplier Lot Flag', 'Color'])."
}
},
"required": ["item_number"]
}
}
HOLD_MAPPING = {
#"Hold Number": "hldnum",
"Warehouse ID": "wh_id",
"Hold Type": "hldtyp",
"Item": "prtnum",
"Item Description": "dsp_prtnum",
"Hold Date": "hlddte",
"User ID": "hld_usr_id",
"Hold Reason Code": "reacod",
"LPN": "lodnum",
"Sub-LPN": "subnum",
"Detail-LPN": "dtlnum",
"Hold Quantity": "untqty"
}
"""
HOLD_TOOL = {
"name": "get_inventory_holds",
"description": "Get inventory hold details by LPN, Load, Sub-load, or Detail ID for a specific warehouse.",
"parameters": {
"type": "object",
"properties": {
"warehouse_id": {"type": "string", "description": "The warehouse ID to filter results (e.g., 'WH1')"},
"lodnum": {"type": "string", "description": "Inventory Load Number/LPN"},
"subnum": {"type": "string", "description": "Inventory Sub Load Number"},
"dtlnum": {"type": "string", "description": "Inventory Detail Number"},
#"lpn": {"type": "string", "description": "License Plate Number"}
},
"required": ["warehouse_id"]
}
}
"""
HOLD_FORMATTERS = {
"Hold Type": format_hold_type,
"Hold Reason Code": format_reason_code,
"Hold Date": format_backend_date
}
HOLD_TOOL = {
"name": "get_inventory_holds",
"description": (
"Retrieve inventory hold records for a warehouse. "
"Use this for ANY query about inventory holds, including: "
"1. Listing ALL holds in a warehouse (when no specific ID is provided). "
"2. Counting the number of hold LPN/inventory. "
"3. Checking a specific LPN, Sub-LPN, or Detail-LPN."
),
"parameters": {
"type": "object",
"properties": {
##"warehouse_id": {
## "type": "string",
## "description": "The warehouse ID. If the user does not specify one, use 'WH1' as the default."
##},
#"warehouse_id": {"type": "string", "description": "The warehouse ID (e.g., 'WH1'). Default to 'WH1' if not specified."},
"lodnum": {"type": "string", "description": "LPN/Inventory/Inventory ID (optional)"},
"subnum": {"type": "string", "description": "Sub-LPN (optional)"},
"dtlnum": {"type": "string", "description": "Detail-LPN (optional)"},
},
"required": []
}
}
LOCATION_STATUS_MAPPING = {
"Location": "stoloc",
"Location Status":"locsts"
}
LOCATION_STATUS_FORMATTERS = {
"Location Status": translate_loc_sts
}
LOCATION_TOOL = {
"name": "get_location_status",
"description": "Check the status of a specific storage location (stoloc/Location).",
"parameters": {
"type": "object",
"properties": {
"stoloc": {
"type": "string",
"description": "The specific storage location or bin name."
},
#"warehouse_id": {
# "type": "string",
# "description": "Optional: Override the default warehouse ID."
#}
},
"required": ["stoloc"] # No longer mandatory for the user to speak it
}
}
TOOL_REGISTRY = {
"get_item_data": {
"function": get_item,
"mapping": ITEM_MAPPING,
"formatters": ITEM_FORMATTERS,
"response_key": "data",
"id_param": "item_number"
},
"get_inventory_holds": {
"function": get_inventory_holds,
"mapping": HOLD_MAPPING,
"formatters": HOLD_FORMATTERS,
"response_key": "data",
"id_param": "lodnum" # Default primary ID to look for
},
"get_location_status": {
"function": get_location_status,
"mapping": LOCATION_STATUS_MAPPING,
"formatters": LOCATION_STATUS_FORMATTERS,
"response_key": "data",
"id_param": "stoloc"
}
}
# Used in the Gemini API Payload
ALL_TOOLS = [ITEM_TOOL,HOLD_TOOL,LOCATION_TOOL]