00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <QWidget>
00024 #include <QCloseEvent>
00025 #include <QFile>
00026
00027 #include "empresabase.h"
00028 #include "ticket.h"
00029 #include "plugins.h"
00030
00033 typedef QMap<QString, Fixed> base;
00034
00035 Ticket::Ticket(EmpresaBase *emp, QWidget *parent) : BLWidget(emp, parent), DBRecord(emp) {
00036 _depura("Ticket::Ticket", 0);
00038 setDBTableName ( "albaran" );
00039 setDBCampoId ( "idalbaran" );
00040 addDBCampo ( "descalbaran", DBCampo::DBvarchar, DBCampo::DBNothing, QApplication::translate("Ticket", "descripcion"));
00041 addDBCampo ( "nomticket", DBCampo::DBvarchar, DBCampo::DBNoSave, QApplication::translate("Ticket", "nombre"));
00042 addDBCampo ( "idalbaran", DBCampo::DBint, DBCampo::DBPrimaryKey, QApplication::translate ( "Ticket", "Id albaran" ) );
00043 addDBCampo ( "fechaalbaran", DBCampo::DBdate, DBCampo::DBNothing, QApplication::translate ( "Ticket", "Id fechaalbaran" ) );
00044 addDBCampo ( "horaalbaran", DBCampo::DBvarchar, DBCampo::DBNoSave, QApplication::translate ( "Ticket", "hora" ) );
00045 addDBCampo ( "idtrabajador", DBCampo::DBint, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Trabajador" ) );
00046 addDBCampo ( "idcliente", DBCampo::DBint, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Cliente" ) );
00047 addDBCampo ( "idalmacen", DBCampo::DBint, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Almacen" ) );
00048 addDBCampo ( "numalbaran", DBCampo::DBint, DBCampo::DBNothing, QApplication::translate ( "Ticket", "Num" ) );
00049 addDBCampo ( "refalbaran", DBCampo::DBvarchar, DBCampo::DBNothing, QApplication::translate ( "Ticket", "Referencia" ) );
00050 addDBCampo ( "ticketalbaran", DBCampo::DBboolean, DBCampo::DBNothing, QApplication::translate ( "Ticket", "Ticket" ) );
00051
00052
00053 setDBvalue("ticketalbaran", "TRUE");
00054 setDBvalue("idalmacen", confpr->valor(CONF_IDALMACEN_DEFECTO));
00055 setDBvalue("idcliente", confpr->valor(CONF_IDCLIENTE_DEFECTO));
00056 setDBvalue("descalbaran", "Ticket de venta");
00057
00058 m_lineaActual = NULL;
00059 m_listaLineas = new QList<DBRecord *>;
00060
00061 _depura("END Ticket::Ticket", 0);
00062 }
00063
00064 Ticket::~Ticket() {
00065 _depura("Ticket::~Ticket", 0);
00066 _depura("END Ticket::~Ticket", 0);
00067 }
00068
00069 DBRecord * Ticket::agregarLinea() {
00070 _depura("Ticket::agregarLinea",0);
00071
00073 DBRecord * item = new DBRecord(empresaBase());
00074 item->setDBTableName ( "lalbaran" );
00075 item->setDBCampoId ( "numlalbaran" );
00076 item->addDBCampo ( "idalbaran", DBCampo::DBint, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Id Albaran" ) );
00077 item->addDBCampo ( "numlalbaran", DBCampo::DBint, DBCampo::DBPrimaryKey, QApplication::translate ( "Ticket", "Id lalbaran" ) );
00078 item->addDBCampo ( "cantlalbaran", DBCampo::DBnumeric, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Cantidad" ) );
00079 item->addDBCampo ( "pvplalbaran", DBCampo::DBnumeric, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Precio" ) );
00080 item->addDBCampo ( "ivalalbaran", DBCampo::DBnumeric, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "IVA" ) );
00081 item->addDBCampo ( "descuentolalbaran", DBCampo::DBnumeric, DBCampo::DBNothing, QApplication::translate ( "Ticket", "Descuento" ) );
00082 item->addDBCampo ( "ordenlalbaran", DBCampo::DBnumeric, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Orden" ) );
00083 item->addDBCampo ( "reqeqlalbaran", DBCampo::DBnumeric, DBCampo::DBNothing, QApplication::translate ( "Ticket", "REQ EQ" ) );
00084
00085 item->addDBCampo ( "idarticulo", DBCampo::DBint, DBCampo::DBNotNull, QApplication::translate ( "Ticket", "Id Articulo" ) );
00086 item->addDBCampo ( "codigocompletoarticulo", DBCampo::DBvarchar, DBCampo::DBNoSave, QApplication::translate ( "Ticket", "Codigo Articulo" ) );
00087 item->addDBCampo ( "nomarticulo", DBCampo::DBvarchar, DBCampo::DBNoSave, QApplication::translate ( "Ticket", "Nombre Articulo" ) );
00088 item->addDBCampo ( "desclalbaran", DBCampo::DBvarchar, DBCampo::DBNothing, QApplication::translate ( "Ticket", "Nombre Articulo" ) );
00089
00090
00091 item->setDBvalue("descuentolalbaran", "0");
00093 m_listaLineas->append(item);
00094
00095 _depura("END Ticket::agregarLinea",0);
00096 return item;
00097 }
00098
00099 void Ticket::pintar() {
00100 _depura("Ticket::pintar", 0, "Metodo para reimplementar en clases derivadas");
00102 int res = g_plugins->lanza("Ticket_pintar", this);
00103 if (res != 0) {
00104 return;
00105 }
00106 _depura("END Ticket::pintar", 0);
00107 }
00108
00109 QList<DBRecord *> *Ticket::listaLineas() {
00110 return m_listaLineas;
00111 }
00112
00113
00114 DBRecord *Ticket::insertarArticulo(QString idArticulo, Fixed cantidad, bool nuevaLinea) {
00115 _depura("Ticket::insertarArticulo", 0);
00116
00118 m_lineaActual = NULL;
00119 DBRecord *item;
00120 for (int i = 0; i < listaLineas()->size(); ++i) {
00121 item = listaLineas()->at(i);
00122 if (item->DBvalue("idarticulo") == idArticulo)
00123 m_lineaActual = item;
00124 }
00125
00126 if (m_lineaActual && nuevaLinea == FALSE) {
00128 Fixed cantidadib(m_lineaActual->DBvalue("cantlalbaran"));
00129 Fixed cant1 = cantidadib + cantidad;
00130 m_lineaActual->setDBvalue("cantlalbaran", cant1.toQString());
00131 } else {
00133 m_lineaActual = agregarLinea();
00134 m_lineaActual->setDBvalue("idarticulo", idArticulo);
00135 m_lineaActual->setDBvalue("cantlalbaran", cantidad.toQString());
00136
00138 QString query = "SELECT * FROM articulo WHERE idarticulo = " + idArticulo;
00139 cursor2 *cur = empresaBase()->cargacursor(query);
00140 if (!cur->eof()) {
00141 m_lineaActual->setDBvalue("pvplalbaran", cur->valor("pvparticulo"));
00142 m_lineaActual->setDBvalue("codigocompletoarticulo", cur->valor("codigocompletoarticulo"));
00143 m_lineaActual->setDBvalue("nomarticulo", cur->valor("nomarticulo"));
00144 m_lineaActual->setDBvalue("desclalbaran", cur->valor("nomarticulo"));
00145 }
00146
00147 cursor2 *cur1 = empresaBase()->cargacursor("SELECT * FROM tasa_iva WHERE idtipo_iva = " + cur->valor("idtipo_iva") + " ORDER BY fechatasa_iva LIMIT 1");
00148 if (!cur1->eof() )
00149 m_lineaActual->setDBvalue("ivalalbaran", cur1->valor("porcentasa_iva"));
00150 delete cur1;
00151 delete cur;
00152 }
00153
00154
00156 pintar();
00157
00158 _depura("END Ticket::insertarArticulo", 0);
00159 return m_lineaActual;
00160 }
00161
00162
00163 void Ticket::borrarArticulo(DBRecord *linea, Fixed cantidad) {
00165 if (m_lineaActual == NULL) {
00166 return;
00167 }
00168
00169 m_lineaActual->borrar();
00170
00171 }
00172
00173
00174 void Ticket::vaciarTicket() {}
00175
00176 void Ticket::subirPosArticulo(DBRecord *linea, int filas) {}
00177
00178 void Ticket::bajarPosArticulo(DBRecord *linea, int filas) {}
00179
00180 void Ticket::inicioPosTicket(DBRecord *) {}
00181
00182 void Ticket::finPosTicket(DBRecord *) {}
00183
00184
00185 DBRecord * Ticket::lineaTicket(int posicion) {
00186 return NULL;
00187 }
00188
00189
00190 DBRecord *Ticket::lineaActTicket() {
00191 return m_lineaActual;
00192 }
00193
00194 void Ticket::setLineaActual(DBRecord *rec) {
00195 m_lineaActual = rec;
00196 }
00197
00198
00199 void Ticket::setDescuentoGlobal(Fixed descuento) {}
00200
00201 void Ticket::imprimir() {
00202 base basesimp;
00203 base basesimpreqeq;
00204
00205 QFile file( confpr->valor(CONF_TICKET_PRINTER_FILE) );
00206 if ( !file.open(QIODevice::WriteOnly | QIODevice::Unbuffered)) {
00207 _depura("Error en la Impresion de ticket", 2);
00208 }
00209 file.write (QString("Empresa S.L\n").toAscii());
00210 file.write (QString("====================================\n").toAscii());
00211 file.write(QString("Direccion\n").toAscii());
00212 file.write(QString("CP: 07000 Palma de Mallorca\n").toAscii());
00213 file.write(QString("Tel: 971 00 00 00\n").toAscii());
00215 file.write ( "\n \n", 3);
00216
00218 file.write( QString("Ticket: ").toAscii());
00219 file.write( DBvalue("numalbaran").toAscii());
00220 file.write ( "\n", 1);
00221
00222
00224 file.write( QString("Fecha: ").toAscii());
00225 QDate fecha = QDate::currentDate();
00226 QString sfecha = fecha.toString("d-M-yyyy");
00227 file.write( sfecha.toAscii());
00228 QTime hora = QTime::currentTime();
00229 QString stime = " " + hora.toString("HH:mm");
00230 file.write( stime.toAscii());
00231 file.write ( "\n", 1);
00232
00233
00235 file.write( QString("Trabajador: ").toAscii());
00236 cursor2 *cur = empresaBase()->cargacursor("SELECT * FROM trabajador WHERE idtrabajador=" + DBvalue("idtrabajador"));
00237 if (!cur->eof()) {
00238 file.write( DBvalue("idtrabajador").toAscii());
00239 file.write(" ");
00240 file.write( cur->valor("nomtrabajador").toAscii());
00241 file.write ( "\n", 1);
00242 }
00243 delete cur;
00244
00246 cur = empresaBase()->cargacursor("SELECT * FROM cliente WHERE idcliente=" + DBvalue("idcliente"));
00247 if (!cur->eof()) {
00248 file.write( QString("Cliente: ").toAscii());
00249 file.write( cur->valor("cifcliente").toAscii());
00250 file.write ( " ", 1);
00251 file.write( cur->valor("nomcliente").toAscii());
00252 file.write ( "\n", 1);
00253 }
00254 delete cur;
00255
00257 cur = empresaBase()->cargacursor("SELECT * FROM almacen WHERE idalmacen=" + DBvalue("idalmacen"));
00258 if (!cur->eof()) {
00259 file.write( QString("Almacen: ").toAscii());
00260 file.write( cur->valor("nomalmacen").toAscii());
00261 file.write ( "\n", 1);
00262 }
00263 delete cur;
00264
00265
00266 file.write ( "\n", 1);
00267 file.write ( "\n", 1);
00268
00269
00270
00271
00272
00273
00275 QString l;
00276 Fixed irpf("0");
00277
00278 cur = empresaBase()->cargacursor("SELECT * FROM configuracion WHERE nombre = 'IRPF'");
00279 if (cur) {
00280 if (!cur->eof()) {
00281 irpf = Fixed(cur->valor("valor"));
00282 }
00283 delete cur;
00284 }
00285
00286 DBRecord *linea;
00287 Fixed descuentolinea("0.00");
00288 for (int i = 0; i < listaLineas()->size(); ++i) {
00289 linea = listaLineas()->at(i);
00290 Fixed cant(linea->DBvalue("cantlalbaran"));
00291 Fixed pvpund(linea->DBvalue("pvplalbaran"));
00292 Fixed desc1(linea->DBvalue("descuentolalbaran"));
00293 Fixed cantpvp = cant * pvpund;
00294 Fixed base = cantpvp - cantpvp * desc1 / 100;
00295 descuentolinea = descuentolinea + (cantpvp * desc1 / 100);
00296 basesimp[linea->DBvalue("ivalalbaran")] = basesimp[linea->DBvalue("ivalalbaran")] + base;
00297 basesimpreqeq[linea->DBvalue("reqeqlalbaran")] = basesimpreqeq[linea->DBvalue("reqeqlalbaran")] + base;
00299 QString str = linea->DBvalue("cantlalbaran").rightJustified(5,' ')+QString(" ")+linea->DBvalue("desclalbaran").leftJustified(24,' ', TRUE)+linea->DBvalue("pvplalbaran").rightJustified(10, ' ');
00300 file.write(str.toAscii());
00301 file.write ( "\n", 1);
00302 }
00303
00304
00305 file.write ( "\n", 1);
00306 file.write ( "\n", 1);
00307
00308 Fixed basei("0.00");
00309 base::Iterator it;
00310 for (it = basesimp.begin(); it != basesimp.end(); ++it) {
00311 basei = basei + it.value();
00312 }
00313
00316 Fixed porcentt("0.00");
00317
00318
00320 Fixed totbaseimp("0.00");
00321 Fixed parbaseimp("0.00");
00322 for (it = basesimp.begin(); it != basesimp.end(); ++it) {
00323 if (porcentt > Fixed("0.00")) {
00324 parbaseimp = it.value() - it.value() * porcentt / 100;
00325 } else {
00326 parbaseimp = it.value();
00327 }
00328 QString str = "Base Imp" + it.key() + "% " + parbaseimp.toQString().rightJustified(10,' ');
00329
00330
00331 totbaseimp = totbaseimp + parbaseimp;
00332 }
00333
00335 Fixed totiva("0.00");
00336 Fixed pariva("0.00");
00337 for (it = basesimp.begin(); it != basesimp.end(); ++it) {
00338 Fixed piva(it.key().toAscii().constData());
00339 if (porcentt > Fixed("0.00")) {
00340 pariva = (it.value() - it.value() * porcentt / 100) * piva / 100;
00341 } else {
00342 pariva = it.value() * piva / 100;
00343 }
00344 QString str = "IVA" + it.key() + "% " + pariva.toQString().rightJustified(10,' ');
00345
00346
00347
00348 totiva = totiva + pariva;
00349 }
00350
00352 Fixed totreqeq("0.00");
00353 Fixed parreqeq("0.00");
00354 for (it = basesimpreqeq.begin(); it != basesimpreqeq.end(); ++it) {
00355 Fixed preqeq(it.key().toAscii().constData());
00356 if (porcentt > Fixed("0.00")) {
00357 parreqeq = (it.value() - it.value() * porcentt / 100) * preqeq / 100;
00358 } else {
00359 parreqeq = it.value() * preqeq / 100;
00360 }
00361 QString str = "R. Eq" + it.key() + "% " + parreqeq.toQString().rightJustified(10,' ');
00362
00363
00364 totreqeq = totreqeq + parreqeq;
00365 }
00366
00367
00368
00369 Fixed totirpf = totbaseimp * irpf / 100;
00370
00371
00372
00373
00374 QString str = "B.IMP " + totbaseimp.toQString().rightJustified(10,' ');
00375
00376
00377
00378 str = "IVA " + totiva.toQString().rightJustified(10,' ');
00379
00380
00381
00382 str = "IRPF " + totirpf.toQString().rightJustified(10,' ');
00383
00384
00385
00386
00387 str = "( IVA INCLUIDO )";
00388 file.write(str.rightJustified(42,' ').toAscii());
00389 file.write ( "\n", 1);
00390
00391
00392
00394 file.write (QString("____________________\n").rightJustified(43,' ').toAscii());
00395
00396 Fixed total = totiva + totbaseimp + totreqeq - totirpf;
00397 str = "TOTAL " + total.toQString().rightJustified(10,' ');
00398 file.write(str.rightJustified(42,' ').toAscii());
00399 file.write ( "\n", 1);
00400
00401
00402
00403
00404
00406 file.write ( "\n \n \n \n", 7);
00407
00410 file.write ("\x1Dh\x40",3);
00412 file.write ( "\x1DH\x02",3);
00414 file.write ( "\x1D",1);
00415 file.write ( "f\x01",2);
00416 ;
00418 file.write ( "\x1D\x77\x01",3);
00420 file.write ( "\x1Dk\x04",3);
00421 file.write (QString("ALB").toAscii());
00422 file.write (" ", 1);
00423 file.write (DBvalue("idalbaran").toAscii());
00424 file.write (" ", 1);
00425 file.write (DBvalue("numalbaran").toAscii());
00426 file.write (" ", 1);
00427 file.write (DBvalue("refalbaran").toAscii());
00428 file.write ("\x00", 1);
00429
00430
00432
00433
00434
00435
00436
00437
00438
00440 file.write ( "\n \n \n \n \n", 9);
00441
00442
00444 file.write ("\x1D\x56\x01", 3);
00445 file.close();
00446 }
00447
00448
00449 void Ticket::subir() {
00450 int i = listaLineas()->indexOf(lineaActTicket());
00451 if (i > 0) i--;
00452 setLineaActual(listaLineas()->at(i));
00453 pintar();
00454 }
00455
00456 void Ticket::bajar() {
00457 int i = listaLineas()->indexOf(lineaActTicket());
00458 if (i < listaLineas()->size() -1) i++;
00459 setLineaActual(listaLineas()->at(i));
00460 pintar();
00461 }
00462
00463
00464 void Ticket::agregarCantidad(QString cantidad) {
00465 Fixed cant(cantidad);
00467 if (m_lineaActual == NULL) {
00468 mensajeAviso("No existe linea");
00469 return;
00470 }
00471 Fixed cantorig(m_lineaActual->DBvalue("cantlalbaran"));
00472 Fixed suma = cant + cantorig;
00473 if (suma == Fixed("0.00")) {
00474 listaLineas()->removeAt(listaLineas()->indexOf(m_lineaActual));
00475 m_lineaActual = listaLineas()->at(0);
00476 } else {
00477 m_lineaActual->setDBvalue("cantlalbaran", suma.toQString());
00478 }
00479 pintar();
00480 }
00481
00482 void Ticket::ponerCantidad(QString cantidad) {
00483 Fixed cant(cantidad);
00485 if (m_lineaActual == NULL) {
00486 mensajeAviso("No existe linea");
00487 return;
00488 }
00489
00490 if (cant == 0) {
00491 listaLineas()->removeAt(listaLineas()->indexOf(m_lineaActual));
00492 m_lineaActual = listaLineas()->at(0);
00493 } else {
00494 m_lineaActual->setDBvalue("cantlalbaran", cant.toQString());
00495 }
00496 pintar();
00497 }
00498
00499 void Ticket::ponerPrecio(QString precio) {
00500 Fixed valor(precio);
00502 if (m_lineaActual == NULL) {
00503 mensajeAviso("No existe linea");
00504 return;
00505 }
00506 m_lineaActual->setDBvalue("pvplalbaran", valor.toQString());
00507 pintar();
00508 }
00509
00510 void Ticket::insertarArticuloCodigo(QString codigo) {
00511 QString query = "SELECT * FROM articulo WHERE codigocompletoarticulo= '"+ codigo +"'";
00512 cursor2 *cur = empresaBase()->cargacursor(query);
00513 if (!cur->eof()) {
00514 insertarArticulo(cur->valor("idarticulo"), Fixed("1"));
00515 }
00516 delete cur;
00517 }
00518
00519 void Ticket::insertarArticuloCodigoNL(QString codigo) {
00520 QString query = "SELECT * FROM articulo WHERE codigocompletoarticulo= '"+ codigo +"'";
00521 cursor2 *cur = empresaBase()->cargacursor(query);
00522 if (!cur->eof()) {
00523 insertarArticulo(cur->valor("idarticulo"), Fixed("1"), TRUE);
00524 }
00525 delete cur;
00526 }
00527
00528
00529
00530
00532
00538 int Ticket::guardar() {
00539 _depura("Ticket::guardar", 0);
00540
00541 try {
00542 QString id;
00543 empresaBase()->begin();
00544 DBsave(id);
00545 DBRecord *item;
00546 for (int i = 0; i < listaLineas()->size(); ++i) {
00547 QString id1;
00548 item = listaLineas()->at(i);
00549 item->setDBvalue("idalbaran", id);
00550 item->setDBvalue("ordenlalbaran", QString::number(i));
00551 item->DBsave(id1);
00552 }
00553 empresaBase()->commit();
00554
00555 cursor2 *cur = empresaBase()->cargacursor("SELECT * FROM albaran WHERE idalbaran = " + id);
00556 DBload(cur);
00557 delete cur;
00558
00559 _depura("END Ticket::guardar", 0);
00560 return 0;
00561 } catch (...) {
00562 mensajeInfo("Error inesperado con la base de datos");
00563 empresaBase()->rollback();
00564 return -1;
00565 }
00566 }
00567