Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proyecto de Procesamiento de Recibos de Luz v2
Proyecto de Procesamiento de Recibos de Luz v2
Alcance
Se requiere de un sistema que pueda ser capaz de leer los archivos de recibos de luz almacenados
en un bucket y solo tomará en cuenta cuando el cliente del recibo sea IPT (ruc 20602982174 o
nombre Internet Para Todos).
El usuario final dejara los archivos por winscp en un bucket de GCP donde debe existir una
carpeta por cada compañía eléctrica y dentro de estas se colocarán los archivos del mes que
luego de procesarse además de insertarse en la base de datos, debe generar un resumen csv que
contendrá los datos de los archivos dejados en cada carpeta con el detalle de la ejecución de
estos y de los archivos hijos resultantes y el contenido de los recibos del mes al que corresponde.
Debe existir una tabla de constantes donde se parametrice toda la aplicación de acuerdo con el
ambiente en que se encuentre y estas deben estar habilitadas por defecto, pero pueden ser
desactivadas para escoger entre una u otra.
Se debe entregar configurado 20 compañías eléctricas de las cuales algunas cuentan con dos
formatos diferentes. Se tienen alrededor de 2200 recibos de luz repartidos entre las 20
compañías eléctricas y el consumo del procesamiento no debe exceder los 200 dólares mensuales
en total por todos los servicios involucrados en las ejecuciones para este proyecto sobre la nube
de GCP.
El 98% de recibos se encuentra en los 14 primeros elementos de la siguiente lista de compañías
eléctricas. Las 10 primeras compañías eléctricas de la lista deben llegar a un 100% de eficiencia,
el resto debería superar el 95% de efectividad. Esto sumada a la trazabilidad completa del ciclo
de vida del procesamiento de recibos y todos los entregables completos y validados debería ser
un buen indicador de éxito.
Con la lectura de estos archivos se espera que automáticamente podamos contar con
información de (resumen a continuación, extendida en la sección de Diagrama referencial):
• Compañías de Luz con las que trabajamos (debe contar con mantenimiento)
o RUC de Empresa de Luz
o Dirección de Empresa de Luz
o Nro de Cuenta *llenado manualmente o mediante algún proceso masivo
• Suministros (debe contar con mantenimiento, un suministro pertenece a una compañia)
o Nro de Suministro
o Medidor
o Potencia
o Tarifa
o Dirección del Medidor
o Dpto/Prov/Distrito
o Identificador del sitio *llenado manualmente o mediante algún proceso masivo
para relacionar el sitio y el suministro
• Se debe almacenar datos del recibo tales como
o Energía a facturar
o Nro de Recibo
o Fecha de Emisión
o Fecha de Vencimiento
o Fecha de Corte
o Total, Facturado
La primera validación sobre el archivo inicial debe ser el verificar que el recibo pertenezca al RUC
o nombre de IPT para continuar con la lectura.
Se debe configurar y validar que los recibos deban contar con nro de suministro, nro de recibo,
total, fecha de emisión, fecha de corte, fecha de vencimiento, como campos obligatorios y
parametrizables en la tabla de constantes.
Debe existir relación de tablas entre las compañías, formatos, suministros, archivos padres,
archivos hijos, recibos y las tablas deben contar con campos de auditoría que permitan identificar
si las modificaciones fueron hechas por la web o mediante el proceso automático, quien lo hizo,
cuando se creó y se modificó el registro.
Se debe realizar una lectura masiva de los archivos pdf que de acuerdo con las características del
archivo lean el contenido ya que los archivos pueden venir con:
o Recibos con una página por archivo o con muchas páginas por archivo
o Páginas en horizontal
o Páginas en vertical
o Páginas con recibos girados
o Páginas con un recibo por pagina
o Páginas con más de un recibo por pagina
o Páginas con imágenes escaneadas de uno o más recibos
Cada recibo procesado debe generar un nuevo archivo pdf con el contenido correspondiente del
recibo de luz y se debe grabar su relación para mediante el registro en base de datos ubicar el
archivo. Ejem: Un Archivo pdf X tiene 10 recibos dentro, el proceso corta los 10 recibos en
archivos independientes que identifican cada uno a un solo recibo.
Debe existir tablas que permitan hacer trazabilidad a todas las ejecuciones así estas resulten
fallidas donde se podrá encontrar toda la información necesaria para determinar que sucedió
con el archivo que se procesó, cuando ocurrió, que ocurrió y donde encontrar el archivo base y el
archivo independiente.
De tener problemas con la lectura de algún archivo, se debe almacenar el registro del proceso
para saber en qué fallo y solicitar un archivo legible o darnos cuenta si el formato del archivo
cambio o debemos registrar manualmente este recibo.
El procesamiento automático debe tener una constante de encendido para poder apagarlo a
voluntad como contingencia y debe contar con una constante que indique la cantidad de veces
que se ejecutara durante el día y/o las horas de ejecución por día separados por coma.
Al termino de cada procesamiento en el bucket del usuario final debe escribirse o actualizarse un
archivo csv (Ejem: archivo procesados_092022.csv como en la primera imagen del winscp) con
el resultado de todos los archivos procesados (originales/padres) en el mes cuyo contenido debe
ser tanto de procesos exitosos como erróneos con el detalle de cada proceso de cada archivo
resultante (hijos) y mostrando el detalle de cada recibo/boleta que se consiguió leer.
Debe existir una web creada en Django con bd en Mysql e integrada con el Portal de IPT, podemos
proporcionar la base del proyecto donde se trabajará la web que será un módulo dentro del
Portal, para manejar un estándar respecto a otros desarrollos que venimos realizando.
Esta web a la que por ahora llamaremos “Recibos Suministros IPT” debe permitir realizar los
mantenimientos de:
Se debe poder monitorear/consultar el histórico filtrado por año, mes y compañías de los
archivos que se fueron subidos por winscp por el usuario y se debería ver las siguientes opciones.
• Se debe contar con una opción de Archivos Subidos donde debe aparecer un listado de
los archivos que fueron subidos por el usuario y que debe estar almacenado en la tabla
archivos, donde podría descargarme el archivo que se subió y ver el detalle de los
archivos resultantes generados por el proceso, cada uno con el indicador de si está en
proceso o ya termino.
• Se debe poder ver el detalle de cada recibo grabado en la base de datos.
• Esta opción anterior debe permitir una ejecución manual en caso el archivo haya fallado,
incluso debería conocer desde aquí sobre el error ocurrido.
• Se debe poder exportar a Excel el listado mostrado de los archivos que fueron procesados
y los que no, con mensaje del problema de ser el caso.
• Se debe poder descargar comprimidos en formato zip los archivos especificados en el
filtro de búsqueda.
Se debe exponer un endpoint donde podamos consultar los recibos procesados correctamente
en un rango de fecha determinado con una estructura cabecera y detalle con campos como ruc
compañía eléctrica, razón social, banco, número de cuenta, número cci, nro de suministro,
medidor, potencia, tarifa, código de sitio, nombre de estación, categoría, ubigeo, nro de recibo,
kwh a facturar, fecha de recibo, fecha de corte, fecha de vencimiento, total facturado.
Este resumen busca concientizar sobre lo necesario que es tener bien dimensionadas las tablas
ya que en una POC no se tomo en cuenta la trazabilidad que debe existir, este diagrama puede
mejorarse, pero como mínimo se espera que cumpla con las tablas ya indicadas.
En general las fechas de creación y modificación deben ser campos default que graben las fechas
en formato datetime y cada que se actualice la tabla el dato a afectarse solamente sería la fecha
de modificación.
Tabla: Constante
Tabla: CompañiaElectrica
Si la lectura del archivo que le pertenece a una compañía eléctrica falla, debe grabarse todos los
archivos correspondientes en una carpeta que respete la estructura de (/AÑO/MES/NOMBRE
CARPETA de tabla CompañiaElectrica/ERROR_LOGS/).
Tabla: Formato
El campo formato validaciones debe almacenar un JSON donde figuraran todos los campos a
obtener y la forma de obtenerlos y/o limpiarlos, las constantes que pertenecen al grupo de
campos requeridos en todos los formatos deben estar asociados a los campos que aquí aparecen.
Tabla: Suministro
Tabla: ArchivoPadre
Tabla: ArchivoHijo
2. El proceso automático copia el archivo y se lo lleva a una carpeta con el mismo nombre al
bucket de procesados.
3. El proceso automático mediante un flujo interno gira el archivo e intenta detectar el formato
al cual pertenece.
3.1 Si el proceso pudo detectar a que formato pertenece, mueve el archivo original hacia la
carpeta PADRES dentro de la carpeta del formato correspondiente. Ejem:
/ADINELSA/ADINELSA_MENORES/PADRES/, siendo la ruta previa a /PADRES/ un valor tomado
de la ruta_formato de la tabla Formato.
3.1.1 El nombre del archivo padre debe ser renombrado por uno que pueda ser mejor ubicado y
que se indicó previamente en la tabla ArchivoPadre, los valores de los nombres originales y el
nombre nuevo deben ser almacenados en la tabla de ArchivoPadre.
3.2 Si el proceso no pudo detectar a que formato pertenece entonces debe mover el archivo a
una ruta similar a /2022/09/ADINELSA/SIN FORMATO/
4. Si ya se tiene el archivo padre ubicado en la carpeta /PADRES/ debe cortarse el archivo pdf en
sus correspondientes hijos para tener un recibo por archivo pdf y debe colocarlos en la ruta que
corresponda. Ejem: /ADINELSA/ADINELSA_MENORES/HIJOS/, siendo la ruta previa a /HIJOS/ un
valor tomado de la ruta_formato de la tabla Formato.
4.2 Si el proceso de lectura de algún archivo falla deben indicarse en la misma tabla sobre la
falla, dar una pista del error, guardando el contenido JSON y terminando el proceso de lectura,
continuando con el siguiente archivo hijo y contabilizando el éxito o el error en la tabla padre.
4.3 Toda la trazabilidad de las ejecuciones debe grabarse en base de datos, si un archivo fallo
debo tener un monitor que me permita ejecutar el proceso manual de forma masiva (sin importar
la hora de ejecución configurada en constantes) o de manera individual seleccionando el archivo
que quiero reprocesar lo cual sumaria 1 a nro_intentos en la tabla ArchivosPadre.
5. Al final del proceso se genera un archivo CSV con todo el contenido de los archivos procesados
que incluyen todos los archivos leídos en el mes en curso considerando ejecuciones correctas e
incorrectas.
6. Se debe remover de la carpeta del usuario final los archivos que si pasaron de forma
satisfactoria, dejando los archivos pdf errados y sin renombrar en la carpeta /ERROR_LOGS/ del
bucket del usuario (/AÑO/MES/NOMBRE CARPETA de tabla CompañiaElectrica/ERROR_LOGS/)