From eed96fb1757f582ff36f711145eb009e484ea198 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Thu, 15 Apr 2004 20:26:15 +0000 Subject: [PATCH] * Hago carga de facturas desde XML, con carga de Notas e Items ... (faltan detalles) Las notas se graban en notas.* --- emufs_gui/facturas.c | 204 +++++++++++++++++++++++++++++++++---------- emufs_gui/facturas.h | 19 +++- emufs_gui/gui.c | 3 +- 3 files changed, 174 insertions(+), 52 deletions(-) diff --git a/emufs_gui/facturas.c b/emufs_gui/facturas.c index 0016c9f..1e77446 100644 --- a/emufs_gui/facturas.c +++ b/emufs_gui/facturas.c @@ -2,13 +2,21 @@ #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 *); + +/* 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) { @@ -57,53 +65,156 @@ int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo) return 1; } -/* es por cada mes a generar */ -#define CANT_FACTURAS 1500 +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; +} -t_LstFacturas *fact_cargar(const char *filename) +char *leer_nota(xmlNode *node) { - int i, numero, size, error = 0, cant; - char *estados[6] = {"PN", "CD", "CM", "CF", "PM", "NC"}; - char *fps[6] = {"CO", "CR", "CH"}; - void *save; - t_Factura fact; - EMUFS_REG_ID id; + xmlNode *tmp; + char *salida; + tmp = node->children; + while (tmp) { + if (tmp->type == XML_ELEMENT_NODE) { + if (strcmp(tmp->name, "NOTA") == 0) { + break; + } + } + 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 { + salida = (char *)malloc(sizeof(char)*400); + salida[0] = '\0'; + } + return salida; +} - lst_facturas = (t_LstFacturas *)malloc(sizeof(t_LstFacturas)); - lst_facturas->primero = NULL; + +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) { - 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; ifp->grabar_registro(lst_facturas->fp, save, size, &error); - agregar_nodo_factura(lst_facturas, crear_nodo_factura(id, EMUFS_NOT_FOUND, numero)); - free(save); + 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 { - /* Cargo un archivo existente */ +/* 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; } @@ -119,12 +230,8 @@ int fact_liberar(t_LstFacturas *l) 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]; @@ -157,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; } diff --git a/emufs_gui/facturas.h b/emufs_gui/facturas.h index f2a3c85..1f65e63 100644 --- a/emufs_gui/facturas.h +++ b/emufs_gui/facturas.h @@ -7,18 +7,31 @@ #include #include #include +#include +#include + +typedef struct _t_item_ { + int numero; + char cv[9]; + char pvu[9]; +} t_Item; typedef struct _facturas_ { + /* Dejo los campos numericos al principio para mayor facilidad + * de parseo. + */ int numero; + float procdoi; + int numero_remito; + int cant_items; char emision[9]; char vencimiento[9]; - int numero_remito; char estado[3]; char fp[3]; - float procdoi; char ctacte[6]; char cheque[19]; char *nota; + t_Item *items; } t_Factura; typedef struct _reg_factura_ { @@ -34,7 +47,7 @@ typedef struct _lista_facturas_ { EMUFS *fp_texto; /* Filepointer al archivo donde estan los textos */ } t_LstFacturas; -t_LstFacturas *fact_cargar(const char *filename); +t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque); int fact_liberar(t_LstFacturas *l); #endif diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index ec90147..86f7eed 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -134,7 +134,8 @@ int main(int argc, char *argv[]) dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ..."); if (argc == 4) { art_cargar(argv[1], atoi(argv[2]), atoi(argv[3])); - fact_cargar(argv[1]); + if (!fact_cargar("facturas.xml", 3, 100)) + fprintf(stderr, "ERROR CARGANDO FACTURAS\n"); } else art_cargar(NULL, -1, -1); -- 2.43.0