]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs_gui/facturas.c
* agrego doc
[z.facultad/75.06/emufs.git] / emufs_gui / facturas.c
index 2a7e8d2b334ce2bb35e996eb68331f3bda83ebaa..1eefe8571c3ade81b3a1bfa820cd481800476393 100644 (file)
@@ -1,6 +1,7 @@
 
 #include "facturas.h"
 #include "idx.h"
+#include "common.h"
 
 static t_LstFacturas *lst_facturas;
 
@@ -197,20 +198,20 @@ t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque)
                /* En el registro no guardo los punteros de nota ni items. Si guardo la cantidad de items
                 * y los items al final del registro.
                 */
-               if (tipo == T3) {
+               if ((tipo-1) == T3) {
                        /* Limito a 10 items en el caso de registro constante! */
                        cant_items = 10;
                } else {
                        cant_items = 0;
                }
                tmp->fp = emufs_crear("facturas", tipo-1, tam_bloque, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item));
-               tmp->fp_texto = emufs_crear("notas", 1, 100, 0);
+               tmp->fp_texto = emufs_crear("notas", T2, 100, 0);
                for (node=inicio ; node ; node = node->next) {
                        if (node->type == XML_ELEMENT_NODE) {
                                if (strcmp(node->name, "FACTURA") == 0) {
                                        t_Factura fact;
                                        void *save;
-                                       memset(&fact, '*', sizeof(t_Factura));
+                                       memset(&fact, 0, sizeof(t_Factura));
                                        prop = xml_get_prop(node, "NroFac");
                                        fact.numero = atoi(prop); xmlFree(prop);
                                        prop = xml_get_prop(node, "PorcDoI");
@@ -473,6 +474,8 @@ void fact_modificar(char *s)
        free(fact->nota);
        fact->nota = form_obtener_valor_char(form_nota, "");
 
+       form_destruir(form_nota);
+
        entrada = procesar_guardar_factura(fact, lst_facturas, &size);
        if (entrada) {
                id = lst_facturas->fp->modificar_registro(lst_facturas->fp, id, entrada, size, &error);
@@ -679,6 +682,15 @@ static int procesar_leer_factura(t_Factura *dst, void *src, EMUFS_REG_SIZE size,
        char *ini, *fin;
        int dummy;
 
+       if (lst == NULL) {
+               PERR("Puntero a lista NULO");
+               return 0;
+       }
+       if (lst->fp == NULL) {
+               PERR("EMUFS No creado!");
+               return 0;
+       }
+
        switch (lst->fp->tipo) {
                case T1:
                case T2:
@@ -738,12 +750,12 @@ static int procesar_leer_factura(t_Factura *dst, void *src, EMUFS_REG_SIZE size,
                                fin = (char *)src+size;
                                memcpy(dst->items, ini, fin-ini);
 
-                               dst->nota = lst->fp_texto->leer_registro(lst->fp_texto, dst->reg_nota, (EMUFS_REG_SIZE *)&dummy, &dummy);
                        } else {
                                dst->items = NULL;
                        }
-
+                       dst->nota = lst->fp_texto->leer_registro(lst->fp_texto, dst->reg_nota, (EMUFS_REG_SIZE *)&dummy, &dummy);
                        return 0;
+               break;
                case T3:
                        /* Se que tengo 10 items */
                        /* TODO : Ver porque leer_registro_tipo3 tira mal el size */
@@ -751,7 +763,95 @@ static int procesar_leer_factura(t_Factura *dst, void *src, EMUFS_REG_SIZE size,
                        memcpy(dst, src, size-sizeof(t_Item)*10);
                        dst->items = (t_Item *)malloc(10*sizeof(t_Item));
                        memcpy(dst->items, src+size-sizeof(t_Item)*10, 10*sizeof(t_Item));
+                       dst->nota = lst->fp_texto->leer_registro(lst->fp_texto, dst->reg_nota, (EMUFS_REG_SIZE *)&dummy, &dummy);
        }
        return 0;
 }
 
+void fact_reformatear(int tipo, int tam_bloque, int tam_reg)
+{
+       EMUFS *nuevo, *old;
+       EMUFS_REG_ID *indices, id;
+       EMUFS_REG_SIZE indices_total, i, size, tam_reg1;
+       t_Factura fact;
+       t_LstFacturas *lst_nueva;
+       int error;
+       char *save;
+
+       PERR("==== EMPIEZO ====\n");
+       old = lst_facturas->fp;
+
+       /* Creo el nuevo file */
+       PERR("Creo el archivo\n");
+       if (tipo == T3) {
+               /* Me aseguro de que entren n items completos */
+               tam_reg1 = sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+10*sizeof(t_Item);
+       }
+       nuevo = emufs_crear("emufs_tmp", tipo, tam_bloque, tam_reg1);
+       if (nuevo == NULL) {
+               PERR("ARCHIVO NUEVO NO CREADO");
+               return;
+       }
+
+       /* Creo la nueva lista */
+       lst_nueva = (t_LstFacturas *)malloc(sizeof(t_LstFacturas));
+       lst_nueva->primero = NULL;
+       lst_nueva->fp = nuevo;
+
+       /* Leo los indices del archivo viejo */
+       PERR("Obtengo Indices\n");
+       indices = emufs_idx_get(old, &indices_total);
+       if (indices == NULL) {
+               fact_liberar(lst_nueva);
+               return;
+       }
+
+       PERR("Proceso datos");
+       for(i=0; i<indices_total; i++) {
+               error = 0;
+               PERR("Leo");
+               save = old->leer_registro(old, indices[i], &size, &error);
+               if (procesar_leer_factura(&fact, save, size, lst_facturas) == 0) {
+                       PERR("Procese Leer Ok");
+                       free(save);
+                       /* Lei un registro Ok. Lo salvo en el archivo nuevo */
+                       save = procesar_guardar_factura(&fact, lst_nueva, &size);
+                       PERR("Procese Grabar Ok");
+                       if (save) {
+                               error = 0;
+                               PERR("Grabo el Registro");
+                               id = nuevo->grabar_registro(nuevo, save, size, &error);
+                               PERR("Lo agrego");
+                               agregar_nodo_factura(lst_nueva, crear_nodo_factura(id, fact.reg_nota, fact.numero));
+                               PERR("Libero Memoria");
+                               free(save);
+                               if (fact.items) free(fact.items);
+                               if (fact.nota) free(fact.nota);
+                               PERR("Termine con este Item");
+                       }
+               }
+       }
+
+       free(indices);
+
+       PERR("Libero lo viejo\n");
+       fact_liberar(lst_facturas);
+
+       PERR("Ahora tengo lo nuevo\n");
+       lst_facturas = lst_nueva;
+
+       /* El nuevo tiene como nombre emufs_tmp, lo cambio a mano! */
+       free(lst_facturas->fp->nombre);
+       lst_facturas->fp->nombre = (char *)malloc(sizeof(char)*(strlen("facturas")+1));
+       strcpy(lst_facturas->fp->nombre, "facturas");
+       
+       /* Muevo los archivos! */
+       /* TODO : Poner en otro lugar mas generico! */
+       PERR("Renombre!!\n");
+       rename("emufs_tmp.dat", "facturas.dat");
+       rename("emufs_tmp.idx", "facturas.idx");
+       rename("emufs_tmp.fsc", "facturas.fsc");
+       rename("emufs_tmp.did", "facturas.did");
+       PERR("==== TERMINE ====\n");
+}
+