]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/facturas.c
* Pocos cambios.
[z.facultad/75.06/emufs.git] / emufs_gui / facturas.c
1
2 #include "facturas.h"
3 #include "idx.h"
4
5 static t_LstFacturas *lst_facturas;
6
7 /* Procesa una factura antes de enviarla al archivo para guardarla */
8 static void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, EMUFS_REG_SIZE *size);
9 static int procesar_leer_factura(t_Factura *dst, void *src, EMUFS_REG_SIZE size, t_LstFacturas *lst);
10 static t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num);
11 static int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo);
12 int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo);
13 static t_Item *leer_items(xmlNode *, int *cant, int size);
14 static char *leer_nota(xmlNode *);
15
16 t_LstFacturas *fact_get_lst()
17 {
18         return lst_facturas;
19 }
20
21 /* Hack! ... Si no existe propiedad retorna "" */
22 char *xml_get_prop(xmlNode *node, char *nombre)
23 {
24         char *s;
25         if (xmlGetProp(node, nombre) == NULL) {
26                 s = malloc(1);
27                 s[0] = '\0';
28                 return s;
29         }
30         return xmlGetProp(node, nombre);
31 }
32
33 int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo)
34 {
35         if (nodo == NULL) return 0;
36         if (nodo->ant == NULL) {
37                 /* Me piden borrar el primer nodo */
38                 if (nodo->sig) {
39                         nodo->sig->ant = NULL;
40                 }
41                 lst->primero = nodo->sig;
42         } else {
43                 if (nodo->sig) {
44                         nodo->sig->ant = nodo->ant;
45                 }
46                 nodo->ant->sig = nodo->sig;
47         }
48         free(nodo);
49         return 1;
50 }
51
52 t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num)
53 {
54         t_Reg_Factura *tmp;
55         if (reg == EMUFS_NOT_FOUND) return NULL;
56         tmp = malloc(sizeof(t_Reg_Factura));
57         if (tmp == NULL) return NULL;
58         tmp->sig = tmp->ant = NULL;
59         tmp->num_reg = reg;
60         tmp->texto_reg = texto;
61         tmp->numero = num;
62
63         return tmp;
64 }
65
66 int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo)
67 {
68         if (nodo == NULL) return 0;
69
70         if (lst->primero) {
71                 lst->primero->ant = nodo;
72                 nodo->sig = lst->primero;
73                 lst->primero = nodo;
74         } else {
75                 lst->primero = nodo;
76         }
77         return 1;
78 }
79
80 t_Item *leer_items(xmlNode *node, int *cant, int size)
81 {
82         t_Item *tmp;
83         int count;
84         char *prop;
85         if (size == -1) {
86                 tmp = NULL;
87                 count = 0;
88                 node = node->children;
89                 while (node) {
90                         if (node->type == XML_ELEMENT_NODE) {
91                                 if (strcmp(node->name, "ITEMVENTA") == 0) {
92                                         count++;
93                                         tmp = realloc(tmp, sizeof(t_Item)*count);
94                                         memset(&tmp[count-1], 0, sizeof(t_Item));
95                                         prop = xml_get_prop(node, "NroArtículo");
96                                         tmp[count-1].numero = atoi(prop);
97                                         xmlFree(prop);
98                                         strcpy(tmp[count-1].cv, prop = xml_get_prop(node, "CV")); xmlFree(prop);
99                                         strcpy(tmp[count-1].pvu, prop = xml_get_prop(node, "PVU")); xmlFree(prop);
100                                 }
101                         }
102                         node = node->next;
103                 }
104                 *cant = count;
105         } else {
106                 (*cant) = size;
107                 tmp = (t_Item *)malloc(sizeof(t_Item)*size);
108                 memset(tmp, 0, sizeof(t_Item)*size);
109
110                 count = 0;
111                 node = node->children;
112                 while (node) {
113                         if (node->type == XML_ELEMENT_NODE) {
114                                 if (strcmp(node->name, "ITEMVENTA") == 0) {
115                                         memset(&tmp[count], '*', sizeof(t_Item));
116                                         prop = xml_get_prop(node, "NroArtículo");
117                                         tmp[count].numero = atoi(prop);
118                                         xmlFree(prop);
119                                         strcpy(tmp[count].cv, prop = xml_get_prop(node, "CV")); xmlFree(prop);
120                                         strcpy(tmp[count].pvu, prop = xml_get_prop(node, "PVU")); xmlFree(prop);
121                                         count++;
122                                 }
123                         }
124                         if (count == 10) break; /* No me entran mas items! */
125                         node = node->next;
126                 }
127         }
128         return tmp;
129 }
130
131 char *leer_nota(xmlNode *node)
132 {
133         xmlNode *tmp;
134         char *salida;
135         tmp = node->children;
136         while (tmp) {
137                 if (tmp->type == XML_ELEMENT_NODE) {
138                         if (strcmp(tmp->name, "NOTA") == 0) {
139                                 break;
140                         }
141                 }
142                 tmp = tmp->next;
143         }
144
145         if (tmp) {
146                 salida = (char *)malloc(sizeof(char)*(strlen(XML_GET_CONTENT(tmp->children))+1));
147                 strcpy(salida, XML_GET_CONTENT(tmp->children));
148         } else {
149                 salida = (char *)malloc(sizeof(char));
150                 salida[0] = '\0';
151         }
152         return salida;
153 }
154
155
156 t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque)
157 {
158         xmlDocPtr document;
159         xmlNode *node, *inicio;
160         int error = 0, cant_items, i;
161         char *prop;
162         EMUFS_REG_SIZE size;
163         t_LstFacturas *tmp;
164         EMUFS_REG_ID id, *indices, indices_cant;
165         
166         lst_facturas = NULL;
167
168         tmp = (t_LstFacturas *)malloc(sizeof(t_LstFacturas));
169         if (tmp == NULL) return NULL;
170         lst_facturas = tmp;
171         tmp->primero = NULL;
172
173         if (filename != NULL) {
174                 PERR("Voy a cargar de un XML");
175                 document = xmlReadFile(filename, "ISO-8859-1",0);
176                 if (document == NULL) {
177                         PERR("Error al leer documento!!");
178                         free(tmp);
179                         lst_facturas = NULL;
180                         return NULL;
181                 }
182
183                 inicio = NULL;
184                 node = xmlDocGetRootElement(document);
185                 /* Busco el TAG principal "ARTICULOS" */
186                 while (node) {
187                         if (node->type == XML_ELEMENT_NODE) {
188                                 if (strcmp(node->name, "FACTURAS") == 0) {
189                                         inicio = node->children;
190                                         break;
191                                 }
192                         }
193                         node = node->next;
194                 }
195
196                 /* En el registro no guardo los punteros de nota ni items. Si guardo la cantidad de items
197                  * y los items al final del registro.
198                  */
199                 if (tipo == T3) {
200                         /* Limito a 10 items en el caso de registro constante! */
201                         cant_items = 10;
202                 } else {
203                         cant_items = 0;
204                 }
205                 tmp->fp = emufs_crear("facturas", tipo-1, tam_bloque, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item));
206                 tmp->fp_texto = emufs_crear("notas", 1, 100, 0);
207                 for (node=inicio ; node ; node = node->next) {
208                         if (node->type == XML_ELEMENT_NODE) {
209                                 if (strcmp(node->name, "FACTURA") == 0) {
210                                         t_Factura fact;
211                                         void *save;
212                                         memset(&fact, '*', sizeof(t_Factura));
213                                         prop = xml_get_prop(node, "NroFac");
214                                         fact.numero = atoi(prop); xmlFree(prop);
215                                         prop = xml_get_prop(node, "PorcDoI");
216                                         fact.procdoi = atof(prop); xmlFree(prop);
217                                         prop = xml_get_prop(node, "NroRemito");
218                                         fact.numero_remito = atoi(prop); xmlFree(prop);
219                                         strncpy(fact.emision, prop = xml_get_prop(node, "FechaEmisión"), 8); xmlFree(prop);
220                                         fact.emision[8] = '\0';
221                                         strncpy(fact.vencimiento, prop = xml_get_prop(node, "FechaVto"), 8); xmlFree(prop);
222                                         fact.vencimiento[8] = '\0';
223                                         strncpy(fact.estado, prop = xml_get_prop(node, "Estado"), 2); xmlFree(prop);
224                                         fact.estado[2] = '\0';
225                                         strncpy(fact.fp, prop = xml_get_prop(node, "FP"), 2); xmlFree(prop);
226                                         fact.fp[2] = '\0';
227                                         strncpy(fact.ctacte, prop = xml_get_prop(node, "NroCtaCte"), 5); xmlFree(prop);
228                                         fact.ctacte[5] = '\0';
229                                         strncpy(fact.cheque, prop = xml_get_prop(node, "NroCheque"), 18); xmlFree(prop);
230                                         fact.cheque[18] = '\0';
231
232                                         fact.nota = leer_nota(node);
233                                         fact.items = leer_items(node, &fact.cant_items, ((tipo-1)==T3)?10:-1);
234
235                                         error = 0;
236                                         id = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, strlen(fact.nota)+1, &error);
237                                         fact.reg_nota = id;
238                                         save = procesar_guardar_factura(&fact, lst_facturas, &size);
239                                         if (save != NULL) {
240                                                 error = 0;
241                                                 id = tmp->fp->grabar_registro(tmp->fp, save, size, &error);
242                                                 agregar_nodo_factura(tmp, crear_nodo_factura(id, fact.reg_nota, fact.numero));
243                                                 if (fact.items) free(fact.items);
244                                                 if (fact.nota) free(fact.nota);
245                                                 free(save);
246                                         }
247                                 }
248                         }
249                 }
250                 xmlFreeDoc(document);
251                 xmlCleanupParser();
252         } else {
253                 PERR("Voy a recuperar desde un archivo");
254                 tmp->fp = emufs_abrir("facturas");
255                 if (tmp->fp == NULL) {
256                         PERR("No se pudo cargar archivo de facturas!");
257                         free(tmp);
258                         lst_facturas = NULL;
259                         return NULL;
260                 }
261                 tmp->fp_texto = emufs_abrir("notas");
262                 if (tmp->fp_texto == NULL) {
263                         PERR("No se pudo cargar archivo de notas!");
264                         emufs_destruir(tmp->fp);
265                         free(tmp);
266                         lst_facturas = NULL;
267                         return NULL;
268                 }
269
270                 /* Ahora trato de recuperar la info */
271                 indices = emufs_idx_get(tmp->fp, &indices_cant);
272                 for(i=0; i<indices_cant; i++) {
273                         t_Factura art;
274                         void *save;
275                         /* Leo el registro */
276                         save = tmp->fp->leer_registro(tmp->fp, indices[i], &size, &error);
277                         if (procesar_leer_factura(&art, save, size, tmp) == 1) {
278                                 agregar_nodo_factura(tmp, crear_nodo_factura(indices[i], art.reg_nota, art.numero));
279                                 free(save);
280                         }
281                 }
282                 free(indices);
283         }
284
285         PERR("Facturas todo Ok");
286         return lst_facturas;
287 }
288
289 int fact_liberar(t_LstFacturas *l)
290 {
291         t_Reg_Factura *del;
292         if (l == NULL) l = lst_facturas;
293         if (l == NULL) return 1;
294
295         emufs_destruir(l->fp);
296         emufs_destruir(l->fp_texto);
297         while (l->primero) {
298                 del = l->primero;
299                 l->primero = l->primero->sig;
300                 free(del);
301         }
302         free(l);
303
304         lst_facturas = NULL;
305         return 0;
306 }
307
308 t_Factura *fact_buscar(t_LstFacturas *lst, int numero, EMUFS_REG_ID *id, EMUFS_REG_ID *id_texto)
309 {
310         t_Factura *fact;
311         t_Reg_Factura *reg;
312         char *leo;
313         EMUFS_REG_SIZE size;
314         int error;
315         if (lst == NULL) return NULL;
316
317         fact = NULL;
318         reg = lst->primero;
319         while (reg) {
320                 if (reg->numero == numero) {
321                         size = 0;
322                         error = 0;
323                         leo = lst->fp->leer_registro(lst->fp, reg->num_reg, &size, &error);
324                         if (leo != NULL) {
325                                 fact = (t_Factura *)malloc(sizeof(t_Factura));
326                                 if (fact == NULL) {
327                                         free(leo);
328                                         return NULL;
329                                 }
330                                 procesar_leer_factura(fact, leo, size, lst);
331                                 (*id) = reg->num_reg;
332                                 (*id_texto) = reg->texto_reg;
333                                 free(leo);
334                         }
335                         break;
336                 }
337                 reg = reg->sig;
338         }
339         return fact;
340 }
341
342 t_Factura *fact_form_buscar(WINDOW *win, EMUFS_REG_ID *id, EMUFS_REG_ID *id_texto)
343 {
344         t_Form *form;
345         t_Factura *fact;
346
347         form = form_crear(win);
348         form_agregar_widget(form, INPUT, "Numero de Factura", 8, "");
349         form_ejecutar(form, 1,1);
350         fact = fact_buscar(lst_facturas, form_obtener_valor_int(form, "Numero de Factura"), id, id_texto);
351         form_destruir(form);
352
353         return fact;
354 }
355
356 void fact_eliminar(char *s)
357 {
358         WINDOW *win;
359         t_Factura *fact;
360         t_Reg_Factura *nodo;
361         EMUFS_REG_ID id;
362                                                                         
363         win = newwin(LINES-4, COLS-2, 2, 1);
364         box(win, 0, 0);
365         
366         fact = fact_form_buscar(win, &id, &id);
367
368         if (fact == NULL) {
369                 wattron(win, COLOR_PAIR(COLOR_YELLOW));
370                 mvwaddstr(win, 2, 1, "No existe artículo con ese código. Abortando!");
371                 wattroff(win, COLOR_PAIR(COLOR_YELLOW));
372                 wrefresh(win);
373                 getch();
374                 werase(win);
375                 wrefresh(win);
376                 delwin(win);
377                 return;
378         }
379
380         nodo = lst_facturas->primero;
381         while (nodo) {
382                 if (nodo->numero == fact->numero) {
383                         lst_facturas->fp->borrar_registro(lst_facturas->fp, nodo->num_reg);
384                         lst_facturas->fp_texto->borrar_registro(lst_facturas->fp_texto, nodo->texto_reg);
385                         eliminar_nodo_factura(lst_facturas, nodo);
386                         break;
387                 }
388                 nodo = nodo->sig;
389         }
390
391         free(fact->items);
392         free(fact);
393 }
394
395 void fact_modificar(char *s)
396 {
397         WINDOW *win, *items;
398         t_Form *form;
399         t_Factura *fact;
400         /*EMUFS_REG_SIZE size;*/
401         EMUFS_REG_ID id, id_texto;
402 /*      int y_actual, cant, error;*/
403         char tmp_str[10];
404
405                                                                         
406         win = newwin(LINES-4, COLS-2, 2, 1);
407         box(win, 0, 0);
408         
409         fact = fact_form_buscar(win, &id, &id_texto);
410
411         if (fact == NULL) {
412                 wattron(win, COLOR_PAIR(COLOR_YELLOW));
413                 mvwaddstr(win, 2, 1, "No existe artículo con ese código. Abortando!");
414                 wattroff(win, COLOR_PAIR(COLOR_YELLOW));
415                 wrefresh(win);
416                 getch();
417                 werase(win);
418                 wrefresh(win);
419                 delwin(win);
420                 return;
421         }
422
423         mvwaddch(win, 10, 0, ACS_LTEE);
424         mvwhline(win, 10, 1, ACS_HLINE, COLS-3);
425         mvwaddch(win, 10, COLS-3, ACS_RTEE);
426         wrefresh(win);
427
428         items = derwin(win, LINES-20, COLS-4, 15, 1);
429         wrefresh(items);
430
431         form = form_crear(win);
432         sprintf(tmp_str, "%08d", fact->numero);
433         form_agregar_widget(form, INPUT, "Numero de Factura", 8, tmp_str);
434         form_agregar_widget(form, INPUT, "Fecha Emision", 8, fact->emision);
435         form_agregar_widget(form, INPUT, "Fecha Vto", 8, fact->vencimiento);
436         sprintf(tmp_str, "%08d", fact->numero_remito);
437         form_agregar_widget(form, INPUT, "Nro Remito", 8, tmp_str);
438         form_agregar_widget(form, RADIO, "Estado", 6, "PN,CD,CM,SF,PM,NC");
439         form_agregar_widget(form, RADIO, "Forma de pago", 3, "CO,CR,CH");
440         sprintf(tmp_str, "%02.2f", fact->procdoi);
441         form_agregar_widget(form, INPUT, "%% Descuento", 5, tmp_str);
442         form_agregar_widget(form, INPUT, "Cuenta Cte", 5, fact->ctacte);
443         form_agregar_widget(form, INPUT, "Cheque Nro", 18, fact->cheque);
444
445         form_ejecutar(form, 1,1);
446
447         fact->numero = form_obtener_valor_int(form, "Numero de Factura");
448         strcpy(fact->emision, form_obtener_valor_char(form, "Fecha Emision"));
449         strcpy(fact->vencimiento, form_obtener_valor_char(form, "Fecha Vto"));
450         fact->numero_remito = form_obtener_valor_int(form, "Nro Remito");
451         strcpy(fact->estado, form_obtener_valor_char(form, "Estado"));
452         strcpy(fact->fp, form_obtener_valor_char(form, "Forma de pago"));
453         fact->procdoi = form_obtener_valor_float(form, "%% Descuento");
454         strcpy(fact->ctacte, form_obtener_valor_char(form, "Cuenta Cte"));
455         strcpy(fact->cheque, form_obtener_valor_char(form, "Cheque Nro"));
456
457         form_destruir(form);
458
459         /* TODO MODIFICAR */
460         
461 /*      entrada = procesar_guardar_factura(&fact,lst_facturas, &size);
462         if (entrada) {
463                 id = lst_facturas->fp->grabar_registro(lst_facturas->fp, entrada, size, &error);*/
464                 /*id_texto = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, 400, &error);*/
465                 /* TODO : -1 == id_texto !!!!!!!! XXX XXX XXX XXX XXX XXX XXX */
466                 /*agregar_nodo_factura(lst_facturas, crear_nodo_factura(id, -1, fact.numero));
467                 free(entrada);
468         }
469         */                                                              
470 /*      form_destruir(form); */
471
472         free(fact->items);
473         free(fact);
474
475         werase(win);
476         wrefresh(win);
477         delwin(items);
478         delwin(win);
479 }
480
481 void fact_agregar(char *s)
482 {
483         WINDOW *win, *items, *nota, *subnota;
484         t_Form *form, *form_nota;
485         t_Item *its = NULL;
486         t_Factura fact;
487         EMUFS_REG_SIZE size;
488         EMUFS_REG_ID id; /*, id_texto;*/
489         int y_actual, cant, error;
490         char *entrada;
491
492         win = newwin(LINES-4, COLS-2, 2, 1);
493         box(win, 0, 0);
494         mvwaddch(win, 10, 0, ACS_LTEE);
495         mvwhline(win, 10, 1, ACS_HLINE, COLS-3);
496         mvwaddch(win, 10, COLS-3, ACS_RTEE);
497         wrefresh(win);
498
499         items = derwin(win, LINES-20, COLS-4, 15, 1);
500         nota = derwin(win, 9, COLS-62, 1, 56);
501         subnota = derwin(nota, 7, COLS-64, 1, 1);
502         box(nota, 0, 0);
503         mvwaddstr(nota, 0, 1, "Nota :");
504         wrefresh(nota);
505         wrefresh(items);
506
507         form = form_crear(win);
508         form_agregar_widget(form, INPUT, "Numero de Factura", 8, "");
509         form_agregar_widget(form, INPUT, "Fecha Emision", 8, "");
510         form_agregar_widget(form, INPUT, "Fecha Vto", 8, "");
511         form_agregar_widget(form, INPUT, "Nro Remito", 8, "");
512         form_agregar_widget(form, RADIO, "Estado", 6, "PN,CD,CM,SF,PM,NC");
513         form_agregar_widget(form, RADIO, "Forma de pago", 3, "CO,CR,CH");
514         form_agregar_widget(form, INPUT, "%% Descuento", 5, "");
515         form_agregar_widget(form, INPUT, "Cuenta Cte", 5, "");
516         form_agregar_widget(form, INPUT, "Cheque Nro", 18, "");
517
518         form_ejecutar(form, 1,1);
519
520         form_nota = form_crear(subnota);
521         form_agregar_widget(form_nota, INPUT, "", 255, "");
522         form_ejecutar(form_nota, 0, 0);
523
524         fact.numero = form_obtener_valor_int(form, "Numero de Factura");
525         strcpy(fact.emision, form_obtener_valor_char(form, "Fecha Emision"));
526         strcpy(fact.vencimiento, form_obtener_valor_char(form, "Fecha Vto"));
527         fact.numero_remito = form_obtener_valor_int(form, "Nro Remito");
528         strcpy(fact.estado, form_obtener_valor_char(form, "Estado"));
529         strcpy(fact.fp, form_obtener_valor_char(form, "Forma de pago"));
530         fact.procdoi = form_obtener_valor_float(form, "%% Descuento");
531         strcpy(fact.ctacte, form_obtener_valor_char(form, "Cuenta Cte"));
532         strcpy(fact.cheque, form_obtener_valor_char(form, "Cheque Nro"));
533
534         form_destruir(form);
535         form_destruir(form_nota);
536
537         form = form_crear(win);
538         form_agregar_widget(form, INPUT, "Nro de Articulo (* == fin)", 8, "");
539         form_agregar_widget(form, INPUT, "CV", 8, "");
540         form_agregar_widget(form, INPUT, "PVU", 8, "");
541         y_actual = 0;
542         scrollok(items, 1);
543         mvwaddstr(win, 15, 2, "Numero");
544         mvwaddstr(win, 15, 11, "CV");
545         mvwaddstr(win, 15, 21, "PVU");
546         cant = 0;
547         do {
548                 form_set_valor(form, "Nro de Articulo (* == fin)", "");
549                 form_set_valor(form, "CV", "");
550                 form_set_valor(form, "PVU", "");
551                 form_ejecutar(form, 2, 11);
552
553                 entrada = form_obtener_valor_char(form, "Nro de Articulo (* == fin)");
554
555                 if ((entrada[0] != '\0') && (entrada[0] != '*')){
556                         y_actual++;
557                         if (y_actual > LINES-22) {
558                                 y_actual = LINES-22;
559                                 wscrl(items, 1);
560                         }
561                         mvwaddstr(items, y_actual, 1, entrada);
562                         mvwaddstr(items, y_actual, 10, form_obtener_valor_char(form, "CV"));
563                         mvwaddstr(items, y_actual, 20, form_obtener_valor_char(form, "PVU"));
564                         wrefresh(items);
565                         /* Agrego el Item */
566                         cant++;
567                         its = (t_Item *)realloc(its, cant*sizeof(t_Item));
568                         if (its != NULL) {
569                                 its[cant-1].numero = atoi(entrada);
570                                 strcpy(its[cant-1].cv, form_obtener_valor_char(form, "CV"));
571                                 strcpy(its[cant-1].pvu, form_obtener_valor_char(form, "PVU"));
572                         }
573                 }
574         } while (entrada[0] != '*');
575
576         if (lst_facturas->fp->tipo == T3) {
577                 if (cant != 10) {
578                         /* TODO Limitar en la GUI en lugar de truncar! */
579                         its = (t_Item *)realloc(its, 10*sizeof(t_Item));
580                         if (its == NULL) {
581                                 cant = 0;
582                         } else {
583                                 memset(its+sizeof(t_Item)*cant, 0, (10-cant)*sizeof(t_Item));
584                                 cant = 10;
585                         }
586                 }
587         }
588         fact.items = its;
589         fact.cant_items = cant;
590
591         entrada = procesar_guardar_factura(&fact,lst_facturas, &size);
592         if (entrada) {
593                 error = 0;
594                 id = lst_facturas->fp->grabar_registro(lst_facturas->fp, entrada, size, &error);
595                 /*id_texto = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, 400, &error);*/
596                 /* TODO : -1 == id_texto !!!!!!!! XXX XXX XXX XXX XXX XXX XXX */
597                 agregar_nodo_factura(lst_facturas, crear_nodo_factura(id, -1, fact.numero));
598                 free(entrada);
599         }
600                                                                         
601         if (its) free(its);
602         form_destruir(form);
603
604         werase(win);
605         wrefresh(win);
606         delwin(items);
607         delwin(subnota);
608         delwin(nota);
609         delwin(win);
610 }
611
612 void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, EMUFS_REG_SIZE *size)
613 {
614         char *tmp=NULL;
615         int i[12];
616
617         switch (lst->fp->tipo) {
618                 case T1:
619                 case T2:
620                         /* Calculo el tamaño que voy a necesitar */
621                         i[0] = sizeof(int);
622                         i[1] = sizeof(float);
623                         i[2] = sizeof(int);
624                         i[3] = sizeof(int);
625                         i[4] = sizeof(EMUFS_BLOCK_ID);
626                         i[5] = sizeof(char)*(strlen(f->emision)+1); /* +1 por el \0 para separar */
627                         i[6] = sizeof(char)*(strlen(f->vencimiento)+1); /* +1 por el \0 para separar */
628                         i[7] = sizeof(char)*(strlen(f->estado)+1); /* +1 por el \0 para separar */
629                         i[8] = sizeof(char)*(strlen(f->fp)+1); /* +1 por el \0 para separar */
630                         i[9] = sizeof(char)*(strlen(f->ctacte)+1); /* +1 por el \0 para separar */
631                         i[10] = sizeof(char)*(strlen(f->cheque)+1); /* +1 por el \0 para separar */
632                         i[11] = sizeof(t_Item)*f->cant_items;
633                         (*size) = i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]+i[10]+i[11];
634                         tmp = (char *)malloc(*size);
635                         if (tmp == NULL) return NULL;
636                         memset(tmp, 0, *size);
637                         /* Ahora copio la info */
638                         memcpy(tmp, &f->numero, i[0]);
639                         memcpy(tmp+i[0], &f->procdoi, i[1]);
640                         memcpy(tmp+i[0]+i[1], &f->numero_remito, i[2]);
641                         memcpy(tmp+i[0]+i[1]+i[2], &f->cant_items, i[3]);
642                         memcpy(tmp+i[0]+i[1]+i[2]+i[3], &f->reg_nota, i[4]);
643                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4], f->emision, i[5]);
644                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5], f->vencimiento, i[6]);
645                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6], f->estado, i[7]);
646                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7], f->fp, i[8]);
647                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8], f->ctacte, i[9]);
648                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9], f->cheque, i[10]);
649                         if (i[11] != 0)
650                                 memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]+i[10], f->items, i[11]);
651                 break;
652                 case T3:
653                         (*size) = sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item *) + f->cant_items*sizeof(t_Item);
654                         tmp = (char *)malloc(*size);
655                         if (tmp == NULL) return NULL;
656                         memcpy(tmp, f, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item *));
657                         memcpy(tmp+sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item *), f->items, f->cant_items*sizeof(t_Item));
658         }
659         return tmp;
660 }
661
662 static int procesar_leer_factura(t_Factura *dst, void *src, EMUFS_REG_SIZE size, t_LstFacturas *lst)
663 {
664         char *ini, *fin;
665         int dummy;
666
667         switch (lst->fp->tipo) {
668                 case T1:
669                 case T2:
670                         ini = (char *)src;
671                         /* Copio los campos numericos, muy facil:-) */
672                         memcpy(&dst->numero, ini, sizeof(int));
673                         ini+=sizeof(int);
674                         
675                         memcpy(&dst->procdoi, ini, sizeof(float));
676                         ini+=sizeof(float);
677
678                         memcpy(&dst->numero_remito, ini, sizeof(int));
679                         ini+=sizeof(int);
680                         
681                         memcpy(&dst->cant_items, ini, sizeof(int));
682                         ini+=sizeof(int);
683                         
684                         memcpy(&dst->reg_nota, ini, sizeof(EMUFS_BLOCK_ID));
685                         ini+=sizeof(EMUFS_BLOCK_ID);
686
687                         /* Ahora empieza el juego */
688                         /* Los \0 son los delimitadores de campo! */
689                         fin = ini;
690                         while (*fin!='\0') fin++;
691                         memcpy(dst->emision, ini, fin-ini+1);
692                         
693                         ini = fin+1;
694                         fin = ini;
695                         while (*fin!='\0') fin++;
696                         memcpy(dst->vencimiento, ini, fin-ini+1);
697                         
698                         ini = fin+1;
699                         fin = ini;
700                         while (*fin!='\0') fin++;
701                         memcpy(dst->estado, ini, fin-ini+1);
702                         
703                         ini = fin+1;
704                         fin = ini;
705                         while (*fin!='\0') fin++;
706                         memcpy(dst->fp, ini, fin-ini+1);
707                         
708                         ini = fin+1;
709                         fin = ini;
710                         while (*fin!='\0') fin++;
711                         memcpy(dst->ctacte, ini, fin-ini+1);
712                         
713                         ini = fin+1;
714                         fin = ini;
715                         while (*fin!='\0') fin++;
716                         memcpy(dst->cheque, ini, fin-ini+1);
717
718                         if (dst->cant_items > 0) {
719                                 /* Ahora tengo que cargar los items */
720                                 dst->items = (t_Item *)malloc(sizeof(t_Item)*dst->cant_items);
721
722                                 ini = fin+1;
723                                 fin = (char *)src+size;
724                                 memcpy(dst->items, ini, fin-ini);
725
726                                 dst->nota = lst->fp_texto->leer_registro(lst->fp_texto, dst->reg_nota, (EMUFS_REG_SIZE *)&dummy, &dummy);
727                         } else {
728                                 dst->items = NULL;
729                         }
730
731                         return 0;
732                 case T3:
733                         /* Se que tengo 10 items */
734                         /* TODO : Ver porque leer_registro_tipo3 tira mal el size */
735                         size = lst->fp->tam_reg;
736                         memcpy(dst, src, size-sizeof(t_Item)*10);
737                         dst->items = (t_Item *)malloc(10*sizeof(t_Item));
738                         memcpy(dst->items, src+size-sizeof(t_Item)*10, 10*sizeof(t_Item));
739         }
740         return 0;
741 }
742