import React, { useState } from 'react';
import { Calculator, FileText, Sparkles } from 'lucide-react';
export default function CalculadoraDibujoArquitectonico() {
const [precioBase, setPrecioBase] = useState('');
const [materialesProveidos, setMaterialesProveidos] = useState(true);
const [materiales, setMateriales] = useState({
papel: false,
plumones: false,
cinta: false,
premium: false
});
const [escala, setEscala] = useState('1:100');
const [tiposDibujo, setTiposDibujo] = useState({});
const [complejidad, setComplejidad] = useState('medio');
const [tiempoHoras, setTiempoHoras] = useState('');
const [color, setColor] = useState('bn');
const [datos, setDatos] = useState('completos');
const [tipoEncargo, setTipoEncargo] = useState('suelto');
const [dificultad, setDificultad] = useState('medio');
const [mostrarResultado, setMostrarResultado] = useState(false);
const escalaValores = {
'1:200': 8,
'1:100': 6,
'1:50': 4,
'1:20': 2,
'1:10': 2
};
const tipoDibujoValores = {
'planta': 2,
'elevacion': 3,
'corte': 4,
'axonometria': 5,
'perspectiva1': 6,
'perspectiva2': 8,
'perspectiva3': 10
};
const complejidadValores = {
'simple': 0,
'medio': 5,
'complejo': 10,
'muy_complejo': 15
};
const colorValores = {
'bn': 0,
'planos': 4,
'sombras': 7,
'render': 10
};
const datosValores = {
'completos': 0,
'incompletos': 3,
'sin_datos': 8
};
const encargoValores = {
'suelto': 0,
'anteproyecto': 8,
'proyecto': 10
};
const multiplicadorValores = {
'facil': 1.0,
'medio': 1.2,
'dificil': 1.5,
'muy_dificil': 1.8
};
const actualizarCantidad = (tipo, cantidad) => {
const cant = parseInt(cantidad) || 0;
if (cant <= 0) {
const nuevosTipos = { ...tiposDibujo };
delete nuevosTipos[tipo];
setTiposDibujo(nuevosTipos);
} else {
setTiposDibujo({ ...tiposDibujo, [tipo]: cant });
}
};
const calcularPrecio = () => {
const base = parseFloat(precioBase) || 0;
let costoMateriales = 0;
if (!materialesProveidos) {
if (materiales.papel) costoMateriales += 3;
if (materiales.plumones) costoMateriales += 4;
if (materiales.cinta) costoMateriales += 2;
if (materiales.premium) costoMateriales += 6;
}
const costoEscala = escalaValores[escala];
const costoTiposDibujo = Object.entries(tiposDibujo).reduce((sum, [tipo, cantidad]) =>
sum + (tipoDibujoValores[tipo] * cantidad), 0
);
const costoComplejidad = complejidadValores[complejidad];
const horas = parseFloat(tiempoHoras) || 0;
const costoTiempo = horas * 2;
const costoColor = colorValores[color];
const costoDatos = datosValores[datos];
const costoEncargo = encargoValores[tipoEncargo];
const subtotal = base + costoMateriales + costoEscala + costoTiposDibujo +
costoComplejidad + costoTiempo + costoColor + costoDatos + costoEncargo;
const multiplicador = multiplicadorValores[dificultad];
const precioFinal = subtotal * multiplicador;
return {
base,
costoMateriales,
costoEscala,
costoTiposDibujo,
costoComplejidad,
costoTiempo,
costoColor,
costoDatos,
costoEncargo,
subtotal,
multiplicador,
precioFinal,
horas
};
};
const handleCalcular = () => {
if (!precioBase || Object.keys(tiposDibujo).length === 0 || !tiempoHoras) {
alert('Por favor completa al menos: Precio base, Tipo de dibujo (con cantidad) y Tiempo estimado');
return;
}
setMostrarResultado(true);
};
const resultado = mostrarResultado ? calcularPrecio() : null;
return (
{/* Patrón de fondo decorativo */}
{/* Header con estilo Y2K */}
✿ Calculadora de Precios ✿
~ Dibujo Arquitectónico ~
{/* Contenedor principal con bordes punteados */}
{/* Precio Base */}
setPrecioBase(e.target.value)}
className="w-full px-4 py-3 border-3 border-blue-400 rounded-xl focus:ring-4 focus:ring-blue-300 focus:border-blue-500 bg-white shadow-inner font-bold"
placeholder="Ej: 50"
step="0.01"
/>
{/* Materiales */}
{/* Escala */}
{/* Tipo de dibujo */}
{[
{ key: 'planta', label: 'Planta', precio: 2 },
{ key: 'elevacion', label: 'Elevación', precio: 3 },
{ key: 'corte', label: 'Corte', precio: 4 },
{ key: 'axonometria', label: 'Axonometría', precio: 5 },
{ key: 'perspectiva1', label: 'Perspectiva 1 punto', precio: 6 },
{ key: 'perspectiva2', label: 'Perspectiva 2 puntos', precio: 8 },
{ key: 'perspectiva3', label: 'Perspectiva 3 puntos', precio: 10 }
].map(tipo => (
))}
{Object.keys(tiposDibujo).length > 0 && (
Resumen de láminas:
{Object.entries(tiposDibujo).map(([tipo, cantidad]) => {
const tipoInfo = [
{ key: 'planta', label: 'Planta', precio: 2 },
{ key: 'elevacion', label: 'Elevación', precio: 3 },
{ key: 'corte', label: 'Corte', precio: 4 },
{ key: 'axonometria', label: 'Axonometría', precio: 5 },
{ key: 'perspectiva1', label: 'Perspectiva 1 punto', precio: 6 },
{ key: 'perspectiva2', label: 'Perspectiva 2 puntos', precio: 8 },
{ key: 'perspectiva3', label: 'Perspectiva 3 puntos', precio: 10 }
].find(t => t.key === tipo);
return (
✿ {tipoInfo.label}: {cantidad}
S/. {(tipoInfo.precio * cantidad).toFixed(2)}
);
})}
)}
{/* Complejidad */}
{/* Tiempo */}
setTiempoHoras(e.target.value)}
className="w-full px-4 py-3 border-3 border-green-400 rounded-xl focus:ring-4 focus:ring-green-300 bg-white shadow-inner font-bold"
placeholder="Ej: 5"
step="0.5"
/>
{/* Color */}
{/* Datos */}
{/* Tipo de encargo */}
{/* Dificultad */}
{/* Botón calcular */}
{/* Resultado */}
{mostrarResultado && resultado && (
✿ Desglose de Costos ✿
{[
{ label: 'Precio base', valor: resultado.base },
{ label: 'Materiales', valor: resultado.costoMateriales },
{ label: `Escala (${escala})`, valor: resultado.costoEscala },
{ label: `Tipo(s) de dibujo (${Object.values(tiposDibujo).reduce((a, b) => a + b, 0)} láminas)`, valor: resultado.costoTiposDibujo },
{ label: 'Complejidad', valor: resultado.costoComplejidad },
{ label: `Tiempo (${resultado.horas} hrs × S/.2)`, valor: resultado.costoTiempo },
{ label: 'Color', valor: resultado.costoColor },
{ label: 'Datos', valor: resultado.costoDatos },
{ label: 'Tipo de encargo', valor: resultado.costoEncargo }
].map((item, idx) => (
✿ {item.label}:
S/. {item.valor.toFixed(2)}
))}
★ Subtotal:
S/. {resultado.subtotal.toFixed(2)}
Multiplicador de dificultad:
×{resultado.multiplicador.toFixed(1)}
★ PRECIO FINAL:
S/. {resultado.precioFinal.toFixed(2)}
Tiempo estimado: {resultado.horas} horas
)}
{/* Footer decorativo */}
✿ ★ ✿ Hecho con amor ✿ ★ ✿
);
}