]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/articulos.c
Se pasan macros para comparar al base.h.
[z.facultad/75.06/emufs.git] / emufs_gui / articulos.c
1
2 #include "articulos.h"
3 #include "idx.h"
4 #include "gui.h"
5 #include "common.h"
6 #include "lista.h"
7 #include "menu.h"
8 #include "facturas.h"
9
10 static t_LstArticulos *lst_articulos;
11
12 static t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id);
13
14 static void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArticulos *lst);
15 static int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_LstArticulos *lst);
16
17 #ifdef TP_PRIMER_ENTREGA
18 /* Manejo de la lista doble */
19 static t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num);
20 static int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo);
21 static int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo);
22
23 int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo)
24 {
25         if (nodo == NULL) return 0;
26         if (nodo->ant == NULL) {
27                 /* Me piden borrar el primer nodo */
28                 if (nodo->sig) {
29                         nodo->sig->ant = NULL;
30                 }
31                 lst->primero = nodo->sig;
32         } else {
33                 if (nodo->sig) {
34                         nodo->sig->ant = nodo->ant;
35                 }
36                 nodo->ant->sig = nodo->sig;
37         }
38         free(nodo);
39         return 1;
40 }
41
42 t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num)
43 {
44         t_Reg_Articulo *tmp;
45         if (reg == EMUFS_NOT_FOUND) return NULL;
46         tmp = malloc(sizeof(t_Reg_Articulo));
47         if (tmp == NULL) return NULL;
48         tmp->sig = tmp->ant = NULL;
49         tmp->num_reg = reg;
50         tmp->numero = num;
51
52         return tmp;
53 }
54
55 int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo)
56 {
57         if (nodo == NULL) return 0;
58
59         if (lst->primero) {
60                 lst->primero->ant = nodo;
61                 nodo->sig = lst->primero;
62                 lst->primero = nodo;
63         } else {
64                 lst->primero = nodo;
65         }
66         return 1;
67 }
68 #endif /* TP_PRIMER_ENTREGA */
69
70 t_LstArticulos *art_get_lst()
71 {
72         return lst_articulos;
73 }
74
75 t_LstArticulos *art_cargar(t_Parametros *param)
76 {
77         xmlDocPtr document;
78         xmlNode *node, *inicio;
79         int error = 0;
80         char *prop;
81         EMUFS_REG_SIZE size;
82         t_LstArticulos *tmp;
83         t_Articulo *un_articulo;
84         lst_articulos = NULL;
85
86         tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos));
87         if (tmp == NULL) return NULL;
88         lst_articulos = tmp;
89         tmp->primero = NULL;
90
91         if (param != NULL) {
92                 PERR("Voy a crear desde un XML");
93                 document = xmlReadFile(param->xml_art, "ISO-8859-1",0);
94                 if (document == NULL) {
95                         free(tmp);
96                         lst_articulos = NULL;
97                         return NULL;
98                 }
99
100                 inicio = NULL;
101                 node = xmlDocGetRootElement(document);
102                 /* Busco el TAG principal "ARTICULOS" */
103                 while (node) {
104                         if (node->type == XML_ELEMENT_NODE) {
105                                 if (strcmp(node->name, "ARTICULOS") == 0) {
106                                         inicio = node->children;
107                                         break;
108                                 }
109                         }
110                         node = node->next;
111                 }
112                 /* Creo el FS */
113                 tmp->fp = emufs_crear("articulos", param->tipo_arch_art, param->tam_bloque_art, sizeof(t_Articulo));
114                 /* Agrego los indices */
115                 PERR("Voy a agregar un indice");
116                 emufs_agregar_indice(tmp->fp, "presentacion", IND_EXAHUSTIVO, param->ind_art[2].tipo_arbol, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), param->ind_art[2].tam_bloque, 1);
117                 emufs_agregar_indice(tmp->fp, "desc", IND_EXAHUSTIVO, param->ind_art[1].tipo_arbol, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), param->ind_art[1].tam_bloque, 0);
118                 emufs_agregar_indice(tmp->fp, "codigo", IND_PRIMARIO, param->ind_art[0].tipo_arbol, IDX_INT, 0, param->ind_art[0].tam_bloque, 0);
119                 if (!tmp->fp) {
120                         PERR("NO SE PUDO CREAR ARCHIVO ARTICULOS");
121                         free(tmp);
122                         xmlFreeDoc(document);
123                         xmlCleanupParser();
124                         lst_articulos = NULL;
125                         return NULL;
126                 }
127                 for (node=inicio ; node ; node = node->next) {
128                         if (node->type == XML_ELEMENT_NODE) {
129                                 if (strcmp(node->name, "ARTICULO") == 0) {
130                                         t_Articulo art;
131                                         void *save;
132                                         memset(&art, 0, sizeof(t_Articulo));
133                                         prop = xml_get_prop(node, "NroArtículo");
134                                         art.numero = atoi(prop);
135                                         xmlFree(prop);
136                                         strncpy(art.desc, prop = xml_get_prop(node, "Descripción"), 50); xmlFree(prop);
137                                         art.desc[50] = '\0'; /* Me aseguro de que este */
138                                         strncpy(art.presentacion, prop = xml_get_prop(node, "Presentación"), 30); xmlFree(prop);
139                                         art.presentacion[30] = '\0'; /* Me aseguro de que este */
140                                         strncpy(art.existencia, prop = xml_get_prop(node, "Existencia"), 8); xmlFree(prop);
141                                         art.existencia[8] = '\0'; /* Me aseguro de que este */
142                                         strncpy(art.ubicacion, prop = xml_get_prop(node, "Ubicación"), 30); xmlFree(prop);
143                                         strncpy(art.pvu, prop = xml_get_prop(node, "PVU"), 8); xmlFree(prop);
144                                         art.pvu[8] = '\0'; /* Me aseguro de que este */
145                                         strncpy(art.emin, prop = xml_get_prop(node, "Emín"), 8); xmlFree(prop);
146                                         art.emin[8] = '\0'; /* Me aseguro de que este */
147                                         /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */
148                                         save = procesar_guardar_articulo(&art, &size, lst_articulos);
149                                         if (save != NULL) {
150                                                 error = 0;
151                                                 tmp->fp->grabar_registro(tmp->fp, save, size, &error);
152                                                 free(save);
153                                         }
154                                 }
155                         }
156                 }
157                 xmlFreeDoc(document);
158                 xmlCleanupParser();
159         } else {
160                 PERR("Voy a recuperar desde un archivo");
161                 tmp->fp = emufs_abrir("articulos");
162                 fprintf(stderr, "PTR=%p %p\n", tmp, tmp->fp);
163                 if (tmp->fp == NULL) {
164                         PERR("No se pudo cargar archivo de articulos.");
165                         free(tmp);
166                         lst_articulos = NULL;
167                         return NULL;
168                 }
169         }
170
171         return tmp;
172 }
173
174 int art_liberar(t_LstArticulos *l)
175 {
176         t_Reg_Articulo *del;
177         if (l == NULL) l = lst_articulos;
178         if (l == NULL) return 1;
179
180         emufs_destruir(l->fp);
181         while (l->primero) {
182                 del = l->primero;
183                 l->primero = l->primero->sig;
184                 free(del);
185         }
186         free(l);
187
188         lst_articulos = NULL;
189         return 0;
190 }
191
192 t_Articulo *art_obtener(t_LstArticulos *lst, int numero, EMUFS_REG_ID *id)
193 {
194         t_Articulo *art;
195         void *tmp;
196         int error = 0;
197         EMUFS_REG_SIZE size;
198         CLAVE k;
199
200         if (lst == NULL) lst = lst_articulos;
201         if (lst == NULL) return NULL;
202
203         (*id) = -1; /* XXX Ver que se hacia con esto */
204         art = (t_Articulo *)malloc(sizeof(t_Articulo));
205         /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */
206         error = 0;
207         k = emufs_indice_generar_clave_desde_valor(lst->fp->indices, (char *)&numero);
208         tmp = lst->fp->leer_registro(lst->fp, k, &size, &error);
209         if (error) {
210                 free(art);
211                 return NULL;
212         }
213
214         if (procesar_leer_articulo(art, tmp, size, lst_articulos) != 1) {
215                 free(art);
216                 free(tmp);
217                 return NULL;
218         }
219
220         free(tmp);
221         return art;
222 }
223
224 t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id)
225 {
226         t_Form *form;
227         t_Articulo *articulo;
228
229         form = form_crear(win);
230         form_agregar_widget(form, INPUT, "Numero de Artículo", 8, "");
231         form_ejecutar(form, 1,1);
232         articulo = art_obtener(NULL, form_obtener_valor_int(form, "Numero de Artículo"), id);
233         form_destruir(form);
234
235         return articulo;
236 }
237
238 void art_modificar(char *s)
239 {
240         WINDOW *win;
241         t_Form *form;
242         t_Articulo *articulo;
243         char num[11];
244         void *tmp;
245         int error;
246         EMUFS_REG_SIZE size;
247         EMUFS_REG_ID codigo;
248
249         win = newwin(9, COLS-2, 13, 1);
250         box(win, 0, 0);
251         wrefresh(win);
252
253         if (s == NULL) {
254                 PERR("Voy a buscar con el formulario");
255                 articulo = art_form_buscar(win, &codigo);
256                 PERR("Ya lo tengo!!!!!!");
257         } else {
258                 codigo = atoi(s);
259                 /* Leo el registro directamente */
260                 articulo = (t_Articulo *)malloc(sizeof(t_Articulo));
261                 /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */
262                 error = 0;
263                 tmp = lst_articulos->fp->leer_registro(lst_articulos->fp,
264                                                 emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&codigo), &size, &error);
265                 if (error) {
266                         free(articulo);
267                         articulo = NULL;
268                 } else {
269                         if (procesar_leer_articulo(articulo, tmp, size, lst_articulos) != 1) {
270                                 free(articulo);
271                                 articulo = NULL;
272                         }
273                         free(tmp);
274                 }
275         }
276
277         if (articulo != NULL) {
278                 form = form_crear(win);
279                 sprintf(num, "%08d", articulo->numero);
280                 form_agregar_widget(form, INPUT, "Numero de Artículo", 8, num);
281                 form_es_modificable(form, "Numero de Artículo" , 0);
282                 form_agregar_widget(form, INPUT, "Descripción", 50, articulo->desc);
283                 form_agregar_widget(form, INPUT, "Presentación", 30, articulo->presentacion);
284                 form_agregar_widget(form, INPUT, "Stock Actual", 8, articulo->existencia);
285                 form_agregar_widget(form, INPUT, "Ubicacion", 30, articulo->ubicacion);
286                 form_agregar_widget(form, INPUT, "PVU", 8, articulo->pvu);
287                 form_agregar_widget(form, INPUT, "Stock Mínimo", 8, articulo->emin);
288                 form_ejecutar(form, 1,1);
289
290                 /* Actualizar registro */
291                 articulo->numero = form_obtener_valor_int(form, "Numero de Artículo");
292                 strcpy(articulo->desc, form_obtener_valor_char(form, "Descripción"));
293                 strcpy(articulo->presentacion, form_obtener_valor_char(form, "Presentación"));
294                 strcpy(articulo->existencia, form_obtener_valor_char(form, "Stock Actual"));
295                 strcpy(articulo->ubicacion, form_obtener_valor_char(form, "Ubicacion"));
296                 strcpy(articulo->pvu, form_obtener_valor_char(form, "PVU"));
297                 strcpy(articulo->emin, form_obtener_valor_char(form, "Stock Mínimo"));
298                 /* Ya actualice los datos, ahora veo de grabarlos */
299                 tmp = procesar_guardar_articulo(articulo, &size, lst_articulos);
300                 if (tmp) {
301                         CLAVE k;
302                         INDICE_DATO dummy1;
303                         error = 0;
304                         k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&articulo->numero);
305                         /* dummy se pasa porque esto se hace por clave primaria, y el INDICE_DATO que se
306                          * pasa solo es requerido cuando son claves multiples
307                          */
308                         lst_articulos->fp->modificar_registro(lst_articulos->fp, k, tmp, size, &error, dummy1);
309                         free(tmp);
310                 }
311                 
312                 form_destruir(form);
313                 free(articulo);
314         } else {        
315                 wattron(win, COLOR_PAIR(COLOR_YELLOW));
316                 mvwaddstr(win, 6, 4, "No existe artículo con ese código. Abortando!");
317                 wattroff(win, COLOR_PAIR(COLOR_YELLOW));
318                 wrefresh(win);
319                 getch();
320         }
321         werase(win);
322         wrefresh(win);
323         delwin(win);
324 }
325
326 void art_eliminar(char *s)
327 {
328         WINDOW *win;
329         t_Articulo *articulo;
330         EMUFS_REG_ID id;
331         CLAVE k;
332
333         win = newwin(8, COLS-2, 13, 1);
334         box(win, 0, 0);
335         wrefresh(win);
336
337         articulo = art_form_buscar(win, &id);
338
339         if (articulo == NULL) {
340                 wattron(win, COLOR_PAIR(COLOR_YELLOW));
341                 mvwaddstr(win, 6, 4, "No existe artículo con ese código. Abortando!");
342                 wattroff(win, COLOR_PAIR(COLOR_YELLOW));
343                 wrefresh(win);
344                 getch();
345         } else {
346                 INDICE_DATO dummy;
347
348                 /* Antes de borrar veo si existe alguna factura que contenga este articulo */
349                 if (fact_hay_con_item(articulo->numero) == 0) {
350                         k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&(articulo->numero));
351                         PERR("Borrando ARTICULO")
352                         lst_articulos->fp->borrar_registro(lst_articulos->fp, k, dummy);
353                         PERR("LISTO BORRADO");
354                 } else {
355                         wattron(win, COLOR_PAIR(COLOR_YELLOW));
356                         mvwaddstr(win, 6, 4, "No se pudo eliminar Articulo porque hay una factura que lo referencia.");
357                         wattroff(win, COLOR_PAIR(COLOR_YELLOW));
358                         wrefresh(win);
359                         getch();
360                 }
361                 free(articulo);
362         }
363
364         werase(win);
365         wrefresh(win);
366         delwin(win);
367 }
368
369 void art_agregar(char *s)
370 {
371         WINDOW *win;
372         t_Form *form;
373         t_Articulo art;
374         void *save;
375         int error = 0, existe;
376         EMUFS_REG_SIZE size;
377         EMUFS_REG_ID id;
378         INDICE_DATO dato;
379         CLAVE k;
380
381         win = newwin(9, COLS-2, 13, 1);
382         box(win, 0, 0);
383         wrefresh(win);
384
385         form = form_crear(win);
386         form_agregar_widget(form, INPUT, "Numero de Artículo", 8, "");
387         form_agregar_widget(form, INPUT, "Descripción", 50, "");
388         form_agregar_widget(form, INPUT, "Presentación", 30, "");
389         form_agregar_widget(form, INPUT, "Stock Actual", 8, "");
390         form_agregar_widget(form, INPUT, "Ubicacion", 30, "");
391         form_agregar_widget(form, INPUT, "PVU", 8, "");
392         form_agregar_widget(form, INPUT, "Stock Mínimo", 8, "");
393         form_ejecutar(form, 1,1);
394         
395         art.numero = atoi(form_obtener_valor_char(form, "Numero de Artículo"));
396         existe = 0;
397         /* Me dijo que no existe el codigo */
398         k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&art.numero);
399         dato = lst_articulos->fp->indices->existe_entrada(lst_articulos->fp->indices, k);
400         if (dato.id != -1) existe = 1;
401
402         if (!existe) {
403                 strcpy(art.desc, form_obtener_valor_char(form, "Descripción"));
404                 strcpy(art.presentacion, form_obtener_valor_char(form, "Presentación"));
405                 strcpy(art.existencia, form_obtener_valor_char(form, "Stock Actual"));
406                 strcpy(art.ubicacion, form_obtener_valor_char(form, "Ubicacion"));
407                 strcpy(art.pvu, form_obtener_valor_char(form, "PVU"));
408                 strcpy(art.emin, form_obtener_valor_char(form, "Stock Mínimo"));
409
410                 /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */
411                 save = procesar_guardar_articulo(&art, &size, lst_articulos);
412                 if (save != NULL) {
413                         error = 0;
414                         id = lst_articulos->fp->grabar_registro(lst_articulos->fp, save, size, &error);
415                         if (error) {
416                                 wattron(win, COLOR_PAIR(COLOR_YELLOW));
417                                 mvwaddstr(win, 6, 4, "Error al tratar de agregar el nuevo registro");
418                                 wattroff(win, COLOR_PAIR(COLOR_YELLOW));
419                                 wrefresh(win);
420                                 getch();
421                         }
422                         free(save);
423                 }
424         } else {
425                 wattron(win, COLOR_PAIR(COLOR_YELLOW));
426                 mvwaddstr(win, 7, 1, "El código ya existe!. Abortando.");
427                 wattroff(win, COLOR_PAIR(COLOR_YELLOW));
428                 wrefresh(win);
429                 getch();
430         }
431         form_destruir(form);
432
433         werase(win);
434         wrefresh(win);
435         delwin(win);
436 }
437
438 int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_LstArticulos *lst)
439 {
440         char *fin, *ini;
441         switch (lst->fp->tipo) {
442                 case T1:
443                 case T4:
444                 case T2:
445                         ini = (char *)src;
446                         /* Copio el primer campo, esto es facil :-) */
447                         memset(dst, 0, sizeof(t_Articulo));
448                         memcpy(&dst->numero, ini, sizeof(unsigned int));
449                         ini+=sizeof(unsigned int);
450                         /* Ahora empieza el juego */
451                         /* Los \0 son los delimitadores de campo! */
452                         fin = ini;
453                         while (*fin!='\0') fin++;
454                         memcpy(dst->desc, ini, fin-ini+1);
455                         
456                         ini = fin+1;
457                         fin = ini;
458                         while (*fin!='\0') fin++;
459                         memcpy(dst->presentacion, ini, fin-ini+1);
460                         
461                         ini = fin+1;
462                         fin = ini;
463                         while (*fin!='\0') fin++;
464                         memcpy(dst->existencia, ini, fin-ini+1);
465                         
466                         ini = fin+1;
467                         fin = ini;
468                         while (*fin!='\0') fin++;
469                         memcpy(dst->ubicacion, ini, fin-ini+1);
470                         
471                         ini = fin+1;
472                         fin = ini;
473                         while (*fin!='\0') fin++;
474                         memcpy(dst->pvu, ini, fin-ini+1);
475                         
476                         ini = fin+1;
477                         fin = (char *)src+size;
478                         memcpy(dst->emin, ini, fin-ini);
479
480                         break;
481                 case T5:
482                 case T3:
483                         memcpy(dst, src, sizeof(t_Articulo));
484         }
485
486         return 1; /* Todo ok */
487 }
488
489 void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArticulos *lst)
490 {
491         char *tmp=NULL;
492         int i[7];
493         char *from = (char *)src;
494         switch(lst->fp->tipo) {
495                 case T1:
496                 case T2:
497                 case T4:
498                         /* Calculo el tamaño que voy a necesitar */
499                         i[0] = sizeof(unsigned int);
500                         i[1] = sizeof(char)*(strlen(src->desc)+1);
501                         i[2] = sizeof(char)*(strlen(src->presentacion)+1);
502                         i[3] = sizeof(char)*(strlen(src->existencia)+1);
503                         i[4] = sizeof(char)*(strlen(src->ubicacion)+1); 
504                         i[5] = sizeof(char)*(strlen(src->pvu)+1);
505                         i[6] = sizeof(char)*(strlen(src->emin)+1);
506                         (*size) = i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6];
507                         tmp = (char *)malloc((*size));
508                         if (tmp == NULL) return NULL;
509                         memset(tmp, 0, *size);
510                         memcpy(tmp, &src->numero, i[0]);
511                         memcpy(tmp+i[0], src->desc, i[1]);
512                         memcpy(tmp+i[0]+i[1], src->presentacion, i[2]);
513                         memcpy(tmp+i[0]+i[1]+i[2], src->existencia, i[3]);
514                         memcpy(tmp+i[0]+i[1]+i[2]+i[3], src->ubicacion, i[4]);
515                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4], src->pvu, i[5]);
516                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5], src->emin, i[6]);
517                 break;
518                 case T5:
519                 case T3:
520                         /* Lleno el lugar no ocupado de los strings con *, para que el ver
521                          * registro se vea bien 
522                          */
523                         tmp = (char *)malloc(sizeof(t_Articulo));
524                         memset(tmp, '*', sizeof(t_Articulo));
525                         memcpy(tmp, from, sizeof(t_Articulo));
526                         (*size) = sizeof(t_Articulo);
527         }
528         return tmp;
529 }
530
531 void art_reformatear(int tipo, int tam_bloque, int tam_reg)
532 {
533 #ifdef NO_SE_PUEDE_USAR
534         EMUFS *nuevo, *old;
535         EMUFS_REG_ID *indices, id;
536         EMUFS_REG_SIZE indices_total, i, size;
537         t_Articulo art;
538         t_LstArticulos *lst_nueva;
539         int error;
540         char *save;
541
542         PERR("==== EMPIEZO ====\n");
543         old = lst_articulos->fp;
544
545         /* Creo el nuevo file */
546         PERR("Creo el archivo\n");
547         nuevo = emufs_crear("emufs_tmp", tipo, tam_bloque, sizeof(t_Articulo));
548         if (nuevo == NULL) {
549                 PERR("ARCHIVO NUEVO NO CREADO");
550                 return;
551         }
552
553         /* Creo la nueva lista */
554         lst_nueva = (t_LstArticulos *)malloc(sizeof(t_LstArticulos));
555         lst_nueva->primero = NULL;
556         lst_nueva->fp = nuevo;
557
558         /* Leo los indices del archivo viejo */
559         PERR("Obtengo Indices\n");
560         indices = emufs_idx_get(old, &indices_total);
561         if (indices == NULL) {
562                 art_liberar(lst_nueva);
563                 return;
564         }
565
566         PERR("Proceso datos\n");
567         for(i=0; i<indices_total; i++) {
568                 error = 0;
569                 save = old->leer_registro(old, indices[i], &size, &error);
570                 if (procesar_leer_articulo(&art, save, size, lst_articulos) == 1) {
571                         free(save);
572                         /* Lei un registro Ok. Lo salvo en el archivo nuevo */
573                         save = procesar_guardar_articulo(&art, &size, lst_nueva);
574                         if (save) {
575                                 error = 0;
576                                 id = nuevo->grabar_registro(nuevo, save, size, &error);
577                                 agregar_nodo_articulo(lst_nueva, crear_nodo_articulo(id, art.numero));
578                                 free(save);
579                         }
580                 }
581         }
582
583         free(indices);
584
585         PERR("Libero lo viejo\n");
586         art_liberar(lst_articulos);
587
588         PERR("Ahora tengo lo nuevo\n");
589         lst_articulos = lst_nueva;
590
591         /* El nuevo tiene como nombre emufs_tmp, lo cambio a mano! */
592         free(lst_articulos->fp->nombre);
593         lst_articulos->fp->nombre = (char *)malloc(sizeof(char)*(strlen("articulos")+1));
594         strcpy(lst_articulos->fp->nombre, "articulos");
595         
596         /* Muevo los archivos! */
597         /* TODO : Poner en otro lugar mas generico! */
598         PERR("Renombre!!\n");
599         rename("emufs_tmp.dat", "articulos.dat");
600         rename("emufs_tmp.idx", "articulos.idx");
601         rename("emufs_tmp.fsc", "articulos.fsc");
602         rename("emufs_tmp.did", "articulos.did");
603         PERR("==== TERMINE ====\n");
604 #endif
605 }
606
607 int art_exportar_xml(const char *filename)
608 {
609         t_Articulo *art;
610         EMUFS_REG_ID id;
611         FILE *fp;
612         CLAVE k;
613         INDICE *idx;
614
615         idx = lst_articulos->fp->indices;
616
617         k = idx->obtener_menor_clave(idx);
618
619         if (!(fp = fopen(filename, "wt"))) return 0;
620         
621         fprintf(fp, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n\n");
622         fprintf(fp, "<ARTICULOS>\n");
623         while (k.i_clave != -1) {
624                 art = art_obtener(lst_articulos, k.i_clave, &id);
625                 if (art != NULL) {
626                         fprintf(fp, "\t<ARTICULO ");
627                         fprintf(fp, "NroArtículo=\"%d\" ", art->numero);
628                         fprintf(fp, "Descripción=\"%s\" ", art->desc);
629                         fprintf(fp, "Presentación=\"%s\" ", art->presentacion);
630                         fprintf(fp, "Ubicación=\"%s\" ", art->ubicacion);
631                         fprintf(fp, "Existencia=\"%s\" ", art->existencia);
632                         fprintf(fp, "PVU=\"%s\" ", art->pvu);
633                         fprintf(fp, "Emín=\"%s\" />\n", art->emin);
634                         free(art);
635                 }
636                 k = idx->obtener_sig_clave(idx, k);
637         }
638         fprintf(fp, "</ARTICULOS>\n");
639
640         fclose(fp);
641         return 1;
642 }
643
644 /* Dejo el test para que no se pierda */
645 void art_consultas_old(char *s)
646 {
647         /* TEST DE LISTA! */
648         char txt[80];
649         int i;
650         t_Lista *lista;
651         WINDOW *win, *win1;
652
653         win = newwin(LINES-4, COLS-2, 2, 1);
654         win1 = derwin(win, LINES-6, COLS-4, 1, 1);
655         werase(win);
656         box(win, 0, 0);
657         wrefresh(win);
658         
659         /* Creo la lista */
660         lista = lista_crear(3, win1, COLS-4, LINES-6);
661
662         /* Creo las columnas */
663         lista_agregar_columna(lista, "Col1", DATO_INT, 0, 8);
664         lista_agregar_columna(lista, "Col2", DATO_STR, 10, 45);
665         lista_agregar_columna(lista, "Col3", DATO_FLOAT, 60, 10);
666
667         /* Agrego unos datos a ver que pasa */
668         /* Pongo 100 y rezo */
669         for(i=0; i<100; i++) {
670                 sprintf(txt, "Texto del item %d", i);
671                 lista_agregar_fila(lista, i, txt, (rand()%100)/100.0f);
672         }
673         curs_set(0);
674         lista_ejecutar(lista);
675         curs_set(1);
676         wrefresh(win1);
677         wrefresh(win);
678         werase(win1);
679         werase(win);
680         wrefresh(win);
681         delwin(win);
682 }
683
684 void art_consultas_codigos(char *s, t_Lista *lista)
685 {
686         EMUFS_REG_ID dummy;
687         int desde_codigo, hasta_codigo;
688         CLAVE k, menor, mayor;
689         t_Articulo *articulo;
690         t_Form *form;
691         INDICE *idx;
692
693         idx = lst_articulos->fp->indices;
694
695         /* El usuario ingresa rango a listar */
696         form = form_crear(lista->win);
697         form_agregar_widget(form, INPUT, "Desde Codigo", 8, "0");
698         form_agregar_widget(form, INPUT, "Hasta Codigo", 8, "99999999");
699
700         form_ejecutar(form, 2, 2);
701
702         desde_codigo = form_obtener_valor_int(form, "Desde Codigo");
703         hasta_codigo = form_obtener_valor_int(form, "Hasta Codigo");
704
705         form_destruir(form);
706         werase(lista->win);
707         wrefresh(lista->win);
708
709         /* Leo los datos desde el archivo */
710         k = emufs_indice_generar_clave_desde_valor(idx, (char *)&desde_codigo);
711
712         menor = idx->obtener_menor_clave(idx);
713         mayor = idx->obtener_mayor_clave(idx);
714
715         if (k.i_clave < menor.i_clave)
716                 k = menor;
717         if (k.i_clave > mayor.i_clave)
718                 hasta_codigo = mayor.i_clave;
719         fprintf(stderr, "k.i_clave = %d  -- hasta_codigo = %d\n", k.i_clave, hasta_codigo);
720         while ((k.i_clave != -1) && (k.i_clave <= hasta_codigo)) {
721                 PERR("BUSCO ARTICULO");
722                 articulo = art_obtener(lst_articulos, k.i_clave, &dummy);
723                 PERR("LO TENGO");
724                 if (articulo != NULL) {
725                         PERR("AGREGO A LA LISTA");
726                         fprintf(stderr, "%d - %s\n", articulo->numero, articulo->desc);
727                         lista_agregar_fila(lista,
728                                                                 articulo->numero,
729                                                                 articulo->desc,
730                                                                 articulo->existencia,
731                                                                 articulo->emin
732                                                 );
733                         free(articulo);
734                 }
735                 PERR("OBTENGO SIGUIENTE CLAVE");
736                 k = idx->obtener_sig_clave(idx, k); 
737                 fprintf(stderr, "k.i_clave = %d  -- hasta_codigo = %d\n", k.i_clave, hasta_codigo);
738         }
739
740         curs_set(0);
741         lista_ejecutar(lista);
742         curs_set(1);
743 }
744
745 void art_consultas_stock(char *s, t_Lista *lista)
746 {
747         CLAVE k, menor;
748         t_Articulo articulo;
749         t_Form *form;
750         INDICE *idx;
751         float por;
752
753         idx = emufs_buscar_indice_por_nombre(lst_articulos->fp, "desc");
754         if (idx == NULL) PERR("NO SE ENCUENTRA INDICE DESC!!!");
755
756         /* El usuario ingresa rango a listar */
757         form = form_crear(lista->win);
758         form_agregar_widget(form, INPUT, "Ingrese %", 8, "0");
759
760         form_ejecutar(form, 2, 2);
761
762         por = form_obtener_valor_float(form, "Ingrese %");
763
764         form_destruir(form);
765         werase(lista->win);
766         wrefresh(lista->win);
767
768         menor = idx->obtener_menor_clave(idx);
769
770         k = menor;
771         while (k.i_clave != -1) {
772                 char *tmp;
773                 EMUFS_REG_SIZE size;
774                 int error, cant, i;
775                 INDICE_DATO *datos;
776                 CLAVE k1;
777                 datos = idx->buscar_entradas(idx, k, &cant);
778                 for(i=0; i<cant; i++) {
779                         error = 1;
780                         k1.i_clave = datos[i].id;
781                         tmp = lst_articulos->fp->leer_registro(lst_articulos->fp, k1, &size, &error);
782
783                         if (tmp != NULL) {
784                                 procesar_leer_articulo(&articulo, tmp, size, lst_articulos);
785                         
786                                 if (atof(articulo.existencia) <= (1.0f+por)*atof(articulo.emin)) {
787                                         lista_agregar_fila(lista,
788                                                 articulo.numero,
789                                                 articulo.desc,
790                                                 articulo.existencia,
791                                                 articulo.emin
792                                         );
793                                 }
794                                 free(tmp);
795                         }
796                 }
797                 if (datos) free(datos);
798                 k = idx->obtener_sig_clave(idx, k); 
799         }
800
801         curs_set(0);
802         lista_ejecutar(lista);
803         curs_set(1);
804 }
805
806 void art_consultas_cambiar_precio(char *s, t_Lista *lista)
807 {
808         CLAVE k, menor;
809         t_Articulo articulo;
810         t_Form *form;
811         INDICE *idx;
812         float por, pvu;
813         char desc[51], uno_solo;
814
815         idx = emufs_buscar_indice_por_nombre(lst_articulos->fp, "desc");
816         if (idx == NULL) PERR("NO SE ENCUENTRA INDICE DESC!!!");
817
818         /* El usuario ingresa rango a listar */
819         form = form_crear(lista->win);
820         form_agregar_widget(form, INPUT, "Desc. Articulo (nulo==Todos)", 50, "");
821         form_agregar_widget(form, INPUT, "Ingrese %", 8, "0");
822
823         werase(lista->win);
824         wrefresh(lista->win);
825         form_ejecutar(form, 2, 2);
826
827         por = form_obtener_valor_float(form, "Ingrese %");
828         strcpy(desc, form_obtener_valor_char(form, "Desc. Articulo (nulo==Todos)"));
829
830         form_destruir(form);
831         werase(lista->win);
832         wrefresh(lista->win);
833
834         uno_solo = 1;
835         if (strlen(desc) == 0) {
836                 uno_solo = 0;
837                 k = menor = idx->obtener_menor_clave(idx);
838         } else {
839                 k.i_clave = 1;
840         }
841
842         while (k.i_clave != -1) {
843                 char *tmp;
844                 EMUFS_REG_SIZE size;
845                 int error, cant, i;
846                 INDICE_DATO *datos;
847                 CLAVE k1;
848                 if (uno_solo == 0)
849                         datos = idx->buscar_entradas(idx, k, &cant);
850                 else
851                         datos = emufs_buscar_registros(lst_articulos->fp, "desc", desc, &cant);
852                 fprintf(stderr, "obtuve %d claves para %s\n", cant, desc);
853                 for(i=0; i<cant; i++) {
854                         error = 1;
855                         k1.i_clave = datos[i].id;
856                         tmp = lst_articulos->fp->leer_registro(lst_articulos->fp, k1, &size, &error);
857
858                         if (tmp != NULL) {
859                                 procesar_leer_articulo(&articulo, tmp, size, lst_articulos);
860                                 free(tmp);
861                         
862                                 /* XXX */
863                                 pvu = atof(articulo.pvu);
864                                 pvu += pvu*por;
865
866                                 sprintf(articulo.pvu, "%.2f", pvu);
867                                 tmp = procesar_guardar_articulo(&articulo, &size, lst_articulos);
868                                 error = 0;
869                                 /* README : Aca si tengo que pasar el INDICE_DATO correcto, para que la funcion
870                                  * borrar sea capaz de eliminar solo el item que corresponde en las
871                                  * claves con repeticion
872                                  */
873                                 PERR("=== MODIFICANDO ===");
874                                 fprintf(stderr, "Desc=%s , PVU=%s, Codigo=%d\n", articulo.desc, articulo.pvu, articulo.numero);
875                                 lst_articulos->fp->modificar_registro(lst_articulos->fp, k1, tmp, size, &error, datos[i]);
876                                 PERR("===     FIN     ===");
877                         }
878                 }
879                 if (datos) free(datos);
880                 if (uno_solo == 0)
881                         k = idx->obtener_sig_clave(idx, k); 
882                 else
883                         k.i_clave = -1;
884         }
885 }
886
887 void art_consultas_varias(char *nombre_indice, char *titulo, t_Lista *lista)
888 {
889         int i, cant, error;
890         char desc[51], *tmp;
891         t_Articulo articulo;
892         t_Form *form;
893         INDICE_DATO *datos;
894         CLAVE k;
895         EMUFS *fs;
896         EMUFS_REG_SIZE size;
897
898         fs = lst_articulos->fp;
899
900         /* El usuario ingresa rango a listar */
901         form = form_crear(lista->win);
902         form_agregar_widget(form, INPUT, titulo, 50, "");
903
904         werase(lista->win);
905         form_ejecutar(form, 2, 2);
906
907         tmp = form_obtener_valor_char(form, titulo);
908         strcpy(desc, tmp);
909
910         form_destruir(form);
911         werase(lista->win);
912         wrefresh(lista->win);
913
914         /* Leo los datos desde el archivo */
915         datos = emufs_buscar_registros(fs, nombre_indice, desc, &cant);
916         for(i=0; i<cant; i++) {
917                 k.i_clave = datos[i].id;
918                 error = 1;
919                 tmp = (char *)fs->leer_registro(fs, k, &size, &error);
920                 if (tmp != NULL) {
921                         procesar_leer_articulo(&articulo, tmp, size, lst_articulos);
922                         lista_agregar_fila(lista,
923                                                         articulo.numero,
924                                                         articulo.desc,
925                                                         articulo.existencia,
926                                                         articulo.emin
927                                         );
928                         free(tmp);
929                 } else {
930                         PERR("NO SE PUDO RECUPERAR EL REGISTRO DE DATOS");
931                 }
932         }
933         if (datos) free(datos);
934         curs_set(0);
935         lista_ejecutar(lista);
936         curs_set(1);
937         
938 }
939
940 void art_consultas(char *s)
941 {
942         t_Lista *lista;
943         WINDOW *win1, *win;
944         MENU(mi_menu) {
945                 MENU_OPCION("por Codigos", "Consulta de Articulos por rango de codigo."),
946                 MENU_OPCION("por Descripcion", "Consulta por descripcion"),
947                 MENU_OPCION("por Presentacion", "Consulta por Presentacion"),
948                 MENU_OPCION("por Sock Faltante", "Consulta de articulos por stock"),
949                 MENU_OPCION("Modificar Precios", "Permite Modificar los PVU"),
950                 MENU_OPCION("Volver", "Volver al menu anterior.")
951         };
952         int opt;
953         
954         win = newwin(LINES-4, COLS-2, 2, 1);
955         win1 = derwin(win, LINES-6, COLS-4, 1, 1);
956         werase(win);
957         box(win, 0, 0);
958         wrefresh(win);
959         
960         /* Creo la lista donde mostrar la consulta*/
961         /* Muestro solo info relevante */
962         lista = lista_crear(4, win1, COLS-4, LINES-6);
963
964         /* Creo las columnas */
965         lista_agregar_columna(lista, "Numero", DATO_INT, 0, 8);    /* numero     */
966         lista_agregar_columna(lista, "Descripcion", DATO_STR, 10, 51);  /* desc       */
967         lista_agregar_columna(lista, "Existencia", DATO_STR, 55, 9);   /* existencia */
968         lista_agregar_columna(lista, "S. Minimo", DATO_STR, 66, 9);   /* enim       */
969
970         while ((opt = menu_ejecutar(mi_menu, 6, "Consulta de Articulos")) != 5) {
971                 switch (opt) {
972                         case 0:
973                                 art_consultas_codigos(s, lista);
974                         break;
975                         case 1:
976                                 art_consultas_varias("desc", "Descripcion", lista);
977                         break;
978                         case 2:
979                                 art_consultas_varias("presentacion", "Presentacion", lista);
980                         break;
981                         case 3:
982                                 art_consultas_stock(s, lista);
983                         break;
984                         case 4:
985                                 art_consultas_cambiar_precio(s, lista);
986                 }
987                 lista_clear(lista);
988                 werase(win1);
989                 werase(win);
990                 wrefresh(win1);
991                 box(win, 0, 0);
992                 wrefresh(win);
993         }
994         werase(win1);
995         werase(win);
996         wrefresh(win);
997         delwin(win);
998 }
999
1000
1001 void imprimir(WINDOW *win, int y, int x, char *s, char *b)
1002 {
1003         wmove(win, y, x);
1004         waddstr(win, s);
1005         waddstr(win, b);
1006 }
1007
1008 void mostrar_art(WINDOW *win, CLAVE k, char *s, INDICE *idx)
1009 {
1010         t_Articulo *art;
1011         EMUFS_REG_ID dummy;
1012         int y = 3;
1013         char numero[10];
1014         /* XXX SOLO PARA CODIGO XXX */
1015         
1016         wattron(win, COLOR_PAIR(COLOR_RED));
1017         mvwaddstr(win, 1, 5, "Recorriendo Articulos por indice ");
1018         waddstr(win, s);
1019         wattroff(win, COLOR_PAIR(COLOR_RED));
1020
1021         wattron(win, A_BOLD);
1022         mvwaddstr(win, 18, 5, "Teclas:");
1023         wattroff(win, A_BOLD);
1024         mvwaddstr(win, 19, 5, " L = Siguiente");
1025         mvwaddstr(win, 20, 5, " K = Anterior");
1026
1027         if (strcmp(s, "codigo") == 0) {
1028                 art = art_obtener(lst_articulos, k.i_clave, &dummy);
1029         } else {
1030                 INDICE_DATO *datos;
1031                 EMUFS_REG_SIZE size;
1032                 int cant, error;
1033                 char *tmp;
1034
1035                 art = (t_Articulo *)malloc(sizeof(t_Articulo));
1036                 /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */
1037                 PERR("Busco todos los datos que tengan esta clave");
1038                 datos = idx->buscar_entradas(idx, k, &cant);
1039                 if (datos == NULL) {
1040                         free(art);
1041                         art = NULL;
1042                 } else {
1043                         fprintf(stderr, "Tengo %d datos\n", cant);
1044                         error = 1;
1045                         k.i_clave = datos[0].id;
1046                         PERR("Leo el primer dato");
1047                         tmp = lst_articulos->fp->leer_registro(lst_articulos->fp, k, &size, &error);
1048                         if (tmp == NULL) {
1049                                 free(art);
1050                                 art = NULL;
1051                         } else {
1052                                 if (procesar_leer_articulo(art, tmp, size, lst_articulos) != 1) {
1053                                         free(art);
1054                                         free(tmp);
1055                                         art = NULL;
1056                                 }
1057                         }
1058                         free(datos);
1059                 }
1060         }
1061
1062         
1063         if (art != NULL) {
1064                 sprintf(numero, "%08d", art->numero);
1065
1066                 imprimir(win, y++, 5, "Numero      : ", numero);
1067                 imprimir(win, y++, 5, "Descripcion : ", art->desc);
1068                 imprimir(win, y++, 5, "Presentacion: ", art->presentacion);
1069                 imprimir(win, y++, 5, "Existencia  : ", art->existencia);
1070                 imprimir(win, y++, 5, "Ubicacion   : ", art->ubicacion);
1071                 imprimir(win, y++, 5, "P. Unitario : ", art->pvu);
1072                 imprimir(win, y++, 5, "Stock Minimo: ", art->emin);
1073                 
1074                 free(art);
1075         } else {
1076                 PERR("NO EXISTE EL ARTICULO");
1077         }
1078         
1079 }
1080
1081 void art_recorrer_con_indice(char *s)
1082 {
1083         WINDOW *win, *win1;
1084         INDICE *idx;
1085         CLAVE stack[1000]; /* shhhh */
1086         CLAVE k;
1087         int stack_pos=0, c;
1088                 
1089         PERR("Busco indice");
1090         idx = emufs_buscar_indice_por_nombre(lst_articulos->fp, s);
1091
1092         win = newwin(LINES-4, COLS-2, 2, 1);
1093         win1 = derwin(win, LINES-6, COLS-4, 1, 1);
1094         werase(win);
1095         box(win, 0, 0);
1096         wrefresh(win);
1097
1098         PERR("Obtengo clave menor");
1099         k = idx->obtener_menor_clave(idx);
1100         
1101         PERR("Muestro el primer elemento");
1102
1103
1104         mostrar_art(win1, k, s, idx);
1105         wrefresh(win1);
1106         PERR("Sigue el usuario");
1107         curs_set(0);
1108         stack[0] = k;
1109         while ((c=wgetch(win)) != 13) {
1110                 switch (c) {
1111                         case 'L':
1112                         case 'l':
1113                                 stack[stack_pos++] = k; /* Guardo la clave para poder volver */
1114                                 k = idx->obtener_sig_clave(idx, k);
1115                                 /* TODO Verificar que no me pase del fin */
1116                                 break;
1117                         case 'K':
1118                         case 'k':
1119                                 /* recupero la anterior */
1120                                 stack_pos--;
1121                                 if (stack_pos < 0) stack_pos = 0;
1122                                 k = stack[stack_pos];
1123                                 break;
1124                         default:
1125                                 continue;
1126                 }
1127                 werase(win1);
1128                 mostrar_art(win1, k, s, idx);
1129                 wrefresh(win1);
1130         }
1131         curs_set(1);
1132
1133         werase(win1);
1134         werase(win);
1135         wrefresh(win);
1136         delwin(win);
1137 }
1138
1139 void art_recorrer()
1140 {
1141         char *ind[3] = {"codigo", "desc", "presentacion"};
1142         MENU(mi_menu) {
1143                 MENU_OPCION("Codigos", "Recorrer por Indice Codigo"),
1144                 MENU_OPCION("Descripcion", "Recorrer por Indice Descripcionn"),
1145                 MENU_OPCION("Presentacion", "Recorrer por Indice Presentacion"),
1146                 MENU_OPCION("Volver", "Volver al menu anterior.")
1147         };
1148         int opt;
1149         while ((opt = menu_ejecutar(mi_menu, 4, "Recorrer Articulos")) != 3) {
1150                 art_recorrer_con_indice(ind[opt]);
1151         }
1152 }
1153
1154 void art_ver_ventas()
1155 {
1156 #ifdef cONDORITO
1157         char desde_fecha[10], hasta_fecha[10];
1158         t_Lista *lista;
1159         t_Form *form;
1160         WINDOW *win, *win1;
1161         INDICE *idx;
1162         CLAVE k_menor, k_mayor;
1163
1164         win = newwin(LINES-4, COLS-2, 2, 1);
1165         win1 = derwin(win, LINES-6, COLS-4, 1, 1);
1166         werase(win);
1167         box(win, 0, 0);
1168         wrefresh(win);
1169         
1170         /* El usuario ingresa rango a listar */
1171         form = form_crear(win1);
1172         form_agregar_widget(form, INPUT, "Desde Fecha", 8, "");
1173         form_agregar_widget(form, INPUT, "Hasta Fecha", 8, "");
1174         form_ejecutar(form, 2, 2);
1175
1176         strcpy(desde_fecha, form_obtener_valor_char(form, "Desde Fecha"));
1177         strcpy(hasta_fecha, form_obtener_valor_char(form, "Hasta Fecha"));
1178         
1179         form_destruir(form);
1180         werase(win1);
1181         wrefresh(win1);
1182
1183         /* Si el usuario no ingreso alguno de los datos, lo obtengo del indice */
1184         /*idx = emufs_buscar_indice_por_nombre(fact_get_lst()->fp, "emision");*/
1185
1186         /* Uso el indice por numero de articulo */
1187         idx = fact_get_lst()->fp->externo;
1188
1189         if (idx==NULL) PERR("INDICE EMISION NO SE ENCUENTRA!!");
1190         if (strlen(desde_fecha) == 0) {
1191                 k_menor = idx->obtener_menor_clave(idx);
1192                 emufs_indice_obtener_valor_desde_clave(idx, k_menor, desde_fecha);
1193                 PERR("OBTUVE MENOR CLAVE DESDE EL INDICE");
1194                 PERR(desde_fecha);
1195         }
1196         if (strlen(hasta_fecha) == 0) {
1197                 k_mayor = idx->obtener_mayor_clave(idx);
1198                 emufs_indice_obtener_valor_desde_clave(idx, k_mayor, hasta_fecha);
1199                 PERR("OBTUVE MAYOR CLAVE DESDE EL INDICE");
1200                 PERR(hasta_fecha);
1201         }
1202         
1203         /* Creo la lista donde mostrar la consulta*/
1204         /* Muestro solo info relevante */
1205         lista = lista_crear(4, win1, COLS-4, LINES-6);
1206
1207         /* Creo las columnas */
1208         lista_agregar_columna(lista, "Fecha", DATO_STR, 0, 9);       /* emision    */
1209         lista_agregar_columna(lista, "Numero", DATO_INT, 20, 8);     /* numero articulo    */
1210         lista_agregar_columna(lista, "Cantidad", DATO_INT, 30, 10);  /* estado     */
1211
1212         /* Leo los datos desde el archivo */
1213         while (k_menor.i_clave != -1) {
1214                 t_Factura fact;
1215                 int error, cant, i;
1216                 char *leo;
1217                 EMUFS_REG_SIZE size;
1218                 INDICE_DATO *datos;
1219                 CLAVE k1;
1220                 datos = idx->buscar_entradas(idx, k_menor, &cant);
1221                 for(i=0; i<cant; i++) {
1222                         error = 1;
1223                         k1.i_clave = datos[i].id;
1224                         leo = lst_facturas->fp->leer_registro(lst_facturas->fp, k1, &size, &error);
1225                         if (leo != NULL) {
1226                                 procesar_leer_factura(&fact, leo, size, lst_facturas);
1227                                 free(leo);
1228                         }
1229                         lista_agregar_fila(lista,
1230                                 fact.emision,
1231                                 get_estado(fact.estado),
1232                                 get_forma_pago(fact.fp),
1233                                 get_importe_factura(fact.items, fact.cant_items, fact.procdoi)
1234                         );
1235                 }
1236                 if (datos) free(datos);
1237                 if (fact.items) free(fact.items);
1238                 k_menor = idx->obtener_sig_clave(idx, k_menor);
1239         }
1240
1241         curs_set(0);
1242         lista_ejecutar(lista);
1243         curs_set(1);
1244         wrefresh(win1);
1245         wrefresh(win);
1246         werase(win1);
1247         werase(win);
1248         wrefresh(win);
1249         delwin(win);
1250 #endif
1251 }
1252
1253 void art_actualizar_stock(int numero, int cv)
1254 {
1255         t_Articulo *articulo;
1256         EMUFS_REG_ID dummy;
1257         char *tmp;
1258         EMUFS_REG_SIZE size;
1259         int error, stock;
1260
1261         articulo = art_obtener(lst_articulos, numero, &dummy);
1262         if (articulo != NULL) {
1263                 /* Actualizo el stock */
1264                 stock = atoi(articulo->existencia);
1265                 stock -= cv;
1266                 sprintf(articulo->existencia, "%d", stock);
1267                 tmp = procesar_guardar_articulo(articulo, &size, lst_articulos);
1268                 if (tmp) {
1269                         CLAVE k;
1270                         INDICE_DATO dummy1;
1271                         k.i_clave = numero;
1272                         EMUFS *fp;
1273                         /* dummy se pasa porque esto se hace por clave primaria, y el INDICE_DATO que se
1274                          * pasa solo es requerido cuando son claves multiples
1275                          */
1276                         PERR("Guardando modificacion de Stock");
1277                         error = 0;
1278                         fprintf(stderr, "PTR=%p %p\n", lst_articulos, lst_articulos->fp);
1279                         fp = lst_articulos->fp;
1280                         PERR("Pase1");
1281                         fprintf(stderr, "METODO : %p\n", fp->modificar_registro);
1282                         fp->modificar_registro(fp, k, tmp, size, &error, dummy1);
1283                         PERR("Pase2");
1284                         PERR("Listo");
1285                         free(tmp);
1286                 }
1287         }
1288 }
1289