402 lines
8.2 KiB
TypeScript
402 lines
8.2 KiB
TypeScript
/**
|
|
* 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)
|
|
}
|