Aplicación web para gestión de usuarios, carga de ítems y generación de cotizaciones con cálculo automático de costos, flete, gastos, interés, factor y precios finales.
Cotix360 es una aplicación web operativa para administrar catálogos, cotizaciones, recetas comerciales, ingeniería y compras. El sistema concentra el ciclo completo desde la carga de ítems hasta la validación técnica/comercial y el control de costos de compra contra la ingeniería aprobada.
El proyecto es una aplicación PHP tradicional con frontend server-rendered y JavaScript modular por pantalla. La prioridad funcional es mantener trazabilidad de precios, estados, márgenes, totales por moneda y reglas de negocio entre áreas.
- Gestión de usuarios, sesiones y permisos por cargo.
- Administración de catálogo de ítems y carga masiva desde Excel.
- Cotizaciones con cálculo comercial, financiamiento y exportación PDF.
- Recetas comerciales con detalle editable, tipo de cambio, márgenes por categoría y datos comerciales.
- Detección de cambios de precio contra catálogo mediante SSE.
- Flujo de aprobación de recetas hacia ingeniería.
- Ingeniería con validación técnica, estados controlados y adicionales positivos/negativos.
- Compras generadas desde ingeniería validada, con edición controlada, semáforo comparativo y análisis gráfico.
- Exportación a PDF/Excel para documentos comerciales y técnicos.
- PHP 8.x
- MySQL/MariaDB
- Apache HTTP Server
- JavaScript vanilla por módulo de pantalla
- Bootstrap y componentes del template administrativo
- Composer para dependencias PHP
- Dompdf para PDF
- PhpSpreadsheet para Excel
- Dotenv para configuración de entorno
cotix/
assets/ Frontend: JS, CSS, imágenes, vendor assets
config/ Bootstrap de aplicación, APIs externas y configuración común
controller/ Endpoints HTTP y orquestación de casos de uso
database/ Conexión PDO y migraciones SQL
layout/ Shell HTML compartido: menú, navbar, theme, footer
model/ Acceso a datos y reglas de negocio por dominio
release-notes/ Registro de cambios relevantes
views/ Pantallas PHP renderizadas del lado servidor
vendor/ Dependencias Composer
La aplicación no usa un framework MVC completo. La separación real es pragmática:
views/: composición HTML/PHP y puntos de montaje para JS.assets/js/: comportamiento de cada vista, llamadasfetch, renderizado dinámico y validaciones UX.controller/: validación de request, sesión/permisos, transacciones y respuesta JSON/documento.model/: consultas SQL, creación defensiva de columnas/tablas y reglas persistentes del dominio.
- Instalar dependencias PHP.
composer install- Crear
.enven la raíz.
DB_HOST=127.0.0.1
DB_NAME=bd_cotix
DB_USER=root
DB_PASS=
IP_API_URL=https://api.ipify.org
API_DNI_URL=
API_DNI_URL_2=
API_RUC_URL=
API_RUC_URL_2=-
Crear base de datos y aplicar los scripts SQL disponibles en
database/migrations/más el dump/base inicial del entorno. -
Publicar el proyecto en Apache, por ejemplo:
C:\Apache24\htdocs\cotix
- Abrir la aplicación.
http://127.0.0.1/cotix/index.php
La configuración sensible debe vivir en .env. No subir credenciales reales al repositorio.
DB_HOST: host MySQL.DB_NAME: base de datos de Cotix360.DB_USER: usuario de base de datos.DB_PASS: contraseña de base de datos.IP_API_URL: servicio para registrar IP en login/logout.API_DNI_URL,API_DNI_URL_2: proveedores de consulta DNI.API_RUC_URL,API_RUC_URL_2: proveedores de consulta RUC.
1: Administrador.3: Supervisor.4: Técnico.5: Compras.6: Ingeniería.
Los permisos no deben asumirse desde el frontend. Toda acción que cambie datos debe validarse en controller/model antes de persistir.
La cotización calcula costos, financiamiento y precios finales a partir del catálogo y parámetros comerciales. La salida principal es PDF, manteniendo consistencia entre los valores calculados en pantalla y el documento generado.
La receta representa una propuesta comercial editable antes de aprobación. Sus puntos críticos son:
- Detalle por ítem con cantidad, precio, moneda y tipo de cambio.
- Márgenes por categoría obligatorios antes de aprobación.
- Bloqueo de aprobación si hay precios en cero o datos comerciales incompletos.
- Detección de cambios de precio del catálogo mediante SSE cuando la receta está en estado editable.
- Exportación comercial PDF/Excel.
Ingeniería recibe recetas aprobadas y valida el detalle técnico. Puede manejar adicionales positivos y negativos, pero esos adicionales tienen reglas explícitas según el módulo consumidor.
Compras se genera desde ingeniería validada. El módulo permite ajustar precios, cantidades, moneda y agregar ítems mientras el estado sea editable. El semáforo compara el total de compra contra la referencia de ingeniería.
Reglas actuales de adicionales en compras:
- Ítems normales suman al total y al semáforo.
- Adicionales negativos descuentan del total y afectan el semáforo.
- Adicionales positivos son informativos y no afectan total ni semáforo.
- Existen modales separados para revisar adicionales negativos y positivos.
Enviada: estado editable principal en recetas.Aprobada: receta aprobada y transferida al siguiente flujo.Validado: estado usado en ingeniería/compras para indicar validación operativa.Pendiente: estado legacy/compatible en compras.Anulada: estado terminal no editable.
Al agregar estados nuevos, revisar enums SQL, validaciones de controllers, badges frontend y reglas de editabilidad.
- Los totales por moneda deben calcularse en backend y reflejarse en frontend.
- Para conversiones a dólares se usa
tipo_cambiode la entidad correspondiente. - En recetas, los márgenes por categoría son obligatorios para aprobar.
- En compras, el semáforo usa total ajustado según reglas de adicionales.
- Evitar duplicar reglas críticas solo en JavaScript; el servidor debe ser la fuente de verdad.
controller/acceso.phpcontroller/logout.php
controller/table_receta.phpcontroller/get_receta.phpcontroller/add_receta.phpcontroller/upd_receta.phpcontroller/upd_estado_receta.phpcontroller/get_receta_categoria.phpcontroller/upd_receta_categoria.phpcontroller/reload_receta_precios.phpcontroller/stream_receta_cambios.php
controller/aprobar_ingenieria.phpcontroller/guardar_ingenieria.phpcontroller/upd_ingenieria_detalle.phpcontroller/upd_ingenieria_header.php
controller/compras/table_compras.phpcontroller/compras/get_compra.phpcontroller/compras/upd_compra_detalle.phpcontroller/compras/charts_compra.php
pdf_cotizacion.phppdf_receta.phpcontroller/export_receta_excel.phpcontroller/export_oferta_comercial_excel.php
El módulo de recetas usa Server-Sent Events para detectar cambios de precio del catálogo sin recargar la pantalla.
Consideraciones operativas:
- El stream debe liberar lock de sesión con
session_write_close(). - El stream solo debe mantenerse activo en estados editables.
- El backend usa firma liviana para evitar consultar detalle completo si no hay cambios.
- El frontend debe cerrar
EventSourceal salir de la vista.
Las migraciones SQL viven en database/migrations/. Varias capas del modelo también hacen creación defensiva de columnas/tablas para ambientes existentes. Aun así, el camino preferido es ejecutar migraciones explícitas por ambiente.
Antes de desplegar cambios de datos:
- Revisar si hay
ENUMafectados. - Validar que nuevas columnas tengan default compatible.
- Confirmar compatibilidad con datos históricos.
- Ejecutar backup si el ambiente tiene datos productivos.
Comandos útiles:
composer install
php -l controller/compras/get_compra.php
php -l model/compras/compras.php
node --check assets/js/compras_detalle.jsBuenas prácticas del proyecto:
- Mantener cambios pequeños y localizados.
- Validar permisos en backend.
- No confiar en campos ocultos del frontend.
- Evitar lógica financiera divergente entre PHP y JavaScript.
- Actualizar cache bust (
?v=) al modificar assets JS/CSS servidos por vistas PHP. - Preferir migraciones explícitas antes que cambios manuales en BD.
- Error de conexión a BD: revisar
.env, credenciales y permisos del usuario MySQL. - Login falla: verificar que el usuario esté activo y que la sesión pueda escribirse.
- PDF no genera: revisar
vendor/, permisos de escritura temporales y dependencias de Dompdf. - Excel no carga: validar cabeceras, formato y tamaño del archivo.
- Cambios JS no aparecen: forzar recarga (
Ctrl + F5) y revisar versión?v=del asset. - SSE no notifica: revisar estado de la receta, conexión del navegador y endpoint
stream_receta_cambios.php.
Este código concentra reglas de negocio críticas en una aplicación PHP legacy-style. Los principales riesgos técnicos son:
- Reglas financieras duplicadas entre backend y frontend.
- Estados representados como strings y enums SQL.
- Compatibilidad con datos históricos.
- Dependencia de cache bust manual para assets.
- Consultas SQL complejas para totales y agrupaciones.
Al tocar totales, márgenes, estados o permisos, validar el flujo completo: lista, detalle, exportación, actualización AJAX y transición de estado.
Los cambios funcionales relevantes deben documentarse en release-notes/ cuando impacten operación, datos, permisos o reglas comerciales.
Proyecto de uso interno. Definir una licencia explícita antes de distribuirlo a terceros.
