detalle de cálculo de algoritmo

20 nov. 2014 - Si el dígito leído es el último de la cadena numérica original, ... cadena original por la cadena resultante y regresar a la posición inicial de la ...
78KB Größe 39 Downloads 128 vistas
DETALLE DE CÁLCULO DE ALGORITMO Algoritmo 62 (10 Dígitos Verificadores) Procedimiento para calcular el Dígito Verificador DATOS NECESARIOS PARA EL CALCULO: Referencia de 1 a 10 Dígitos Importe de $0.01 a $999,999,999.99

Ejemplo: Si la Referencia es igual a: 0675911197 el Importe es igual a: $845.15 y la Fecha es igual a: 20/11/2014 1.

Al año se le resta el número 2014 y se multiplica por el número 372

( 2014 - 2014 ) * 372 = 0 2.

Al mes se le resta la unidad y se multiplica por 31

( 11 - 1 ) * 31 = 310 3.

Al día se le resta la unidad

20 - 1 = 19 4. Se suman los resultados del punto 1,2 y 3 y el resultado es la fecha Condensada. Si la longitud de la fecha condensada es menor a 4 posiciones se agregaran ceros a la izquierda hasta completar las 4 posiciones. 0 + 310 + 18 = 328 Fecha Condensada: 0328 Nota cuando la fecha condensada es menor a 4 digitos se antepone el CERO 5.

Procedimiento para generar el Importe Condensado a 3 Dígitos

Para cifrar el importe de pago e incorporarlo en la línea de captura, se efectúan los siguientes pasos: 1. Se lee el importe y se elimina el punto decimal de éste. 2. Si el número de dígitos es menor de 9 (en caso contrario, ir al paso 3), hacer lo siguiente: 2.1. Ubicar el apuntador al inicio de la cadena numérica resultante en el paso 2.2. Leer el dígito correspondiente y sumarle 1. En caso que el dígito leído de la cadena sea 9, se multiplica por 0. 2.3. El dígito resultante de la operación anterior se inserta dentro de la cadena en la posición inmediata superior a la del dígito leído inicialmente, resultando una nueva cadena numérica (es importante conservar alternamente la cadena numérica original, resultante en el paso 1).

2.4. Si el dígito leído es el último de la cadena numérica original, entonces, sustituir la cadena original por la cadena resultante y regresar a la posición inicial de la misma; de lo contrario, mover el apuntador a la posición siguiente dentro de la cadena numérica original. 2.5. Si el número de dígitos de la nueva cadena es menor de 9, entonces, repetir el proceso desde el paso 2.2. hasta obtener una cadena numérica de 9 dígitos; de lo contrario, continuar con el paso 3. 3. Se incorporan al proceso un multiplicador, cuyo valor inicial es 1, y un acumulador cuyo valor inicial es 0. 4. Ubicar el apuntador en el último dígito de la cadena numérica resultante, y efectuar lo siguiente: 5. En caso que (el * en las expresiones aritméticas significa una multiplicación): 5.1. multiplicador = 1, acumulador = acumulador + dígito leído * 7 5.2. multiplicador = 2, acumulador = acumulador + dígito leído * 3 5.3. multiplicador = 3, acumulador = acumulador + dígito leído * 1 6. Si el valor de acumulador es un número de más de una cifra, entonces, se suman los dígitos primero y último que integran ese valor. 7. Se incrementa en 1 el valor de multiplicador. 8. Si multiplicador > 3, entonces: 8.1. multiplicador = 1 8.2. Se guarda en memoria el residuo resultante de la división de acumulador / 10 9. Si el dígito leído en la cadena numérica es el primero, efectuar los pasos del 5 al 8.2 y terminar el proceso; de lo contrario, desplazar el apuntador al dígito anterior y repetir los pasos del 5 al 8 (u 8.2 de ser necesario). Al finalizar el proceso anterior, se deberá obtener una cadena numérica de tres dígitos, que representa el Importe a pagar cifrado. NOTA IMPORTANTE: En una operación aritmética ejecutada por cualquier computadora ordinaria, la multiplicación tiene mayor prioridad de ejecución que la suma. Algoritmo de encriptación de importe a 3 posiciones 01. VAR Entrada ( ALFANUMERICA ), EntradaAuxiliar ( ALFANUMERICA ), Salida ( ALFANUMERICA ), Digito (ALFANUMERICA ) 02. VAR Long ( NUMERICA ), Posicion ( NUMERICA ), PosicionAuxiliar ( NUMERICA ), Terminar ( LOGICA ) 03. VAR Multiplicador ( NUMERICA ), Suma ( NUMERICA ) 04. LEER( Importe ) 05. Entrada = QuitarEspaciosDeLaIzquierda( Importe ) 06. Entrada = QuitarPuntoDecimal( Entrada ) 07. Long = Longitud( Entrada ) 08. SI Long < 9 ENTONCES 09. EntradaAuxiliar = Entrada 10. Salida = "" 11. Posicion = 1 12. PosicionAuxiliar = 1 13. Terminar = FALSO 14. MIENTRAS NO Terminar 15. SI Longitud( Entrada ) < 9 ENTONCES 16. Digito = ExtraerDigito( Entrada, Posicion, 1 ) 17. SI Digito '9' ENTONCES 18. Salida = InsertarDigito( Entrada, ConvertirATexto( Valor( Digito ) + 1 ), Posicion + 1 ) 19. DE_LO_CONTRARIO 20. Salida = InsertarDigito( Entrada, '0', Posicion + 1 ) 21. FIN_SI 22. FIN_SI 23. Entrada = Salida 24. SI Longitud( Entrada ) = 9 ENTONCES 25. Terminar = VERDADERO 26. DE_LO_CONTRARIO 27. SI PosicionAuxiliar < Longitud( EntradaAuxiliar ) ENTONCES 28. Posicion = Posicion + 2 29. PosicionAuxiliar = PosicionAuxiliar + 1

