]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs_gui/facturas.c
* Bugfix en idx_get para saltar los registros no utilizados
[z.facultad/75.06/emufs.git] / emufs_gui / facturas.c
index d0c0428895ff75abbc13eac55d99e756cd30f117..ec87770eba0c0424012395c95402bb46a86cca7e 100644 (file)
@@ -12,6 +12,11 @@ int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo);
 static t_Item *leer_items(xmlNode *, int *cant, int size);
 static char *leer_nota(xmlNode *);
 
+t_LstFacturas *fact_get_lst()
+{
+       return lst_facturas;
+}
+
 /* Hack! ... Si no existe propiedad retorna "" */
 char *xml_get_prop(xmlNode *node, char *nombre)
 {
@@ -190,6 +195,8 @@ t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque)
                                                id = tmp->fp->grabar_registro(tmp->fp, save, size, &error);
                                                id_texto = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, 400, &error);
                                                agregar_nodo_factura(tmp, crear_nodo_factura(id, id_texto, fact.numero));
+                                               if (fact.items) free(fact.items);
+                                               if (fact.nota) free(fact.nota);
                                                free(save);
                                        }
                                }
@@ -228,7 +235,7 @@ int fact_liberar(t_LstFacturas *l)
        return 0;
 }
 
-t_Factura *fact_buscar(t_LstFacturas *lst, int numero)
+t_Factura *fact_buscar(t_LstFacturas *lst, int numero, EMUFS_REG_ID *id, EMUFS_REG_ID *id_texto)
 {
        t_Factura *fact;
        t_Reg_Factura *reg;
@@ -241,10 +248,16 @@ t_Factura *fact_buscar(t_LstFacturas *lst, int numero)
        reg = lst->primero;
        while (reg) {
                if (reg->numero == numero) {
+                       size = 0;
+                       fprintf(stderr, "Leer me dice que %lu\n", size);
                        leo = lst->fp->leer_registro(lst->fp, reg->num_reg, &size, &error);
+                       fprintf(stderr, "Leer me dice que %lu\n", size);
                        if (leo != NULL) {
                                fact = (t_Factura *)malloc(sizeof(t_Factura));
                                procesar_leer_factura(fact, leo, size, lst);
+                               (*id) = reg->num_reg;
+                               (*id_texto) = reg->texto_reg;
+                               free(leo);
                        }
                        break;
                }
@@ -253,7 +266,7 @@ t_Factura *fact_buscar(t_LstFacturas *lst, int numero)
        return fact;
 }
 
-t_Factura *fact_form_buscar(WINDOW *win, EMUFS_REG_ID *id)
+t_Factura *fact_form_buscar(WINDOW *win, EMUFS_REG_ID *id, EMUFS_REG_ID *id_texto)
 {
        t_Form *form;
        t_Factura *fact;
@@ -261,19 +274,58 @@ t_Factura *fact_form_buscar(WINDOW *win, EMUFS_REG_ID *id)
        form = form_crear(win);
        form_agregar_widget(form, INPUT, "Numero de Factura", 8, "");
        form_ejecutar(form, 1,1);
-       fact = fact_buscar(lst_facturas, form_obtener_valor_int(form, "Numero de Factura"));
+       fact = fact_buscar(lst_facturas, form_obtener_valor_int(form, "Numero de Factura"), id, id_texto);
        form_destruir(form);
 
        return fact;
 }
 
+void fact_eliminar(char *s)
+{
+       WINDOW *win;
+       t_Factura *fact;
+       t_Reg_Factura *nodo;
+       EMUFS_REG_ID id;
+                                                                       
+       win = newwin(LINES-4, COLS-2, 2, 1);
+       box(win, 0, 0);
+       
+       fact = fact_form_buscar(win, &id, &id);
+
+       if (fact == NULL) {
+               wattron(win, COLOR_PAIR(COLOR_YELLOW));
+               mvwaddstr(win, 2, 1, "No existe artículo con ese código. Abortando!");
+               wattroff(win, COLOR_PAIR(COLOR_YELLOW));
+               wrefresh(win);
+               getch();
+               werase(win);
+               wrefresh(win);
+               delwin(win);
+               return;
+       }
+
+       nodo = lst_facturas->primero;
+       while (nodo) {
+               if (nodo->numero == fact->numero) {
+                       lst_facturas->fp->borrar_registro(lst_facturas->fp, nodo->num_reg);
+                       lst_facturas->fp_texto->borrar_registro(lst_facturas->fp_texto, nodo->texto_reg);
+                       eliminar_nodo_factura(lst_facturas, nodo);
+                       break;
+               }
+               nodo = nodo->sig;
+       }
+
+       free(fact->items);
+       free(fact);
+}
+
 void fact_modificar(char *s)
 {
        WINDOW *win, *items;
        t_Form *form;
        t_Factura *fact;
        /*EMUFS_REG_SIZE size;*/
-       EMUFS_REG_ID id; /*, id_texto;*/
+       EMUFS_REG_ID id, id_texto;
 /*     int y_actual, cant, error;*/
        char tmp_str[10];
 
@@ -281,9 +333,14 @@ void fact_modificar(char *s)
        win = newwin(LINES-4, COLS-2, 2, 1);
        box(win, 0, 0);
        
-       fact = fact_form_buscar(win, &id);
+       fact = fact_form_buscar(win, &id, &id_texto);
 
        if (fact == NULL) {
+               wattron(win, COLOR_PAIR(COLOR_YELLOW));
+               mvwaddstr(win, 2, 1, "No existe artículo con ese código. Abortando!");
+               wattroff(win, COLOR_PAIR(COLOR_YELLOW));
+               wrefresh(win);
+               getch();
                werase(win);
                wrefresh(win);
                delwin(win);
@@ -507,9 +564,68 @@ void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, EMUFS_REG_SIZE
 
 static int procesar_leer_factura(t_Factura *dst, void *src, EMUFS_REG_SIZE size, t_LstFacturas *lst)
 {
+       char *ini, *fin;
+
        switch (lst->fp->tipo) {
                case T1:
                case T2:
+                       ini = (char *)src;
+                       /* Copio los campos numericos, muy facil:-) */
+                       memcpy(&dst->numero, ini, sizeof(int));
+                       ini+=sizeof(int);
+                       
+                       memcpy(&dst->procdoi, ini, sizeof(float));
+                       ini+=sizeof(float);
+
+                       memcpy(&dst->numero_remito, ini, sizeof(int));
+                       ini+=sizeof(int);
+                       
+                       memcpy(&dst->cant_items, ini, sizeof(int));
+                       ini+=sizeof(int);
+
+                       /* Ahora empieza el juego */
+                       /* Los \0 son los delimitadores de campo! */
+                       fin = ini;
+                       while (*fin!='\0') fin++;
+                       memcpy(dst->emision, ini, fin-ini+1);
+                       
+                       ini = fin+1;
+                       fin = ini;
+                       while (*fin!='\0') fin++;
+                       memcpy(dst->vencimiento, ini, fin-ini+1);
+                       
+                       ini = fin+1;
+                       fin = ini;
+                       while (*fin!='\0') fin++;
+                       memcpy(dst->estado, ini, fin-ini+1);
+                       
+                       ini = fin+1;
+                       fin = ini;
+                       while (*fin!='\0') fin++;
+                       memcpy(dst->fp, ini, fin-ini+1);
+                       
+                       ini = fin+1;
+                       fin = ini;
+                       while (*fin!='\0') fin++;
+                       memcpy(dst->ctacte, ini, fin-ini+1);
+                       
+                       ini = fin+1;
+                       fin = ini;
+                       while (*fin!='\0') fin++;
+                       memcpy(dst->cheque, ini, fin-ini+1);
+
+                       if (dst->cant_items > 0) {
+                               /* Ahora tengo que cargar los items */
+                               dst->items = (t_Item *)malloc(sizeof(t_Item)*dst->cant_items);
+
+                               ini = fin+1;
+                               fprintf(stderr, "trabajo con 1 -> %lu\n", size);
+                               fin = (char *)src+size;
+                               memcpy(dst->items, ini, fin-ini);
+                       } else {
+                               dst->items = NULL;
+                       }
+
                        return 0;
                case T3:
                        /* Se que tengo 10 items */