Saltar al contenido
Chatbots de WhatsApp desde cero
Temario

Ejercicio: Vender tu bot como servicio

  • ⏱ 45 minutos
  • 📶 Nivel: intermedio

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.

▶ Prueba tu código aquí (opcional)
Consola

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.

    cotizar.js
    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;
    }