4 void separar_string(char *s, int *numero, float *precio)
6 /* Bueno el ' ' y reemplazo por \0 */
10 while ((s[pos] != '\0') && (s[pos] != ' ')) pos++;
17 *precio = atof(s+pos+1);
19 /* Dejo todo como esta! */
23 int main(int argc, char *argv[])
28 int numero, i,j, cant_items, CANT;
34 printf("Modo de uso :\n");
35 printf("\t#> %s salida.xml <cantidad de facturas a generar>\n", argv[0]);
43 if ((fp=fopen(argv[1], "wt")) == NULL) {
44 printf("No se pudo generar archivo de salida.\n");
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.");
53 notas = dict_crear("notas.txt");
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\" ");
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\" ");
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\" ");
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);
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);
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);
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\" ");
100 fprintf(fp, "\t\t<NOTA>%s</NOTA>\n", dict_get_al_azar(notas));
101 /* Veo cuantos items necesita esta factura */
103 cant_items = al_azar(2, 5);
109 cant_items = al_azar(6, 10);
112 cant_items = al_azar(10, 15);
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);
120 fprintf(fp, "\t</FACTURA>\n");
122 fprintf(fp, "\t</FACTURAS>\n");
124 dict_destruir(articulos);
125 dict_destruir(notas);