efqtoolbutton_importar.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2006 by Arturo Martin Llado                             *
00003  *   amartin@conetxia.com                                                  *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020 
00021 #include <QWidget>
00022 #include "efqtoolbutton_importar.h"
00023 #include "facturasplist.h"
00024 #include "funcaux.h"
00025 
00027 #include <QtXml/QDomDocument>
00028 #include <QtXml/QDomNodeList>
00029 #include <QtXml/QDomNode>
00030 #include <QString>
00031 #include <QFileDialog>
00032 #include <QMap>
00033 #include <QList>
00034 #include "facturapview.h"
00035 #include "fixed.h"
00036 
00037 #include "listlinfacturapview.h"
00038 #include "company.h"
00039 #include "listdescfacturaprovview.h"
00040 #include "dbrecord.h"
00041 
00042 
00044 
00048 EFQToolButtonImportar::EFQToolButtonImportar(FacturasProveedorList *faclistado, QWidget *parent) : QToolButton(parent), PEmpresaBase() {
00049         _depura("EFQToolButtonImportar::EFQToolButtonImportar", 0);
00050         m_faclistado = faclistado;
00051         setEmpresaBase(faclistado->empresaBase());
00052         connect(this, SIGNAL(clicked()), this, SLOT(click()));
00053         _depura("END EFQToolButtonImportar::EFQToolButtonImportar", 0);
00054 }
00055 
00056 
00058 
00060 EFQToolButtonImportar::~EFQToolButtonImportar() {
00061         _depura("EFQToolButtonImportar::~EFQToolButtonImportar", 0);
00062         _depura("END EFQToolButtonImportar::~EFQToolButtonImportar", 0);
00063 }
00064 
00065 
00067 
00072 QString EFQToolButtonImportar::obten_valor_nodo(QString nombre, QDomDocument *doc) {
00073         _depura("EFQToolButtonImportar_EFQToolButtonImportar::obten_valor_nodo", 0);
00074         QDomNodeList lista_nodos = doc->elementsByTagName(nombre);
00075         QDomNode nodo = lista_nodos.item(0);
00076         
00077         if (nodo.isNull())
00078                 _depura("No hay un nodo con ese nombre", 2);
00079                 
00080         _depura("END EFQToolButtonImportar_EFQToolButtonImportar::obten_valor_nodo", 0);
00081 
00082         return nodo.toElement().text();
00083 }
00084 
00085 
00088 
00093 QString EFQToolButtonImportar::obten_descuento_factura(QDomDocument *doc, QList< QMap<QString, QString> > &lista_descuentos) {
00094         _depura("EFQToolButtonImportar_EFQToolButtonImportar::obten_descuento_factura", 0);
00095         // Obtenemos el nodo padre
00096         QDomNodeList lista_padre = doc->elementsByTagName("Invoice");
00097         QDomNode padre = lista_padre.item(0);
00098         QMap<QString, QString> mapa_descuento;
00099                 
00100         QDomNode nodo1, nodo2;
00101         
00102         Fixed total_descuento = "0.00";
00103         
00109         nodo1 = padre.firstChildElement("cac:AllowanceCharge");
00110         
00111         while ( !nodo1.isNull() ) {
00112                 
00114                 nodo2 = nodo1.firstChildElement("cbc:MultiplierFactorNumeric");
00115                 
00116                 mapa_descuento["conceptdfactura"] = "DESCUENTO";
00117                 mapa_descuento["proporciondfactura"] = nodo2.toElement().text();
00118                 
00120                 nodo2 = nodo2.nextSiblingElement("cbc:Amount");
00121                 
00123                 total_descuento = total_descuento + Fixed(nodo2.toElement().text());
00124                 
00126                 lista_descuentos.append(mapa_descuento);
00127 
00129                 nodo1 = nodo1.nextSiblingElement("cac:AllowanceCharge");
00130         }
00131         
00132         _depura("END EFQToolButtonImportar_EFQToolButtonImportar::obten_descuento_factura", 0);
00133         
00134         return total_descuento.toQString();
00135 }
00136 
00137 
00141 
00146 void EFQToolButtonImportar::obten_linea_factura(QDomDocument *doc, QMap<QString, QString> &mapa_lfactura, int i) {
00147         _depura("EFQToolButtonImportar_EFQToolButtonImportar::obten_linea_factura", 0);
00148         QDomNodeList lista_lineas = doc->elementsByTagName("cac:InvoiceLine");
00149         QDomNode padre = lista_lineas.item(i);
00150         QDomNode tmp;
00151         
00152         // Buscamos la descripcion de esa linea de factura
00153         tmp = padre;
00154         tmp = tmp.firstChildElement("cac:Item");
00155         tmp = tmp.firstChildElement("cbc:Description");
00156         
00157         mapa_lfactura["desclfactura"] = tmp.toElement().text();
00158         
00159         // Buscamos la cantidad de elementos pertenecientes a la linea
00160         tmp = padre;
00161         tmp = tmp.firstChildElement("cbc:InvoicedQuantity");
00162         
00163         mapa_lfactura["cantlfactura"] = tmp.toElement().text();
00164         
00165         // Buscamos PVP de la linea
00166         tmp = padre;
00167         tmp = tmp.firstChildElement("cbc:LineExtensionAmount");
00168         
00169         mapa_lfactura["pvplfactura"] = tmp.toElement().text();
00170         
00171         // Buscamos IVA de la linea
00172         tmp = padre;
00173         tmp = tmp.firstChildElement("cac:TaxTotal");
00174         tmp = tmp.firstChildElement("cbc:TotalTaxAmount");
00175         
00176         mapa_lfactura["ivalfactura"] = tmp.toElement().text();
00177         
00178         // Buscamos descuento de la linea
00179         tmp = padre;
00180         tmp = tmp.firstChildElement("cac:AllowanceCharge");
00181         tmp = tmp.firstChildElement("cbc:MultiplierFactorNumeric");
00182         
00183         mapa_lfactura["descuentolfactura"] = tmp.toElement().text();
00184         
00185         // Buscamos ID de articulo de la linea
00186         tmp = padre;
00187         tmp = tmp.firstChildElement("cac:Item");
00188         tmp = tmp.firstChildElement("cac:SellersItemIdentification");
00189         tmp = tmp.firstChildElement("cac:ID");
00190         
00191         mapa_lfactura["idarticulo"] = tmp.toElement().text();
00192         
00193         _depura("END EFQToolButtonImportar_EFQToolButtonImportar::obten_linea_factura", 0);
00194 }
00195 
00196 
00202 
00206 QString EFQToolButtonImportar::obten_id_proveedor(QDomDocument *doc) {
00207         _depura("EFQToolButtonImportar_EFQToolButtonImportar::obten_id_proveedor", 0);
00208         // Nos situamos sobre la parte que identifica al vendedor
00209         QDomNodeList lista_nodos = doc->elementsByTagName("cac:SellerParty");
00210         // Obtenemos el nodo padre de esta seccion
00211         QDomNode padre = lista_nodos.item(0);
00212         // Lo recorremos hasta llegar a donde nos interesa
00213         QDomNode nodo = padre;;
00214         
00215         nodo = nodo.firstChildElement("cac:Party");
00216         nodo = nodo.firstChildElement("cac:PartyIdentification");
00217         nodo = nodo.firstChildElement("cac:ID");
00218         
00219         _depura("END EFQToolButtonImportar_EFQToolButtonImportar::obten_id_proveedor", 0);
00220         
00221         return nodo.toElement().text();
00222 }
00223 
00224 
00226 
00229 void EFQToolButtonImportar::importa_factura_ubl() {
00230         _depura("EFQToolButtonImportar::importa_factura_ubl", 0);
00231 
00232         QString fichero = QFileDialog::getOpenFileName(
00233                         this,
00234                         "Escoja un fichero que contenga una efactura para importarlo a la base de datos de BulmaFact",
00235                         "/tmp",
00236                         "Todos los archivos (*)"
00237                         );
00238 
00241         if (fichero == "")
00242                 return;
00243         
00246         QDomDocument doc("efactura");
00247         QFile file(fichero);
00248         
00249         if (!file.open(QIODevice::ReadOnly))
00250                 return;
00251 
00253         if (!doc.setContent(&file)) {
00254                 file.close();
00255                 return;
00256         }
00257         
00258         file.close();
00259         
00261         
00262         QString numeroFactura = obten_valor_nodo("ID", &doc);
00263         QString fechaFactura = obten_valor_nodo("cbc:IssueDate", &doc);
00264         QString descFactura = obten_valor_nodo("cbc:Note", &doc);
00265         QString bimpFactura = obten_valor_nodo("cbc:LineExtensionTotalAmount", &doc);
00266         QString impFactura = obten_valor_nodo("cbc:TotalTaxAmount", &doc);
00267         QString totalFactura = obten_valor_nodo("cbc:TaxInclusiveTotalAmount", &doc);
00268         
00270         QString idProveedor = obten_id_proveedor(&doc);
00271                 
00272         QString query = "SELECT * FROM proveedor WHERE cifproveedor = '" + idProveedor + "'";
00273         cursor2 *proveedor = empresaBase()->cargacursor(query);
00274                 
00275         if (proveedor->numregistros() == 0) {
00276                 _depura("El proveedor con CIF " + idProveedor + " no existe en la base de datos. Hay que crearlo antes de importar esta factura.", 2);
00277                 
00278                 return;
00279         }
00280 
00282         
00283         FacturaProveedorView *fp = ((Company *)empresaBase())->newFacturaProveedorView();
00284         empresaBase()->m_pWorkspace->addWindow(fp);
00285         fp->inicializar();
00286         fp->pintar();
00287         fp->show();
00288         
00290 
00291         QList< QMap<QString, QString> > lista_mapas_dfactura;
00292         
00293         QString descuentoFactura = obten_descuento_factura(&doc, lista_mapas_dfactura);
00294         
00297         
00298         // Contamos los descuentos que hay
00299         
00300         int numdescuentos = lista_mapas_dfactura.count();
00301         
00303 
00306 
00308         
00309         ListDescuentoFacturaProvView *descuentos =(ListDescuentoFacturaProvView *) fp->getlistadescuentos();
00310         SDBRecord *rec = descuentos->lista()->last();
00311         QMap <QString, QString> mapa_dfactura;
00312 
00313         for (int i = 0; i < numdescuentos; i++) {
00314                 descuentos->setinsercion(FALSE);
00315                 mapa_dfactura = lista_mapas_dfactura.at(i);     
00316                         
00317                 rec->setDBvalue("conceptdfacturap", mapa_dfactura["conceptdfactura"]);
00318                 rec->setDBvalue("proporciondfacturap", mapa_dfactura["proporciondfactura"]);
00319                 
00320                 descuentos->setinsercion(TRUE);
00321                 descuentos->nuevoRegistro();
00322                 
00323                 rec = descuentos->lista()->last();
00324         } // end for
00325         
00327         
00329         
00330         // Contamos las lineas que hay
00331         
00332         QDomNodeList lista_lfactura = doc.elementsByTagName("cac:InvoiceLine");
00333         
00334         lista_lfactura.item(0);
00335         
00336         int numlineas = 0;
00337         
00338         for (int i = 0; !lista_lfactura.item(i).isNull(); i++)
00339                 numlineas = i+1;
00340         
00341         if (numlineas == 0) {
00342                 _depura("Esta factura es erronea. No contiene ninguna linea asociada", 2);
00343                 exit(-1);
00344         }
00345         
00348 
00349         QMap<QString, QString> mapa_lfactura;
00350         QList< QMap<QString, QString> > lista_mapas_lfactura;
00351         
00353 
00360 
00362         for (int i = 0; i < numlineas; i++) {
00363                 obten_linea_factura(&doc, mapa_lfactura, i);
00364                 lista_mapas_lfactura.append(mapa_lfactura);
00365         }
00366         
00368 
00369         ListLinFacturaProveedorView *lineas = (ListLinFacturaProveedorView *) fp->getlistalineas();
00370         rec = lineas->lista()->last();
00371         cursor2 *articulo = NULL;
00372         QString idarticulo, nomarticulo;
00373 
00374         for (int i = 0; i < numlineas; i++) {
00375                 lineas->setinsercion(FALSE); 
00376                 mapa_lfactura = lista_mapas_lfactura.at(i);     
00377 
00381                 query = "SELECT * FROM articulo WHERE codigocompletoarticulo = '" + mapa_lfactura["idarticulo"] + "'";
00382                 articulo = empresaBase()->cargacursor(query);
00383                 
00386                 if (articulo->numregistros() == 0) {
00387                         _depura("El articulo con codigo completo " + mapa_lfactura["idarticulo"] + " no existe en la base de datos. Se importara como articulo generico.", 2);
00388                         
00390                         query = "SELECT valor FROM configuracion WHERE nombre = 'CodArticuloGenerico'";
00391                         articulo = empresaBase()->cargacursor(query);
00392                         
00393                         mapa_lfactura["idarticulo"] = articulo->valor("valor");
00394                         
00396                         query = "SELECT idarticulo, nomarticulo FROM articulo WHERE codigocompletoarticulo = '" + articulo->valor("valor") + "'";
00397                         articulo = empresaBase()->cargacursor(query);
00398                 } // end if
00399                         
00400                 idarticulo  = articulo->valor("idarticulo");
00401                 nomarticulo = articulo->valor("nomarticulo");
00402                 
00403                 rec->setDBvalue("codigocompletoarticulo", mapa_lfactura["idarticulo"]);
00404                 
00405 //              rec->refresh();
00406                 
00407                 rec->setDBvalue("idarticulo", articulo->valor("idarticulo"));
00408                 
00409                 rec->setDBvalue("nomarticulo", articulo->valor("nomarticulo"));
00410                 rec->setDBvalue("desclfacturap", mapa_lfactura["desclfactura"]);
00411                 rec->setDBvalue("cantlfacturap", mapa_lfactura["cantlfactura"]);
00412                 rec->setDBvalue("pvplfacturap", mapa_lfactura["pvplfactura"]);
00413                 rec->setDBvalue("ivalfacturap", mapa_lfactura["ivalfactura"]);          
00414                 rec->setDBvalue("descuentolfacturap", mapa_lfactura["descuentolfactura"]);
00415 
00416                 lineas->setinsercion(TRUE);
00417                 lineas->nuevoRegistro();
00418                 
00419                 rec = lineas->lista()->last();
00420         } // end for
00421         
00422         delete articulo;
00423 
00425 
00427 /*
00428         fp->pintanumfacturap(numeroFactura);
00429         fp->pintafechafacturap(fechaFactura);
00430         fp->pintadescfacturap(descFactura);
00431         fp->pintaidproveedor(proveedor->valor("idproveedor"));
00432 */
00433         fp->pintar();
00434         
00435         delete proveedor;
00436         
00437         Fixed bimp(bimpFactura);
00438         Fixed iva(impFactura);
00439         
00440         fp->calculaypintatotales();
00441         fp->m_totalDiscounts->setText(descuentoFactura);
00442         
00444         
00445         lineas->setEmpresaBase(empresaBase());
00446         descuentos->setEmpresaBase(empresaBase());
00447 
00448         fp->setDBvalue("idproveedor", idProveedor);
00449         fp->setDBvalue("reffacturap", ""); 
00450         fp->setDBvalue("numfacturap", numeroFactura);
00451         fp->setDBvalue("ffacturap", fechaFactura);
00452         fp->setDBvalue("descfacturap", descFactura);
00453         fp->setDBvalue("comentfacturap", "");
00454         
00459         fp->setDBvalue("idforma_pago", "");
00460         
00461         fp->setDBvalue("procesadafacturap", "");
00462         
00463         _depura("END EFQToolButtonImportar::importa_factura_ubl", 0);
00464 }
00465 
00466 
00468 
00470 void EFQToolButtonImportar::click() {
00471         _depura("EFQToolButtonImportar::click", 0);
00472         importa_factura_ubl();
00473         _depura("END EFQToolButtonImportar::click", 0);
00474 }

Generated on Sat Dec 15 00:01:05 2007 for BulmaGes by  doxygen 1.5.1