Skip to content

Lista de Precios - Costo por Margen de Ganancia - Documentacion Tecnica Frontend

DOCUMENTACION RETROSPECTIVA - Generada a partir de codigo implementado el 2026-02-09

Modulo: Ventas Feature: Lista de Precios - Costo por Margen de Ganancia Fecha: 2026-02-09


Referencia de Negocio


Estado de la Implementacion: Legacy (Vanilla JS + PHP)

Esta funcionalidad esta implementada con la arquitectura legacy del sistema:

  • Vista: PHP server-side rendering (lista-precios-costo-ganancia.php)
  • Logica: Vanilla JavaScript con ES Modules (lista-precios-ganancia-margen.js)
  • API: Legacy ApiRequest class (FormData + fetch via proxy PHP)
  • UI Framework: AdminLTE 3 + Bootstrap 4 + jQuery + jQuery UI
  • NO migrada a React/TypeScript

Archivos Involucrados

ArchivoTipoProposito
public/view/mod-ventas/lista-precios-costo-ganancia.phpVista PHPTemplate HTML con formulario
public/js/view/mod-ventas/lista-precios-ganancia-margen.jsJavaScript ES ModuleLogica del formulario y llamadas API
public/php/backend/lista-precio.phpProxy PHPProxy legacy entre frontend y backend
public/php/components/mod-venta/main-sidebar-venta.phpSidebar PHPMenu de navegacion del modulo Ventas

Componentes de la Vista

Template PHP: lista-precios-costo-ganancia.php

Estructura de pagina:

  • Header con breadcrumb: Home > Ventas > Lista precios > Costo por margen de ganancia
  • Card con titulo "Costo por margen de ganancia"
  • Formulario con ID idFormListaPrecios
  • Footer estandar
  • Scripts cargados: jQuery, Bootstrap, DataTables, AdminLTE, jQuery UI

Formulario HTML:

idFormListaPrecios (form)
  |
  |-- Radio buttons (name="aplicacion")
  |    |-- idInputPorcentajeArticulo: "Aplicar % Ganancia registrado en el articulo" [checked]
  |    |-- idInputPorcentajeFijo: "Aplicar % Fijo"
  |         |-- idInputPorcentaje: input text (disabled por defecto) [data-badge-type="P"]
  |
  |-- idInputLista: input number - "Lista" [required]
  |
  |-- idCheckPrecioFinal: checkbox - "Obtener Precio Final (Costo + Impuestos)"
  |
  |-- idInputAgrupacionDesde: input text - "Desde agrupacion" [con autocomplete]
  |-- idInputAgrupacionHasta: input text - "Hasta agrupacion" [con autocomplete]
  |
  |-- idBtnRegistrar: button submit - "Aceptar"
  |-- button "Cancelar" (onclick="back('mv')")

Logica JavaScript

Archivo: lista-precios-ganancia-margen.js

Imports:

  • ApiRequest desde ../../middleware/API.js - Clase para comunicacion con backend
  • setAutocomplete desde ../../util/inputs.js - Configuracion de jQuery UI Autocomplete
  • setInputBadge desde ../../util/inputs.js - Badge visual para inputs de porcentaje

Estructura de datos

Objeto actualizacionLista (estado local del formulario):

PropiedadTipoValor inicialDescripcion
agrupacionDesdeint/nullnullID del rubro inicial
agrupacionHastaint/nullnullID del rubro final
listaint/nullnullNumero de lista destino
porcentajefloat/nullnullPorcentaje fijo (null = usar del articulo)
precioFinalbooleanfalseIncluir impuestos en calculo

Flujo de inicializacion (IIFE asincrono)

  1. Muestra popup de carga
  2. Obtiene primer rubro: GET rubro?first=true
  3. Obtiene ultimo rubro: GET rubro?last=true
  4. Asigna valores por defecto a actualizacionLista.agrupacionDesde y agrupacionHasta
  5. Muestra en inputs: "{id} | {concepto}"
  6. Configura autocomplete en ambos inputs de agrupacion
  7. Cierra popup de carga

