+ char *tmpfile = "tmp_xxx.xxx";
+ FILE *fp;
+ EMUFS *emu;
+ t_Factura factura, *una_factura;
+ int cant_items;
+
+ PERR("CREO TEMPORAL FACTURAS");
+ dump_facturas(tmpfile);
+ PERR("LISTO");
+
+ PERR("Libero lo viejo");
+ fact_liberar(NULL);
+ PERR("Done");
+
+ PERR("Creo todo de nuevo");
+ lst_facturas = (t_LstFacturas *)malloc(sizeof(t_LstFacturas));
+ lst_facturas->primero = NULL;
+ if (param->tipo_arch_fact == T3) {
+ /* Limito a 10 items en el caso de registro constante! */
+ cant_items = 10;
+ } else {
+ cant_items = 0;
+ }
+ emu = lst_facturas->fp = emufs_crear("facturas", param->tipo_arch_fact, param->tam_bloque_fact, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item));
+ emufs_agregar_indice(emu, "ctacte", IND_SELECCION, param->ind_fac[4].tipo_arbol, IDX_STRING, STRUCT_OFFSET(una_factura, emision), param->ind_fac[4].tam_bloque, 5);
+ emufs_agregar_indice(emu, "cheque", IND_SELECCION, param->ind_fac[3].tipo_arbol, IDX_STRING, STRUCT_OFFSET(una_factura, emision), param->ind_fac[3].tam_bloque, 4);
+ emufs_agregar_indice(emu, "vto", IND_SELECCION, param->ind_fac[2].tipo_arbol, IDX_STRING, STRUCT_OFFSET(una_factura, emision), param->ind_fac[2].tam_bloque, 1);
+ emufs_agregar_indice(emu, "emision", IND_EXAHUSTIVO, param->ind_fac[1].tipo_arbol, IDX_STRING, STRUCT_OFFSET(una_factura, emision), param->ind_fac[1].tam_bloque, 0);
+ emufs_agregar_indice(emu, "numero", IND_PRIMARIO, param->ind_fac[0].tipo_arbol, IDX_INT, 0, param->ind_fac[0].tam_bloque, 0);
+
+ /* Creo el indice externo por Nro Articulo */
+ emu->externo = emufs_indice_crear(emu, "articulo", IND_SELECCION, IND_B, IDX_INT, 0, 512, 0);
+ lst_facturas->fp_texto = emufs_crear("notas", param->tipo_arch_nota, param->tam_bloque_nota, 100);
+ PERR("Listo!");
+
+
+ fp = fopen(tmpfile, "r");
+ if (fp == NULL) PERR("Ciao!");
+ while (!feof(fp)) {
+ void *save;
+ int len, error;
+ EMUFS_REG_ID id;
+ EMUFS_REG_SIZE size;
+ /* Leo la factura */
+ PERR("Leo registro");
+ if (fread(&factura, sizeof(t_Factura), 1, fp) != 1) continue;
+ factura.items = malloc(sizeof(t_Item)*factura.cant_items);
+ fread(factura.items, factura.cant_items, sizeof(t_Item), fp);
+ fread(&len, 1, sizeof(int), fp);
+ factura.nota = malloc(len*sizeof(char));
+ fread(factura.nota, 1, len, fp);
+ PERR(factura.nota);
+ PERR("Lo guardo");
+ /* Listo, ya lei, ahora agrego */
+ error = 0;
+ id = lst_facturas->fp_texto->grabar_registro(lst_facturas->fp_texto, factura.nota, (param->tipo_arch_nota==T3)?100:(strlen(factura.nota)+1), &error);
+ factura.reg_nota = id;
+ save = procesar_guardar_factura(&factura, lst_facturas, &size);
+ if (save != NULL) {
+ int i;
+ error = 0;
+ id = lst_facturas->fp->grabar_registro(lst_facturas->fp, save, size, &error);
+
+ /* Agrego los Items al indice externo */
+ for(i=0; i<factura.cant_items; i++) {
+ if (factura.items[i].numero != 0) {
+ CLAVE _k; /* HACK Para hacer mas rapido */
+ INDICE_DATO _dato;
+ _k.i_clave = factura.items[i].numero;
+ _dato.id = id;
+ lst_facturas->fp->externo->agregar_entrada(lst_facturas->fp->externo, _k, _dato);
+ }
+ }
+
+ if (factura.items) {
+ free(factura.items);
+ factura.items = NULL;
+ }
+ if (factura.nota) {
+ free(factura.nota);
+ factura.nota = NULL;
+ }
+ free(save);
+ }
+ }
+ fclose(fp);
+}