00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <QFile>
00022 #include <QTextStream>
00023
00024 #include "registroiva.h"
00025 #include "empresa.h"
00026 #include "configuracion.h"
00027 #include "fixed.h"
00028 #include "funcaux.h"
00029 #include "plugins.h"
00030
00031 typedef QMap<QString, Fixed> base;
00032
00033
00035
00039 RegistroIva::RegistroIva(Empresa *comp, QWidget *parent) : FichaBc(comp, parent) {
00040 _depura("RegistroIva::RegistroIva", 0);
00041 setTitleName(tr("Registro IVA"));
00042 setDBTableName("registroiva");
00043 setDBCampoId("idregistroiva");
00044 addDBCampo("idregistroiva", DBCampo::DBint, DBCampo::DBPrimaryKey, "Identificador");
00045 addDBCampo("contrapartida", DBCampo::DBint, DBCampo::DBNotNull, "Contrapartida");
00046 addDBCampo("baseimp", DBCampo::DBnumeric, DBCampo::DBNotNull, "Base Imponible");
00047 addDBCampo("iva", DBCampo::DBnumeric, DBCampo::DBNotNull, "Iva");
00048 addDBCampo("ffactura", DBCampo::DBdate, DBCampo::DBNotNull, "Fecha Factura");
00049 addDBCampo("idborrador", DBCampo::DBint, DBCampo::DBNotNull, "Borrador");
00050 addDBCampo("numorden", DBCampo::DBint, DBCampo::DBNotNull, "Orden");
00051 addDBCampo("cif", DBCampo::DBvarchar, DBCampo::DBNotNull, "CIF");
00052 addDBCampo("idfpago", DBCampo::DBint, DBCampo::DBNothing, "Forma de Pago");
00053 addDBCampo("incregistro", DBCampo::DBboolean, DBCampo::DBNotNull, "incregistro");
00054 addDBCampo("regularizacion", DBCampo::DBboolean, DBCampo::DBNothing, "regularizacion");
00055 addDBCampo("plan349", DBCampo::DBboolean, DBCampo::DBNothing, "plan 349");
00056 addDBCampo("factemitida", DBCampo::DBboolean, DBCampo::DBNotNull, "Factura Emitida");
00057 addDBCampo("rectificaaregistroiva", DBCampo::DBint, DBCampo::DBNothing, "Rectifica a");
00058 addDBCampo("factura", DBCampo::DBvarchar, DBCampo::DBNothing, "Factura");
00059 addDBCampo("femisionregistroiva", DBCampo::DBdate, DBCampo::DBNotNull, "Fecha Emision");
00060 addDBCampo("serieregistroiva", DBCampo::DBvarchar, DBCampo::DBNothing, "Serie");
00061 _depura("END RegistroIva::RegistroIva", 0);
00062 }
00063
00064
00066
00068 RegistroIva::~RegistroIva() {
00069 _depura("RegistroIva::~RegistroIva", 0);
00070 _depura("RegistroIva::~RegistroIva", 0);
00071 }
00072
00073
00075
00078 int RegistroIva::borrar() {
00079 _depura("RegistroIva::borraRegistroIva", 0);
00080 if (DBvalue("idregistroiva") != "") {
00081 empresaBase()->begin();
00082 try {
00083 int error = empresaBase()->ejecuta("DELETE FROM iva WHERE idregistroiva = " + DBvalue("idregistroiva"));
00084
00085 if (error) throw -1;
00086
00087 error = empresaBase()->ejecuta("DELETE FROM registroiva WHERE idregistroiva = " + DBvalue("idregistroiva"));
00088
00089 if (error) throw -1;
00090
00091 empresaBase()->commit();
00092 _depura("Registro borrado satisfactoriamente", 2);
00093 dialogChanges_cargaInicial();
00094 close();
00095 } catch (...) {
00096 _depura("No se pudo borrar el registro de IVA", 2);
00097 empresaBase()->rollback();
00098 }
00099 }
00100 _depura("END RegistroIva::borraRegistroIva", 0);
00101 return 0;
00102 }
00103
00104
00106
00108 void RegistroIva::vaciaRegistroIva() {
00109 _depura("RegistroIva::vaciaRegistroIva", 0);
00110 DBclear();
00111 _depura("END RegistroIva::vaciaRegistroIva", 0);
00112 }
00113
00114
00116
00118 void RegistroIva::pintaRegistroIva() {
00119 _depura("RegistroIva::pintaRegistroIva", 0);
00120 pintaidregistroiva(DBvalue("idregistroiva"));
00121 pintacontrapartida(DBvalue("contrapartida"));
00122 pintabaseimp(DBvalue("baseimp"));
00123 pintaiva(DBvalue("iva"));
00124 pintaffactura(DBvalue("ffactura"));
00125 pintafactura(DBvalue("factura"));
00126 pintaidborrador(DBvalue("idborrador"));
00127 pintaincregistro(DBvalue("incregistro"));
00128 pintaregularizacion(DBvalue("regularizacion"));
00129 pintaplan349(DBvalue("plan349"));
00130 pintanumorden(DBvalue("numorden"));
00131 pintacif(DBvalue("cif"));
00132 pintaidfpago(DBvalue("idfpago"));
00133 pintafactemitida(DBvalue("factemitida"));
00134 pintarectificaaregistroiva(DBvalue("rectificaaregistroiva"));
00135 pintafemisionregistroiva(DBvalue("femisionregistroiva"));
00136 pintaserieregistroiva(DBvalue("serieregistroiva"));
00137 calculaypintatotales();
00138 _depura("END RegistroIva::pintaRegistroIva", 0);
00139 }
00140
00141
00143
00147 int RegistroIva::cargar(QString id) {
00148 _depura("RegistroIva::cargaRegistroIva", 0);
00149 int error = 0;
00150 QString query = "SELECT * FROM registroiva WHERE idregistroiva = " + id;
00151 cursor2 *cur= empresaBase()->cargacursor(query);
00152
00153 if (cur->error()) error = 1;
00154
00155 if (!cur->eof()) {
00156 DBload(cur);
00157 }
00158
00159 delete cur;
00160
00162 if (error) {
00163 _depura("Error en la carga del registro\n", 0);
00164 return -1;
00165 }
00166
00167 dialogChanges_cargaInicial();
00168 _depura("END RegistroIva::cargaRegistroIva", 0);
00169 return 0;
00170 }
00171
00172
00174
00177 int RegistroIva::guardar() {
00178 _depura("RegistroIva::guardaRegistroIva", 0);
00179 QString id;
00180 try {
00181 DBsave(id);
00182 setidregistroiva(id);
00183 } catch (...) {
00184 _depura("RegistroIva::guardar Error al guardar", 2);
00185 throw -1;
00186 }
00187 _depura("END RegistroIva::guardaRegistroIva", 0);
00188 return 0;
00189 }
00190
00191
00193
00205 int RegistroIva::buscaborradorservicio(int idborrador) {
00206 _depura("RegistroIva::buscaborradorservicio", 0);
00207 QString SQLQuery;
00208 int registro = 0;
00209 try {
00210 SQLQuery.sprintf("CREATE TEMPORARY TABLE lacosa AS SELECT idborrador, bcontrapartidaborr(idborrador) AS contrapartida , cuenta.idcuenta AS idcuenta, codigo, borrador.debe - borrador.haber AS baseimp FROM borrador, cuenta where borrador.idcuenta=cuenta.idcuenta AND borrador.idasiento IN (SELECT idasiento FROM borrador WHERE idborrador = %d)", idborrador);
00211 empresaBase()->begin();
00212 int error = empresaBase()->ejecuta(SQLQuery);
00213 SQLQuery.sprintf("DELETE FROM lacosa WHERE idborrador NOT IN (SELECT idborrador FROM lacosa WHERE idborrador = %d UNION SELECT contrapartida AS idborrador FROM lacosa WHERE idborrador = %d) AND contrapartida NOT IN (SELECT idborrador FROM lacosa WHERE idborrador = %d UNION SELECT contrapartida AS idborrador FROM lacosa WHERE idborrador = %d)", idborrador, idborrador, idborrador, idborrador);
00214 error = empresaBase()->ejecuta(SQLQuery);
00215
00216 if (error) {
00217 _depura("Error en la creacion del temporary table", 2);
00218 empresaBase()->rollback();
00219 return -1;
00220 }
00221
00224 QString cuentas = "";
00225 SQLQuery = "SELECT valor FROM configuracion WHERE nombre = 'CuentasIngresos'";
00226 cursor2 *cur = empresaBase()->cargacursor(SQLQuery);
00227
00228 if (!cur->eof()) {
00229 cuentas += cur->valor("valor");
00230 }
00231
00232 delete cur;
00233 SQLQuery = "SELECT valor FROM configuracion WHERE nombre = 'CuentasGastos'";
00234 cur = empresaBase()->cargacursor(SQLQuery);
00235
00236 if (!cur->eof()) {
00237 cuentas += ";" + cur->valor("valor");
00238 }
00239
00240 delete cur;
00241 cuentas.replace(';',"%|^");
00242 cuentas = "'^" + cuentas + "%'";
00244 QString cuentasIVA = "";
00245 SQLQuery = "SELECT valor FROM configuracion WHERE nombre = 'RegistroEmitida'";
00246 cur=empresaBase()->cargacursor(SQLQuery);
00247
00248 if (!cur->eof()) {
00249 cuentasIVA += cur->valor("valor");
00250 }
00251
00252 delete cur;
00253 SQLQuery = "SELECT valor FROM configuracion WHERE nombre = 'RegistroSoportada'";
00254 cur = empresaBase()->cargacursor(SQLQuery);
00255
00256 if (!cur->eof()) {
00257 cuentasIVA += ";" + cur->valor("valor");
00258 }
00259
00260 delete cur;
00261 cuentasIVA.replace(';', "%|^");
00262 cuentasIVA = "'^" + cuentasIVA + "%'";
00264 SQLQuery = "SELECT * FROM lacosa WHERE codigo SIMILAR TO " + cuentas + " OR codigo SIMILAR TO " + cuentasIVA;
00265 cur = empresaBase()->cargacursor(SQLQuery);
00266
00267 while (!cur->eof()) {
00268 fprintf(stderr, "idborrador: %s contrapartida: %s cuenta: %s\n", cur->valor("idborrador").toAscii().constData(), cur->valor("contrapartida").toAscii().constData(), cur->valor("codigo").toAscii().constData());
00269 registro = atoi(cur->valor("idborrador").toAscii().constData());
00270 cur->siguienteregistro();
00271 }
00272
00273 delete cur;
00277 SQLQuery = "SELECT abs(sum(baseimp)) AS subtotal FROM lacosa, (SELECT baseimp AS iva FROM lacosa WHERE codigo SIMILAR TO "+cuentasIVA+") AS iva WHERE codigo SIMILAR TO " + cuentas + " AND (iva.iva*100/baseimp)::NUMERIC(2,0) IN (SELECT porcentajetipoiva FROM tipoiva)";
00278 cur = empresaBase()->cargacursor(SQLQuery);
00279
00280 if (!cur->eof()) {
00281 setbaseimp(cur->valor("subtotal"));
00282 }
00283
00284 delete cur;
00285 SQLQuery = "DROP TABLE lacosa";
00286 error = empresaBase()->ejecuta(SQLQuery);
00287 empresaBase()->commit();
00288 } catch (...) {
00289 _depura("RegistroIva:: Error en transaccion", 2);
00290 empresaBase()->rollback();
00291 }
00292 _depura("END RegistroIva::buscaborradorservicio", 0);
00293 return registro;
00294 }
00295
00296
00298
00304 int RegistroIva::buscaborradorcliente(int idborrador) {
00305 _depura("RegistroIva::buscaborradorcliente", 0);
00306 QString SQLQuery;
00307 int registro = 0;
00308 try {
00309 empresaBase()->begin();
00310 SQLQuery.sprintf("CREATE TEMPORARY TABLE lacosa AS SELECT idborrador, bcontrapartidaborr(idborrador) AS contrapartida , cuenta.cifent_cuenta, cuenta.idcuenta AS idcuenta, codigo, borrador.debe AS debe, borrador.haber AS haber, borrador.debe+borrador.haber AS totalfactura FROM borrador LEFT JOIN cuenta ON borrador.idcuenta=cuenta.idcuenta where borrador.idasiento IN (SELECT idasiento FROM borrador WHERE idborrador = %d)", idborrador);
00311 int error = empresaBase()->ejecuta(SQLQuery);
00312
00313 SQLQuery.sprintf("DELETE FROM lacosa WHERE idborrador NOT IN (SELECT idborrador FROM lacosa WHERE idborrador = %d UNION SELECT contrapartida AS idborrador FROM lacosa WHERE idborrador = %d) AND contrapartida NOT IN (SELECT idborrador FROM lacosa WHERE idborrador = %d UNION SELECT contrapartida AS idborrador FROM lacosa WHERE idborrador = %d)", idborrador, idborrador, idborrador, idborrador);
00314 error = empresaBase()->ejecuta(SQLQuery);
00321 QString cuentas = "";
00322 SQLQuery = "SELECT valor FROM configuracion WHERE nombre = 'CuentasDerechos'";
00323 cursor2 *cur1 = empresaBase()->cargacursor(SQLQuery);
00324 if (!cur1->eof()) {
00325 cuentas += cur1->valor("valor");
00326 }
00327 delete cur1;
00328 SQLQuery = "SELECT valor FROM configuracion WHERE nombre = 'CuentasObligaciones'";
00329 cur1 = empresaBase()->cargacursor(SQLQuery);
00330 if (!cur1->eof()) {
00331 cuentas += ";" + cur1->valor("valor");
00332 }
00333 delete cur1;
00334 cuentas.replace(';', "%|^");
00335 cuentas = "'^" + cuentas + "%'";
00336
00338 SQLQuery = "SELECT * FROM lacosa WHERE codigo SIMILAR TO " + cuentas;
00339 cursor2 *cur = empresaBase()->cargacursor(SQLQuery);
00340 while (!cur->eof()) {
00342 setcontrapartida(cur->valor("idcuenta"));
00343 setcif(cur->valor("cifent_cuenta"));
00346 if (cur->valor("codigo").left(2) == "43") {
00347 setfactemitida("t");
00348 } else {
00349 setfactemitida( "f");
00350 }
00351 registro = cur->valor("idborrador").toInt();
00352 cur->siguienteregistro();
00353 }
00354 delete cur;
00355 SQLQuery = "DROP TABLE lacosa";
00356 error = empresaBase()->ejecuta(SQLQuery);
00357 empresaBase()->commit();
00358 } catch (...) {
00359 _depura("RegistroIva:: Error en buscaborradorcliente", 2);
00360 empresaBase()->rollback();
00361 }
00362 _depura("ENd RegistroIva::buscaborradorcliente", 0);
00363 return registro;
00364 }
00365
00366
00375
00376
00379 void RegistroIva::inicializa1(int idapunte1) {
00380 _depura("RegistroIva::inicializa1", 0);
00381 QString query, cadena;
00382 int idborrador;
00384 idborrador = buscaborradorcliente(idapunte1);
00387 if (idborrador <= 0)
00388 idborrador = idapunte1;
00390 query.sprintf ( "SELECT * FROM registroiva WHERE idborrador = %d", idborrador);
00391 cursor2 *cursoriva = empresaBase()->cargacursor(query);
00392 if (!cursoriva->eof()) {
00394 cargar( cursoriva->valor("idregistroiva"));
00395 } else {
00398 buscaborradoriva(idapunte1);
00400 buscafecha(idapunte1);
00402 buscaborradorservicio(idapunte1);
00403 buscaNumFactura(idapunte1);
00404 setidborrador(QString::number(idapunte1));
00405 }
00406 delete cursoriva;
00407 pintaRegistroIva();
00408 _depura("END RegistroIva::inicializa1", 0);
00409 }
00410
00411
00421
00422
00426 int RegistroIva::buscaborradoriva(int idborrador) {
00427 _depura("RegistroIva::buscaborradoriva", 0);
00428 int error = 0;
00429 try {
00430 empresaBase()->begin();
00431 QString SQLQuery;
00432 SQLQuery.sprintf("CREATE TEMPORARY TABLE lacosa AS SELECT borrador.debe AS ivadebe, borrador.haber AS ivahaber, idborrador, bcontrapartidaborr(idborrador) AS contrapartida , cuenta.idcuenta AS idcuenta, codigo, borrador.fecha AS fecha FROM borrador, cuenta WHERE borrador.idcuenta=cuenta.idcuenta AND borrador.idasiento IN (SELECT idasiento FROM borrador WHERE idborrador = %d)", idborrador);
00433 error = empresaBase()->ejecuta(SQLQuery);
00434 if (error) {
00435 _depura("error en la base de datos", 2);
00436 _depura(SQLQuery, 2);
00437 }
00438
00439 SQLQuery.sprintf("DELETE FROM lacosa WHERE idborrador NOT IN (SELECT idborrador FROM lacosa WHERE idborrador = %d UNION SELECT contrapartida AS idborrador FROM lacosa WHERE idborrador = %d) AND contrapartida NOT IN (SELECT idborrador FROM lacosa WHERE idborrador = %d UNION SELECT contrapartida AS idborrador FROM lacosa WHERE idborrador = %d)", idborrador, idborrador, idborrador, idborrador);
00440 error = empresaBase()->ejecuta(SQLQuery);
00441
00442 if (error) {
00443 _depura("error en la base de datos", 2);
00444 _depura(SQLQuery, 2);
00445 }
00446
00448 SQLQuery = "SELECT *, GREATEST(debe * 100 / porcentajetipoiva, haber * 100 / porcentajetipoiva)::NUMERIC(12, 1) AS baseiva, GREATEST (ivadebe, ivahaber) AS ivaiva FROM tipoiva ";
00449 SQLQuery += " LEFT JOIN (SELECT *, ivadebe AS debe, ivahaber AS haber FROM lacosa) AS lacosa ON tipoiva.idcuenta = lacosa.idcuenta ";
00450
00451
00452 m_lineas->cargar(SQLQuery);
00453 recalculaIva();
00454 _depura("limpiamos la base de datos");
00455 SQLQuery = "DROP TABLE lacosa";
00456 error = empresaBase()->ejecuta(SQLQuery);
00457 empresaBase()->commit();
00458 } catch (...) {
00459 _depura("Error al buscar el borrador", 2);
00460 empresaBase()->rollback();
00461 }
00462 _depura("END RegistroIva::buscaborradoriva", 0);
00463 return 0;
00464 }
00465
00466
00468
00471 void RegistroIva::buscafecha(int idborrador) {
00472 _depura("RegistroIva::buscafecha", 0);
00473 QString SQLQuery;
00474 cursor2 *cur = empresaBase()->cargacursor("SELECT fecha from borrador WHERE idborrador = " + QString::number(idborrador));
00475 if (!cur->eof()) {
00476 setffactura(cur->valor("fecha").left(10));
00477 setfemisionregistroiva(cur->valor("fecha").left(10));
00478 }
00479 delete cur;
00480 _depura("END RegistroIva::buscafecha", 0);
00481 }
00482
00483
00489
00492 void RegistroIva::buscaNumFactura(int idborrador) {
00493 _depura("RegistroIva::buscaNumFactura", 0);
00494 QString query;
00495 cursor2 *recordset;
00496 QString cadena;
00497 int numord;
00498 query.sprintf("SELECT factura, numorden FROM registroiva WHERE idborrador IN (SELECT idborrador FROM borrador WHERE idasiento=(SELECT idasiento FROM borrador WHERE idborrador = '%i'))", idborrador);
00499 recordset = empresaBase()->cargacursor(query);
00500 if (!recordset->eof()) {
00501 setfactura( recordset->valor("factura"));
00502 setnumorden( recordset->valor("numorden"));
00503 } else {
00507 query.sprintf("SELECT * FROM borrador WHERE idasiento IN (SELECT idasiento FROM borrador WHERE idborrador = '%i') AND debe = 0", idborrador);
00508 recordset = empresaBase()->cargacursor(query, "recordset");
00509
00510 QString num_ser = recordset->valor("conceptocontable");
00511 QRegExp patrons(" ([A-Z]*)[0-9]+$");
00512 if (patrons.indexIn(num_ser) > -1) {
00513 num_ser = patrons.cap(1);
00514 } else {
00515 num_ser = "Normal";
00516 }
00517 setserieregistroiva(num_ser);
00518
00519 QString num_fra = recordset->valor("conceptocontable");
00520 QRegExp patron(" [A-Z]*([0-9]+)$");
00521 if (patron.indexIn(num_fra) > -1) {
00522 num_fra = patron.cap(1);
00523 } else {
00524 num_fra = "0";
00525 }
00526 setfactura(num_fra);
00528 query.sprintf("SELECT MAX(to_number(numorden,'99999')) AS numorden FROM registroiva WHERE numorden <> ''");
00529 recordset = empresaBase()->cargacursor(query, "recordset");
00530 if (!recordset->eof()) {
00531 numord = 1 + atoi(recordset->valor("numorden").toAscii().constData());
00532 } else {
00533 numord = 1;
00534 }
00535 setnumorden(QString::number(numord));
00536 }
00537 delete recordset;
00538 _depura("END RegistroIva::buscaNumFactura", 0);
00539 }
00540