30. DE_LO_CONTRARIO 31. EntradaAuxiliar = Entrada 32. Posicion = 1 33. PosicionAuxiliar = 1 34. FIN_SI 35. FIN_SI 36. FIN_MIENTRAS 37. FIN_SI 38. Veces = 1 39. Multiplicador = 1 40. Suma = 0 41. Salida = "" 42. Posicion = Longitud( Entrada ) 43. MIENTRAS Posicion >= 1 44. SELECCIONAR Multiplicador 45. CASO 1: 46. Suma = Suma + ConvertirAEntero( ExtraerDigito( Entrada, Posicion, 1 ) ) * 7 47. CASO 2: 48. Suma = Suma + ConvertirAEntero( ExtraerDigito( Entrada, Posicion, 1 ) ) * 3 49. CASO 3: 50. Suma = Suma + ConvertirAEntero( ExtraerDigito( Entrada, Posicion, 1 ) ) * 1 51. FIN_SELECCIONAR 52. SI Longitud( QuitarEspaciosDeLaIzquierda( ConvertirATexto( Suma ) ) ) > 1 ENTONCES 53. Suma = ConvertirAEntero( ExtraerDeLaIzquierda( QuitarEspaciosDeLaIzquierda( ConvertirATexto( Suma ) ), 1 ) ) + ConvertirAEntero( ExtraerDeLaDerecha( QuitarEspaciosDeLaIzquierda( ConvertirATexto( Suma ) ), 1 ) ) 54. FIN_SI 56. Multiplicador = Multiplicador + 1 57. SI Multiplicador > 3 ENTONCES 58. Multiplicador = 1 59. Salida = Salida + QuitarEspaciosDeLaIzquierda( ConvertirATexto( Suma MOD 10 ) ) 60. FIN_SI 64. Posicion = Posicion - 1 65. FIN_MIENTRAS

CASO PRÁCTICO IMPORTE CONDENSADO A 3 POSICIONES Téngase como entrada el importe de $ 845.15 1. Eliminando el punto decimal: 845.15 → 84515 2. Como la longitud de la cadena resultante es menor de 9 dígitos, entonces: 2.1. Se ubica el apuntador al inicio de la cadena 84515 2.2. Se lee el dígito, y se efectúa la suma 8 + 1 = 9 2.3. Se inserta el número 9 en la cadena original, una posición posterior a 8: 894515 2.4. Se mueve el apuntador al siguiente dígito de la cadena original: 894515 2.5. Como el número de dígitos de la cadena resultante es menor de 9, entonces, 4 + 1 = 5 (paso 2.2) 2.6. Se inserta el número 5 en la cadena, una posición posterior a 4: 8945515 (paso 2.3) 2.7. Se mueve el apuntador al siguiente dígito de la cadena original: 8945515 2.8. Como el número de dígitos de la cadena resultante es menor de 9, entonces, 5 + 1 = 6 (paso 2.2) 2.9. Se inserta el número 6 en la cadena, una posición posterior a 5: 89455615 (paso 2.3) 2.10. Se mueve el apuntador al siguiente dígito de la cadena original: 89455615 2.11. Como el número de dígitos de la cadena resultante es menor de 9, entonces, 1 + 1 = 2 (paso 2.2) 2.12. Se inserta el número 2 en la cadena, una posición posterior a 1: 894556125 (paso 2.3) 2.13. Al ejecutarse el paso anterior, se obtiene la cadena deseada de 9 dígitos: 894556125 3. multiplicador = 1, acumulador = 0 4. Se ubica el apuntador en el último dígito de la cadena: 894556125 CASO PRÁCTICO: Téngase como entrada el importe de $ 845.15 5. Como multiplicador = 1, entonces, acumulador = acumulador + 5 * 7 = 35 (el último valor de acumulador, anterior a esta operación, es 0) 6. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 3 + 5 = 8 7. multiplicador = multiplicador + 1 = 2 (el último valor de multiplicador, anterior a esta operación, es 1) 8. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125

