*##########################################################
*#
*# Nuevo Sistema de Facturacion - BOLIVIA
*# (c) Ing. Luis Braulio Camacho Espinoza, 2007
*#
[email protected]
*# Uso rc4(nroaut, nrofac, nit, fecha, totalbs, mensaje)
*# Donde :
*# nroaut: es el numero de autorizacion de las facturas
*# nrofac: es el numero de factura
*# nit: es el NIT del cliente
*# fecha es la fecha de la factura
*# totalbs es el monto total de la factura
*# mensaje es la llave proporcionada por el SIN
*# Retorna:
*# Cadena codificada
*#
*# Puede ser utilizado como esta o modificado a sus requerimientos
*# solo, por favor, mantengan el nombre del autor.
*#
*##########################################################
FUNCTION RC4
PARAMETERS nroaut, nrofac, nit, fecha, totalbs, mensaje
PRIVATE ALL
*
paramok = .T.
IF (nroaut <= 0)
WAIT WIND "RC4: Error en el Número de Autorización = " + STR(nroaut)
paramok = .F.
ENDIF
IF (nrofac <= 0)
WAIT WIND "RC4: Error en el Número de Factura = " + STR(nrofac)
paramok = .F.
ENDIF
IF (nit < 0)
WAIT WIND "RC4: Error en el NIT = " + STR(nit)
paramok = .F.
ENDIF
IF (totalbs <= 0)
WAIT WIND "RC4: Error en el Total de la factura = " + STR(totalbs)
paramok = .F.
ENDIF
IF (fecha < CTOD("01/01/2000"))
WAIT WIND "RC4: Error en la Fecha = " + DTOC(fecha)
paramok = .F.
ENDIF
IF LEN(TRIM(mensaje)) <= 0
WAIT WIND "RC4: Error en la llave = " + mensaje
paramok = .f.
ENDIF
IF paramok = .F.
WAIT WIND "RC4: Error en los datos de entrada, no puedo continuar"
WAIT WIND "RC4: Error en los datos de entrada, no puedo continuar"
RETURN ("")
ENDIF
*
nroautd = (nroaut * 10) + FDigitoVer(nroaut)
nrofacd = (nrofac * 10) + FDigitoVer(nrofac)
nitd = (nit * 10) + FDigitoVer(nit)
*
fec = VAL(DTOS(fecha))
fechad = (fec * 10) + FDigitoVer(fec)
*
totbs = FRedondear(totalbs)
totalbsd = (totbs * 10) + FDigitoVer(totbs)
*
suma = (nroautd + nrofacd + nitd + fechad + totalbsd)
*
xmodulo = (suma % ((64^5)-1))
*
mbase64 = FBase64(xmodulo)
*
mrc4 = F_RC4(mbase64, mensaje)
*
RETURN (mrc4)
*
********************************
FUNCTION FRedondear
PARAMETERS mnro
PRIVATE ALL
*
n1 = INT(mnro)
IF (mnro - n1) >= 0.5
n2 = n1 + 1
ELSE
n2 = n1
ENDIF
RETURN (n2)
***********************************************************
***********************************************************
* Digito, obtiene el d¡gito verificador de un n£mero
* (c) Ing. Luis Braulio Camacho Espinoza, 2007
***********************************************************
***********************************************************
FUNCTION FDigitoVer
PARAMETERS nro
PRIVATE ALL
*
DIMENSION g_vhf_mul[10,10]
DIMENSION g_vhf_per[8,10]
DIMENSION g_vhf_inv[10]
*
g_vhf_mul[1,1] = 0
g_vhf_mul[1,2] = 1
g_vhf_mul[1,3] = 2
g_vhf_mul[1,4] = 3
g_vhf_mul[1,5] = 4
g_vhf_mul[1,6] = 5
g_vhf_mul[1,7] = 6
g_vhf_mul[1,8] = 7
g_vhf_mul[1,9] = 8
g_vhf_mul[1,10] = 9
g_vhf_mul[2,1] = 1
g_vhf_mul[2,2] = 2
g_vhf_mul[2,3] = 3
g_vhf_mul[2,4] = 4
g_vhf_mul[2,5] = 0
g_vhf_mul[2,6] = 6
g_vhf_mul[2,7] = 7
g_vhf_mul[2,8] = 8
g_vhf_mul[2,9] = 9
g_vhf_mul[2,10] = 5
g_vhf_mul[3,1] = 2
g_vhf_mul[3,2] = 3
g_vhf_mul[3,3] = 4
g_vhf_mul[3,4] = 0
g_vhf_mul[3,5] = 1
g_vhf_mul[3,6] = 7
g_vhf_mul[3,7] = 8
g_vhf_mul[3,8] = 9
g_vhf_mul[3,9] = 5
g_vhf_mul[3,10] = 6
g_vhf_mul[4,1] = 3
g_vhf_mul[4,2] = 4
g_vhf_mul[4,3] = 0
g_vhf_mul[4,4] = 1
g_vhf_mul[4,5] = 2
g_vhf_mul[4,6] = 8
g_vhf_mul[4,7] = 9
g_vhf_mul[4,8] = 5
g_vhf_mul[4,9] = 6
g_vhf_mul[4,10] = 7
g_vhf_mul[5,1] = 4
g_vhf_mul[5,2] = 0
g_vhf_mul[5,3] = 1
g_vhf_mul[5,4] = 2
g_vhf_mul[5,5] = 3
g_vhf_mul[5,6] = 9
g_vhf_mul[5,7] = 5
g_vhf_mul[5,8] = 6
g_vhf_mul[5,9] = 7
g_vhf_mul[5,10] = 8
g_vhf_mul[6,1] = 5
g_vhf_mul[6,2] = 9
g_vhf_mul[6,3] = 8
g_vhf_mul[6,4] = 7
g_vhf_mul[6,5] = 6
g_vhf_mul[6,6] = 0
g_vhf_mul[6,7] = 4
g_vhf_mul[6,8] = 3
g_vhf_mul[6,9] = 2
g_vhf_mul[6,10] = 1
g_vhf_mul[7,1] = 6
g_vhf_mul[7,2] = 5
g_vhf_mul[7,3] = 9
g_vhf_mul[7,4] = 8
g_vhf_mul[7,5] = 7
g_vhf_mul[7,6] = 1
g_vhf_mul[7,7] = 0
g_vhf_mul[7,8] = 4
g_vhf_mul[7,9] = 3
g_vhf_mul[7,10] = 2
g_vhf_mul[8,1] = 7
g_vhf_mul[8,2] = 6
g_vhf_mul[8,3] = 5
g_vhf_mul[8,4] = 9
g_vhf_mul[8,5] = 8
g_vhf_mul[8,6] = 2
g_vhf_mul[8,7] = 1
g_vhf_mul[8,8] = 0
g_vhf_mul[8,9] = 4
g_vhf_mul[8,10] = 3
g_vhf_mul[9,1] = 8
g_vhf_mul[9,2] = 7
g_vhf_mul[9,3] = 6
g_vhf_mul[9,4] = 5
g_vhf_mul[9,5] = 9
g_vhf_mul[9,6] = 3
g_vhf_mul[9,7] = 2
g_vhf_mul[9,8] = 1
g_vhf_mul[9,9] = 0
g_vhf_mul[9,10] = 4
g_vhf_mul[10,1] = 9
g_vhf_mul[10,2] = 8
g_vhf_mul[10,3] = 7
g_vhf_mul[10,4] = 6
g_vhf_mul[10,5] = 5
g_vhf_mul[10,6] = 4
g_vhf_mul[10,7] = 3
g_vhf_mul[10,8] = 2
g_vhf_mul[10,9] = 1
g_vhf_mul[10,10] = 0
*
g_vhf_per[1,1] = 0
g_vhf_per[1,2] = 1
g_vhf_per[1,3] = 2
g_vhf_per[1,4] = 3
g_vhf_per[1,5] = 4
g_vhf_per[1,6] = 5
g_vhf_per[1,7] = 6
g_vhf_per[1,8] = 7
g_vhf_per[1,9] = 8
g_vhf_per[1,10] = 9
g_vhf_per[2,1] = 1
g_vhf_per[2,2] = 5
g_vhf_per[2,3] = 7
g_vhf_per[2,4] = 6
g_vhf_per[2,5] = 2
g_vhf_per[2,6] = 8
g_vhf_per[2,7] = 3
g_vhf_per[2,8] = 0
g_vhf_per[2,9] = 9
g_vhf_per[2,10] = 4
g_vhf_per[3,1] = 5
g_vhf_per[3,2] = 8
g_vhf_per[3,3] = 0
g_vhf_per[3,4] = 3
g_vhf_per[3,5] = 7
g_vhf_per[3,6] = 9
g_vhf_per[3,7] = 6
g_vhf_per[3,8] = 1
g_vhf_per[3,9] = 4
g_vhf_per[3,10] = 2
g_vhf_per[4,1] = 8
g_vhf_per[4,2] = 9
g_vhf_per[4,3] = 1
g_vhf_per[4,4] = 6
g_vhf_per[4,5] = 0
g_vhf_per[4,6] = 4
g_vhf_per[4,7] = 3
g_vhf_per[4,8] = 5
g_vhf_per[4,9] = 2
g_vhf_per[4,10] = 7
g_vhf_per[5,1] = 9
g_vhf_per[5,2] = 4
g_vhf_per[5,3] = 5
g_vhf_per[5,4] = 3
g_vhf_per[5,5] = 1
g_vhf_per[5,6] = 2
g_vhf_per[5,7] = 6
g_vhf_per[5,8] = 8
g_vhf_per[5,9] = 7
g_vhf_per[5,10] = 0
g_vhf_per[6,1] = 4
g_vhf_per[6,2] = 2
g_vhf_per[6,3] = 8
g_vhf_per[6,4] = 6
g_vhf_per[6,5] = 5
g_vhf_per[6,6] = 7
g_vhf_per[6,7] = 3
g_vhf_per[6,8] = 9
g_vhf_per[6,9] = 0
g_vhf_per[6,10] = 1
g_vhf_per[7,1] = 2
g_vhf_per[7,2] = 7
g_vhf_per[7,3] = 9
g_vhf_per[7,4] = 3
g_vhf_per[7,5] = 8
g_vhf_per[7,6] = 0
g_vhf_per[7,7] = 6
g_vhf_per[7,8] = 4
g_vhf_per[7,9] = 1
g_vhf_per[7,10] = 5
g_vhf_per[8,1] = 7
g_vhf_per[8,2] = 0
g_vhf_per[8,3] = 4
g_vhf_per[8,4] = 6
g_vhf_per[8,5] = 9
g_vhf_per[8,6] = 1
g_vhf_per[8,7] = 3
g_vhf_per[8,8] = 2
g_vhf_per[8,9] = 5
g_vhf_per[8,10] = 8
*
g_vhf_inv[1] = 0
g_vhf_inv[2] = 4
g_vhf_inv[3] = 3
g_vhf_inv[4] = 2
g_vhf_inv[5] = 1
g_vhf_inv[6] = 5
g_vhf_inv[7] = 6
g_vhf_inv[8] = 7
g_vhf_inv[9] = 8
g_vhf_inv[10] = 9
*
check = 0
i = 0
j = 0
perr = 0
longnro = 0
*
nroc = RTRIM(LTRIM(STR(nro,16,0)))
longnro = LEN(nroc)
nroc = FInvCadena(nroc)
check = 0
FOR i = 0 TO (longnro - 1)
perr = ((i + 1) % 8)
j = VAL(SUBSTR(nroc,i+1,1))
perr = Per(perr,j)
check = Mul(check, perr)
ENDFOR
check = Inv(check)
RETURN (check)
****************************************************
FUNCTION FInvCadena
PARAMETERS c
c2 = ""
i = 0
j = 0
c2 = ""
FOR I = 1 TO LEN(c)
c2 = SUBSTR(c,i,1) + c2
ENDFOR
RETURN (c2)
***************************************************
FUNCTION Mul
PARAMETERS i,j
*
RETURN (g_vhf_mul[i+1, j+1])
*******************************************************
FUNCTION Per
PARAMETERS i,j
*
RETURN (g_vhf_per[i+1, j+1])
******************************************************
FUNCTION Inv
PARAMETERS i
*
RETURN (g_vhf_inv[i+1])
*****************************************************
***********************************************************
***********************************************************
* Digito, la base 64 de un numero
* c) Ing. Luis Braulio Camacho Espinoza, 2007
***********************************************************
***********************************************************
FUNCTION FBase64
PARAMETERS mnro
PRIVATE ALL
DIMENSION g_base64(64)
g_base64[01] = "0"
g_base64[02] = "1"
g_base64[03] = "2"
g_base64[04] = "3"
g_base64[05] = "4"
g_base64[06] = "5"
g_base64[07] = "6"
g_base64[08] = "7"
g_base64[09] = "8"
g_base64[10] = "9"
g_base64[11] = "A"
g_base64[12] = "B"
g_base64[13] = "C"
g_base64[14] = "D"
g_base64[15] = "E"
g_base64[16] = "F"
g_base64[17] = "G"
g_base64[18] = "H"
g_base64[19] = "I"
g_base64[20] = "J"
g_base64[21] = "K"
g_base64[22] = "L"
g_base64[23] = "M"
g_base64[24] = "N"
g_base64[25] = "O"
g_base64[26] = "P"
g_base64[27] = "Q"
g_base64[28] = "R"
g_base64[29] = "S"
g_base64[30] = "T"
g_base64[31] = "U"
g_base64[32] = "V"
g_base64[33] = "W"
g_base64[34] = "X"
g_base64[35] = "Y"
g_base64[36] = "Z"
g_base64[37] = "a"
g_base64[38] = "b"
g_base64[39] = "c"
g_base64[40] = "d"
g_base64[41] = "e"
g_base64[42] = "f"
g_base64[43] = "g"
g_base64[44] = "h"
g_base64[45] = "i"
g_base64[46] = "j"
g_base64[47] = "k"
g_base64[48] = "l"
g_base64[49] = "m"
g_base64[50] = "n"
g_base64[51] = "o"
g_base64[52] = "p"
g_base64[53] = "q"
g_base64[54] = "r"
g_base64[55] = "s"
g_base64[56] = "t"
g_base64[57] = "u"
g_base64[58] = "v"
g_base64[59] = "w"
g_base64[60] = "x"
g_base64[61] = "y"
g_base64[62] = "z"
g_base64[63] = "+"
g_base64[64] = "/"
*
cociente = 1
resto = 0
palabra = ""
DO WHILE (cociente > 0)
cociente = INT(mnro / 64)
resto = mnro % 64
palabra = g_base64[resto+1] + palabra
mnro = cociente
ENDDO
RETURN (palabra)
**************************************************************
*****************************************************
*(c) Ing. Luis Braulio Camacho Espinoza, 2007
*
Continua en : parte 2