#include <efqtoolbutton_importar.h>
Inheritance diagram for EFQToolButtonImportar:

Public Slots | |
| void | click () |
Public Member Functions | |
| EFQToolButtonImportar (FacturasProveedorList *faclistado, QWidget *parent=0) | |
| ~EFQToolButtonImportar () | |
| void | importa_factura_ubl () |
| ------------------ Importa una factura desde un fichero en formato UBL 1.0 ------------------- /// | |
| QString | obten_valor_nodo (QString nombre, QDomDocument *doc) |
| Dado un nombre de etiqueta se retorna el texto/valor que contiene (<etiqueta>valor</etiqueta>). | |
| QString | obten_id_proveedor (QDomDocument *doc) |
| QString | obten_descuento_factura (QDomDocument *doc, QList< QMap< QString, QString > > &lista_descuentos) |
| void | obten_linea_factura (QDomDocument *doc, QMap< QString, QString > &mapa_lfactura, int i) |
Private Attributes | |
| FacturasProveedorList * | m_faclistado |
Definition at line 35 of file efqtoolbutton_importar.h.
| EFQToolButtonImportar::EFQToolButtonImportar | ( | FacturasProveedorList * | faclistado, | |
| QWidget * | parent = 0 | |||
| ) |
| faclistado | ||
| parent |
Definition at line 48 of file efqtoolbutton_importar.cpp.
References _depura(), click(), PEmpresaBase::empresaBase(), m_faclistado, and PEmpresaBase::setEmpresaBase().
00048 : 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 }
| EFQToolButtonImportar::~EFQToolButtonImportar | ( | ) |
Definition at line 60 of file efqtoolbutton_importar.cpp.
References _depura().
00060 { 00061 _depura("EFQToolButtonImportar::~EFQToolButtonImportar", 0); 00062 _depura("END EFQToolButtonImportar::~EFQToolButtonImportar", 0); 00063 }
| void EFQToolButtonImportar::importa_factura_ubl | ( | ) |
------------------ Importa una factura desde un fichero en formato UBL 1.0 ------------------- ///
Si se le da a cancelar en el dialogo anterior cancelamos la ejecucion del resto del codigo
Declaramos una variable de tipo QDomDocument que usaremos para cargar los datos del fichero en memoria
Cargamos los datos en memoria usando el contenido de 'fichero'
Empezamos a obtener datos de la efactura
Comprobamos que el proveedor existe. Si no, abortamos y damos mensaje de error.
Mostramos la ficha con la informacion de la factura importada --------------------------------------
Obtenemos los descuentos ---------------------------------------------------------------------------
Vamos a usar un QMap para ir recorriendo los descuentos de la factura y los valores los iremos guardando, una vez obtenidos los que nos interesan, en una lista de QMaps.
Estas son las claves que vamos a usar dentro del QMap mapa_dfactura
mapa_dfactura["conceptdfactura"] mapa_dfactura["proporciondfactura"]
Pintamos los descuentos --------------------------------------------
FIN Descuentos de factura --------------------------------------------------------------------------
Obtenemos lineas de factura ------------------------------------------------------------------------
Vamos a usar un QMap para ir recorriendo las lineas de factura y los valores los iremos guardando, una vez obtenidos los que nos interesan, en una lista de QMaps.
Estas son las claves que vamos a usar dentro del QMap mapa_lfactura
mapa_lfactura["desclfactura"] mapa_lfactura["cantlfactura"] mapa_lfactura["pvplfactura"] mapa_lfactura["ivalfactura"] mapa_lfactura["descuentolfactura"] mapa_lfactura["idarticulo"]
Mientras haya lineas, las vamos obteniendo
Pintamos las lineas de factura --------------------------------------------
Hace falta que este en el bucle? preguntar a Tomeu
Comprobamos que existe un articulo con ese codigo en la BD Si no es asi, mandamos una alerta al usuario y anyadimos ese articulo a la linea como articulo generico
Si no obtenemos resultados cargamos en el cursor articulo los valores que necesitamos (idarticulo y nomarticulo)
Obtenemos el codigo de articulo generico
Datos necesarios para guardar correctamente la linea de factura
FIN lineas de factura ------------------------------------------------------------------------------
Empezamos a pintar datos ---------------------------------------------------------------------------
Damos valores a los campos DBvalue -----------------------------------------------------------------
El valor lo pone el usuario que importa la factura
Que seleccione la forma de pago el que esta importanto la factura. Esto lo hacemos asi porque guardamos este campo como una cadena de texto dentro de la efactura, al ser algo tan variable mejor que lo haga de nuevo el propio usuario.
Definition at line 229 of file efqtoolbutton_importar.cpp.
References _depura(), QWorkspace2::addWindow(), FichaBf::calculaypintatotales(), postgresiface2::cargacursor(), PEmpresaBase::empresaBase(), FALSE, FichaBf::getlistadescuentos(), FichaBf::getlistalineas(), FacturaProveedorView::inicializar(), iva, SubForm3::lista(), EmpresaBase::m_pWorkspace, Ui_FacturaProveedorBase::m_totalDiscounts, SubForm3::nuevoRegistro(), cursor2::numregistros(), obten_descuento_factura(), obten_id_proveedor(), obten_linea_factura(), obten_valor_nodo(), Ficha::pintar(), DBRecord::setDBvalue(), SubForm2Bf::setEmpresaBase(), SubForm3::setinsercion(), TRUE, and cursor2::valor().
Referenced by click().
00229 { 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 }
| QString EFQToolButtonImportar::obten_valor_nodo | ( | QString | nombre, | |
| QDomDocument * | doc | |||
| ) |
Dado un nombre de etiqueta se retorna el texto/valor que contiene (<etiqueta>valor</etiqueta>).
| nombre | ||
| doc |
Definition at line 72 of file efqtoolbutton_importar.cpp.
References _depura().
Referenced by importa_factura_ubl().
00072 { 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 }
| QString EFQToolButtonImportar::obten_id_proveedor | ( | QDomDocument * | doc | ) |
| doc |
Definition at line 206 of file efqtoolbutton_importar.cpp.
References _depura().
Referenced by importa_factura_ubl().
00206 { 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 }
| QString EFQToolButtonImportar::obten_descuento_factura | ( | QDomDocument * | doc, | |
| QList< QMap< QString, QString > > & | lista_descuentos | |||
| ) |
| doc | ||
| lista_descuentos |
Nos movemos entre los nodos hijos cac:AllowanceCharge Ojo, no confundir con los elementos cac:AllowanceCharge que estan dentro del elemento cac:InvoiceLine. Por eso se hace este tipo de recorrido. Cogemos los nodos cac:AllowanceCharge que son hijos del nodo raiz, no todos los nodos cac:AllowanceCharge.
Nos situamos sobre el elemento que contiene el porcentaje de descuento sobre el PVP
Nos situamos sobre el elemento que contiene la cantidad
Acumulamos...
Guardamos la informacion de este descuento en la lista de descuentos
Siguiente descuento, si existe
Definition at line 93 of file efqtoolbutton_importar.cpp.
References _depura(), and Fixed::toQString().
Referenced by importa_factura_ubl().
00093 { 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 }
| void EFQToolButtonImportar::obten_linea_factura | ( | QDomDocument * | doc, | |
| QMap< QString, QString > & | mapa_lfactura, | |||
| int | i | |||
| ) |
| doc | ||
| mapa_lfactura | ||
| i |
Definition at line 146 of file efqtoolbutton_importar.cpp.
References _depura().
Referenced by importa_factura_ubl().
00146 { 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 }
| void EFQToolButtonImportar::click | ( | ) | [slot] |
Definition at line 470 of file efqtoolbutton_importar.cpp.
References _depura(), and importa_factura_ubl().
Referenced by EFQToolButtonImportar().
00470 { 00471 _depura("EFQToolButtonImportar::click", 0); 00472 importa_factura_ubl(); 00473 _depura("END EFQToolButtonImportar::click", 0); 00474 }
1.5.1