Eventos configurados

ElementoEventoAccion
Radio porcentajeFijochangeHabilita input porcentaje, asigna valor
Radio porcentajeGananciachangeDeshabilita input porcentaje, porcentaje = null
idCheckPrecioFinalchangeToggle precioFinal
idInputPorcentajeblurAsigna valor a actualizacionLista.porcentaje
idInputListablurAsigna valor a actualizacionLista.lista
idFormListaPreciossubmitEjecuta generacion

Autocomplete de agrupaciones

Se configura jQuery UI Autocomplete en ambos campos:

Source: GET rubro?filter={term}&scope=min

Formato: { label: "{id} | {concepto}", value: { id, concepto } }

Al seleccionar: Asigna el ID a actualizacionLista.agrupacionDesde o agrupacionHasta

Al borrar: Asigna null

Submit del formulario

javascript
POST lista-precio
{
  method: 'ganancia-margen',
  data: actualizacionLista
}

Flujo:

  1. preventDefault()
  2. Muestra popup "Generando lista de precios"
  3. Envia POST via ApiRequest
  4. En exito: muestra modal "Lista de precio generada"
  5. En error: manejo global de errores de ApiRequest

Integracion con Backend (API)

Endpoints consumidos

MetodoEndpoint LegacyEndpoint Backend RealProposito
GETphp/backend/rubro (via ApiRequest)N/A (proxy)Obtener rubros para autocomplete
POSTphp/backend/lista-precioPOST /api/mod-ventas/lista-precioGenerar lista de precios

Proxy PHP: lista-precio.php

Archivo: public/php/backend/lista-precio.php

El frontend no se comunica directamente con el backend Slim. Las requests pasan por el proxy PHP legacy:

Flujo GET:

  1. Lee parametros de $_GET (lista, producto)
  2. Valida con validator inline
  3. Reenvia a backend via Request::get('mod-ventas/lista-precio', ['json' => $data])
  4. Retorna data del response JSON

Flujo POST:

  1. Lee body JSON desde php://input
  2. Reenvia a backend via Request::post('mod-ventas/lista-precio', ['json' => $body])
  3. Retorna data del response JSON

Seguridad del proxy: Valida sesion ($_SESSION['SD_USER'])


Ubicacion en sidebar

Ventas (Mod. Ventas)
  |-- Bases [permiso: VENTAS_BASES]
       |-- Lista de precios [permiso: VENTAS_BASES_LISTA-PRECIO]
            |-- Automatico por rango [permiso: VENTAS_BASES_LISTA-PRECIO_RANGO]
            |-- Costo por margen de ganancia [permiso: VENTAS_BASES_LISTA-PRECIO_COSTO]

URL

?loc=mvlpcg

Activacion de menu

Se activa manualmente via JavaScript inline al final del PHP template:

  • Menu "Bases": menu-is-opening, menu-open, active
  • Submenu "Lista de precios": menu-is-opening, menu-open
  • Item activo: idMainSideBarListaPreciosCostoPMargen con clase active

Validaciones del Formulario

Validaciones HTML nativas

CampoValidacionTipo
idInputListarequiredHTML5

Validaciones JavaScript

ValidacionUbicacionDescripcion
Porcentaje habilitado/deshabilitadoEvento change de radiosInput porcentaje se deshabilita cuando se selecciona "por articulo"

Validaciones ausentes

  • No se valida que lista sea un numero positivo en el frontend
  • No se valida que las agrupaciones desde/hasta sean validas (que desde <= hasta)
  • No se valida que el porcentaje sea un numero positivo
  • No hay confirmacion previa antes de la ejecucion masiva

Dependencias Frontend

Librerias utilizadas

LibreriaVersionUso
jQuery(bundled)DOM manipulation, eventos
Bootstrap 4(bundled)Estilos, grid, form-control
jQuery UI(bundled)Autocomplete en campos de agrupacion
SweetAlert2(global)Popups de carga y mensajes (showPopupLoading, showModal, Swal)
AdminLTE(bundled)Layout, sidebar, cards
DataTablesCargado pero no usadoScript incluido en template pero no utilizado por esta vista

