]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/facturas.c
* Se inicializa bloque en \0's al crear un nuevo bloque en tipo1
[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 static t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num);
10 static int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo);
11 int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo);
12
13 int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo)
14 {
15         if (nodo == NULL) return 0;
16         if (nodo->ant == NULL) {
17                 /* Me piden borrar el primer nodo */
18                 if (nodo->sig) {
19                         nodo->sig->ant = NULL;
20                 }
21                 lst->primero = nodo->sig;
22         } else {
23                 if (nodo->sig) {
24                         nodo->sig->ant = nodo->ant;
25                 }
26                 nodo->ant->sig = nodo->sig;
27         }
28         free(nodo);
29         return 1;
30 }
31
32 t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num)
33 {
34         t_Reg_Factura *tmp;
35         if (reg == EMUFS_NOT_FOUND) return NULL;
36         tmp = malloc(sizeof(t_Reg_Factura));
37         if (tmp == NULL) return NULL;
38         tmp->sig = tmp->ant = NULL;
39         tmp->num_reg = reg;
40         tmp->texto_reg = texto;
41         tmp->numero = num;
42
43         return tmp;
44 }
45
46 int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo)
47 {
48         if (nodo == NULL) return 0;
49
50         if (lst->primero) {
51                 lst->primero->ant = nodo;
52                 nodo->sig = lst->primero;
53                 lst->primero = nodo;
54         } else {
55                 lst->primero = nodo;
56         }
57         return 1;
58 }
59
60 /* es por cada mes a generar */
61 #define CANT_FACTURAS 1500
62
63 t_LstFacturas *fact_cargar(const char *filename)
64 {
65         int i, numero, size, error = 0, cant;
66         char *estados[6] = {"PN", "CD", "CM", "CF", "PM", "NC"}; 
67         char *fps[6] = {"CO", "CR", "CH"}; 
68         void *save;
69         t_Factura fact;
70         EMUFS_REG_ID id;
71
72         lst_facturas = (t_LstFacturas *)malloc(sizeof(t_LstFacturas));
73         lst_facturas->primero = NULL;
74
75         if (filename != NULL) {
76                 lst_facturas->fp = emufs_crear("facturas", T3, sizeof(t_Factura)*20, sizeof(t_Factura));
77                 /* Genero las facturas en forma automática */
78                 /* Genero las facturas de fecha Abril 2004 */
79                 srand(time(NULL));
80                 numero = 0;
81                 cant = 0;
82                 for(i=0; i<CANT_FACTURAS; i++) {
83                         /* Entre 10 y 15 ITEMS! */
84                         fact.numero = numero;
85                         sprintf(fact.emision, "200404%02d", al_azar(1, 30));
86                         sprintf(fact.vencimiento, "200406%02d", al_azar(1, 30));
87                         fact.numero_remito = numero; /* QUE PONGO? */
88                         strcpy(fact.estado, estados[al_azar(0, 5)]);
89                         strcpy(fact.fp, fps[al_azar(0, 2)]); /* FIXME : esto y estado se relacionan */
90                         fact.procdoi = 0; /* TODO : relacionar con el estado */
91                         sprintf(fact.ctacte, "%05d", al_azar(11111, 99999));
92                         sprintf(fact.cheque, "%04d-%03d-%05d-%03d", al_azar(1, 9999), al_azar(1,999),al_azar(1,99999),al_azar(1,999));
93                         fact.nota = NULL;
94
95                         /* Guardo */
96                         save = procesar_guardar_factura(&fact, lst_facturas, &size);
97                         if (save != NULL) {
98                                 id = lst_facturas->fp->grabar_registro(lst_facturas->fp, save, size, &error);
99                                 agregar_nodo_factura(lst_facturas, crear_nodo_factura(id, EMUFS_NOT_FOUND, numero));
100                                 free(save);
101                         }
102                 }
103         } else {
104                 /* Cargo un archivo existente */
105         }
106
107         return lst_facturas;
108 }
109
110 int fact_liberar(t_LstFacturas *l)
111 {
112         if (l == NULL) l = lst_facturas;
113         if (l == NULL) return 1;
114
115         emufs_destruir(l->fp);
116         free(l);
117
118         lst_facturas = NULL;
119         return 0;
120 }
121
122 int al_azar(int min, int max)
123 {
124         return (min + rand()%(max-min));
125 }
126
127 void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size)
128 {
129         char *tmp=NULL;
130         int i[9];
131
132         switch (lst->fp->tipo) {
133                 case T1:
134                 case T2:
135                         /* Calculo el tamaño que voy a necesitar */
136                         i[0] = sizeof(int);
137                         i[1] = sizeof(char)*(strlen(f->emision)+1); /* +1 por el \0 para separar */
138                         i[2] = sizeof(char)*(strlen(f->vencimiento)+1); /* +1 por el \0 para separar */
139                         i[3] = sizeof(int);
140                         i[4] = sizeof(char)*(strlen(f->estado)+1); /* +1 por el \0 para separar */
141                         i[5] = sizeof(char)*(strlen(f->fp)+1); /* +1 por el \0 para separar */
142                         i[6] = sizeof(float);
143                         i[7] = sizeof(char)*(strlen(f->ctacte)+1); /* +1 por el \0 para separar */
144                         i[8] = sizeof(char)*(strlen(f->cheque)+1); /* +1 por el \0 para separar */
145                         (*size) = i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8];
146                         tmp = (char *)malloc(*size);
147                         if (tmp == NULL) return NULL;
148                         /* Ahora copio la info */
149                         memcpy(tmp, &f->numero, i[0]);
150                         memcpy(tmp+i[0], f->emision, i[1]);
151                         memcpy(tmp+i[0]+i[1], f->vencimiento, i[2]);
152                         memcpy(tmp+i[0]+i[1]+i[2], &f->numero_remito, i[3]);
153                         memcpy(tmp+i[0]+i[1]+i[2]+i[3], f->estado, i[4]);
154                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4], f->fp, i[5]);
155                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5], &f->procdoi, i[6]);
156                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6], f->ctacte, i[7]);
157                         memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7], f->cheque, i[8]);
158                 break;
159                 case T3:
160                         tmp = (char *)malloc(sizeof(t_Factura));
161                         if (tmp == NULL) return NULL;
162                         memcpy(tmp, f, sizeof(t_Factura));
163                         (*size) = sizeof(t_Factura);
164         }
165         return tmp;
166 }
167