Skip to content

Condicion IVA - Documentacion Tecnica Frontend

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

Modulo: Ventas Feature: Condicion IVA (Catalogo fiscal) Fecha: 2026-02-09 Estado arquitectonico: Legacy (PHP + Vanilla JavaScript, sin migrar a React/TypeScript)


Requisitos de Negocio

Ver: Condicion IVA - Resource


Arquitectura Implementada

Archivos del recurso

TipoArchivoDescripcion
Vista PHPpublic/view/mod-ventas/cond-iva.phpTemplate HTML con DataTables, sidebar de ventas
Script principalpublic/js/view/mod-ventas/cond-iva.jsLogica de vista: tabla, eventos, interacciones
Componente formulariopublic/js/components/forms/ventas/cond-iva.jsFormulario modal reutilizable para crear/editar
Template formulariopublic/php/components/mod-venta/forms/cond-iva.htmlHTML del formulario modal (cargado dinamicamente)
Proxy backendpublic/php/backend/cond-iva.phpProxy PHP que valida y reenvia al backend

Patron de arquitectura

Este recurso utiliza la arquitectura legacy del sistema:

Vista PHP (cond-iva.php)
  -> Script Vanilla JS (cond-iva.js) con ES Modules
    -> ApiRequest (API.js) con FormData/fetch
      -> Proxy PHP (php/backend/cond-iva.php)
        -> Validacion inline
        -> Request HTTP al backend (server/backend/ordiva.php)

NO utiliza: React, TypeScript, Zod, TanStack Query, React Hook Form, Axios, ni ningun componente moderno del stack.


Componentes Implementados

Vista: cond-iva.php

Ubicacion: public/view/mod-ventas/cond-iva.phpURL de acceso: ?loc=mvciTemplate base: AdminLTE con Bootstrap 4

Estructura de la pagina:

  • Header con titulo "Listado de cond. de IVA" y boton de alta (deshabilitado)
  • Breadcrumb: Home > Ventas > Cond. IVA
  • Card con tabla DataTables
  • Sidebar del modulo Ventas (main-sidebar-venta.php)

Dependencias cargadas:

  • jQuery
  • Bootstrap 4
  • DataTables (con responsive, buttons)
  • PDFMake (exportacion PDF)
  • JSZip (exportacion Excel)
  • AdminLTE
  • SweetAlert (modales y toasts)

Script principal cargado: js/view/mod-ventas/cond-iva.js (ES Module)

Sidebar activo: Configura idNavMainSideBarBases > idMainSideBarBases > idMainSideBarCondIva

Script principal: cond-iva.js

Ubicacion: public/js/view/mod-ventas/cond-iva.jsTipo: ES Module

Imports:

  • createFormCondIva desde ../../components/forms/ventas/cond-iva.js
  • ApiRequest desde ../../middleware/API.js
  • LANG_TABLE desde ../../util/constantes.js
  • reemplazarFila desde ../../util/datatable-methods.js

Inicializacion:

DataTable con las siguientes columnas:

ColumnaCampoAnchoRender especial
CodigoidAutoNo
NombrenombreAutoNo
Defectodefecto10%Checkbox con clase .defecto
AccionesnullAutoBoton editar (verde)

Botones de exportacion: Excel, PDF

Carga de datos:

ApiRequest.get('cond-iva') -> tabla.rows.add(data).draw()

