-[ 0x09 ]-------------------------------------------------------------------- -[ ESTE BANCO ESTA OCUPADO ]------------------------------------------------- -[ by fca00000 ]------------------------------------------------------SET-15- Ficheros CSB ------------ Para la transmision de informacion bancaria entre ordenadores, el Consejo Superior Bancario definio las llamadas normas CSB que especifican el formato de los registros de ficheros conteniendo informacion sobre nominas, remesas y transferencias. La norma CSB34 define las nominas (N) y transferencias (T). La norma CSB19 define la remesa (R). Los tres tipos (a partir de ahora llamados NRT) son ficheros ASCII con lineas de tama€o 163 para R, y 73 para N y T. N y T son bastante parecidos; la unica diferencia esta en un dato de un registro que indica si es N o T. Un ejemplo de T es: 0306H50312276 130995RA 0011309951309952036001833003212370 0306H50312276 002MI NOMBRE 0306H50312276 003MI CALLE 0306H50312276 004 0606H50312276 132 01000000050000020350124010038759319 69 0606H50312276 132 011PERICO DE LOS PALOTES 0606H50312276 132 012CALLE GRANDE 47 0806H50312276 000000500000000000010000000008 Como se observa, los registros pueden empezar por: 0306 -> registro de cabecera de documento. Hay 4 lineas de cabecera 0606 -> registro de lineas. Hay una linea primera, una 2§, y hasta 4 mas. 0806 -> registro de importes totales. Solo aparece 1 linea de este tipo. Registros de cabecera: Primer registro: 0306H50312276 130995RA 0011309951309952036001833003212370 Codigo del ordenante: 5-14 (H50312276 ) Numero de documento: 15-26 (130995RA ) Numero del registro: 27-29 (001) Fecha del documento: 30-35 (130995) Formato ddmmaa Fecha de cargo: 36-41 (130995) Cuenta de cargo 1§: 42-45 (2036) Cuenta de cargo 2§: 46-49 (0018) Cuenta de cargo 3§: 64-65 (63) Digitos de control del CCC Cuenta de cargo 4§: 50-59 (3300321237) Segundo registro: 0306H50312276 002MI NOMBRE Codigo de ordenante: 5-14 (H50312276 ) Numero del registro : 27-29 (002) Nombre del ordenante: 30-66 (MI NOMBRE ) Tercer registro: 0306H50312276 003MI CALLE Codigo de ordenante: 5-14 (H50312276 ) Numero del registro: 27-29 (003) Domicilio del ordenante: 30-66 (MI CALLE ) Cuarto registro: 0306H50312276 004 Codigo de ordenante: 5-14 (H50312276 ) Numero del registro: 27-29 (004) Domicilio del ordenante: 30-66 ( ) Es obligatorio usar 4 registros, pero no todos los datos lo son; eso depende del banco o entidad financiera con la que se este hablando. Algunos usan estos datos como una codificacion para sus programas de gestion, por lo que lo mejor es conseguir un fichero que funcione, y trabajar sobre el. Los datos que quedan en blanco son de uso libre. Registros de lineas: Primer registro: 0606H50312276 132 01000000050000020350124010038759319 69 Codigo de ordenante: 5-14 (H50312276 ) Referenc del benef: 15-26 (132 ) Numero de dato: 27-29 (010) Importe: 30-41 (000000500000) formato 999999999900 -> 5.000,00 pts Entidad pagadora 1§: 42-45 (2035) Entidad pagadora 2§: 46-49 (0124) Entidad pagadora 3§: 64-65 (69) Entidad pagadora 4§: 50-59 (0100387593) Gastos: 60-60 (1). Siempre es "1" Concepto de Orden: 61-61 (9). "9" si es Transferencia, "1" si es Nomina Segundo registro (Obligatorio): 0606H50312276 132 011PERICO DE LOS PALOTES Codigo de ordenante: 5-14 (H50312276 ) Referenc del benef: 15-26 (132 ) Numero de dato: 27-29 (011) Nombre del benefic: 30-65 (PERICO DE LOS PALOTES) Tercer registro (Opcional, y tantos como se deseen): 0606H50312276 132 012CALLE GRANDE 47 Codigo de ordenante: 5-14 (H50312276 ) Referenc del benef: 15-26 (132 ) Numero de dato: 27-29 (012) Nombre del benefic: 30-65 (CALLE GRANDE 47) Notar que muchos de los campos de "Nombre de beneficiario" se usan para informacion generica, tal como la poblacion, los conceptos de movimientos, .. Registros de totales: Unico registro: 0806H50312276 000000500000000000010000000008 Codigo de ordenante: 5-14 (H50312276 ) Suma de los importes: 30-41 (000000500000) formato 999999999900 -> 5,000.00 Num. de registros individuales: 42-50 (00000001) Num. total de registros del soporte: 50-59 (0000000008) Este formato es soportado por la mayoria de las aplicaciones de contabilidad, y muchos de los bancos admiten que se les mande un disco con estos ficheros, que ellos mismos se encargan de meter en sus sistemas de gestion. Tambien algunos permiten el envio de estos ficheros por medios electronicos, ya sea mediante codificacion en EDIFACT en la especificacion PAYMUL:92:1:UN o ???MUL:D:96A:UN, donde ??? puede ser PAY (PAgo MULtiple), CRE (Abono) o bien DEB (Cargo) Otros permiten el envio por Internet mediante modulos de seguridad basados en claves publicas y privadas. Como se puede observar, la mayor parte de las veces solo es necesario indicar una cuenta de cargo para sacar el dinero y una cuenta de abono para meterlo. Obtener numeros de cuentas es bastante sencillo hoy en dia, pero es preciso saber si esa cuenta esta permitida en el sistema de gestion del banco para operar con ficheros de norma CSB. Las comunicaciones entre entidades financieras distintas (no entre sucursales de la misma entidad) se realizan en este formato, por lo que las cantidades de dinero que se transmiten mediante este formato son bastante altas, aunque, a cambio, las medidas de seguridad son bastante altas, y por ello la confianza en estos sistemas es muy elevada, por lo que se automatizan todos los procesos y apenas hay intervencion humana. El dato del numero de la cuenta corriente es fundamental, asi que voy a explicar unos conceptos: El Codigo de Cuenta Corriente (CCC en adelante) se compone de 4 datos: CCC1: Entidad. 4 digitos CCC2: Sucursal. 4 digitos CCC4: Numero de cuenta. 10 digitos CCC3: codigo de control. 2 digitos El digito de control es un chequeo de los otros numeros. Aunque algunas entidades permiten no especificarlo (poniendo " " o "**" ), lo mas normal es calcularlo; aqui se presenta el codigo en lenguaje C strcpy(s1, CCC1); strcat(s1, CCC2); strcpy(s2, CCC4); v[1]=1; v[2]=2; v[3]=4; v[4]=8; v[5]=5; v[6]=10; v[7]=9; v[8]=7; v[9]=3; v[10]=6; d1=0; for(x=1;x<=8;x++) d1+= ( s1[x] * v[2+x] ); resto=11- ( d1 % 11 ) if(resto==10) resto=1; if(resto==11) resto=0; c1=resto; d2=0; for(x=1;x<=10;x++) d1+= ( s2[x] * v[x] ); resto=11- ( d1 % 11 ) if(resto==10) resto=1; if(resto==11) resto=0; c2=resto; CCC2[0]='0'+c1; CCC2[1]='0'+c2; (Si haces los calculos con el CCC que se usa en este ejemplo, descubriras que esta mal calculado; lo he hecho a proposito. Pero lo puedes calcular con tu propia cuenta de tu banco) A continuacion se proporciona otro programilla. <++> set_015/csb/lee_csb.c /* Este programa lee un fichero CSB y lo reduce a una linea por cada documento que esta dentro. Vale tanto para remesas como para nominas y transferencias. Necesita como parametro de entrada un fichero CSB (o una suma de varios) Toda la salida la muestra por pantalla. Tiene demasiados goto , pero funciona perfectamente */ #include FILE *ap; int todo_blanco=0; int i; char cad_leida[400]; char cad_leida3[400]; char cad_leida9[400]; char cad_leida8[400]; char cad_leida6[400]; char cad_leida5[400]; int es_remesa=0; char tipo[80]; char fechadoc[80]; char emisor[80]; char numdoc[80]; char fechaeje[80]; char ccc1[80]; char ccc2[80]; char ccc3[80]; char ccc4[80]; char importe[80]; char nada[80]; void busca_01_03() { sigue_01_03: if(cad_leida[1]=='1') { es_remesa=1; return; } if(cad_leida[1]=='3') { es_remesa=0; return; } fgets(cad_leida, 390, ap); goto sigue_01_03; } void busca_09() { sigue_09: if(cad_leida9[1]=='9') { return; } fgets(cad_leida9, 390, ap); goto sigue_09; } void busca_06() { sigue_06: if(cad_leida6[1]=='6') { return; } fgets(cad_leida6, 390, ap); goto sigue_06; } void busca_08() { sigue_08: if(cad_leida8[1]=='8') { return; } fgets(cad_leida8, 390, ap); goto sigue_08; } main(int argc, char *argv[]) { ap=fopen(argv[1],"rt"); if(ap==NULL) { printf("no puedo abrir %s \n", argv[1] ); exit(1); } principio: fgets(cad_leida, 390, ap); if(feof(ap)|| strlen(cad_leida)<20 ) { exit(1); } busca_01_03(); if(es_remesa==1) { fgets(cad_leida3, 390, ap); fgets(cad_leida9, 390, ap); busca_09(); memset(tipo,0,80); memset(fechadoc,0,80); memset(emisor,0,80); memset(numdoc,0,80); memset(fechaeje,0,80); memset(ccc1,0,80); memset(ccc2,0,80); memset(ccc3,0,80); memset(ccc4,0,80); memset(importe,0,80); memcpy(tipo,"100",62-62+1); memcpy(fechadoc,&cad_leida[17-1],22-17+1); memcpy(emisor,&cad_leida[149-1],162-149+1); todo_blanco=1; for(i=0;i<14;i++) if(emisor[i]!=' ') todo_blanco=0; if(todo_blanco==1) memcpy(emisor,&cad_leida[29-1],68-29+1); memcpy(numdoc,&cad_leida[97-1],108-97+1); memcpy(fechaeje,&cad_leida3[23-1],28-23+1); memcpy(ccc1,&cad_leida3[69-1],88-69+1); memcpy(importe,&cad_leida9[89-1],98-89+1); if(tipo[0]=='1') strcpy(tipo,"REMESA"); printf("%s;%s;%-40.40s;%s;%s;%s;%s\n", tipo, fechadoc, emisor, numdoc, fechaeje, ccc1, importe ); } if(es_remesa==0) { fgets(cad_leida3, 390, ap); fgets(cad_leida6, 390, ap); busca_06(); fgets(cad_leida8, 390, ap); busca_08(); memset(tipo,0,80); memset(fechadoc,0,80); memset(emisor,0,80); memset(numdoc,0,80); memset(fechaeje,0,80); memset(ccc1,0,80); memset(ccc2,0,80); memset(ccc3,0,80); memset(ccc4,0,80); memset(importe,0,80); memcpy(tipo,&cad_leida6[61-1],62-62+1); memcpy(fechadoc,&cad_leida[30-1],35-30+1); memcpy(emisor,&cad_leida3[15-1],26-15+1); memcpy(numdoc,&cad_leida[15-1],26-15+1); memcpy(fechaeje,&cad_leida[36-1],41-36+1); memcpy(ccc1,&cad_leida[42-1],45-42+1); memcpy(ccc2,&cad_leida[46-1],49-46+1); memcpy(ccc3,&cad_leida[64-1],65-64+1); memcpy(ccc4,&cad_leida[50-1],59-50+1); memcpy(importe,&cad_leida8[30-1],41-30+1); if(tipo[0]=='1') strcpy(tipo,"NOMINA"); if(tipo[0]=='9') strcpy(tipo,"TRANSF"); printf("%s;%s;%-40.40s;%s;%s;%s%s%s%s;%s\n", tipo, fechadoc, emisor, numdoc, fechaeje, ccc1, ccc2, ccc3, ccc4, importe ); } goto principio; } <--> Este formato de fichero lleva en vigor mas de 10 a€os, y posiblemente dure algunos mas, asi que espero que a alguien le sirva y le saque partido.