]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/facturas.c
* ver_archivo emite por stderr para poder hacer un pipe desde la GUI
[z.facultad/75.06/emufs.git] / emufs_gui / facturas.c
1
2 #include "facturas.h"
3
4 static t_LstFacturas *lst_facturas;
5 static int al_azar(int min, int max);
6
7 /* Procesa una factura antes de enviarla al archivo para guardarla */
8 static void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size);
9
10 /* es por cada mes a generar */
11 #define CANT_FACTURAS 500
12
13 t_LstFacturas *fact_cargar(const char *filename)
14 {
15         int i, numero, size, error, cant;
16         char *estados[6] = {"PN", "CD", "CM", "CF", "PM", "NC"}; 
17         char *fps[6] = {"CO", "CR", "CH"}; 
18         void *save;
19         t_Factura fact;
20
21         lst_facturas = (t_LstFacturas *)malloc(sizeof(t_LstFacturas));
22
23         if (filename != NULL) {
24                 lst_facturas->fp = emufs_crear("facturas", T3, sizeof(t_Factura)*20+100, sizeof(t_Factura));
25                 /* Genero las facturas en forma automática */
26                 /* Genero las facturas de fecha Abril 2004 */
27                 srand(time(NULL));
28                 numero = 0;
29                 cant = 0;
30                 for(i=0; i<CANT_FACTURAS*0.1; i++) {
31                         /* Entre 10 y 15 ITEMS! */
32                         fact.numero = numero;
33                         sprintf(fact.emision, "200404%02d", al_azar(1, 30));
34                         sprintf(fact.vencimiento, "200406%02d", al_azar(1, 30));
35                         fact.numero_remito = numero; /* QUE PONGO? */
36                         strcpy(fact.estado, estados[al_azar(0, 5)]);
37                         strcpy(fact.fp, fps[al_azar(0, 2)]); /* FIXME : esto y estado se relacionan */
38                         fact.procdoi = 0; /* TODO : relacionar con el estado */
39                         sprintf(fact.ctacte, "%05d", al_azar(11111, 99999));
40                         sprintf(fact.cheque, "%04d-%03d-%05d-%03d", al_azar(1, 9999), al_azar(1,999),al_azar(1,99999),al_azar(1,999));
41                         fact.nota = NULL;
42
43                         /* Guardo */
44                         save = procesar_guardar_factura(&fact, lst_facturas, &size);
45                         if (save != NULL) {
46                                 lst_facturas->array[cant].numero = numero;
47                                 lst_facturas->array[cant].num_reg = lst_facturas->fp->grabar_registro(lst_facturas->fp, save, size, &error);
48                         }
49                 }
50                 lst_facturas->cant = cant;
51         } else {
52                 /* Cargo un archivo existente */
53         }
54
55         return lst_facturas;
56 }
57
58 int fact_liberar(t_LstFacturas *l)
59 {
60         if (l == NULL) l = lst_facturas;
61         if (l == NULL) return 1;
62
63         ver_archivo_FS(l->fp);
64         emufs_destruir(l->fp);
65 /*      free(l->array); */
66         free(l);
67
68         lst_facturas = NULL;
69         return 0;
70 }
71
72 int al_azar(int min, int max)
73 {
74         return (min + rand()%(max-min));
75 }
76
77 void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size)
78 {
79         char *tmp=NULL;
80         int i[9];
81
82         switch (lst->fp->tipo) {
83                 case T1:
84                 case T2:
85                         /* Calculo el tamaño que voy a necesitar */
86                         i[0] = sizeof(int);
87                         i[1] = sizeof(char)*(strlen(f->emision)+1); /* +1 por el \0 para separar */
88                         i[2] = sizeof(char)*(strlen(f->vencimiento)+1); /* +1 por el \0 para separar */
89                         i[3] = sizeof(int);
90                         i[4] = sizeof(char)*(strlen(f->estado)+1); /* +1 por el \0 para separar */
91                         i[5] = sizeof(char)*(strlen(f->fp)+1); /* +1 por el \0 para separar */
92                         i[6] = sizeof(float);
93                         i[7] = sizeof(char)*(strlen(f->ctacte)+1); /* +1 por el \0 para separar */
94                         i[8] = sizeof(char)*(strlen(f->cheque)+1); /* +1 por el \0 para separar */
95                         (*size) = i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8];
96                         tmp = (char *)malloc(*size);
97                         if (tmp == NULL) return NULL;
98                         /* Ahora copio la info */
99                         memcpy(tmp, &f->numero, i[0]);
100                         memcpy(tmp+i[0], f->emision, i[1]);
101                         memcpy(tmp+i[0]+i[1], f->vencimiento, i[2]);
102                         memcpy(tmp+i[0]+i[1]+i[2], &f->numero_remito, i[3]);
103                         memcpy(tmp+i[0]+i[1]+i[2]+i[3], f->estado, i[4]);
104                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4], f->fp, i[5]);
105                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5], &f->procdoi, i[6]);
106                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6], f->ctacte, i[7]);
107                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7], f->cheque, i[8]);
108                 break;
109                 case T3:
110                         tmp = (char *)malloc(sizeof(t_Factura));
111                         if (tmp == NULL) return NULL;
112                         memcpy(tmp, f, sizeof(t_Factura));
113                         (*size) = sizeof(t_Factura);
114         }
115         return tmp;
116 }
117