EFQToolButtonImportar Class Reference

#include <efqtoolbutton_importar.h>

Inheritance diagram for EFQToolButtonImportar:

QToolButton PEmpresaBase

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

FacturasProveedorListm_faclistado

Detailed Description

Definition at line 35 of file efqtoolbutton_importar.h.


Constructor & Destructor Documentation

EFQToolButtonImportar::EFQToolButtonImportar ( FacturasProveedorList faclistado,
QWidget parent = 0 
)

Parameters:
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 }


Member Function Documentation

void EFQToolButtonImportar::importa_factura_ubl (  ) 

------------------ Importa una factura desde un fichero en formato UBL 1.0 ------------------- ///

Returns:

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>).

Parameters:
nombre 
doc 
Returns:

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  ) 

Parameters:
doc 
Returns:

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 
)

Parameters:
doc 
lista_descuentos 
Returns:

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 
)

Parameters:
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 }


Field Documentation

FacturasProveedorList* EFQToolButtonImportar::m_faclistado [private]

Definition at line 39 of file efqtoolbutton_importar.h.

Referenced by EFQToolButtonImportar().


The documentation for this class was generated from the following files:
Generated on Sat Dec 15 00:01:51 2007 for BulmaGes by  doxygen 1.5.1