# REPORTE DE COSTO STORE ESPECIFICO 2

Fuente: /var/www/html/qareportes/app/Http/Controllers/Cloud/CentroCostosController.php

## 1) Nombre del reporte

- Nombre: Reporte de Costo Store Específico 2
- Código / Alias: update\_specific\_store
- Responsable: Equipo de Reportes Cloud
- Propósito (1 línea):

## 2) Alcance temporal

- Campo(s) de fecha utilizados:
- first\_day, last\_day (generados por obtainRangeDaysByYear)
- from\_date, to\_date (pasados a reportes ERPNext)

- Tipo de rango (diario / mensual / personalizado):
- Mensual dinámico, basado en el mes actual (date("m"))
- Se generan rangos de inicio y fin de mes (Y-m-d)
- Puede limitarse al mes actual o retroceder 2 meses (según condición en $first\_month).

- Inclusión de horas (sí/no).: Sí \[00:00:00 – 23:59:59\]
- Zona horaria: La del servidor

## 3) Origen de datos (tablas/APIs)

3.1 Conexión / Base: CAPACITACION

- Tabla / Recurso: report\_centro\_costo\_store\_especifico\_2
- Alias (si aplica): $table
- Campos utilizados (clave → descripción):
- id → Identificador primario autoincremental
- agencia → Nombre de la agencia o sucursal
- producto\_servicio → Tipo de elemento (‘PRODUCTO’ o ‘SERVICIO’)
- nombre\_articulo → Nombre del artículo o servicio
- stock\_inicial → Stock inicial del periodo
- unidades\_recibidas → Cantidad ingresada en el periodo
- unidades\_vendidas → Cantidad vendida
- merma → Cantidad perdida o desechada
- inventario\_final → Existencia final calculada
- costo\_de\_compra → Costo unitario de compra
- precio\_venta → Precio unitario de venta
- valor\_inventario\_final → Valor total del inventario final
- valor\_venta → Valor total de ventas
- valor\_compra → Valor total de compras
- retabilidad → Diferencia entre valor de venta y compra
- ano → Año del reporte
- periodo → Mes del reporte
- created\_date → Fecha de creación del registro
- status → Estado lógico del registro (activo = 1)


- Condiciones (WHERE) aplicadas:
- Dinámicas según rango de fechas (first\_date, second\_date)
- Filtros heredados de subconsultas (warehouse, item\_group, price\_list)

- Tipo de unión con otras fuentes (JOIN y llave): No aplica directamente (la consolidación se realiza por combinación de arrays en PHP)
- Observaciones (ej. particiones, índices):
- La tabla se recrea dinámicamente por mes/año (CREATE TABLE report\_centro\_costo\_store\_especifico\_2\_YYYY\_MM)
- Se indexa el campo status
- Inserciones masivas por bloques de 900 registros


3.2 Conexión / Base: CAPACITACION

- Tabla / Recurso: tabWarehouse as alm
- Alias (si aplica): $data\_warehouse
- Campos utilizados (clave → descripción):
- alm.name → Nombre del almacén


- Condiciones (WHERE) aplicadas: WHERE LOCATE('Tienda', alm.name) &gt; 0 (solo almacenes que contienen la palabra “Tienda”)
- Tipo de unión con otras fuentes (JOIN y llave): Se cruza con warehouse de report\_stock\_balance mediante coincidencia exacta de nombre
- Observaciones (ej. particiones, índices):
- Retorna únicamente almacenes activos de tipo “Tienda”
- Estructura esperada: {status, message, data\[\]}


3.3 Conexión / Base: CAPACITACION

- Tabla / Recurso: tabDelivery Note
- Alias (si aplica): $data\_desecho
- Campos utilizados (clave → descripción):
- dni.warehouse → Almacén origen
- dn.creation → Fecha de creación
- dni.item\_code → Código del artículo
- dni.qty → Cantidad desechada


- Condiciones (WHERE) aplicadas:
- dn.sele = 'Desecho'
- dn.status = 'To Bill'
- dn.creation BETWEEN first\_date AND second\_date

- Tipo de unión con otras fuentes (JOIN y llave): LEFT JOIN tabDelivery Note Item AS dni ON (dn.name = dni.parent)
- Observaciones (ej. particiones, índices):
- Permite calcular el valor de merma por producto
- API: method/send-query-database


3.4 Conexión / Base: CAPACITACION

