Expand the calculator with a multi-step wizard flow, admin dashboard with quote tracking, login/auth system, distance API integration, and history page. Add new UI components (dialog, progress, select, slider, switch), update pricing logic, and improve the overall design with new assets. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
83 lines
2.7 KiB
TypeScript
83 lines
2.7 KiB
TypeScript
export const PRICES = {
|
|
// Isolering (per m³ volume)
|
|
INSULATION_MATERIALS: 2850, // kr/m³
|
|
INSULATION_LABOR_PER_M3: 880, // kr/m³
|
|
INSULATION_TOTAL_PER_M3: 3730, // kr/m³
|
|
// Base insulation labor (always applied per m² area)
|
|
INSULATION_BASE_LABOR: 75, // kr/m² - always added when insulation is included
|
|
|
|
// Gulvvarme (altid inkluderet)
|
|
FLOOR_HEATING_MATERIALS: 75, // kr/m²
|
|
FLOOR_HEATING_LABOR: 130, // kr/m²
|
|
FLOOR_HEATING_TOTAL: 205, // kr/m²
|
|
|
|
// Syntetisk net (altid inkluderet)
|
|
SYNTHETIC_NET_MATERIALS: 24, // kr/m²
|
|
SYNTHETIC_NET_LABOR: 25, // kr/m²
|
|
SYNTHETIC_NET_TOTAL: 49, // kr/m²
|
|
|
|
// Flydespartel
|
|
SELF_LEVELING_COMPOUND: 450, // kr/m²
|
|
COMPOUND_WEIGHT_PER_M2: 90, // kg/m²
|
|
|
|
// Faste gebyrer
|
|
START_FEE: 3500, // kr (leje af anlæg og sikkerhedsudstyr)
|
|
|
|
// Transport
|
|
TRANSPORT_PER_KM: 18.75, // kr/km
|
|
GREAT_BELT_FEE: 500, // kr (kun Fyn)
|
|
|
|
// Procenttillæg
|
|
COVERING_PERCENTAGE: 0.007, // 0.7%
|
|
WASTE_PERCENTAGE: 0.0025, // 0.25%
|
|
TOTAL_PERCENTAGE: 0.0095, // 0.95%
|
|
|
|
// Moms
|
|
VAT: 0.25, // 25%
|
|
} as const
|
|
|
|
// Pumpebil fees include both materials and labor (from rene.pdf)
|
|
export const PUMP_TRUCK_FEES = [
|
|
{ minWeight: 8000, materialFee: 0, laborFee: 8800, fee: 8800 }, // >8000 kg
|
|
{ minWeight: 5000, materialFee: 3800, laborFee: 8000, fee: 11800 }, // 5000-8000 kg
|
|
{ minWeight: 3000, materialFee: 6000, laborFee: 7000, fee: 13000 }, // 3000-5000 kg
|
|
{ minWeight: 0, materialFee: 8100, laborFee: 7000, fee: 15100 }, // 0-3000 kg
|
|
] as const
|
|
|
|
export const CONSTRAINTS = {
|
|
MIN_AREA: 25, // m²
|
|
MAX_AREA: 250, // m²
|
|
MIN_HEIGHT: 8, // cm
|
|
MAX_HEIGHT: 100, // cm
|
|
CONCRETE_THICKNESS: 5, // cm (fratrækkes fra højde)
|
|
HOME_POSTAL_CODE: "4550", // Asnæs
|
|
HOME_CITY: "Asnæs",
|
|
} as const
|
|
|
|
// Gulvbelægningstyper - påvirker valg af gulvspartel
|
|
export const FLOORING_TYPES = {
|
|
STANDARD: {
|
|
id: "standard",
|
|
name: "Klinker / Svømmende trægulv",
|
|
description: "Fliser, klinker eller trægulv der ikke limes",
|
|
compoundMultiplier: 1.0, // Standard compound
|
|
},
|
|
GLUED_WOOD: {
|
|
id: "glued_wood",
|
|
name: "Limet trægulv",
|
|
description: "Trægulv der limes fast til underlaget",
|
|
compoundMultiplier: 1.28, // Premium compound kræves (+28%)
|
|
},
|
|
} as const
|
|
|
|
export type FlooringType = keyof typeof FLOORING_TYPES
|
|
|
|
export const COVERAGE_AREAS = {
|
|
WEST_ZEALAND: { start: 4000, end: 4999, bridgeFee: 0 },
|
|
COPENHAGEN: { start: 2000, end: 2999, bridgeFee: 0 },
|
|
NORTH_ZEALAND: { start: 3000, end: 3999, bridgeFee: 0 },
|
|
LOLLAND_FALSTER: { start: 4800, end: 4899, bridgeFee: 0 },
|
|
FUNEN: { start: 5000, end: 5999, bridgeFee: PRICES.GREAT_BELT_FEE },
|
|
} as const
|
|
|
|
export type CoverageArea = keyof typeof COVERAGE_AREAS
|