X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/ecddfc3161e6285cdd95ec7237d1e8e562a594a1..43e1e27b378dcf40321063e8c200894d4f47bb7c:/emufs_gui/articulos.c diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 9ba3f73..4c69770 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -13,16 +13,12 @@ static t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id); static void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArticulos *lst); static int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_LstArticulos *lst); +#ifdef TP_PRIMER_ENTREGA /* Manejo de la lista doble */ static t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num); static int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo); static int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo); -t_LstArticulos *art_get_lst() -{ - return lst_articulos; -} - int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) { if (nodo == NULL) return 0; @@ -68,8 +64,14 @@ int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) } return 1; } +#endif /* TP_PRIMER_ENTREGA */ -t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) +t_LstArticulos *art_get_lst() +{ + return lst_articulos; +} + +t_LstArticulos *art_cargar(t_Parametros *param) { xmlDocPtr document; xmlNode *node, *inicio; @@ -79,16 +81,15 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) t_LstArticulos *tmp; t_Articulo *un_articulo; lst_articulos = NULL; - EMUFS_REG_ID id; tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); if (tmp == NULL) return NULL; lst_articulos = tmp; tmp->primero = NULL; - if (filename != NULL) { + if (param != NULL) { PERR("Voy a crear desde un XML"); - document = xmlReadFile(filename, "ISO-8859-1",0); + document = xmlReadFile(param->xml_art, "ISO-8859-1",0); if (document == NULL) { free(tmp); lst_articulos = NULL; @@ -107,11 +108,8 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) } node = node->next; } -#ifdef DEBUG - fprintf(stderr, "Articulos : Tipo=%d Bloque=%d\n", tipo-1, tam_bloque); -#endif /* Creo el FS */ - tmp->fp = emufs_crear("articulos", tipo-1, tam_bloque, sizeof(t_Articulo)); + tmp->fp = emufs_crear("articulos", param->tipo_arch_art, param->tam_bloque_art, sizeof(t_Articulo)); /* Agrego los indices */ PERR("Voy a agregar un indice"); emufs_agregar_indice(tmp->fp, "presentacion", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, presentacion), 512); @@ -149,8 +147,7 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) save = procesar_guardar_articulo(&art, &size, lst_articulos); if (save != NULL) { error = 0; - id = tmp->fp->grabar_registro(tmp->fp, save, size, &error); - agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); + tmp->fp->grabar_registro(tmp->fp, save, size, &error); free(save); } } @@ -657,9 +654,9 @@ void art_consultas_old(char *s) lista = lista_crear(3, win1, COLS-4, LINES-6); /* Creo las columnas */ - lista_agregar_columna(lista, DATO_INT, 0, 8); - lista_agregar_columna(lista, DATO_STR, 10, 45); - lista_agregar_columna(lista, DATO_FLOAT, 60, 10); + lista_agregar_columna(lista, "Col1", DATO_INT, 0, 8); + lista_agregar_columna(lista, "Col2", DATO_STR, 10, 45); + lista_agregar_columna(lista, "Col3", DATO_FLOAT, 60, 10); /* Agrego unos datos a ver que pasa */ /* Pongo 100 y rezo */ @@ -678,24 +675,19 @@ void art_consultas_old(char *s) delwin(win); } -void art_consultas_codigos(char *s) +void art_consultas_codigos(char *s, t_Lista *lista) { EMUFS_REG_ID dummy; int desde_codigo, hasta_codigo; - int i; + CLAVE k, menor, mayor; t_Articulo *articulo; - t_Lista *lista; t_Form *form; - WINDOW *win, *win1; + INDICE *idx; + + idx = lst_articulos->fp->indices; - win = newwin(LINES-4, COLS-2, 2, 1); - win1 = derwin(win, LINES-6, COLS-4, 1, 1); - werase(win); - box(win, 0, 0); - wrefresh(win); - /* El usuario ingresa rango a listar */ - form = form_crear(win1); + form = form_crear(lista->win); form_agregar_widget(form, INPUT, "Desde Codigo", 8, "0"); form_agregar_widget(form, INPUT, "Hasta Codigo", 8, "99999999"); @@ -705,22 +697,22 @@ void art_consultas_codigos(char *s) hasta_codigo = form_obtener_valor_int(form, "Hasta Codigo"); form_destruir(form); - werase(win1); - wrefresh(win1); - - /* Creo la lista donde mostrar la consulta*/ - /* Muestro solo info relevante */ - lista = lista_crear(4, win1, COLS-4, LINES-6); - - /* Creo las columnas */ - lista_agregar_columna(lista, DATO_INT, 0, 8); /* numero */ - lista_agregar_columna(lista, DATO_STR, 10, 51); /* desc */ - lista_agregar_columna(lista, DATO_STR, 55, 9); /* existencia */ - lista_agregar_columna(lista, DATO_STR, 65, 9); /* enim */ + werase(lista->win); + wrefresh(lista->win); /* Leo los datos desde el archivo */ - for(i=desde_codigo; i<=hasta_codigo; i++) { - articulo = art_obtener(lst_articulos, i, &dummy); + k = emufs_indice_generar_clave_desde_valor(idx, (char *)&desde_codigo); + + menor = idx->obtener_menor_clave(idx); + mayor = idx->obtener_mayor_clave(idx); + + if (k.i_clave < menor.i_clave) + k = menor; + if (k.i_clave > mayor.i_clave) + hasta_codigo = mayor.i_clave; + fprintf(stderr, "k.i_clave = %d -- hasta_codigo = %d\n", k.i_clave, hasta_codigo); + while ((k.i_clave != -1) && (k.i_clave <= hasta_codigo)) { + articulo = art_obtener(lst_articulos, k.i_clave, &dummy); if (articulo != NULL) { lista_agregar_fila(lista, articulo->numero, @@ -728,46 +720,85 @@ void art_consultas_codigos(char *s) articulo->existencia, articulo->emin ); + free(articulo); } + k = idx->obtener_sig_clave(idx, k); + fprintf(stderr, "k.i_clave = %d -- hasta_codigo = %d\n", k.i_clave, hasta_codigo); + } + + curs_set(0); + lista_ejecutar(lista); + curs_set(1); +} + +void art_consultas_stock(char *s, t_Lista *lista) +{ + EMUFS_REG_ID dummy; + int hasta_codigo; + CLAVE k, menor, mayor; + t_Articulo *articulo; + t_Form *form; + INDICE *idx; + float por; + + idx = lst_articulos->fp->indices; + + /* El usuario ingresa rango a listar */ + form = form_crear(lista->win); + form_agregar_widget(form, INPUT, "Ingrese %", 8, "0"); + + form_ejecutar(form, 2, 2); + + por = form_obtener_valor_float(form, "Ingrese %"); + + form_destruir(form); + werase(lista->win); + wrefresh(lista->win); + + menor = idx->obtener_menor_clave(idx); + mayor = idx->obtener_mayor_clave(idx); + + k = menor; + hasta_codigo = mayor.i_clave; + while ((k.i_clave != -1) && (k.i_clave <= hasta_codigo)) { + articulo = art_obtener(lst_articulos, k.i_clave, &dummy); + if (articulo != NULL) { + if (atof(articulo->existencia) <= (1.0f+por)*atof(articulo->emin)) { + lista_agregar_fila(lista, + articulo->numero, + articulo->desc, + articulo->existencia, + articulo->emin + ); + } + free(articulo); + } + k = idx->obtener_sig_clave(idx, k); } curs_set(0); lista_ejecutar(lista); curs_set(1); - - wrefresh(win1); - wrefresh(win); - werase(win1); - werase(win); - wrefresh(win); - delwin(win); } -void art_consultas_varias(char *nombre_indice, char *titulo) +void art_consultas_varias(char *nombre_indice, char *titulo, t_Lista *lista) { int i, cant, error; char *desc, *tmp; t_Articulo articulo; - t_Lista *lista; t_Form *form; INDICE_DATO *datos; - WINDOW *win, *win1; CLAVE k; EMUFS *fs; EMUFS_REG_SIZE size; fs = lst_articulos->fp; - win = newwin(LINES-4, COLS-2, 2, 1); - win1 = derwin(win, LINES-6, COLS-4, 1, 1); - werase(win); - box(win, 0, 0); - wrefresh(win); - /* El usuario ingresa rango a listar */ - form = form_crear(win1); + form = form_crear(lista->win); form_agregar_widget(form, INPUT, titulo, 50, ""); + werase(lista->win); form_ejecutar(form, 2, 2); tmp = form_obtener_valor_char(form, titulo); @@ -775,18 +806,8 @@ void art_consultas_varias(char *nombre_indice, char *titulo) strcpy(desc, tmp); form_destruir(form); - werase(win1); - wrefresh(win1); - - /* Creo la lista donde mostrar la consulta*/ - /* Muestro solo info relevante */ - lista = lista_crear(4, win1, COLS-4, LINES-6); - - /* Creo las columnas */ - lista_agregar_columna(lista, DATO_INT, 0, 8); /* numero */ - lista_agregar_columna(lista, DATO_STR, 10, 51); /* desc */ - lista_agregar_columna(lista, DATO_STR, 55, 9); /* existencia */ - lista_agregar_columna(lista, DATO_STR, 65, 9); /* enim */ + werase(lista->win); + wrefresh(lista->win); /* Leo los datos desde el archivo */ datos = emufs_buscar_registros(fs, nombre_indice, desc, &cant); @@ -812,35 +833,61 @@ void art_consultas_varias(char *nombre_indice, char *titulo) lista_ejecutar(lista); curs_set(1); - wrefresh(win1); - wrefresh(win); - werase(win1); - werase(win); - wrefresh(win); - delwin(win); } void art_consultas(char *s) { + t_Lista *lista; + WINDOW *win1, *win; MENU(mi_menu) { MENU_OPCION("por Codigos", "Consulta de Articulos por rango de codigo."), MENU_OPCION("por Descripcion", "Consulta por descripcion"), MENU_OPCION("por Presentacion", "Consulta por Presentacion"), + MENU_OPCION("por Sock Faltante", "Consulta de articulos por stock"), MENU_OPCION("Volver", "Volver al menu anterior.") }; int opt; - while ((opt = menu_ejecutar(mi_menu, 4, "Consulta de Articulos")) != 3) { + win = newwin(LINES-4, COLS-2, 2, 1); + win1 = derwin(win, LINES-6, COLS-4, 1, 1); + werase(win); + box(win, 0, 0); + wrefresh(win); + + /* Creo la lista donde mostrar la consulta*/ + /* Muestro solo info relevante */ + lista = lista_crear(4, win1, COLS-4, LINES-6); + + /* Creo las columnas */ + lista_agregar_columna(lista, "Numero", DATO_INT, 0, 8); /* numero */ + lista_agregar_columna(lista, "Descripcion", DATO_STR, 10, 51); /* desc */ + lista_agregar_columna(lista, "Existencia", DATO_STR, 55, 9); /* existencia */ + lista_agregar_columna(lista, "S. Minimo", DATO_STR, 66, 9); /* enim */ + + while ((opt = menu_ejecutar(mi_menu, 5, "Consulta de Articulos")) != 4) { switch (opt) { case 0: - art_consultas_codigos(s); + art_consultas_codigos(s, lista); break; case 1: - art_consultas_varias("desc", "Descripcion"); + art_consultas_varias("desc", "Descripcion", lista); break; case 2: - art_consultas_varias("presentacion", "Presentacion"); + art_consultas_varias("presentacion", "Presentacion", lista); + break; + case 3: + art_consultas_stock(s, lista); } + lista_clear(lista); + werase(win1); + werase(win); + wrefresh(win1); + box(win, 0, 0); + wrefresh(win); } + werase(win1); + werase(win); + wrefresh(win); + delwin(win); }