- Tabla / Recurso: tabDelivery Note Item
- Alias (si aplica): $data\_desecho
- Campos utilizados (clave → descripción):
- dni.warehouse → Almacén origen
- dn.creation → Fecha de creación
- dni.item\_code → Código del artículo
- dni.qty → Cantidad desechada


- Condiciones (WHERE) aplicadas:
- dn.sele = 'Desecho'
- dn.status = 'To Bill'
- dn.creation BETWEEN first\_date AND second\_date

- Tipo de unión con otras fuentes (JOIN y llave): LEFT JOIN tabDelivery Note Item AS dni ON (dn.name = dni.parent)
- Observaciones (ej. particiones, índices):
- Permite calcular el valor de merma por producto
- API: method/send-query-database


3.5 Conexión / Base: CAPACITACION

- Tabla / Recurso: method/erpnext.stock.report.stock\_balance.stock\_balance.report\_stock\_balance
- Alias (si aplica): $get\_report\_stock\_balance
- Campos utilizados (clave → descripción):
- warehouse → Nombre o código del almacén
- item\_name → Nombre del artículo o producto
- item\_group → → Grupo o categoría del ítem
- opening\_qty → Cantidad inicial en inventario
- in\_qty → Cantidad ingresada al almacén
- out\_qty → Cantidad salida del almacén
- val\_rate → Valor unitario o tasa de valoración del producto


- Condiciones (WHERE) aplicadas:
- company = 'Shalom Empresarial'
- item\_group = 'TIENDA'
- from\_date, to\_date dinámicos

- Tipo de unión con otras fuentes (JOIN y llave):
- Combina con tabWarehouse (por nombre de almacén)
- Cruza con get\_desechos (por warehouse e item\_code)

- Observaciones (ej. particiones, índices):
- Endpoint protegido con token de autenticación
- Retorna estructura JSON con message (array de registros)


3.6 Conexión / Base: CAPACITACION

- Tabla / Recurso: method/erpnext.stock.report.stock\_ledger.stock\_ledger.report\_stock
- Alias (si aplica): $get\_report\_stock\_ledger
- Campos utilizados (clave → descripción):
- item\_name → Nombre del artículo o producto
- actual\_qty → Cantidad actual disponible en inventario
- valuation\_rate → Valor unitario o tasa de valoración del ítem
- qty\_after\_transaction → Cantidad total después de la transacción
- in\_qty → Cantidad ingresada en la transacción
- out\_qty → Cantidad retirada o despachada en la transacción


- Condiciones (WHERE) aplicadas:
- from\_date, to\_date, company = 'Shalom Empresarial'
- warehouse = 'ALMACEN GENERAL-TIENDA - SE'

- Tipo de unión con otras fuentes (JOIN y llave):
- Relación por item\_name con los productos de get\_report\_stock\_balance

- Observaciones (ej. particiones, índices):
- Permite calcular stock inicial y final detallado
- Respuesta JSON con niveles \[message\]\[1\] para los datos válidos


3.7 Conexión / Base: CAPACITACION

- Tabla / Recurso: tabItem Price
- Alias (si aplica): $pricelist\_respo
- Campos utilizados (clave → descripción):
- price\_list\_rate → Precio de venta estándar


- Condiciones (WHERE) aplicadas:
- price\_list = 'Venta estándar'
- selling = 1
- docstatus = 0
- item\_name = &lt;producto&gt;

- Tipo de unión con otras fuentes (JOIN y llave):
- Se asocia por item\_name con registros del balance de stock

- Observaciones (ej. particiones, índices):
- Se consulta individualmente por cada producto
- Orden descendente por creation (último precio vigente)


## 4) Filtros globales del reporte

- Inclusiones (must-have):
- Solo artículos con grupo 'TIENDA'
- Solo almacenes cuyo nombre contenga 'Tienda'
- Solo movimientos de la empresa 'Shalom Empresarial'

- Exclusiones (reglas de descarte):
- Desechos no clasificados fuera de rango
- Precios con docstatus ≠ 0

- Reglas por estado / habilitado: Campos status = 1 (activos en tabla destino)
- Parámetros externos (si el usuario puede filtrarlo): No se expone interfaz de usuario directa (parámetros internos calculados).

## 5) Transformaciones y Reglas de negocio

