Un importante banco desea ofrecer una cena a grupos selectos de clientes. El banco definirá 6 grupos de clientes según ciertos criterios, los cuales serán invitados y cada grupo contará con una mesa. Las mesas cuentan con 8 puestos y en caso de que un grupo tenga menos de 4 clientes, la mesa no sería instalada y se considerará cancelada. Se requiere construir un programa que reciba los criterios (filtros) para formar cada grupo y que según esto determine los clientes a ser invitados. La salida del programa debe entregar los códigos de cliente asignados a cada mesa.
En caso de que los filtros devuelvan más de 8 personas, se tomarían las primeras 8 en función de sus depósitos totales (tomando los primeros 8 con mayor monto total sumando el balance de todas sus cuentas y en caso de mismo monto, ordenar por código de manera ascendente como criterio de prioridad para la mesa). En caso de que el total de personas sea menor a 4 personas, marcar la mesa como CANCELADA (ver especificación de la salida).
Es importante tener en cuenta lo siguiente, y es que solo se debe incluir a una persona por empresa (la de mayor monto), es decir, todas las personas en una mesa deben ser de empresas diferentes. Por lo tanto, si dentro de las 8 personas, dos son de la misma empresa, se sacaría de la lista a la persona con menor monto en las cuentas y su lugar sería tomado por el siguiente cliente que cumpla con los requisitos. Algunos clientes tienen su número de identificación encriptado (marcados con el flag encrypt en 1) y requiere ser desencriptado utilizando el web service: https://test.evalartapp.com/extapiquest/code_decrypt/ (Pasar el código a desencriptar al final de la url y capturar la cadena devuelta por el web service con el código desencriptado).
De igual manera, el número de hombres y mujeres debe ser el mismo en cada mesa. En caso de que haya una diferencia, se debe eliminar de la mesa a aquellos con los montos más bajos y remplazarlos por las siguientes personas del sexo opuesto que cumplan con los criterios. En caso de que no sea posible armar una mesa de al menos 4 personas, la mesa deberá ser cancelada.
La entrada será un archivo que su programa debe ser capaz de procesar (descargar el archivo entrada.txt). El archivo contiene cabeceras con el nombre de las mesas y los criterios de filtro para cada una. Estos filtros permiten identificar que clientes son candidatos para ser invitados a esa mesa en particular (Se debe tomar esto en cuenta además de los criterios que aplican a todas las mesas). El formato para los filtros es el código del campo a filtrar, seguido de dos puntos y el valor a utilizar. Los posibles filtros son:
- Tipo de Cliente (TC)
- Código de ubicación geográfica (UG)
- Rango Inicial Balance (RI)
- Rango Final Balance (RF)
Aquí un ejemplo de cómo se veria la entrada:
<General>
TC: 1
UG: 3
RI: 100000
RF: 200000
<Mesa 1>
UG:2
RI: 500000
<Mesa 2>
UG: 1
RF: 10000
En este ejemplo, se solicita la información para llenar 3 mesas (Genera, Mesa 1 y Mesa 2) con diversos criterios. Por ejemplo, la mesa dos serían clientes de la Ubicación Geográfica 2 y con un total en sus cuentas superior a 500000. Todos los filtros corresponden a información contenida en la base de datos de cuentas y clientes (account y client).
La base de datos cuenta con dos tablas, account y client. Debe descargar el archivo bd.txt e importarlo a una base de datos MySQL. Client contiene los datos de los clientes y account las cuentas. Un cliente puede tener entre 0 y varias cuentas.
Estructura de client:
id: Un identificador interno
code: El código del cliente (el dato que se debe usar para los resultados) male: 1 si es hombre, 0 si es mujer
encrypt: 0 si no está encriptado, 1 si requiere desencriptar con el webservice type: El código del tipo de cliente
location: El código de ubicación del cliente
company: El código de la empresa a la que pertenece el cliente
Estructura de account:
id: Un identificador interno
client_id: el id del cliente que posee la cuenta
balance: El monto que posee el cliente en esa cuenta
El formato de salida debe tener una estructura similar a la de entrada, pero en vez de los filtros, se listarían los códigos de los clientes de la lista, separados por comas, sin espacios y ordenados según el monto de sus cuentas (y en caso de coincidir el monto, ordenado por código), de mayor a menor. Para mesas que no alcanzaron los 4 integrantes, se colocaría la palabra CANCELADA. Por ejemplo:
<General>
C10029,C10129,C12105,C10126,C10088,C10091,C10051,C10354
<Mesa 1>
C10629,C15129,C12122,C10198
<Mesa 2>
CANCELADA
Estos ejemplos son ficticios y no corresponden a los resultados que pudiera obtener realmente.
La solución se hace utilizando el lenguaje de programación Java a traves de la construcción de un servicio web que brinda un endpoint para procesar el archivo de carga en formato txt y obtener la respuesta de los invitados para cada mesa.
Las siguientes tecnologias y herramientas de desarrollo de software fueron utilizadas en el proyecto:
- Java 11
- Spring boot
- Gradle
- JDBC
- MySQL
- Postman
- IntelliJ IDEA
Para desplegar la aplicación solo necesitas lo siguiente en tu ambiente:
- Java 11
- Base de datos MySQL
- IDE Java (IntelliJ IDEA)
- Recomandado: Software para consumo de API Rest (postman)
Para ejecutar la aplicación debes seguir los siguientes pasos:
- Importar el proyecto en el IDE de tu preferencia
- Crear la base de datos utilizando el script del archivo
database.sql
- Crear la estructura de la base de datos utilizando el script del archivo
schema.sql
- Crear los datos iniciales utilizando el script del archivo
insert.sql
- Ejecutar la aplicación utilizando Gradle con el comando:
./gradlew bootRun
- Ejecutar Postman o CURL y consumir la url: http://localhost:8080/api/clients/process enviando como parametro el archivo de entrada (con el formato específico)
Para obtener un ejemplo de la petición y la respuesta por favor abrir la colección de Postman que se encuentra en el proyecto con el nombre: hackaton_bancolombia.postman_collection.json