""" Hardware pricing database for BOM generation Prices are approximate retail as of 2025 """ # Basic procurement links for common gear we surface in mock/default designs PROCUREMENT_LINKS = { "Cisco Catalyst 9300": "https://www.cisco.com/c/en/us/products/switches/catalyst-9300-series-switches/", "Cisco ISR 4331": "https://www.cisco.com/c/en/us/products/routers/4000-series-integrated-services-routers-isr/index.html", "Cisco ISR 1100": "https://www.cisco.com/c/en/us/products/routers/1100-series-integrated-services-routers-isr/index.html", "Arista 7050": "https://www.arista.com/en/products/7050x3-series", "Fortinet FortiGate 60F": "https://www.fortinet.com/products/next-generation-firewall/fortigate-60f", "Palo Alto PA-220": "https://www.paloaltonetworks.com/products/secure-the-network/next-generation-firewall/pa-220", "Ubiquiti U6-Pro": "https://store.ui.com/us/en/pro/category/all-wifi/products/u6-pro", "Ubiquiti U6-Enterprise": "https://store.ui.com/us/en/pro/category/all-wifi/products/u6-enterprise", "Ubiquiti USW-Pro-24-PoE": "https://store.ui.com/us/en/pro/category/switching/products/usw-pro-24-poe", "Ubiquiti USW-Enterprise-48-PoE": "https://store.ui.com/us/en/pro/category/switching/products/usw-enterprise-48-poe", "pfSense Netgate 6100": "https://shop.netgate.com/products/6100-base", "Dell PowerEdge R650": "https://www.dell.com/en-us/shop/povw/poweredge-r650", } HARDWARE_PRICING = { # Switches "Cisco Catalyst 9300": {"price": 8500, "category": "switch", "vendor": "Cisco"}, "Cisco Catalyst 2960": {"price": 2500, "category": "switch", "vendor": "Cisco"}, "Arista 7050": {"price": 12000, "category": "switch", "vendor": "Arista"}, "Ubiquiti USW-Enterprise-48-PoE": {"price": 1799, "category": "switch", "vendor": "Ubiquiti"}, "Ubiquiti USW-Pro-24-PoE": {"price": 499, "category": "switch", "vendor": "Ubiquiti"}, "Juniper EX4300": {"price": 6500, "category": "switch", "vendor": "Juniper"}, # Routers "Cisco ISR 4331": {"price": 4500, "category": "router", "vendor": "Cisco"}, "Cisco ISR 1100": {"price": 1200, "category": "router", "vendor": "Cisco"}, "Ubiquiti Dream Machine Pro": {"price": 379, "category": "router", "vendor": "Ubiquiti"}, "MikroTik CCR2004": {"price": 899, "category": "router", "vendor": "MikroTik"}, # Access Points "Ubiquiti U6-Enterprise": {"price": 379, "category": "access_point", "vendor": "Ubiquiti"}, "Ubiquiti U6-Pro": {"price": 179, "category": "access_point", "vendor": "Ubiquiti"}, "Cisco Catalyst 9130": {"price": 1500, "category": "access_point", "vendor": "Cisco"}, "Aruba AP-535": {"price": 1200, "category": "access_point", "vendor": "Aruba"}, # Firewalls "Palo Alto PA-220": {"price": 3500, "category": "firewall", "vendor": "Palo Alto"}, "Fortinet FortiGate 60F": {"price": 800, "category": "firewall", "vendor": "Fortinet"}, "pfSense Netgate 6100": {"price": 899, "category": "firewall", "vendor": "Netgate"}, # Servers "Dell PowerEdge R650": {"price": 5000, "category": "server", "vendor": "Dell"}, "HP ProLiant DL360": {"price": 4500, "category": "server", "vendor": "HP"}, # Generic fallbacks "Generic Switch 48-port": {"price": 800, "category": "switch", "vendor": "Generic"}, "Generic Router": {"price": 500, "category": "router", "vendor": "Generic"}, "Generic Access Point": {"price": 150, "category": "access_point", "vendor": "Generic"}, } CABLE_PRICING = { "Cat6 Ethernet": {"price_per_foot": 0.50, "typical_length_ft": 3}, "Cat6a Ethernet": {"price_per_foot": 0.75, "typical_length_ft": 3}, "Fiber LC-LC": {"price_per_meter": 15.00, "typical_length_m": 10}, "Fiber SC-SC": {"price_per_meter": 12.00, "typical_length_m": 10}, } ACCESSORY_PRICING = { "42U Server Rack": 800, "Console Cable Kit": 45, "Rack PDU 20A": 250, "Cable Management": 100, "UPS 1500VA": 350, "Network Tools Kit": 150, } def estimate_device_cost(model: str, vendor: str = None) -> float: """ Estimate cost for a network device Returns price in USD """ # Try exact match first if model in HARDWARE_PRICING: return HARDWARE_PRICING[model]["price"] # Try fuzzy match on vendor if vendor: for key, data in HARDWARE_PRICING.items(): if vendor.lower() in key.lower() or vendor.lower() in data["vendor"].lower(): return data["price"] # Fallback based on role keywords model_lower = model.lower() if "switch" in model_lower: return HARDWARE_PRICING["Generic Switch 48-port"]["price"] elif "router" in model_lower or "gateway" in model_lower: return HARDWARE_PRICING["Generic Router"]["price"] elif "access point" in model_lower or "ap" in model_lower: return HARDWARE_PRICING["Generic Access Point"]["price"] # Default fallback return 1000 def estimate_cable_cost(cable_type: str, quantity: int, length: str = None) -> float: """ Estimate cable costs """ if cable_type in CABLE_PRICING: pricing = CABLE_PRICING[cable_type] if "price_per_foot" in pricing: feet = pricing["typical_length_ft"] if length and "ft" in length: feet = int(length.replace("ft", "").strip()) return pricing["price_per_foot"] * feet * quantity elif "price_per_meter" in pricing: meters = pricing["typical_length_m"] if length and "m" in length: meters = int(length.replace("m", "").strip()) return pricing["price_per_meter"] * meters * quantity return 10 * quantity # Default $10 per cable def estimate_accessory_cost(accessory_name: str) -> float: """ Estimate accessory costs """ for key, price in ACCESSORY_PRICING.items(): if key.lower() in accessory_name.lower(): return price return 50 # Default $50 for unknown accessories