9. Como multiplicador = 2, entonces, acumulador = acumulador + 2 * 3 = 14 (el último valor de acumulador, anterior a esta operación, es 8) 6. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 1 + 4 = 5 7. multiplicador = multiplicador + 1 = 3 (el último valor de multiplicador, anterior a esta operación, es 2) 8. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 10. Como multiplicador = 3, entonces, acumulador = acumulador + 1 * 1 = 6 (el último valor de acumulador, anterior a esta operación, es 5) 11. multiplicador = multiplicador + 1 = 4 (el último valor de multiplicador, anterior a esta operación, es 3) 12. Como multiplicador > 3, entonces, multiplicador = 1 y guardar en memoria el residuo de la división de acumulador / 10 = 6 13. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 14. Como multiplicador = 1, entonces, acumulador = acumulador + 6 * 7 = 48 (el último valor de acumulador, anterior a esta operación, es 6) 15. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 4 + 8 = 12 16. multiplicador = multiplicador + 1 = 2 (el último valor de multiplicador, anterior a esta operación, es 1) 17. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 14. Como multiplicador = 2, entonces, acumulador = acumulador + 5 * 3 = 27 (el último valor de acumulador, anterior a esta operación, es 12) 15. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 2 + 7 = 9 16. multiplicador = multiplicador + 1 = 3 (el último valor de multiplicador, anterior a esta operación, es 2) 17. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 18. Como multiplicador = 3, entonces, acumulador = acumulador + 5 * 1 = 14 (el último valor de acumulador, anterior a esta operación, es 9) 19. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 1 + 4 = 5 20. multiplicador = multiplicador + 1 = 4 (el último valor de multiplicador, anterior a esta operación, es 3) 21. Como multiplicador > 3, entonces, multiplicador = 1 y guardar en memoria el residuo de la división de acumulador / 10 = 5 22. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 23. Como multiplicador = 1, entonces, acumulador = acumulador + 4 * 7 = 33 (el último valor de acumulador, anterior a esta operación, es 5) 24. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 3 + 3 = 6 25. multiplicador = multiplicador + 1 = 2 (el último valor de multiplicador, anterior a esta operación, es 1) 26. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 27. Como multiplicador = 2, entonces, acumulador = acumulador + 9 * 3 = 33 (el último valor de acumulador, anterior a esta operación, es 6) 28. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 3 + 3 = 6 29. multiplicador = multiplicador + 1 = 3 (el último valor de multiplicador, anterior a esta operación, es 2) 30. Se desplaza el apuntador a la posición inmediata anterior en la cadena: 894556125 31. Como multiplicador = 3, entonces, acumulador = acumulador + 8 * 1 = 14 (el último valor de acumulador, anterior a esta operación, es 9) 32. Como el número resultante de la operación es de dos cifras, entonces, acumulador = 1 + 4 = 5 33. multiplicador = multiplicador + 1 = 4 (el último valor de multiplicador, anterior a esta operación, es 3) 34. Como multiplicador > 3, entonces, multiplicador = 1 y guardar en memoria el residuo de la división de acumulador / 10 = 5

35. El proceso finaliza por tratarse del primer dígito en la cadena original, y se concatenan (unen) los dígitos resultantes (guardados en memoria) en proceso, en el orden en que se obtuvieron: 655, lo que representa el importe cifrado a tres dígitos.

8. A la derecha de la Referencia se le agrega la fecha condensada, y a la derecha de estos el importe condensado y la constante 2, quedando el siguiente formato: RRRRRRRRRRFFFFIII2 067591119734946552

9. A la Referencia resultante del punto 8, se les multiplica por los ponderadores 11, 13, 17, 19 y 23, de derecha a izquierda y siempre iniciando la secuencia con el número 11, aun cuando el número a multiplicar sea 0 deberá tomarse en cuenta. 0 * 17 0

10.

6 4 * * 13 13 78 52

7 9 * * 11 11 77 99

5 4 * * 23 23 115 92

9 6 * * 19 19 171 114

1 5 * * 17 17 17 85

1 5 * * 13 13 13 65

1 2 * * 11 11 11 22

9

7

3

*

*

*

23

19

17

207

133

51

Se suman todos los resultados de las multiplicaciones del punto 9.

0 + 78 + 77 + 115 + 171 + 17 + 13 + 11 + 207 + 133 + 0 + 0 + 33 + 92 + 171 + 68 + 78 + 22 = 1396 11. El resultado de la suma indicada en el punto 10, se divide entre 97 y al residuo se le suma 1.

97

14 | 1396 426 38

Z 38 + 1 = 39 El dígito verificador estará formado por los cuatro dígitos de la fecha condensada, los 3 dígitos del importe condensado, la constante 2 y los dos dígitos verificadores del punto 11 Dígito Verificador: 3494655239 12. A la referencia se le agregara el dígito verificador y esa será la línea de captura que recibirá el cajero en ventanilla. Referencia Completa: 06759111973494655239