Eventos:

  1. Boton Alta (btn_alta):

    • Click: showModal('info', 'Esta opcion esta deshabilitada')
    • Atajo de teclado referenciado en UI: Alt+A (pero no implementado en JS)
  2. Boton Modificar (#idBtnModificarCondIva):

    • Click en fila: Lee datos de la fila del atributo data-row (JSON)
    • Abre formulario con createFormCondIva({ updateData: row, onSubmitCallback })
    • Callback actualiza la fila en la tabla con reemplazarFila(tabla, 'id', data.id, data)
  3. Checkbox Defecto (#idCheckDefecto):

    • Click: Si se marca (checked), envia PATCH con { id, defecto: true }
    • Desmarca visualmente el checkbox anterior sin recargar datos del servidor
    • Si se intenta desmarcar, lo vuelve a marcar (no permite quedar sin defecto)
    • Usa request.patch('cond-iva', condIva) para persistir

Componente: createFormCondIva

Ubicacion: public/js/components/forms/ventas/cond-iva.jsTipo: Funcion async exportada por defecto Patron: Componente reutilizable con carga dinamica de HTML

Parametros (options object):

ParametroTipoDefaultDescripcion
updateDataObject{}Datos para modo edicion
appendToHTMLElementnullContenedor alternativo (si null, crea modal)
onSubmitCallbackFunctionRequeridoCallback al guardar exitosamente

Campos del formulario:

CampoIDTipo HTMLValidacion HTMLEvento
DescripcioninputDescripciontextrequired, maxlength="18"blur -> asigna a condIva.nombre
CUIT obligatoriocheckCuitcheckboxNingunachange -> asigna a condIva.registra_cuit
Se discriminacheckDiscriminacheckboxNingunachange -> asigna a condIva.discrimina_iva

Estructura de datos del formulario:

javascript
const condIva = {
    id: updateData.id ?? null,
    nombre: null,
    registra_cuit: false,
    discrimina_iva: false,
}

Flujo de submit:

  1. Valida formulario con isValidForm(form) (validacion HTML5 nativa)
  2. Muestra popup de carga con showPopupLoading('info', 'Registrando cambios')
  3. Si condIva.id existe (modo edicion): request.put('cond-iva', condIva)
  4. Si condIva.id es null (modo alta): request.post('cond-iva', condIva)
  5. Cierra el popup, muestra toast de exito, ejecuta callback, cierra modal

Comportamiento del modal:

  • data-backdrop="static" (no se cierra al hacer click fuera)
  • Al mostrarse: Focus en campo Descripcion con seleccion de texto
  • Al ocultarse: Remueve el modal del DOM, restaura clase modal-open si hay otros modales

Template HTML: cond-iva.html

Ubicacion: public/php/components/mod-venta/forms/cond-iva.htmlCarga: Dinamica via getContentFile() (fetch del HTML)

Estructura:

  • Modal Bootstrap 4 (modal fade, data-backdrop="static")
  • Titulo: "Condicion de IVA"
  • Formulario #idFormCondIva con:
    • Input text para Descripcion (maxlength 18, required)
    • Checkbox "CUIT obligatorio" (tabindex -1)
    • Checkbox "Se discrimina" (tabindex -1)
    • Botones: Cancelar (danger, dismiss) y Aceptar (primary, submit)

Proxy Backend: cond-iva.php

Ubicacion: public/php/backend/cond-iva.phpProposito: Intermediario entre frontend y backend, agrega validacion

Metodos soportados:

MetodoValidacionesReenvio
GETNingunaRequest::get('ordiva')
PUTid: required|integer, nombre: required|max:18|min:3, registra_cuit: required|boolean, discrimina_iva: required|booleanRequest::put('ordiva', body)
PATCHid: required|integer, defecto: required|booleanRequest::patch('ordiva', body)
POSTNo implementadoN/A
DELETENo implementadoN/A

Autenticacion: Verifica sesion PHP ($_SESSION['SD_USER'])


State Management

Patron: Variables locales en scope de modulo (ES Modules)

VariableTipoAlcanceProposito
tablaDataTableModuloInstancia de tabla jQuery DataTables
btnAltaHTMLElementModuloReferencia al boton de alta
requestApiRequestModuloInstancia para llamadas al backend

Estado del formulario: Objeto condIva local dentro del closure de createFormCondIva(). No hay estado global compartido.

Cache: No hay cache implementado. Cada carga de pagina hace un GET al servidor.


Integracion con Backend

Endpoints consumidos

MetodoURL ProxyURL Backend finalProposito
GETcond-ivaordivaListar todas las condiciones
PUTcond-ivaordivaModificar condicion completa
PATCHcond-ivaordivaModificar campo defecto
POSTcond-ivaordivaCrear condicion (implementado en formulario, no en proxy)

Patron de comunicacion: ApiRequest (API.js) -> FormData/fetch -> Proxy PHP -> Guzzle HTTP -> Backend

Transformaciones de datos

Backend -> Frontend (GET):

  • Los datos vienen ya transformados por el modelo: discrimina_iva como boolean, id como integer
  • El frontend los usa directamente sin transformacion adicional

Frontend -> Backend (PUT):

  • El objeto condIva se envia tal cual: { id, nombre, registra_cuit, discrimina_iva }
  • El proxy valida tipos antes de reenviar

Frontend -> Backend (PATCH):

  • Solo envia { id, defecto } para cambio de defecto

Routing

URL de la vista: ?loc=mvciRouting: Server-side rendering (PHP). No hay React Router. Navegacion: Links en sidebar del modulo Ventas, breadcrumbs con URLs con parametro loc


Accesibilidad

Estado actual:

  • Los checkboxes del formulario tienen tabindex="-1" (no accesibles por teclado)
  • El boton de alta referencia atajo Alt+A en la UI pero no lo implementa en JavaScript
  • Los checkboxes de la tabla usan custom-control de Bootstrap para estilizado
  • El modal tiene aria-label="Close" en el boton de cerrar

Deuda tecnica identificada

ItemSeveridadDescripcion
Arquitectura legacyAltaNo usa React/TypeScript. Vanilla JS con jQuery
Sin tipos TypeScriptAltaNo hay interfaces ni tipos definidos
Sin Zod schemasAltaValidaciones solo via HTML5 required + proxy PHP
Sin TanStack QueryMediaNo hay cache, no hay invalidacion, no hay loading states automaticos
Sin React Hook FormMediaManejo manual de formularios con eventos DOM
POST no funcionalMediaFormulario tiene logica POST pero proxy no lo soporta
Checkboxes sin tabindexBajaCheckboxes del formulario no son accesibles por teclado
Atajo Alt+A no implementadoBajaReferenciado en UI pero no funcional
IDs duplicados en tablaMedia#idCheckDefecto y #idBtnModificarCondIva se repiten en cada fila

Plan de migracion sugerido

Para migrar a la arquitectura moderna del sistema, se necesitaria:

  1. Types: Crear ts/ventas/CondicionIva/types/condicionIva.types.ts
  2. Schema Zod: Crear ts/ventas/CondicionIva/schemas/condicionIva.schema.ts
  3. Service: Crear ts/ventas/CondicionIva/services/condicionIva.service.ts (usando api.ts con Axios)
  4. Hooks: Crear ts/ventas/CondicionIva/hooks/useCondicionIva.ts (TanStack Query)
  5. Components: Crear ts/ventas/CondicionIva/components/CondicionIvaTable/ y CondicionIvaForm/
  6. View: Crear ts/ventas/CondicionIva/views/CondicionIvaView.tsx
  7. Config: Registrar en queryKeys.ts, routes.tsx, sidebar.ts

Preguntas Tecnicas Pendientes

Aclaraciones Requeridas: Hay aspectos tecnicos que requieren validacion. Ver: Preguntas sobre Condicion IVA


Referencias


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