/** * Vending Machine Manuals Configuration * Comprehensive manufacturer lists and machine type categories */ export interface ManufacturerInfo { name: string aliases: string[] brands?: string[] // Sub-brands } export interface MachineTypeInfo { name: string keywords: string[] aliases: string[] description: string } /** * Comprehensive list of vending machine manufacturers * Includes aliases and sub-brands for better detection */ export const MANUFACTURERS: ManufacturerInfo[] = [ { name: "Crane", aliases: [ "crane", "cpi", "crane payment innovations", "crane merchandising", ], brands: [ "BevMax", "Merchant Series", "National Vendors", "Merchant", "Bev Max", ], }, { name: "AMS", aliases: [ "ams", "automated merchandising systems", "automated merchandising", ], }, { name: "Dixie-Narco", aliases: ["dixie narco", "dixie", "narco", "dixie-narco"], }, { name: "Royal Vendors", aliases: ["royal vendors", "royal", "royal vendor"], }, { name: "Vendo", aliases: ["vendo", "sandenvendo", "sanden vendo"], }, { name: "Seaga", aliases: ["seaga", "seaga manufacturing"], }, { name: "USI", aliases: ["usi", "united standard industries", "u-select-it", "uselectit"], }, { name: "AP", aliases: [ "ap", "automatic products", "api", "automatic products international", ], }, { name: "Quick Fresh Vending", aliases: ["quick fresh", "qfv", "quick fresh vending"], }, { name: "GPL", aliases: ["gpl", "general products limited"], }, { name: "HealthyYOU Vending", aliases: ["healthyyou", "healthy you", "healthyyou vending"], }, { name: "Wittern Group", aliases: ["wittern", "wittern group"], }, { name: "Tomra", aliases: ["tomra"], }, { name: "Selecta", aliases: ["selecta"], }, { name: "Necta", aliases: ["necta"], }, { name: "Fas International", aliases: ["fas", "fas international"], }, { name: "Jofemar", aliases: ["jofemar"], }, { name: "Coinco", aliases: ["coinco"], }, { name: "Conlux", aliases: ["conlux"], }, { name: "MEI-Mars", aliases: ["mei", "mars", "mei-mars", "mei mars", "meiglobal"], }, ] /** * Machine type categories with keywords for detection */ export const MACHINE_TYPES: MachineTypeInfo[] = [ { name: "Snack", keywords: [ "snack", "snk", "snacks", "chips", "candy", "granola", "pretzel", "snackshop", "snackmart", "snackcenter", "snacktron", "snackvendor", "glassfront snack", "confectionery", ], aliases: [ "snack machine", "snack vendor", "snack vending", "snack machine", ], description: "Snack vending machines that dispense packaged snacks", }, { name: "Beverage", keywords: [ "beverage", "bev", "drink", "drinks", "soda", "cold", "bottle", "can", "canned", "bevmax", "coldtron", "cold drink", "can drink", "bottledrop", "glassfront beverage", "glass front beverage", ], aliases: [ "beverage machine", "drink machine", "beverage vendor", "cold drink", "soda machine", "drink vendor", ], description: "Cold beverage vending machines for sodas, water, and drinks", }, { name: "Combo", keywords: [ "combo", "combination", "snack-drink", "snack drink", "snack and drink", "refreshment center", "snack beverage", "snacks beverage", "snacks coffee", "dual zone", "dzf", "szf", ], aliases: [ "combo machine", "combination machine", "combo vendor", "refreshment center", ], description: "Combination machines that offer both snacks and beverages", }, { name: "Coffee", keywords: [ "coffee", "hot", "espresso", "cappuccino", "latte", "tea", "hot drink", "hot beverage", "cafe", "café", "hottron", "hot drink center", "fresh brew", "freeze dried", "geneva", "hba", ], aliases: [ "coffee machine", "hot drink machine", "coffee vendor", "hot beverage machine", "cafe machine", ], description: "Hot beverage machines for coffee, tea, and hot drinks", }, { name: "Food", keywords: [ "food", "fresh", "meal", "sandwich", "salad", "perishable", "carousel", "showcase", "merchandiser", "cold food", "deli", "food center", "food king", "glassfront food", "cold food carousel", ], aliases: [ "food machine", "fresh food", "meal machine", "food vendor", "deli machine", ], description: "Food vending machines for fresh or frozen meals", }, { name: "Frozen", keywords: [ "frozen", "ice cream", "icecream", "frozen food", "frozen treat", "frozen dessert", "chilled", "glassfront frozen", "glass front frozen", "frozen gourmet", "frozen food glassfront", "ice cream center", "frozen food center", ], aliases: [ "frozen food machine", "ice cream machine", "frozen treat machine", "frozen vendor", "ice cream vendor", ], description: "Frozen food and ice cream vending machines", }, { name: "Bulk", keywords: ["bulk", "gumball", "gum", "toy", "nut", "candy bulk"], aliases: ["bulk vendor", "bulk machine", "bulk vending"], description: "Bulk vending machines for small items like gumballs and toys", }, { name: "Ice Cream", keywords: ["ice cream", "icecream", "frozen treat", "frozen dessert"], aliases: ["ice cream machine", "frozen treat machine"], description: "Ice cream and frozen treat vending machines", }, { name: "Specialty", keywords: [ "specialty", "special", "electronics", "personal care", "beauty", "cigarette", "bait", "milk", "cheese", "yogurt", ], aliases: ["specialty machine", "specialty vendor"], description: "Specialty vending machines for niche products", }, ] /** * Get manufacturer name from directory name or filename */ export function detectManufacturer(input: string): string | null { const normalized = input.toLowerCase().trim() for (const manufacturer of MANUFACTURERS) { // Check main name if (normalized.includes(manufacturer.name.toLowerCase())) { return manufacturer.name } // Check aliases for (const alias of manufacturer.aliases) { if (normalized.includes(alias.toLowerCase())) { return manufacturer.name } } // Check sub-brands if (manufacturer.brands) { for (const brand of manufacturer.brands) { if (normalized.includes(brand.toLowerCase())) { return manufacturer.name } } } } return null } /** * Get machine type from filename or content */ export function detectMachineType(input: string): string | null { const normalized = input.toLowerCase().trim() // Check each machine type in priority order for (const machineType of MACHINE_TYPES) { // Check keywords for (const keyword of machineType.keywords) { if (normalized.includes(keyword.toLowerCase())) { return machineType.name } } // Check aliases for (const alias of machineType.aliases) { if (normalized.includes(alias.toLowerCase())) { return machineType.name } } } return null } /** * Get all manufacturer names (for filtering) */ export function getAllManufacturerNames(): string[] { return MANUFACTURERS.map((m) => m.name).sort() } /** * Get all machine type names (for filtering) */ export function getAllMachineTypeNames(): string[] { return MACHINE_TYPES.map((m) => m.name).sort() } /** * Get machine type info by name */ export function getMachineTypeInfo(name: string): MachineTypeInfo | undefined { return MACHINE_TYPES.find((m) => m.name === name) }