00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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
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
00160 tmp = padre;
00161 tmp = tmp.firstChildElement("cbc:InvoicedQuantity");
00162
00163 mapa_lfactura["cantlfactura"] = tmp.toElement().text();
00164
00165
00166 tmp = padre;
00167 tmp = tmp.firstChildElement("cbc:LineExtensionAmount");
00168
00169 mapa_lfactura["pvplfactura"] = tmp.toElement().text();
00170
00171
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
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
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
00209 QDomNodeList lista_nodos = doc->elementsByTagName("cac:SellerParty");
00210
00211 QDomNode padre = lista_nodos.item(0);
00212
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
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 }
00325
00327
00329
00330
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 }
00399
00400 idarticulo = articulo->valor("idarticulo");
00401 nomarticulo = articulo->valor("nomarticulo");
00402
00403 rec->setDBvalue("codigocompletoarticulo", mapa_lfactura["idarticulo"]);
00404
00405
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 }
00421
00422 delete articulo;
00423
00425
00427
00428
00429
00430
00431
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 }