Funciones globales utilizadas

FuncionOrigenUso
showPopupLoading(tipo, mensaje)Global (SweetAlert wrapper)Popup de carga
showModal(tipo, mensaje)Global (SweetAlert wrapper)Mensaje de exito/error
Swal.close()SweetAlert2Cerrar popup
back(loc)GlobalNavegacion al menu (onclick del boton Cancelar)
setAutocomplete(input, config)../../util/inputs.jsConfiguracion de jQuery UI Autocomplete
setInputBadge(input, required)../../util/inputs.jsBadge visual de porcentaje

Diagrama de Interaccion

mermaid
sequenceDiagram
    participant U as Usuario
    participant V as Vista PHP
    participant JS as lista-precios-ganancia-margen.js
    participant P as Proxy PHP (lista-precio.php)
    participant B as Backend (ListaPrecioController)
    participant S as ListaPrecioService
    participant M as ListaPrecio Model
    participant D as Domain (Item/Ajuste)

    Note over V,JS: Carga inicial
    JS->>P: GET rubro?first=true
    P-->>JS: Primer rubro
    JS->>P: GET rubro?last=true
    P-->>JS: Ultimo rubro
    JS->>V: Renderiza rubros en inputs

    Note over U,JS: Configuracion
    U->>V: Selecciona modo porcentaje
    U->>V: Ingresa lista destino
    U->>V: Marca/desmarca precio final
    U->>V: Ajusta agrupaciones (opcional)

    Note over U,B: Ejecucion
    U->>V: Click "Aceptar"
    JS->>P: POST lista-precio {method: "ganancia-margen", data: {...}}
    P->>B: POST /api/mod-ventas/lista-precio
    B->>S: generarListaMargenGanancia(...)

    loop Para cada producto del rango
        S->>S: Verificar costo > 0
        S->>S: Calcular precio base
        opt Si precioFinal
            S->>D: Item.calculate() con Ajustes
            D-->>S: Precio final con impuestos
        end
        S->>M: getAll (verificar existencia)
        alt No existe en lista
            S->>M: insert(ListaPrecioDTO)
        else Ya existe
            S->>M: update(ListaPrecioDTO)
        end
    end

    S-->>B: true/false
    B-->>P: 201 Created
    P-->>JS: Response
    JS->>V: Muestra "Lista de precio generada"

Consideraciones de Migracion a React

Esta funcionalidad es candidata a migracion a React/TypeScript. Aspectos a considerar:

Lo que se migraria

  1. Vista: De PHP template a componente React con React Hook Form + Zod
  2. API: De ApiRequest legacy a Axios con interceptores + TanStack Query
  3. Autocomplete: De jQuery UI a componente ControlledAutoComplete del core
  4. Validaciones: De HTML5 nativo + ausentes a Zod schema completo
  5. Feedback: De SweetAlert global a sistema de notificaciones de React

Estructura sugerida post-migracion

ts/ventas/ListaPrecio/
  |-- components/
  |     |-- CostoGananciaForm/
  |           |-- index.tsx
  |-- views/
  |     |-- CostoGananciaView.tsx
  |-- schemas/
  |     |-- costoGanancia.schema.ts
  |-- services/
  |     |-- listaPrecio.service.ts
  |-- types/
  |     |-- listaPrecio.types.ts
  |-- hooks/
        |-- useCostoGanancia.ts

Mejoras potenciales

  • Agregar confirmacion previa antes de ejecucion masiva
  • Validar que agrupacion desde <= hasta
  • Mostrar resumen de resultados (productos procesados/omitidos)
  • Agregar preview de productos afectados antes de ejecutar
  • Implementar loading states mas granulares

Preguntas Tecnicas Pendientes

Aclaraciones Requeridas: Hay aspectos tecnicos que requieren validacion. Ver: Preguntas sobre Lista de Precios Costo Ganancia


Referencias


NOTA IMPORTANTE: Esta documentacion fue generada automaticamente analizando el codigo implementado. Validar cambios futuros contra este baseline.