X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/46453eaa7a7cbd8a43d9bbebda683814b13a832c..eed96fb1757f582ff36f711145eb009e484ea198:/emufs_gui/facturas.c?ds=sidebyside diff --git a/emufs_gui/facturas.c b/emufs_gui/facturas.c index 68ffe06..1e77446 100644 --- a/emufs_gui/facturas.c +++ b/emufs_gui/facturas.c @@ -2,56 +2,219 @@ #include "facturas.h" static t_LstFacturas *lst_facturas; -static int al_azar(int min, int max); /* Procesa una factura antes de enviarla al archivo para guardarla */ -static void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size); +static void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, EMUFS_REG_SIZE *size); +static t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num); +static int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo); +int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo); +static t_Item *leer_items(xmlNode *, int *cant, int size); +static char *leer_nota(xmlNode *); -/* es por cada mes a generar */ -#define CANT_FACTURAS 1500 +/* Hack! ... Si no existe propiedad retorna "" */ +char *xml_get_prop(xmlNode *node, char *nombre) +{ + if (xmlGetProp(node, nombre) == NULL) return ""; + return xmlGetProp(node, nombre); +} + +int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo) +{ + if (nodo == NULL) return 0; + if (nodo->ant == NULL) { + /* Me piden borrar el primer nodo */ + if (nodo->sig) { + nodo->sig->ant = NULL; + } + lst->primero = nodo->sig; + } else { + if (nodo->sig) { + nodo->sig->ant = nodo->ant; + } + nodo->ant->sig = nodo->sig; + } + free(nodo); + return 1; +} -t_LstFacturas *fact_cargar(const char *filename) +t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num) { - int i, numero, size, error, cant; - char *estados[6] = {"PN", "CD", "CM", "CF", "PM", "NC"}; - char *fps[6] = {"CO", "CR", "CH"}; - void *save; - t_Factura fact; + t_Reg_Factura *tmp; + if (reg == EMUFS_NOT_FOUND) return NULL; + tmp = malloc(sizeof(t_Reg_Factura)); + if (tmp == NULL) return NULL; + tmp->sig = tmp->ant = NULL; + tmp->num_reg = reg; + tmp->texto_reg = texto; + tmp->numero = num; - lst_facturas = (t_LstFacturas *)malloc(sizeof(t_LstFacturas)); + return tmp; +} - if (filename != NULL) { - lst_facturas->fp = emufs_crear("facturas", T3, sizeof(t_Factura)*20, sizeof(t_Factura)); - /* Genero las facturas en forma automática */ - /* Genero las facturas de fecha Abril 2004 */ - srand(time(NULL)); - numero = 0; - cant = 0; - for(i=0; iarray[cant].numero = numero; - lst_facturas->array[cant].num_reg = lst_facturas->fp->grabar_registro(lst_facturas->fp, save, size, &error); +int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo) +{ + if (nodo == NULL) return 0; + + if (lst->primero) { + lst->primero->ant = nodo; + nodo->sig = lst->primero; + lst->primero = nodo; + } else { + lst->primero = nodo; + } + return 1; +} + +t_Item *leer_items(xmlNode *node, int *cant, int size) +{ + t_Item *tmp; + int count; + if (size == -1) { + *cant = 0; + return NULL; + } else { + (*cant) = size; + tmp = (t_Item *)malloc(sizeof(t_Item)*size); + memset(tmp, '$', sizeof(t_Item)*size); + + count = 0; + node = node->children; + while (node) { + if (node->type == XML_ELEMENT_NODE) { + if (strcmp(node->name, "ITEMVENTA") == 0) { + tmp[count].numero = atoi(xml_get_prop(node, "NroArtículo")); + strcpy(tmp[count].cv, xml_get_prop(node, "CV")); + strcpy(tmp[count].pvu, xml_get_prop(node, "PVU")); + count++; + } + } + node = node->next; + } + } + return tmp; +} + +char *leer_nota(xmlNode *node) +{ + xmlNode *tmp; + char *salida; + tmp = node->children; + while (tmp) { + if (tmp->type == XML_ELEMENT_NODE) { + if (strcmp(tmp->name, "NOTA") == 0) { + break; } } - lst_facturas->cant = cant; + tmp = tmp->next; + } + + if (tmp) { + salida = (char *)malloc(sizeof(char)*400); /*(strlen(XML_GET_CONTENT(tmp->children))+1));*/ + strcpy(salida, XML_GET_CONTENT(tmp->children)); } else { - /* Cargo un archivo existente */ + salida = (char *)malloc(sizeof(char)*400); + salida[0] = '\0'; } + return salida; +} + + +t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque) +{ + xmlDocPtr document; + xmlNode *node, *inicio; + int error = 0, cant_items; + EMUFS_REG_SIZE size; + t_LstFacturas *tmp; + EMUFS_REG_ID id, id_texto; /*, *indices, indices_cant;*/ + + lst_facturas = NULL; + + tmp = (t_LstFacturas *)malloc(sizeof(t_LstFacturas)); + if (tmp == NULL) return NULL; + lst_facturas = tmp; + tmp->primero = NULL; + if (filename != NULL) { + document = xmlReadFile(filename, "ISO-8859-1",0); + if (document == NULL) { + fprintf(stderr, "ERROR ABRIENDO %s\n", filename); + return NULL; + } + + inicio = NULL; + node = xmlDocGetRootElement(document); + /* Busco el TAG principal "ARTICULOS" */ + while (node) { + if (node->type == XML_ELEMENT_NODE) { + if (strcmp(node->name, "FACTURAS") == 0) { + inicio = node->children; + break; + } + } + node = node->next; + } + + /* En el registro no guardo los punteros de nota ni items. Si guardo la cantidad de items + * y los items al final del registro. + */ + if (tipo == 3) { + /* Limito a 10 items en el caso de registro constante! */ + cant_items = 10; + } else { + cant_items = 0; + } + tmp->fp = emufs_crear("facturas", tipo-1, tam_bloque, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item)); + tmp->fp_texto = emufs_crear("notas", 1, 420, 400); + for (node=inicio ; node ; node = node->next) { + if (node->type == XML_ELEMENT_NODE) { + if (strcmp(node->name, "FACTURA") == 0) { + t_Factura fact; + void *save; + memset(&fact, '*', sizeof(t_Factura)); + fact.numero = atoi(xml_get_prop(node, "NroFac")); + fact.procdoi = atoi(xml_get_prop(node, "porcDoI")); + fact.numero_remito = atoi(xml_get_prop(node, "NroRemito")); + strcpy(fact.emision, xml_get_prop(node, "FechaEmisión")); + strcpy(fact.vencimiento, xml_get_prop(node, "FechaVto")); + strcpy(fact.estado, xml_get_prop(node, "Estado")); + strcpy(fact.fp, xml_get_prop(node, "FP")); + strcpy(fact.ctacte, xml_get_prop(node, "NroCtaCte")); + strcpy(fact.cheque, xml_get_prop(node, "NroCheque")); + + fact.nota = leer_nota(node); + fact.items = leer_items(node, &fact.cant_items, (tipo==3)?10:-1); + + save = procesar_guardar_factura(&fact, lst_facturas, &size); + if (save != NULL) { + id = tmp->fp->grabar_registro(tmp->fp, save, size, &error); + fprintf(stderr, "Voy a grabar el texto [%d]\n", strlen(fact.nota)); + id_texto = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, 400, &error); + fprintf(stderr, "Todo ok : ID=%lu , txtID=%lu\n", id, id_texto); + agregar_nodo_factura(tmp, crear_nodo_factura(id, id_texto, fact.numero)); + free(save); + } + } + } + } + xmlFreeDoc(document); + xmlCleanupParser(); + } else { +/* tmp->fp = emufs_abrir("articulos");*/ + /* Ahora trato de recuperar la info */ +/* indices = emufs_idx_get(tmp->fp, &indices_cant); + for(i=0; ifp->leer_registro(tmp->fp, indices[i], &size, &error); + if (procesar_leer_articulo(&art, save, size, tmp) == 1) { + agregar_nodo_articulo(tmp, crear_nodo_articulo(indices[i], art.numero)); + free(save); + } + } + free(indices);*/ + } return lst_facturas; } @@ -60,21 +223,15 @@ int fact_liberar(t_LstFacturas *l) if (l == NULL) l = lst_facturas; if (l == NULL) return 1; - ver_archivo_FS(l->fp); emufs_destruir(l->fp); -/* free(l->array); */ free(l); lst_facturas = NULL; return 0; } -int al_azar(int min, int max) -{ - return (min + rand()%(max-min)); -} -void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size) +void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, EMUFS_REG_SIZE *size) { char *tmp=NULL; int i[9]; @@ -107,10 +264,11 @@ void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size) memcpy(tmp+i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7], f->cheque, i[8]); break; case T3: - tmp = (char *)malloc(sizeof(t_Factura)); + (*size) = sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item *) + f->cant_items*sizeof(t_Item); + tmp = (char *)malloc(*size); if (tmp == NULL) return NULL; - memcpy(tmp, f, sizeof(t_Factura)); - (*size) = sizeof(t_Factura); + memcpy(tmp, f, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item *)); + memcpy(tmp+sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item *), f->items, f->cant_items*sizeof(t_Item)); } return tmp; }