10 #include "articulos.h"
13 #include "registros.h"
17 static void finish(int sig);
20 void menu_articulos();
22 void menu_mantenimiento();
23 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg);
25 /* cuadro de msg. w y h son de la ventana padre */
26 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
27 void msg_box_free(WINDOW *padre, WINDOW *win);
29 typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO, BLOQUE_NO_DEFINIDO} t_Param;
31 /* Verifica Argumentos */
32 t_Param param_ok(int argc, char *argv[])
35 for(i=1; i<argc; i++) {
36 if ((strcmp(argv[i], "-h")==0) || (strcmp(argv[i], "--help")==0)) return SHOW_HELP;
38 if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) {
39 /* Luego del archivo XML debe seguir el tipo */
42 if ((n < 1) || (n > 3)) return TIPO_INVALIDO;
43 if (((n == 1) || (n == 3)) && ((i+2)>=argc))
44 return BLOQUE_NO_DEFINIDO;
46 /* Ops, no hay mas parametros */
47 return TIPO_NO_DEFINIDO;
55 void print_help(char *s)
57 printf("EMUFS - 1v0\n");
58 printf("Modo de uso : %s [<archivo articulos XML> tipo=[1|2|3]]\n", s);
59 printf("\nSi especifica un archivo XML desde donde cargar los articulos debera tambien especificar el tipo");
60 printf(" de archivo a crear, siendo 1, 2, 3\n");
63 int main(int argc, char *argv[])
68 switch (param_ok(argc, argv)) {
72 case TIPO_NO_DEFINIDO:
73 printf("Falta parámetro requerido.\nLuego del nombre del archivo debe especificar el tipo de archivo\n");
75 case BLOQUE_NO_DEFINIDO:
76 printf("Falta parámetro requerido.\nLuego del tipo de archivo debe especificar el tamaño del bloque a utilizar\n");
79 printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n");
80 printf("\t1 - Archivo de bloque parametrizado y registro de long. variable.\n");
81 printf("\t2 - Archivo de registros variables sin bloques.\n");
82 printf("\t3 - Archivos de bloque parametrizado y registro de long. parametrizada.\n");
89 printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). ");
90 printf("Esto puede causar que ante un error alguna función trate de emitir un mensaje por pantalla ");
91 printf("haciendo que el aspecto visual se vea desvirtuado.\n\n");
92 printf("Todos los mensajes de error se envian por stderr, por lo que es conveniente que vuelva a ejecutar ");
93 printf("el programa de la siguiente manera :\n");
94 printf("\t#> %s <parametros> 2> error.log\n\n", argv[0]);
95 printf("De esta forma el SO se encargaga de redirigir stderr al archivo error.log y evitar algun problema en ");
96 printf("visualizacion de la aplicacion.\n");
97 printf("Para continuar **bajo su propio riesgo** presione una tecla. Puede cancelar la ejecucion en este punto con CTRL+C\n");
102 signal(SIGINT, finish);
104 keypad(stdscr, TRUE);
108 /* Si se soporta color, los inicializo */
111 /* Simple color assignment, often all we need. */
112 init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); /* COLOR_PAIR(1) */
113 init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
114 init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
115 init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
116 init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
117 init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
118 init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
119 init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
122 /* Verifico un tamaño minimo de consola */
123 if ((LINES < 25) || (COLS < 80)) {
125 printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
129 /* Ventana, caracter para linea vertical, caracter para linea horizontal*/
130 box(stdscr, ACS_VLINE, ACS_HLINE);
131 /* Ventana, Y, X, Texto */
132 mvwaddstr(stdscr, 1, 1, "EMUFS");
133 attron(COLOR_PAIR(2));
134 mvwaddstr(stdscr, LINES-2, 1, "EMUFS (c) The EMUFS Team - Bajo Licencia GNU/GPL");
135 attroff(COLOR_PAIR(2));
138 dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
140 art_cargar(argv[1], atoi(argv[2]), atoi(argv[3]));
141 if (!fact_cargar("facturas.xml", 1, 400))
142 fprintf(stderr, "ERROR CARGANDO FACTURAS\n");
144 art_cargar(NULL, -1, -1);
146 msg_box_free(stdscr, dialog);
148 /* CICLO PRINCIPAL DE LA APLICACION */
149 while ((c = main_menu()) != -1) {
158 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
159 ver_registros(dialog, COLS-2, LINES-4);
166 menu_mantenimiento();
196 items = (ITEM **)calloc(5, sizeof(ITEM *));
198 items[0] = new_item(opciones[0], "Crear una nueva factura.");
199 set_item_userptr(items[0], fact_agregar);
200 items[1] = new_item(opciones[1], "Eliminar una factura existente.");
201 set_item_userptr(items[1], fact_eliminar);
202 items[2] = new_item(opciones[2], "Modificar una factura existente.");
203 set_item_userptr(items[2], fact_modificar);
204 items[3] = new_item(opciones[3], "Volver al menu anterior.");
207 menu = new_menu((ITEM **)items);
208 menu_win = newwin(8, COLS-2, 3, 1);
209 keypad(menu_win, TRUE);
210 set_menu_mark(menu, " > ");
211 set_menu_win(menu, menu_win);
212 set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
215 mvwaddch(menu_win, 2, 0, ACS_LTEE);
216 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
217 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
218 wattron(menu_win, COLOR_PAIR(COLOR_RED));
219 mvwaddstr(menu_win, 1, 1, "Menu Facturas");
220 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
226 while((!salir) && (c = getch()) != KEY_F(3)) {
229 menu_driver(menu, REQ_DOWN_ITEM);
232 menu_driver(menu, REQ_UP_ITEM);
239 cur = current_item(menu);
240 if (strcmp(item_name(cur), opciones[3]) == 0) {
243 p = item_userptr(cur);
246 p(NULL); /* Paso NULL para que ejecute la accion por defecto */
249 mvwaddch(menu_win, 2, 0, ACS_LTEE);
250 mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
251 mvwaddch(menu_win, 2, 67, ACS_RTEE);
254 pos_menu_cursor(menu);
270 void menu_articulos()
283 items = (ITEM **)calloc(5, sizeof(ITEM *));
285 items[0] = new_item(opciones[0], "Crear un nuevo articulo.");
286 set_item_userptr(items[0], art_agregar);
287 items[1] = new_item(opciones[1], "Eliminar un articulo existente.");
288 set_item_userptr(items[1], art_eliminar);
289 items[2] = new_item(opciones[2], "Modificar un articulo existente.");
290 set_item_userptr(items[2], art_modificar);
291 items[3] = new_item(opciones[3], "Volver al menu anterior.");
294 menu = new_menu((ITEM **)items);
295 menu_win = newwin(8, COLS-2, 3, 1);
296 keypad(menu_win, TRUE);
297 set_menu_mark(menu, " > ");
298 set_menu_win(menu, menu_win);
299 set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
302 mvwaddch(menu_win, 2, 0, ACS_LTEE);
303 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
304 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
305 wattron(menu_win, COLOR_PAIR(COLOR_RED));
306 mvwaddstr(menu_win, 1, 1, "Menu Articulos");
307 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
313 while((!salir) && (c = getch()) != KEY_F(3)) {
316 menu_driver(menu, REQ_DOWN_ITEM);
319 menu_driver(menu, REQ_UP_ITEM);
326 cur = current_item(menu);
327 if (strcmp(item_name(cur), opciones[3]) == 0) {
330 p = item_userptr(cur);
333 p(NULL); /* Paso NULL para que ejecute la accion por defecto */
336 mvwaddch(menu_win, 2, 0, ACS_LTEE);
337 mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
338 mvwaddch(menu_win, 2, 67, ACS_RTEE);
341 pos_menu_cursor(menu);
363 int c, salir, opcion;
374 items = (ITEM **)calloc(8, sizeof(ITEM *));
376 items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
377 items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
378 items[2] = new_item(opciones[2], "Ver registros de un archivo.");
379 items[3] = new_item(opciones[3], "Ver bloques de un archivo.");
380 items[4] = new_item(opciones[4], "Ver estadisticas de ocupacion de archivos.");
381 items[5] = new_item(opciones[5], "Tareas de mantenimiento de los archivos.");
382 items[6] = new_item(opciones[6], "Salir del sistema.");
385 menu = new_menu((ITEM **)items);
386 menu_win = newwin(14, COLS-2, 3, 1);
387 keypad(menu_win, TRUE);
388 set_menu_mark(menu, " > ");
389 set_menu_win(menu, menu_win);
390 set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
393 mvwaddch(menu_win, 2, 0, ACS_LTEE);
394 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
395 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
396 wattron(menu_win, COLOR_PAIR(COLOR_RED));
397 mvwaddstr(menu_win, 1, 1, "Menu Principal");
398 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
405 while((!salir) && (c = getch())) {
408 menu_driver(menu, REQ_DOWN_ITEM);
411 menu_driver(menu, REQ_UP_ITEM);
419 cur = current_item(menu);
421 if (strcmp(item_name(cur), opciones[i]) == 0)
424 pos_menu_cursor(menu);
450 static void finish(int sig)
454 /* do your non-curses wrapup here */
458 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
464 va_start(ap, format);
465 vsprintf(txt, format, ap);
470 dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
472 mvwaddstr(dialog, 1, 1, txt);
478 void msg_box_free(WINDOW *padre, WINDOW *win)
487 void menu_mantenimiento()
489 WINDOW *menu_win, *dlg;
492 int c, salir, nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro;
494 "Compactar Articulos",
495 "Compactar Facturas",
497 "Cambiar tipo Archivo Articulos",
498 "Cambiar tipo Archivo Facturas",
499 "Cambiar tipo Archivo Notas",
503 items = (ITEM **)calloc(8, sizeof(ITEM *));
505 items[0] = new_item(opciones[0], "Elimina espacio no utilizado.");
506 items[1] = new_item(opciones[1], "Elimina espacio no utilizado.");
507 items[2] = new_item(opciones[2], "Elimina espacio no utilizado.");
508 items[3] = new_item(opciones[3], "Permite cambiar el tipo del archivo.");
509 items[4] = new_item(opciones[4], "Permite cambiar el tipo del archivo.");
510 items[5] = new_item(opciones[5], "Permite cambiar el tipo del archivo.");
511 items[6] = new_item(opciones[6], "Volver al menu anterior.");
514 menu = new_menu((ITEM **)items);
515 menu_win = newwin(12, COLS-2, 3, 1);
516 keypad(menu_win, TRUE);
517 set_menu_mark(menu, " > ");
518 set_menu_win(menu, menu_win);
519 set_menu_sub(menu, derwin(menu_win, 8, COLS-4, 3, 1));
522 mvwaddch(menu_win, 2, 0, ACS_LTEE);
523 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
524 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
525 wattron(menu_win, COLOR_PAIR(COLOR_RED));
526 mvwaddstr(menu_win, 1, 1, "Menu Mantenimiento");
527 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
533 while((!salir) && (c = getch()) != KEY_F(3)) {
536 menu_driver(menu, REQ_DOWN_ITEM);
539 menu_driver(menu, REQ_UP_ITEM);
546 cur = current_item(menu);
547 if (strcmp(item_name(cur), opciones[6]) == 0) {
550 if (strcmp(item_name(cur), opciones[0]) == 0) {
551 art_get_lst()->fp->compactar(art_get_lst()->fp);
553 if (strcmp(item_name(cur), opciones[1]) == 0) {
554 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
556 if (strcmp(item_name(cur), opciones[2]) == 0) {
557 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
559 if (strcmp(item_name(cur), opciones[3]) == 0) {
561 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
562 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
563 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
564 art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
565 msg_box_free(stdscr, dlg);
569 if (strcmp(item_name(cur), opciones[4]) == 0) {
571 nuevo_tam_registro = 0;
572 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
576 if (strcmp(item_name(cur), opciones[5]) == 0) {
578 nuevo_tam_registro = -2;
579 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
601 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
608 win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
611 form = form_crear(win);
612 form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
613 form_ejecutar(form, 1,1);
615 s = form_obtener_valor_char(form, "Tipo de archivo");
616 if (strcmp(s, "T1") == 0) n = T1;
617 if (strcmp(s, "T2") == 0) n = T2;
618 if (strcmp(s, "T3") == 0) n = T3;
629 form = form_crear(win);
630 form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
633 form_set_valor(form, "Tamaño de bloque", "");
634 form_ejecutar(form, 1,1);
635 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
637 (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
643 if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
644 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
645 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
647 form = form_crear(win);
648 form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
649 if ((*tam_reg) != -1)
650 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
653 form_set_valor(form, "Tamaño de bloque", "");
654 if ((*tam_reg) != -1)
655 form_set_valor(form, "Tamaño de registro", "");
656 form_ejecutar(form, 1,1);
657 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
658 if ((*tam_reg) != -1) {
659 if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
662 (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
663 if ((*tam_reg) != -1)
664 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");