¿Que año es?

Últimamente he recibido muchas quejas de que el año está mal en el archivo CSV resultante de Bank Statement Converter. Al principio, cuando recibí estas quejas, pensé: “¿De qué diablos estás hablando? Todo lo que hacemos es buscar los datos de la transacción y luego escribirlos en un archivo CSV. ¿Cómo puede estar mal el año?”. Veamos qué está pasando con uno de mis extractos bancarios de HSBC.

Cuando se convierte se ve así

Después de descargar y abrir el texto en un editor de texto como Sublime Text, se ve así.

Date,Transaction Details,Deposit,Withdrawal,Balance
20 Feb,B/F BALANCE,,,"XXX"
27 Feb,CREDIT INTEREST,3.84,,"XXX"

Si lo abres en Excel se ve así

Echa un vistazo a la fecha en la parte superior de la imagen. El año está fijado en 2022, pero el CSV no tiene un año en él. Excel es un imbécil y ha agregado en el año en curso.

¿No es nuestro problema?

Podría decirles a mis clientes “Bueno, en realidad Excel es el que agrega el año. El CSV que generamos es correcto, es un problema con Excel”. Eso es tentador, pero seguramente hay una manera de averiguar el año correcto para un extracto bancario. Echemos un vistazo a la parte superior de mi extracto bancario de HSBC.

Hay una fecha misteriosa sin etiqueta que dice “20 de marzo de 2021”. Realmente no podemos saberlo con certeza, pero supongamos que esta fecha es la “Fecha del estado de cuenta” o la fecha en que se generó el estado de cuenta. Veamos si podemos encontrar un método para agregar el año correcto para las fechas que tenemos.

Ejemplo #1 - Marzo

Entrada
Fecha de declaración: 20 de marzo de 2021 Fechas: 20 Feb, 27 Feb, 2 Mar, 4 Mar, 9 Mar, 12 Mar, 16 Mar

Salida
20 Feb 2021
27 Feb 2021
2 Mar 2021
4 Mar 2021
9 Mar 2021
12 Mar 2021
16 Mar 2021

Esto parece bastante fácil de manejar. Tomemos el año a partir de la fecha del estado de cuenta y lo anexámos a las fechas.

Ejemplo #2 - Enero

Entrada
Fecha de declaración: 20 de enero de 2021 Fechas: 22 Dic, 24 Dic, 25 Dic, 31 Dic, 2 Ene, 14 Ene

Salida
22 Dic 2020
24 Dic 2020
25 Dic 2020
31 Dic 2020
2 Ene 2021
14 Ene 2021

Nuestra estrategia del ejemplo anterior no va a funcionar. Lo primero que viene a la mente es detectar el punto de cruce. Se establece el año del estado de cuenta menos uno para todas las fechas antes del cruce. Se establece el año del estado de cuenta para todas las fechas después del punto de cruce. Detectar el punto de cruce es un poco molesto. Una forma de hacerlo es poner un año ficticio en todas las fechas y luego encontrar la primera fecha que sea “menor que” la fecha anterior.

Repasemos el ejemplo. Primero ponemos un año ficticio en todas las fechas: 22 Dic 1999
24 Dic 1999
25 Dic 1999
31 Dic 1999
2 Ene 1999
14 Ene 1999

Luego encontramos la primera fecha que es menor que la anterior. Que es “2 de enero de 1999”. Luego establecemos el año de declaración para todas las fechas posteriores, incluyendo el punto de cruce:

22 Dic 1999
24 Dic 1999
25 Dic 1999
31 Dic 1999
2 Ene 2021
14 Ene 2021

Luego establecemos el año anterior al año de declaración para todas las fechas anteriores al punto de cruce:

22 Dic 2020
24 Dic 2020
25 Dic 2020
31 Dic 2020
2 Ene 2021
14 Ene 2021

Eso es bastante complicado, ¡pero funciona! Aunque huele a fracaso. Si el código huele a fracaso, probablemente lo sea.

Ejemplo #3 - Estado de cuenta de enero sin transacciones de enero

Entrada
Fecha de declaración: 20 de enero de 2021 Fechas: 22 Dec, 24 Dec, 25 Dec, 31 Dec

Salida
22 Dic 2020
24 Dic 2020
25 Dic 2020
31 Dic 2020

No hay ningún punto de cruce en estos datos. Si ejecutáramos nuestro código imaginario, probablemente establecería el año 2021 para todas estas fechas. Que no es lo que queremos. Este conjunto de datos me dejó perplejo durante bastante tiempo. Eventualmente llamé a mi buen amigo Jason Traish. Inmediatamente se le ocurrió el siguiente algoritmo.

“Supongamos que las declaraciones solo retroceden en el tiempo tres meses. Creamos un mapeo para los tres meses anteriores. Enero va a 2021, diciembre a 2020 y noviembre a 2020. Luego transformamos las fechas, tomamos el año correcto del mapeo”

Esto funciona bastante bien. Este método no se preocupa por el orden de las fechas, funcionarán fechas ascendentes, descendentes u ordenadas aleatoriamente.

¿Qué pasa con los archivos PDF combinados?

A algunas personas les gusta combinar varios archivos PDF en uno y luego subirlo a Bank Statement Converter. Esto generalmente funciona bien. Sin embargo, esto realmente podría interferir con nuestra técnica de adición de años. ¿Qué sucede si un usuario carga tres años de extractos bancarios combinados en un solo PDF? Tendríamos que buscar varias fechas de declaración y usar la más cercana en el documento.

¿Qué pasa con las declaraciones que abarcan varios años?

Ah… pasa. Estoy seguro de que existen, pero no creo que sean comunes. Me ocuparé de esto si alguna vez surge.

¿Existe una solución genérica?

Podría ser posible, aunque no lo veo en este momento. Una solución genérica que utilice la estrategia que mencioné anteriormente requeriría una forma genérica de encontrar todas las fechas de los extractos en el PDF. También requeriría una forma genérica de agregar el año a la fecha de una transacción. Tal vez Jason Traish pensará en una solución genérica, hasta entonces continuaré jugando al whack-a-mole arreglando las declaraciones a medida que los clientes se quejan.

Join The Mailing List