registroiva.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Tomeu Borras Riera                              *
00003  *   tborras@conetxia.com                                                  *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
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         } // end try
00099     } // end if
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     } // end if
00158 
00159     delete cur;
00160 
00162     if (error) {
00163         _depura("Error en la carga del registro\n", 0);
00164         return -1;
00165     } // end if
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     } // end try
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         } // end if
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         } // end if
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         } // end if
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         } // end if
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         } // end if
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         } //end while
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         } // end while
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     } // end try
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         } // end if
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         } // end if
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             } // end if
00351             registro = cur->valor("idborrador").toInt();
00352             cur->siguienteregistro();
00353         } // end while
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     } // end try
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     } // end if
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         } // end if
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         } // end if
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         //22/09/07 Ahora se pasa el query
00451         //cursor2 *cur = empresaBase()->cargacursor(SQLQuery);
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     } // end try
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     } // end if
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         } // end if
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         } // end if
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         } // end if
00535         setnumorden(QString::number(numord));
00536     } // end if
00537     delete recordset; 
00538     _depura("END RegistroIva::buscaNumFactura", 0);
00539 }
00540 

Generated on Sat Dec 15 00:00:59 2007 for BulmaGes by  doxygen 1.5.1