]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/generar_archivos/genera_fact.c
* BUGFIX : En emufs_destruir habia un bug donde eliminaba mal y se colgaba
[z.facultad/75.06/emufs.git] / emufs_gui / generar_archivos / genera_fact.c
1
2 #include "dict.h"
3
4 void separar_string(char *s, int *numero, float *precio)
5 {
6         /* Bueno el ' ' y reemplazo por \0 */
7         int pos, len;
8         len = strlen(s);
9         pos = 0;
10         while ((s[pos] != '\0') && (s[pos] != ' ')) pos++;
11         if (pos == len) {
12                 *numero = 0;
13                 *precio = 0.0f;
14         }
15         s[pos] = '\0';
16         *numero = atoi(s);
17         *precio = atof(s+pos+1);
18
19         /* Dejo todo como esta! */
20         s[pos] = ' ';
21 }
22
23 int main(int argc, char *argv[])
24 {
25         t_Dict *articulos;
26         t_Dict *notas;
27         FILE *fp;
28         int numero, i,j, cant_items, CANT;
29         float precio;
30         int co, cr, ch;
31         char *s;
32
33         if (argc != 3) {
34                 printf("Modo de uso :\n");
35                 printf("\t#> %s salida.xml <cantidad de facturas a generar>\n", argv[0]);
36                 return 1;
37         }
38
39         CANT = atoi(argv[2]);
40
41         co = cr = ch = 0;
42
43         if ((fp=fopen(argv[1], "wt")) == NULL) {
44                 printf("No se pudo generar archivo de salida.\n");
45                 return 1;
46         }
47
48         articulos = dict_crear("articulos.txt");
49         if (articulos == NULL) {
50                 printf("No se encontro registro de articulos (articulos.txt). Es posible que deba correr generar_art primero.");
51                 return 1;
52         }
53         notas = dict_crear("notas.txt");
54         
55         fprintf(fp, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n");
56         fprintf(fp, "<FACTURAS>\n");
57         for(i=0; i<CANT; i++) {
58                 fprintf(fp, "\t<FACTURA NroFac=\"%d\" ", i);
59                 fprintf(fp, "FechaEmisión=\"2004%02d%02d\" ", (i<(CANT/2))?4:5, al_azar(1, 30));
60                 fprintf(fp, "FechaVto=\"2004%02d%02d\" ", (i<(CANT/2))?4:5+al_azar(1,3), al_azar(1, 30));
61                 fprintf(fp, "NroRemito=\"%02d\" ", al_azar(1, 99999999));
62                 /* Genero la info importante */
63                 /* Selecciono la forma de Pago (FP) */
64                 if (i < CANT*0.3) { /* FP = "CH" */
65                         fprintf(fp, " FP=\"CH\" ");
66                         ch++;
67                         if (ch <= CANT*0.3*0.2) {
68                                 fprintf(fp, " Estado=\"SF\" ");
69                         } else if (ch <= CANT*0.3*0.5) {
70                                 fprintf(fp, " Estado=\"NC\" ");
71                         } else if (ch <= CANT*0.3) {
72                                 fprintf(fp, " Estado=\"PN\" ");
73                         }
74                         fprintf(fp, "NroCheque=\"%04d-%03d-%05d-%03d\" ", al_azar(1, 9999), al_azar(1, 999), al_azar(1, 99999), al_azar(1, 999));
75                 } else  if (i < CANT*0.6) { /* FP = "CR" */
76                         fprintf(fp, " FP=\"CR\" ");
77                         cr++;
78                         if (cr <= CANT*0.3*0.08) { /* Hasta el 8 % */
79                                 fprintf(fp, " Estado=\"CM\" ");
80                                 if (al_azar(0, 6) > 3) { /* Decido si uso CR */
81                                         fprintf(fp, " PorcDoI=\"%2.2f\" ", al_azar(25, 125)/5.0f);
82                                 }
83                         } else if (cr <= CANT*0.3*0.4) { /* Desde 8 a 40 = 32% */
84                                 fprintf(fp, " Estado=\"CD\" ");
85                                 if (al_azar(0, 6) > 3) { /* Decido si uso CR */
86                                         fprintf(fp, " PorcDoI=\"%2.2f\" ", al_azar(25, 125)/5.0f);
87                                 }
88                         } else if (cr <= CANT*0.3) { /* Desde 40 a 100 = 60% */
89                                 fprintf(fp, " Estado=\"PN\" ");
90                                 if (al_azar(0, 6) > 3) { /* Decido si uso CR */
91                                         fprintf(fp, " PorcDoI=\"%2.2f\" ", -1.0f*al_azar(25, 125)/5.0f);
92                                 }
93                         }
94                         fprintf(fp, "NroCtaCte=\"%d\" ", al_azar(111111, 99999));
95                 } else  if (i < CANT) { /* FP = "CO" */
96                         /* Pago contado simpre tiene 5% de descuento */
97                         fprintf(fp, " FP=\"CO\" Estado=\"PN\" PorcDoI=\"-5.0\" ");
98                 }
99                 fprintf(fp, ">\n");
100                 fprintf(fp, "\t\t<NOTA>%s</NOTA>\n", dict_get_al_azar(notas));
101                 /* Veo cuantos items necesita esta factura */
102                 if (i < CANT) {
103                         cant_items = al_azar(2, 5);
104                 }
105                 if (i < CANT*0.6) {
106                         cant_items = 1;
107                 }
108                 if (i < CANT*0.3) {
109                         cant_items = al_azar(6, 10);
110                 }
111                 if (i < CANT*0.1) {
112                         cant_items = al_azar(10, 15);
113                 }
114                 for(j=0; j<cant_items; j++) {
115                         /* Obtengo un articulo al azar */
116                         s = dict_get_al_azar(articulos);
117                         separar_string(s, &numero, &precio);
118                         fprintf(fp, "\t\t<ITEMVENTA NroArtículo=\"%d\" CV=\"%d\" PVU=\"%.2f\" />\n", numero, al_azar(1, 10), precio);
119                 }
120                 fprintf(fp, "\t</FACTURA>\n");
121         }
122         fprintf(fp, "\t</FACTURAS>\n");
123
124         dict_destruir(articulos);
125         dict_destruir(notas);
126         return 0;
127 }
128