- Derivaciones de campos (cómo se calculan):
- inventario\_final = opening\_qty + in\_qty - out\_qty - merma
- valor\_inventario\_final = inventario\_final \* val\_rate
- valor\_venta = out\_qty \* price\_list\_rate
- valor\_compra = out\_qty \* val\_rate
- retabilidad = valor\_venta - valor\_compra

- Mapeos de estado:
- item\_group == 'SERVICIOS' → producto\_servicio = 'SERVICIO'
- En caso contrario → 'PRODUCTO'

- Reglas de validación (p.ej., sólo registros validados): Retorna error si alguno de los servicios ERP no devuelve status=true.
- Reglas condicionales (si X entonces Y): Si no hay branch, se obtiene de warehouse (partido por “-” para nombre de sucursal).

##  

## 6) Estructura de salida

- Tabla/archivo destino: report\_centro\_costo\_store\_especifico\_2
- Particionado / sufijo: Se crea tabla mensual: report\_centro\_costo\_store\_especifico\_2\_YYYY\_MM
- Clave(s) primaria(s) o únicas: id (INT AUTO\_INCREMENT PRIMARY KEY)
- Columnas del reporte (nombre → tipo → descripción):
- id → INT → Identificador único del registro (PK)
- agencia → VARCHAR(255) → Nombre de la tienda o sucursal
- producto\_servicio → ENUM → Clasificación del ítem (producto / servicio)
- nombre\_articulo → VARCHAR(225) → Descripción o nombre completo del artículo
- stock\_inicial → FLOAT → Cantidad disponible al inicio del periodo
- unidades\_recibidas → FLOAT → Total de unidades ingresadas durante el periodo
- unidades\_vendidas → FLOAT → Total de unidades vendidas o despachadas
- merma → VARCHAR(20) → Cantidad perdida o deteriorada
- inventario\_final → FLOAT → Stock final calculado (stock\_inicial + recibidas - vendidas - merma)
- costo\_de\_compra → VARCHAR(20) → Costo unitario de adquisición
- precio\_venta → FLOAT → Precio unitario de venta
- valor\_inventario\_final → FLOAT → Valor monetario del inventario final
- valor\_venta → FLOAT → Ingreso total generado por ventas
- valor\_compra → FLOAT → Costo total de adquisición
- rentabilidad → FLOAT → Diferencia entre valor\_venta y valor\_compra
- ano → INT → Año correspondiente al periodo
- periodo → VARCHAR(20) → Nombre del mes o periodo (ej. “ENERO”)
- created\_date → DATETIME → Fecha y hora de creación del registro
- status → TINYINT → Estado lógico del registro (1=activo, 0=inactivo)


- Ordenamiento por defecto: No explícito en SQL; implícito por inserción.

## 7) Frecuencia y operación

- Frecuencia de actualización: PENDIENTE (Esperando info de Eduardo)
- Ventana que recalcula (días/meses): Último mes (por defecto), con opción de extender 2 meses atrás
- Tamaño de lote / paginado (chunking): Inserción por array\_chunk de 900 registros
- Tolerancia a fallos / reintentos:
- Manejo de try-catch con rollback de transacción
- Registro en tabla emp\_reportes\_validation con status=0

- Tiempos de ejecución esperados: PENDIENTE (Esperando info de Eduardo)

##  

## 8) Calidad y controles

- Validaciones previas/post:
- Verifica existencia de tabla destino (exist\_table\_bd)
- Crea índice status si la tabla es nueva
- Inserta registro de validación con fechas procesadas.

- Controles de duplicados: La tabla se recrea por mes → evita duplicidad de periodo
- Métricas de completitud (qué se monitorea):
- Conteo de registros por rango de fechas validado en emp\_reportes\_validation.


## 9) Dependencias externas

- APIs / servicios y endpoints:
- APICAPACITACION . "method/send-query-database"
- APICAPACITACION . "method/erpnext.stock.report.stock\_balance.stock\_balance.report\_stock\_balance"
- APICAPACITACION . "method/erpnext.stock.report.stock\_ledger.stock\_ledger.report\_stock"

- Autenticación / headers:
- Authorization: token fc60669957e6bdc:b207d472e96c9df
- Content-Type: application/json

- Mapeos y contratos de datos:
- Todos los endpoints devuelven message o response en JSON
- Campo valor indica validez (true/false).


## 10) Historial de cambios

2025-10-21 14:00 - Elian Franco Arroyo Rodas - Documentación inicial