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.h"
00023 #include "facturaview.h"
00024 #include "funcaux.h"
00025 #include "company.h"
00026 #include "blwidget.h"
00027
00029 #include <QFile>
00030 #include <QTextStream>
00031 #include <QtXml/QXmlInputSource>
00032 #include <QtXml/QXmlSimpleReader>
00033
00034 #define _PLANTILLA_ "/usr/share/bulmages/efactura/plantilla_efactura.xml"
00035 #define _RESULTADO_ "/tmp/efactura"
00036
00037
00039
00043 EFQToolButton::EFQToolButton(FacturaView *fac, QWidget *parent) : QToolButton(parent), PEmpresaBase() {
00044 _depura("EFQToolButton::EFQToolButton", 0);
00045 setEmpresaBase(fac->empresaBase());
00046 m_factura = fac;
00047 connect(this, SIGNAL(clicked()), this, SLOT(click()));
00048 _depura("END EFQToolButton::EFQToolButton", 0);
00049 }
00050
00051
00053
00055 EFQToolButton::~EFQToolButton() {
00056 _depura("EFQToolButton::~EFQToolButton", 0);
00057 _depura("END EFQToolButton::~EFQToolButton", 0);
00058 }
00059
00060
00062
00067 void EFQToolButton::escribe_descuento_factura(QString &string, cursor2 *descuentos_factura, Fixed bimpfactura) {
00068 _depura("EFQToolButton::escribe_descuento_factura", 0);
00069
00070 Fixed descuentoFactura = "0.00";
00071 descuentoFactura = Fixed(descuentos_factura->valor("proporciondfactura"));
00072 descuentoFactura = descuentoFactura*bimpfactura;
00073 descuentoFactura = descuentoFactura*Fixed("0.01");
00074
00075 string += "\t<cac:AllowanceCharge>\n";
00076 string += "\t\t<cbc:ChargeIndicator>false</cbc:ChargeIndicator>\n";
00077 string += "\t\t<cbc:MultiplierFactorNumeric>" + descuentos_factura->valor("proporciondfactura") + "</cbc:MultiplierFactorNumeric>\n";
00078 string += "\t\t<cbc:Amount amountCurrencyID=\"EUR\">" + descuentoFactura.toQString() + "</cbc:Amount>\n";
00079 string += "\t</cac:AllowanceCharge>\n";
00080 string += "\n";
00081
00082 _depura("END EFQToolButton::escribe_descuento_factura", 0);
00083 }
00084
00085
00087
00092 void EFQToolButton::escribe_linea_factura(QString &string, cursor2 *lfactura, int numerolinea) {
00093
00094 _depura("EFQToolButton::escribe_linea_factura", 0);
00095
00096 QString numero = QString::number(numerolinea);
00097
00098 QString query = "SELECT * FROM articulo WHERE idarticulo = " + lfactura->valor("idarticulo");
00099 cursor2 *articulo = empresaBase()->cargacursor(query);
00100
00101 QString string_iva = lfactura->valor("ivalfactura");
00102 QString string_bimp = lfactura->valor("pvplfactura");
00103 QString string_descuento = lfactura->valor("descuentolfactura");
00104
00105 Fixed iva(string_iva);
00106 Fixed bimp(string_bimp);
00107 Fixed descuento(string_descuento);
00108
00109 Fixed iva_lfactura = (iva/100)*bimp;
00110 Fixed descuento_lfactura = (descuento/100)*bimp;
00111
00112 string += "<cac:InvoiceLine>\n";
00113
00114
00115 string += "\t<cac:ID>" + numero + "</cac:ID>\n";
00116
00117
00118 string += "\t<cbc:InvoicedQuantity quantityUnitCode=\"UNIT\">" + lfactura->valor("cantlfactura") + "</cbc:InvoicedQuantity>\n";
00119
00120
00121 string += "\t<cbc:LineExtensionAmount amountCurrencyCodeListVersionID=\"0.3\" amountCurrencyID=\"EUR\">" + lfactura->valor("pvplfactura") +"</cbc:LineExtensionAmount>\n";
00122
00123
00124 string += "\t<cac:AllowanceCharge>\n";
00125 string += "\t\t<cbc:ChargeIndicator>false</cbc:ChargeIndicator>\n";
00126 string += "\t\t<cbc:MultiplierFactorNumeric>" + lfactura->valor("descuentolfactura") + "</cbc:MultiplierFactorNumeric>\n";
00127 string += "\t\t<cbc:Amount amountCurrencyID=\"EUR\">" + descuento_lfactura.toQString() + "</cbc:Amount>\n";
00128 string += "\t</cac:AllowanceCharge>\n";
00129
00130
00131 string += "\t<cac:TaxTotal>\n";
00132 string += "\t\t<cbc:TotalTaxAmount amountCurrencyID=\"EUR\">" + iva_lfactura.toQString() + "</cbc:TotalTaxAmount>\n";
00133 string += "\t</cac:TaxTotal>\n";
00134
00135
00136 string += "\t<cac:Item>\n";
00137 string += "\t\t<cbc:Description>" + lfactura->valor("desclfactura") + "</cbc:Description>\n";
00138
00139 string += "\t\t<cac:SellersItemIdentification>\n";
00140 string += "\t\t\t<cac:ID>" + articulo->valor("codigocompletoarticulo") + "</cac:ID>\n";
00141 string += "\t\t</cac:SellersItemIdentification>\n";
00142
00143 string += "\t\t<cac:TaxCategory>\n";
00144 string += "\t\t\t<cac:ID>" + lfactura->valor("ivalfactura") + "</cac:ID>\n";
00145 string += "\t\t\t<cbc:Percent>" + lfactura->valor("ivalfactura") + "</cbc:Percent>\n";
00146 string += "\t\t\t<cac:TaxScheme>\n";
00147 string += "\t\t\t\t<cac:TaxTypeCode>IVA</cac:TaxTypeCode>\n";
00148 string += "\t\t\t</cac:TaxScheme>\n";
00149 string += "\t\t</cac:TaxCategory>\n";
00150
00151 string += "\t\t<cac:BasePrice>\n";
00152 string += "\t\t\t<cbc:PriceAmount amountCurrencyCodeListVersionID=\"0.3\" amountCurrencyID=\"EUR\">" + articulo->valor("pvparticulo") +"</cbc:PriceAmount>\n";
00153 string += "\t\t</cac:BasePrice>\n";
00154 string += "\t</cac:Item>\n";
00155
00156 string += "</cac:InvoiceLine>\n";
00157 string += "\n";
00158
00159 delete articulo;
00160
00161 _depura("END EFQToolButton::escribe_linea_factura", 0);
00162 }
00163
00165
00166
00168
00170 void EFQToolButton::exporta_factura_ubl() {
00171
00172 _depura("EFQToolButton::exporta_factura_ubl", 0);
00173
00174 QString query = "";
00175
00176 QFile *file_in = new QFile(_PLANTILLA_);
00177
00178 if (!file_in->open(QIODevice::ReadOnly | QIODevice::Text)) {
00179 _depura("Problemas al abir la plantilla de factura", 2);
00180 exit(-1);
00181 }
00182
00184 QString FacturaXml = "";
00185
00187 QTextStream in(file_in);
00188
00190 while (!in.atEnd()) {
00191 FacturaXml += in.readLine();
00192 FacturaXml += "\n";
00193 }
00194
00196
00197
00198
00199 bool error_idtrabajador = false;
00200
00201 if (m_factura->DBvalue("idfactura").isEmpty()) {
00202 _depura("ERROR: El campo idfactura del DBRecord esta vacio.", 2);
00203 exit(-1);
00204 }
00205
00206 if (m_factura->DBvalue("idcliente").isEmpty()) {
00207 _depura("ERROR: El campo idcliente del DBRecord esta vacio.", 2);
00208 exit(-1);
00209 }
00210
00211 if (m_factura->DBvalue("idtrabajador").isEmpty()) {
00212
00213
00214 error_idtrabajador = true;
00215
00216 }
00217
00218 if (m_factura->DBvalue("idforma_pago").isEmpty()) {
00219 _depura("ERROR: El campo idforma_pago del DBRecord esta vacio.", 2);
00220 exit(-1);
00221 }
00222
00223
00224
00225 QString nombrearchivo = "";
00226 nombrearchivo += QString(_RESULTADO_);
00227 nombrearchivo += QString(m_factura->DBvalue("idfactura"));
00228 nombrearchivo += ".xml";
00229
00230 QFile *file_out = new QFile(nombrearchivo);
00231
00232 if (!file_out->open(QIODevice::WriteOnly | QIODevice::Text)) {
00233 _depura("Problemas al crear el archivo de salida", 2);
00234 exit(-1);
00235 }
00236
00237
00238 query = "SELECT totalfactura, bimpfactura, impfactura FROM factura WHERE idfactura = " + m_factura->DBvalue("idfactura");
00239 cursor2 *factura_totales = empresaBase()->cargacursor(query);
00240
00241
00242 query = "SELECT * FROM cliente WHERE idcliente = " + m_factura->DBvalue("idcliente");
00243 cursor2 *cliente = empresaBase()->cargacursor(query);
00244
00245
00246
00247 cursor2 *trabajador = NULL;
00248
00249 if (!error_idtrabajador) {
00250 query = "SELECT * FROM trabajador WHERE idtrabajador = " + m_factura->DBvalue("idtrabajador");
00251 trabajador = empresaBase()->cargacursor(query);
00252 }
00253
00254
00255 query = "SELECT * FROM forma_pago WHERE idforma_pago = " + m_factura->DBvalue("idforma_pago");
00256 cursor2 *forma_pago = empresaBase()->cargacursor(query);
00257
00258
00259
00260 bool error_configuracion = false;
00261
00262 query = "SELECT * FROM configuracion WHERE nombre = 'NombreEmpresa'";
00263 cursor2 *nombre_empresa = empresaBase()->cargacursor(query);
00264
00265 query = "SELECT * FROM configuracion WHERE nombre = 'CIF'";
00266 cursor2 *cif_empresa = empresaBase()->cargacursor(query);
00267
00268 query = "SELECT * FROM configuracion WHERE nombre = 'DireccionCompleta'";
00269 cursor2 *dir_empresa = empresaBase()->cargacursor(query);
00270
00271 query = "SELECT * FROM configuracion WHERE nombre = 'Ciudad'";
00272 cursor2 *ciudad_empresa = empresaBase()->cargacursor(query);
00273
00274 query = "SELECT * FROM configuracion WHERE nombre = 'CodPostal'";
00275 cursor2 *cp_empresa = empresaBase()->cargacursor(query);
00276
00277 if (nombre_empresa->valor("valor").isEmpty()) {
00278 _depura("El campo valor con nombre nombre_empresa de la tabla de configuracion esta vacio", 2);
00279 error_configuracion = true;
00280 }
00281
00282 if (cif_empresa->valor("valor").isEmpty()) {
00283 _depura("El campo valor con nombre cif_empresa de la tabla de configuracion esta vacio", 2);
00284 error_configuracion = true;
00285 }
00286
00287 if (dir_empresa->valor("valor").isEmpty()) {
00288 _depura("El campo valor con nombre dir_empresa de la tabla de configuracion esta vacio", 2);
00289 error_configuracion = true;
00290 }
00291
00292 if (ciudad_empresa->valor("valor").isEmpty()) {
00293 _depura("El campo valor con nombre ciudad_empresa de la tabla de configuracion esta vacio", 2);
00294 error_configuracion = true;
00295 }
00296
00297 if (cp_empresa->valor("valor").isEmpty()) {
00298 _depura("El campo valor con nombre cp_empresa de la tabla de configuracion esta vacio", 2);
00299 error_configuracion = true;
00300 }
00301
00302 if (error_configuracion) {
00303 delete factura_totales;
00304 delete cliente;
00305
00306 if (trabajador != NULL)
00307 delete trabajador;
00308
00309 delete forma_pago;
00310 delete nombre_empresa;
00311 delete cif_empresa;
00312 delete dir_empresa;
00313 delete ciudad_empresa;
00314 delete cp_empresa;
00315
00316 exit(-1);;
00317 }
00318
00319
00320
00321 FacturaXml.replace("[numfactura]", m_factura->DBvalue("numfactura"));
00322 FacturaXml.replace("[ffactura]", m_factura->DBvalue("ffactura"));
00323 FacturaXml.replace("[descfactura]", m_factura->DBvalue("descfactura"));
00324 FacturaXml.replace("[impfactura]", factura_totales->valor("impfactura"));
00325 FacturaXml.replace("[bimpfactura]", factura_totales->valor("bimpfactura"));
00326 FacturaXml.replace("[totalfactura]", factura_totales->valor("totalfactura"));
00327
00328 FacturaXml.replace("[nomcliente]", cliente->valor("nomcliente"));
00329 FacturaXml.replace("[cifcliente]", cliente->valor("cifcliente"));
00330 FacturaXml.replace("[departamento]", cliente->valor("departamento"));
00331 FacturaXml.replace("[dircliente]", cliente->valor("dircliente"));
00332 FacturaXml.replace("[pobcliente]", cliente->valor("poblcliente"));
00333 FacturaXml.replace("[cpcliente]", cliente->valor("cpcliente"));
00334
00335 FacturaXml.replace("[nombre_empresa]", nombre_empresa->valor("valor"));
00336 FacturaXml.replace("[cif_empresa]", cif_empresa->valor("valor"));
00337 FacturaXml.replace("[dir_empresa]", dir_empresa->valor("valor"));
00338 FacturaXml.replace("[ciudad_empresa]", ciudad_empresa->valor("valor"));
00339 FacturaXml.replace("[cp_empresa]", cp_empresa->valor("valor"));
00340
00341 if (trabajador != NULL)
00342 FacturaXml.replace("[trabajador]", trabajador->valor("nomtrabajador") + " " + trabajador->valor("apellidostrabajador"));
00343 else
00344 FacturaXml.replace("[trabajador]", "--");
00345
00346 FacturaXml.replace("[forma_de_pago]", forma_pago->valor("descforma_pago"));
00347
00349
00350 query = "SELECT * FROM lfactura WHERE idfactura = " + m_factura->DBvalue("idfactura");
00351 cursor2 *lfacturas = empresaBase()->cargacursor(query);
00352
00353
00354 lfacturas->primerregistro();
00355
00356 QString LineasFactura = "\n";
00357 int numerolinea = 1;
00358
00359 Fixed totalFactura = "0.00";
00360
00363 while (!lfacturas->eof()) {
00364 escribe_linea_factura(LineasFactura, lfacturas, numerolinea);
00365
00366 totalFactura = totalFactura + (Fixed(lfacturas->valor("cantlfactura"))*Fixed(lfacturas->valor("pvplfactura")));
00367
00368 lfacturas->siguienteregistro();
00369 numerolinea++;
00370 }
00371
00372 FacturaXml.replace("[lineas_factura]", LineasFactura);
00373
00375 query = "SELECT * FROM dfactura WHERE idfactura = " + m_factura->DBvalue("idfactura");
00376 cursor2 *descuentos_factura = empresaBase()->cargacursor(query);
00377
00378 QString DescuentosFactura = "\n";
00379
00380 descuentos_factura->primerregistro();
00381
00382 while (!descuentos_factura->eof()) {
00383 escribe_descuento_factura(DescuentosFactura, descuentos_factura, totalFactura);
00384 descuentos_factura->siguienteregistro();
00385 }
00386
00387 FacturaXml.replace("[descuentos]", DescuentosFactura);
00388
00389 delete descuentos_factura;
00390 delete lfacturas;
00391 delete factura_totales;
00392 delete cliente;
00393
00394 if (trabajador != NULL)
00395 delete trabajador;
00396
00397 delete forma_pago;
00398 delete nombre_empresa;
00399 delete cif_empresa;
00400 delete dir_empresa;
00401 delete ciudad_empresa;
00402 delete cp_empresa;
00403
00405 QTextStream out(file_out);
00406
00407 out << FacturaXml;
00408
00409 file_in->close();
00410 file_out->close();
00411
00412 delete file_in;
00413 delete file_out;
00414
00416
00417 QFile *file = new QFile(nombrearchivo);
00418
00419 if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) {
00420 _depura("ERROR: no se pudo abrir el archivo " + nombrearchivo + " para su parseo.", 2);
00421 exit(-1);
00422 }
00423
00424 QXmlSimpleReader *xmlReader = new QXmlSimpleReader();
00425 QXmlInputSource *source = new QXmlInputSource(file);
00426
00427 bool ok = xmlReader->parse(source);
00428
00429 if (!ok)
00430 _depura("Problemas en el parseo del archivo", 2);
00431
00432 file->close();
00433
00434 delete source;
00435 delete xmlReader;
00436 delete file;
00437
00438 _depura ("Exportacion completada. Su efactura se encuentra en " + nombrearchivo, 2);
00439
00440 _depura("END EFQToolButton::exporta_factura_ubl", 0);
00441 }
00442
00443
00445
00447 void EFQToolButton::click() {
00448
00449 _depura("EFQToolButton::click", 0);
00450
00451 if ( (!m_factura->dialogChanges_hayCambios()) && (m_factura->DBvalue("idfactura") != "") ) {
00452 exporta_factura_ubl();
00453 } else {
00454 _depura("Es necesario Guardar la factura antes de exportarla a UBL", 2);
00455 }
00456
00457 _depura("END EFQToolButton::click", 0);
00458 }
00459