Ejercicio: Vender tu bot como servicio
Objetivo
Armar la propuesta económica de un bot para un negocio: calcular el precio con reglas claras y comprobar que tu margen es sano.
Cómo se trabaja
La parte A es de negocio y se hace en un documento. La parte B son funciones de JavaScript puro. Los montos del ejercicio son de ejemplo (soles); los tuyos serán distintos. No es asesoría legal ni fiscal.
Un ítem de la cotización es { concepto: "Pruebas", horas: 10, mensual: false }. Si mensual es true, las horas son por mes (soporte); si no, son únicas (implementación).
💡 Reto extra
Añade anticipo(total, porcentaje = 0.5) que devuelva cuánto pedir al aprobar la propuesta y cuánto queda para la entrega, como { anticipo, saldo }. Pagar por hitos protege a ambas partes.
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: Separar únicas y mensuales
Recorre los ítems: si it.mensual suma a la cuota mensual; si no, suma a las horas únicas y al monto único. Calcula el descuento al final con horasUnicas >= 40.
💡 Pista 2: Margen
ganancia / precio * 100 da el porcentaje; multiplica por 1000, redondea y divide entre 10 para dejar 1 decimal. El precio mínimo es totalCostos / (1 - margenDeseado).
🔎 Comprueba tu trabajo
Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.
✅ Ver una solución posible
Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.
function cotizar(items, tarifaHora) {
let horasUnicas = 0, unico = 0, mensual = 0;
for (const it of items) {
const monto = it.horas * tarifaHora;
if (it.mensual) mensual += monto;
else { horasUnicas += it.horas; unico += monto; }
}
const descuento = horasUnicas >= 40 ? unico * 0.1 : 0;
const r = x => Math.round(x * 100) / 100;
return {
unico: r(unico - descuento),
descuento: r(descuento),
mensual: r(mensual),
primerMes: r(unico - descuento + mensual),
};
}
function margen(precio, costos) {
const total = costos.reduce((s, c) => s + c, 0);
const ganancia = precio - total;
return {
ganancia: Math.round(ganancia * 100) / 100,
porcentaje: precio > 0 ? Math.round((ganancia / precio) * 1000) / 10 : 0,
};
}
function precioParaMargen(costos, margenDeseado) {
if (margenDeseado >= 1) throw new Error("El margen debe ser menor que 1");
const total = costos.reduce((s, c) => s + c, 0);
return Math.round((total / (1 - margenDeseado)) * 100) / 100;
}