Billing program for the appliance repair company Seoane.
1#include "NuevaFacturaDialog.h"
2#include "NuevoClienteDialog.h"
3#include <QRegExp>
4#include <list>
5#include <iostream>
6#include <QtGui>
7#include <QThread>
8#include <QMutex>
9#include "PrintWindow.h"
10#include "../Negocio/Articulo.h"
11
12using namespace std;
13
14QMutex mutex;
15
16 void ActualizadorThread::setPadre(NuevaFacturaDialog* parent) {
17 nfd = parent;
18 }
19 void ActualizadorThread::run() {
20 while (true) {
21 usleep(10000);
22 nfd->actualizaPrecios();
23 }
24 }
25
26NuevaFacturaDialog::NuevaFacturaDialog(CapaNegocio * const cn, QWidget *parent, Factura *f, bool dePresupuesto)
27 : QDialog(parent)
28{
29 this->dePresupuesto = dePresupuesto;
30 ui.setupUi(this);
31 capaNegocio = cn;
32 lClientes = capaNegocio->getClientes();
33 lArticulos = capaNegocio->getArticulos();
34 setWindowIcon(QIcon(QString::fromUtf8("Gui/images/NFactura.PNG")));
35
36 cliente = 0;
37 padre = 0;
38 nuevaFactura = new Factura();
39
40 //ui.lineEdit_7->installEventFilter(this);
41 //ui.lineEdit_8->installEventFilter(this);
42 //ui.lineEdit_9->installEventFilter(this);
43
44 ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
45
46 ui.lineEdit_11->setText(tr("%1").arg(capaNegocio->obtenerIva()));
47 QDate hoy = QDate::currentDate();
48 ui.dateEdit->setDate(hoy);
49 ui.dateEdit_2->setDate(hoy);
50 ui.lineEdit_10->setEnabled(false);
51 ui.lineEdit_12->setEnabled(false);
52 int num = capaNegocio->getUltimoCodigoFactura();
53 if (num < 100000) {
54 ui.lineEdit_4->setText(tr("0%1").arg(num));
55 } else {
56 ui.lineEdit_4->setText(tr("%1").arg(num));
57 }
58
59 int cod = capaNegocio->getUltimoCodigoCliente();
60 ui.codigoEdit->setText(QString::number(cod));
61
62 connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(anyadirLineaArticulo()));
63 connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(borrarArticulo()));
64 connect(ui.pushButton_7, SIGNAL(clicked()), this, SLOT(limpiar()));
65 connect(ui.pushButton_6, SIGNAL(clicked()), this, SLOT(nuevoTelefono()));
66 connect(ui.pushButton_8, SIGNAL(clicked()), this, SLOT(borrarTelefono()));
67 connect(ui.checkBox_2, SIGNAL(clicked()), this, SLOT(cambiarEstadoDomicilio()));
68 connect(ui.checkBox_3, SIGNAL(clicked()), this, SLOT(cambiarEstadoTaller()));
69 connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(imprimir()));
70
71 if (f != 0) {
72 *nuevaFactura = *f;
73 padre = (ListarFacturas *)parent;
74 setWindowTitle(tr("Editar Factura"));
75 cliente = new Cliente();
76 if (f->getcliente() != 0) {
77 *cliente = *(f->getcliente());
78 ui.nombreEdit->setText(cliente->getnombre().c_str());
79 ui.nombreEdit->setEnabled(false);
80 ui.lineEdit_13->setText(cliente->getapellidos().c_str());
81 ui.lineEdit_13->setEnabled(false);
82 ui.codigoEdit->setText(tr("%1").arg(cliente->getcodigo()));
83 ui.codigoEdit->setEnabled(false);
84 QString direccion;
85 direccion.append(cliente->getdireccion().c_str());
86 QTextDocument *direccionCompleta = new QTextDocument(direccion);
87 ui.direccionEdit->setDocument(direccionCompleta);
88 ui.direccionEdit->setEnabled(false);
89 ui.lineEdit_14->setText(cliente->getpoblacion().c_str());
90 ui.lineEdit_14->setEnabled(false);
91 ui.nifEdit->setText(cliente->getnif().c_str());
92 ui.nifEdit->setEnabled(false);
93 ui.pushButton_6->setEnabled(false);
94 ui.pushButton_8->setEnabled(false);
95 list<int> lista_telefonos = cliente->gettelefonos();
96 list<int>::iterator it2;
97 int row;
98 for (it2 = lista_telefonos.begin(), row = 0; it2 != lista_telefonos.end(); it2++, row++) {
99 addRowTelefono();
100 ui.tabla->item(row, 0)->setText(tr("%1").arg(*it2));
101 }
102 ui.tabla->setEnabled(false);
103 } else {
104 ui.nombreEdit->setEnabled(false);
105 ui.lineEdit_13->setEnabled(false);
106 ui.codigoEdit->setEnabled(false);
107 ui.pushButton_6->setEnabled(false);
108 ui.direccionEdit->setEnabled(false);
109 ui.lineEdit_14->setEnabled(false);
110 ui.nifEdit->setEnabled(false);
111 ui.tabla->setEnabled(false);
112 }
113 if (f->getn_factura() < 100000) {
114 ui.lineEdit_4->setText(tr("0%1").arg(f->getn_factura()));
115 } else {
116 ui.lineEdit_4->setText(tr("%1").arg(f->getn_factura()));
117 }
118 if (f->getfecha()!= "") {
119 ui.checkBox->setChecked(true);
120 ui.dateEdit->setEnabled(true);
121 QDate fecha = QDate::fromString(f->getfecha().c_str(), "dd/MM/yyyy");
122 ui.dateEdit->setDate(fecha);
123 }
124 if (f->getfecha_terminacion()!= "") {
125 ui.checkBox_4->setChecked(true);
126 ui.dateEdit_2->setEnabled(true);
127 QDate fecha = QDate::fromString(f->getfecha_terminacion().c_str(), "dd/MM/yyyy");
128 ui.dateEdit_2->setDate(fecha);
129 }
130 ui.lineEdit_15->setText(f->getobservaciones().c_str());
131 ui.lineEdit->setText(f->getaparato().c_str());
132 ui.lineEdit_2->setText(f->getmarca().c_str());
133 ui.lineEdit_3->setText(f->getmodelo().c_str());
134
135 if (f->getlugar_reparacion() != 0)
136 if (*(f->getlugar_reparacion())) {
137 ui.checkBox_2->setChecked(true);
138 ui.checkBox_3->setChecked(false);
139 } else {
140 ui.checkBox_2->setChecked(false);
141 ui.checkBox_3->setChecked(true);
142 }
143 else {
144 ui.checkBox_2->setChecked(false);
145 ui.checkBox_3->setChecked(false);
146 }
147 QString averia;
148 averia.append(f->getaveria().c_str());
149 QTextDocument *averiaC = new QTextDocument(averia);
150 ui.textEdit->setDocument(averiaC);
151 QString trabajo;
152 trabajo.append(f->gettrabajo_realizado().c_str());
153 QTextDocument *trabajoC = new QTextDocument(trabajo);
154 ui.textEdit_2->setDocument(trabajoC);
155 ui.lineEdit_5->setText(f->gettiempo_empleado().c_str());
156 ui.lineEdit_6->setText(tr("%1").arg(f->getMateriales()));
157 ui.lineEdit_7->setText(tr("%1").arg(f->getprecio_mano_obra()));
158 ui.lineEdit_8->setText(tr("%1").arg(f->getprecio_desplazamiento()));
159 ui.lineEdit_9->setText(tr("%1").arg(f->getprecio_transporte()));
160 ui.lineEdit_10->setText(tr("%1").arg(f->getSubTotal()));
161 ui.lineEdit_11->setText(tr("%1").arg(f->getiva()));
162 ui.lineEdit_12->setText(tr("%1").arg(f->getTotal()));
163
164 list<LineaArticulo> lista = f->getlista_articulos();
165 list<LineaArticulo>::iterator it;
166 for (it = lista.begin(); it != lista.end(); it++) {
167 int row = ui.tableWidget->rowCount();
168 int cantidad = it->getcantidad();
169 addRow();
170 ui.tableWidget->item(row, 0)->setText(tr("%1").arg(it->getarticulo().getcodigo()));
171 ui.tableWidget->item(row, 1)->setText(it->getarticulo().getdescripcion().c_str());
172 ui.tableWidget->item(row, 2)->setText(tr("%1").arg(cantidad));
173 ui.tableWidget->item(row, 3)->setText(tr("%1").arg(it->getarticulo().getpvp()));
174 ui.tableWidget->item(row, 4)->setText(tr("%1").arg(it->getarticulo().getpvp() * (double)cantidad));
175 }
176 if (!dePresupuesto) {
177 ui.pushButton_7->setText(tr("Modificar"));
178 connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(editar()));
179 } else {
180 connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(guardar()));
181 }
182 } else {
183 connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(guardar()));
184 }
185
186 // Cosas de hilos
187 actualizador = new ActualizadorThread();
188 actualizador->setPadre(this);
189 actualizador->start();
190}
191
192NuevaFacturaDialog::~NuevaFacturaDialog()
193{
194 actualizador->quit();
195}
196
197void NuevaFacturaDialog::buscarCliente() {
198 QString nombreParcial = (ui.nombreEdit->text() + "*" ) + ui.lineEdit_13->text();
199 QRegExp rx(nombreParcial + "*");
200 rx.setPatternSyntax(QRegExp::Wildcard);
201 rx.setCaseSensitivity(Qt::CaseInsensitive);
202
203 list<Cliente> lClientesEncontrados;
204 list<Cliente>::iterator it;
205
206 for (it = lClientes.begin(); it != lClientes.end(); it++) {
207 QString nombre(((it->getnombre() + " ") + it->getapellidos()).c_str());
208 if (rx.exactMatch(nombre)) {
209 lClientesEncontrados.push_back(*it);
210 }
211 }
212
213 if (lClientesEncontrados.size() == 1) {
214
215 cliente = new Cliente();
216 *cliente = lClientesEncontrados.front();
217 ui.nombreEdit->setText(cliente->getnombre().c_str());
218 ui.lineEdit_13->setText(cliente->getapellidos().c_str());
219 ui.codigoEdit->setText(tr("%1").arg(cliente->getcodigo()));
220 QString direccion;
221 direccion.append(cliente->getdireccion().c_str());
222 QTextDocument *direccionCompleta = new QTextDocument(direccion);
223 ui.direccionEdit->setDocument(direccionCompleta);
224 ui.lineEdit_14->setText(cliente->getpoblacion().c_str());
225 ui.nifEdit->setText(cliente->getnif().c_str());
226 while (ui.tabla->rowCount() > 0) {
227 ui.tabla->removeRow(0);
228 }
229 list<int> lista_telefonos = cliente->gettelefonos();
230 list<int>::iterator it;
231 int row;
232 for (it = lista_telefonos.begin(), row = 0; it != lista_telefonos.end(); it++, row++) {
233 addRowTelefono();
234 ui.tabla->item(row, 0)->setText(tr("%1").arg(*it));
235 }
236 cambiarCliente();
237 }
238
239}
240
241void NuevaFacturaDialog::buscarArticulo() {
242
243 QString nombreParcial = ui.descripcionEdit->text();
244 QRegExp rx(nombreParcial + "*");
245 rx.setPatternSyntax(QRegExp::Wildcard);
246 rx.setCaseSensitivity(Qt::CaseInsensitive);
247
248 list<Articulo> lArticulosEncontrados;
249 list<Articulo>::iterator it;
250
251 if (ui.referenciaEdit->hasFocus()) {
252 for (it = lArticulos.begin(); it != lArticulos.end(); it++) {
253 if (ui.referenciaEdit->text().toInt() == it->getcodigo()) {
254 lArticulosEncontrados.push_back(*it);
255 }
256 }
257 } else {
258 for (it = lArticulos.begin(); it != lArticulos.end(); it++) {
259 QString nombre((it->getdescripcion()).c_str());
260 if (rx.exactMatch(nombre)) {
261 lArticulosEncontrados.push_back(*it);
262 }
263 }
264 }
265
266 if (lArticulosEncontrados.size() == 1) {
267 articuloActual = lArticulosEncontrados.front();
268 ui.descripcionEdit->setText(articuloActual.getdescripcion().c_str());
269 ui.referenciaEdit->setText(tr("%1").arg(articuloActual.getcodigo()));
270 ui.pvpEdit->setText(tr("%1").arg(articuloActual.getpvp() - articuloActual.getpvp()*(articuloActual.getdescuento() / 100.0)));
271 ui.cantidadEdit->setValue(1);
272 }
273
274}
275
276void NuevaFacturaDialog::addRow(){
277 int row = ui.tableWidget->rowCount();
278 ui.tableWidget->insertRow(row);
279
280 QTableWidgetItem *item0 = new QTableWidgetItem;
281 item0->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
282 ui.tableWidget->setItem(row, 0, item0);
283
284 QTableWidgetItem *item1 = new QTableWidgetItem;
285 item1->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
286 ui.tableWidget->setItem(row, 1, item1);
287
288 QTableWidgetItem *item2 = new QTableWidgetItem;
289 item2->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
290 ui.tableWidget->setItem(row, 2, item2);
291
292 QTableWidgetItem *item3 = new QTableWidgetItem;
293 item3->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
294 ui.tableWidget->setItem(row, 3, item3);
295
296 QTableWidgetItem *item4 = new QTableWidgetItem;
297 item4->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
298 ui.tableWidget->setItem(row, 4, item4);
299}
300
301void NuevaFacturaDialog::anyadirLineaArticulo() {
302
303 int cantidadPrev = ui.cantidadEdit->value();
304 buscarArticulo();
305 ui.cantidadEdit->setValue(cantidadPrev);
306
307 if (articuloActual.getcodigo() != -1) {
308 /**
309 * Caso para un art�culo de la base de datos.
310 */
311 int row = ui.tableWidget->rowCount();
312 int cantidad = ui.cantidadEdit->value();
313
314 list<pair<pair<string, double>, int> >::iterator it;
315 for (it = lArticuloFila.begin(); it != lArticuloFila.end(); it++) {
316 if (articuloActual.getdescripcion() == it->first.first && articuloActual.getpvp() == it->first.second) {
317 break;
318 }
319 }
320
321 if (it == lArticuloFila.end()) {
322 // No encuentra
323 addRow();
324 ui.tableWidget->item(row, 0)->setText(ui.referenciaEdit->text());
325 ui.tableWidget->item(row, 1)->setText(ui.descripcionEdit->text());
326 ui.tableWidget->item(row, 2)->setText(tr("%1").arg(cantidad));
327 ui.tableWidget->item(row, 3)->setText(ui.pvpEdit->text());
328 ui.tableWidget->item(row, 4)->setText(tr("%1").arg(ui.pvpEdit->text().toDouble() * (double)cantidad));
329 pair <string, double> tmp(articuloActual.getdescripcion(), articuloActual.getpvp());
330 lArticuloFila.push_back(pair<pair<string, double>, int>(tmp, row));
331 nuevaFactura->addArticulo(articuloActual, cantidad);
332 } else {
333 // Encuentra
334 row = it->second;
335 int cantidad_prev = ui.tableWidget->item(row, 2)->text().toInt();
336 nuevaFactura->modificarArticulo(articuloActual, cantidad_prev + cantidad);
337 ui.tableWidget->item(row, 2)->setText(tr("%1").arg(cantidad_prev + cantidad));
338 ui.tableWidget->item(row, 4)->setText(tr("%1").arg(ui.pvpEdit->text().toDouble() * (double)(cantidad_prev + cantidad)));
339 actualizaPrecios();
340 }
341
342 actualizaPrecios();
343 } else if (ui.referenciaEdit->text() == "" && ui.pvpEdit->text() != "") {
344 /**
345 * Caso para un articulo temporal, que tendr� que guardarse en la base de datos para poder recuperar la factura,
346 * pero con un c�digo de 0 igual que el resto. Esto supone un problema a la hora de la b�squeda, esto supondr� un
347 */
348 bool ok;
349 ui.pvpEdit->text().toDouble(&ok);
350 if(!ok){
351 QMessageBox::information(this, tr("Atencion"),
352 tr("El precio ha de ser numerico"));
353 } else {
354 int cantidad = ui.cantidadEdit->value();
355
356 list<pair<pair<string, double>, int> >::iterator it;
357 for (it = lArticuloFila.begin(); it != lArticuloFila.end(); it++) {
358 if (ui.descripcionEdit->text().toStdString() == it->first.first && ui.pvpEdit->text().toDouble() == it->first.second) {
359 break;
360 }
361 }
362
363 if (it == lArticuloFila.end()) {
364 // No encuentra
365 // Nuevo art�culo
366 Articulo *a_tmp = capaNegocio->getArticuloDescripcionPvp(ui.descripcionEdit->text().toStdString(), ui.pvpEdit->text().toDouble());
367
368 Articulo a;
369 a.setcodigo(0); //C�digo generico de art�culos temporales.
370 a.setdescripcion(ui.descripcionEdit->text().toStdString());
371 a.setpvp(ui.pvpEdit->text().toDouble());
372 a.sethistorico(true);
373
374 if (a_tmp != 0) {
375 int row = ui.tableWidget->rowCount();
376 addRow();
377 ui.tableWidget->item(row, 0)->setText("0");
378 ui.tableWidget->item(row, 1)->setText(ui.descripcionEdit->text());
379 ui.tableWidget->item(row, 2)->setText(tr("%1").arg(cantidad));
380 ui.tableWidget->item(row, 3)->setText(ui.pvpEdit->text());
381 ui.tableWidget->item(row, 4)->setText(tr("%1").arg(ui.pvpEdit->text().toDouble() * (double)cantidad));
382 pair <string, double> tmp(a_tmp->getdescripcion(), a_tmp->getpvp());
383 lArticuloFila.push_back(pair<pair<string, double>, int>(tmp, row));
384 nuevaFactura->addArticulo(*a_tmp,cantidad);
385 actualizaPrecios();
386 } else {
387 if (capaNegocio->nuevoArticulo(&a)) {
388 int row = ui.tableWidget->rowCount();
389 addRow();
390 ui.tableWidget->item(row, 0)->setText("0");
391 ui.tableWidget->item(row, 1)->setText(ui.descripcionEdit->text());
392 ui.tableWidget->item(row, 2)->setText(tr("%1").arg(cantidad));
393 ui.tableWidget->item(row, 3)->setText(tr("%1").arg(a.getpvp(), 0, 'f', 2));
394 ui.tableWidget->item(row, 4)->setText(tr("%1").arg(a.getpvp() * (double)cantidad, 0, 'f', 2));
395 pair <string, double> tmp(a.getdescripcion(), a.getpvp());
396 lArticuloFila.push_back(pair<pair<string, double>, int>(tmp, row));
397 nuevaFactura->addArticulo(a,cantidad);
398 actualizaPrecios();
399 } else {
400 QMessageBox::warning(this, "Aviso", "Fallo al guardar el nuevo articulo.");
401 }
402 }
403 } else {
404 // Encuentra
405 Articulo *a_tmp = capaNegocio->getArticuloDescripcionPvp(ui.descripcionEdit->text().toStdString(), ui.pvpEdit->text().toDouble());
406 cout << "[Debug]" << a_tmp->getid() << endl;
407 int row = it->second;
408 int cantidad_prev = ui.tableWidget->item(row, 2)->text().toInt();
409 nuevaFactura->modificarArticulo(*a_tmp, cantidad_prev + cantidad);
410 ui.tableWidget->item(row, 2)->setText(tr("%1").arg(cantidad_prev + cantidad));
411 ui.tableWidget->item(row, 4)->setText(tr("%1").arg(ui.pvpEdit->text().toDouble() * (double)(cantidad_prev + cantidad)));
412 actualizaPrecios();
413 }
414
415 }
416 } else {
417 QMessageBox::warning(this, "Aviso", "Articulo no encontrado.");
418 }
419 Articulo aux;
420 articuloActual = aux;
421}
422
423void NuevaFacturaDialog::keyPressEvent(QKeyEvent* event) {
424 //mutex.lock();
425 if ((ui.nombreEdit->hasFocus() || ui.lineEdit_13->hasFocus()) && (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter))
426 buscarCliente();
427 else if ((ui.descripcionEdit->hasFocus() || ui.referenciaEdit->hasFocus() ) && (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter))
428 buscarArticulo();
429}
430void NuevaFacturaDialog::keyReleaseEvent(QKeyEvent* event) {
431 //mutex.unlock();
432}
433
434void NuevaFacturaDialog::borrarArticulo() {
435 int row = ui.tableWidget->currentRow();
436 if (row < 0) {
437 QMessageBox::warning(this, tr("Aviso"), tr("Ha de haber una fila seleccionada."));
438 return;
439 }
440
441 string des = ui.tableWidget->item(row, 1)->text().toStdString();
442 double pvp = ui.tableWidget->item(row, 3)->text().toDouble();
443 int cod = ui.tableWidget->item(row, 0)->text().toInt();
444
445 cout << "[Debug]Borrando el articulo de descripcion: " << des << endl;
446
447 Articulo *a;
448 if ( cod == 0 )
449 a = capaNegocio->getArticuloDescripcionPvp(des, pvp);
450 else
451 a = capaNegocio->getArticuloCodigo(cod);
452
453 if (a == 0) {
454 cout << "[Debug]Articulo no encontrado en la CapaNegocio" << endl;
455 }
456
457 list<pair<pair<string, double>, int> >::iterator it;
458 for (it = lArticuloFila.begin(); it != lArticuloFila.end(); it++) {
459 if (a->getdescripcion() == it->first.first && a->getpvp() == it->first.second) {
460 break;
461 }
462 }
463 lArticuloFila.erase(it);
464
465 if (!nuevaFactura->eliminarArticulo(*a))
466 cout << "[Debug]No se borra el articulo de la factura." << a->getid() << endl;
467
468 ui.tableWidget->removeRow(row);
469
470 actualizaPrecios();
471}
472
473void NuevaFacturaDialog::actualizaPrecios() {
474 mutex.lock();
475 double materiales = nuevaFactura->getMateriales();
476 double mano_obra = ui.lineEdit_7->text().toDouble();
477 double desplazamiento = ui.lineEdit_8->text().toDouble();
478 double transporte = ui.lineEdit_9->text().toDouble();
479 double subtotal = materiales + mano_obra + desplazamiento + transporte;
480 double total = subtotal + (ui.lineEdit_11->text().toDouble() / 100.0 )*subtotal;
481
482 ui.lineEdit_10->setText(tr("%1").arg(subtotal, 0, 'f', 2));
483 ui.lineEdit_6->setText(tr("%1").arg(materiales, 0, 'f', 2));
484 ui.lineEdit_12->setText(tr("%1").arg(total, 0, 'f', 2));
485 mutex.unlock();
486}
487
488bool NuevaFacturaDialog::comprobarDatos () {
489 bool flag = true;
490 if (cliente == 0) {
491 if(ui.nombreEdit->text()==""){
492 QMessageBox::information(this, tr("Atencion"),
493 tr("El campo nombre es necesario"));
494 flag=false;
495 }
496 if(ui.lineEdit_13->text()==""){
497 QMessageBox::information(this, tr("Atencion"),
498 tr("El campo apellido es necesario"));
499 flag=false;
500 }
501 bool ok;
502 ui.codigoEdit->text().toInt(&ok);
503 if(!ok){
504 QMessageBox::information(this, tr("Atencion"),
505 tr("El campo codigo ha de ser numerico"));
506 flag=false;
507 }
508 int rows = ui.tabla->rowCount();
509 for (int i = 0; i < rows; i++) {
510 ui.tabla->item(i,0)->text().toInt(&ok);
511 if(!ok && ui.tabla->item(i,0)->text()!=""){
512 QMessageBox::information(this, tr("Atenci�n"),
513 tr("Hay un tel�fono incorrecto."));
514 flag=false;
515 }
516 }
517 }
518 bool ok;
519 ui.lineEdit_4->text().toInt(&ok);
520 if(!ok && ui.lineEdit_4->text() != ""){
521 QMessageBox::information(this, tr("Atencion"),
522 tr("El campo codigo ha de ser numerico"));
523 flag=false;
524 }
525 ui.lineEdit_5->text().toDouble(&ok);
526 if(!ok && ui.lineEdit_5->text() != ""){
527 QMessageBox::information(this, tr("Atencion"),
528 tr("El tiempo empleado ha de ser numerico"));
529 flag=false;
530 }
531 ui.lineEdit_7->text().toDouble(&ok);
532 if(!ok && ui.lineEdit_7->text() != ""){
533 QMessageBox::information(this, tr("Atencion"),
534 tr("La mano de obra ha de ser numerica"));
535 flag=false;
536 }
537 ui.lineEdit_8->text().toDouble(&ok);
538 if(!ok && ui.lineEdit_8->text() != ""){
539 QMessageBox::information(this, tr("Atencion"),
540 tr("El desplazamiento ha de ser numerico"));
541 flag=false;
542 }
543 ui.lineEdit_9->text().toDouble(&ok);
544 if(!ok && ui.lineEdit_9->text() != ""){
545 QMessageBox::information(this, tr("Atencion"),
546 tr("El transporte ha de ser numerico"));
547 flag=false;
548 }
549 if (nuevaFactura->getn_factura() == -1 && ui.lineEdit_4->text() != "" && capaNegocio->getFacturaNumero(ui.lineEdit_4->text().toInt()) != 0 ) {
550 QMessageBox::information(this, tr("Atenci�n"),
551 tr("N� de factura repetido."));
552 flag=false;
553 }
554 return flag;
555}
556
557bool NuevaFacturaDialog::guardarSinSalir() {
558
559 bool clienteOk;
560
561 if (comprobarDatos()) {
562
563 nuevaFactura->setaparato(ui.lineEdit->text().toStdString());
564 nuevaFactura->setaveria(ui.textEdit->document()->toPlainText().toStdString());
565
566 if (ui.checkBox->isChecked()) {
567 nuevaFactura->setfecha(ui.dateEdit->text().toStdString());
568 } else {
569 nuevaFactura->setfecha(tr("").toStdString());
570 }
571
572 //nuevaFactura->setfecha_terminacion(ui.lineEdit_->text());
573 if (ui.checkBox_4->isChecked()) {
574 nuevaFactura->setfecha_terminacion(ui.dateEdit_2->text().toStdString());
575 } else {
576 nuevaFactura->setfecha_terminacion(tr("").toStdString());
577 }
578
579 if (!ui.checkBox_2->isChecked() && !ui.checkBox_3->isChecked())
580 nuevaFactura->setlugar_reparacion(0);
581 else {
582 bool *s = new bool;
583 *s = ui.checkBox_2->isChecked();
584 nuevaFactura->setlugar_reparacion(s);
585 }
586
587 nuevaFactura->setmarca(ui.lineEdit_2->text().toStdString());
588 nuevaFactura->setmodelo(ui.lineEdit_3->text().toStdString());
589
590 //nuevaFactura->setn_fabricacion(ui.lineEdit_->text());
591
592 if (ui.lineEdit_4->text() == "") {
593 nuevaFactura->setn_factura(-1);
594 } else {
595 nuevaFactura->setn_factura(ui.lineEdit_4->text().toInt());
596 }
597
598 nuevaFactura->setiva(ui.lineEdit_11->text().toInt());
599
600 nuevaFactura->setobservaciones(ui.textEdit->document()->toPlainText().toStdString());
601 nuevaFactura->setprecio_desplazamiento(ui.lineEdit_8->text().toDouble());
602 nuevaFactura->setprecio_mano_obra(ui.lineEdit_7->text().toDouble());
603 nuevaFactura->setprecio_materiales(ui.lineEdit_6->text().toDouble());
604 nuevaFactura->setprecio_transporte(ui.lineEdit_9->text().toDouble());
605
606 nuevaFactura->settiempo_empleado(ui.lineEdit_5->text().toStdString());
607 nuevaFactura->settrabajo_realizado(ui.textEdit_2->document()->toPlainText().toStdString());
608
609 if (cliente == 0) {
610 cliente = new Cliente();
611 cliente->setnombre(ui.nombreEdit->text().toStdString());
612 cliente->setapellidos(ui.lineEdit_13->text().toStdString());
613 cliente->setcodigo(ui.codigoEdit->text().toInt());
614 cliente->setdireccion(ui.direccionEdit->document()->toPlainText().toStdString());
615 cliente->setpoblacion(ui.lineEdit_14->text().toStdString());
616 cliente->setnif(ui.nifEdit->text().toStdString());
617 clienteOk = capaNegocio->nuevoCliente(cliente);
618 } else {
619 clienteOk = true;
620 }
621
622 if (clienteOk)
623 nuevaFactura->setcliente(cliente);
624 else
625 QMessageBox::critical(this, tr("Error"), tr("No se pudo guardar el nuevo cliente."));
626
627 if (capaNegocio->nuevaFactura(nuevaFactura) && clienteOk) {
628 if (padre != 0)
629 padre->actualizar();
630 return true;
631 //this->accept();
632 } else
633 QMessageBox::critical(this, tr("Error"), tr("No se pudo guardar la factura."));
634 }
635 return false;
636}
637
638void NuevaFacturaDialog::guardar() {
639
640 bool clienteOk;
641
642 if (comprobarDatos()) {
643
644 nuevaFactura->setaparato(ui.lineEdit->text().toStdString());
645 nuevaFactura->setaveria(ui.textEdit->document()->toPlainText().toStdString());
646
647 if (ui.checkBox->isChecked()) {
648 nuevaFactura->setfecha(ui.dateEdit->text().toStdString());
649 } else {
650 nuevaFactura->setfecha(tr("").toStdString());
651 }
652 if (ui.checkBox_4->isChecked()) {
653 nuevaFactura->setfecha_terminacion(ui.dateEdit_2->text().toStdString());
654 } else {
655 nuevaFactura->setfecha_terminacion(tr("").toStdString());
656 }
657
658 //nuevaFactura->setfecha_terminacion(ui.lineEdit_->text());
659
660 if (!ui.checkBox_2->isChecked() && !ui.checkBox_3->isChecked())
661 nuevaFactura->setlugar_reparacion(0);
662 else {
663 bool *s = new bool;
664 *s = ui.checkBox_2->isChecked();
665 nuevaFactura->setlugar_reparacion(s);
666 }
667
668 nuevaFactura->setmarca(ui.lineEdit_2->text().toStdString());
669 nuevaFactura->setmodelo(ui.lineEdit_3->text().toStdString());
670
671 //nuevaFactura->setn_fabricacion(ui.lineEdit_->text());
672
673 if (ui.lineEdit_4->text() == "") {
674 nuevaFactura->setn_factura(-1);
675 } else {
676 nuevaFactura->setn_factura(ui.lineEdit_4->text().toInt());
677 }
678
679 nuevaFactura->setiva(ui.lineEdit_11->text().toInt());
680 nuevaFactura->setobservaciones(ui.lineEdit_15->text().toStdString());
681 nuevaFactura->setprecio_desplazamiento(ui.lineEdit_8->text().toDouble());
682 nuevaFactura->setprecio_mano_obra(ui.lineEdit_7->text().toDouble());
683 nuevaFactura->setprecio_materiales(ui.lineEdit_6->text().toDouble());
684 nuevaFactura->setprecio_transporte(ui.lineEdit_9->text().toDouble());
685
686 nuevaFactura->settiempo_empleado(ui.lineEdit_5->text().toStdString());
687 nuevaFactura->settrabajo_realizado(ui.textEdit_2->document()->toPlainText().toStdString());
688
689 if (cliente == 0) {
690 cliente = new Cliente();
691 cliente->setnombre(ui.nombreEdit->text().toStdString());
692 cliente->setapellidos(ui.lineEdit_13->text().toStdString());
693 cliente->setcodigo(ui.codigoEdit->text().toInt());
694 cliente->setdireccion(ui.direccionEdit->document()->toPlainText().toStdString());
695 cliente->setpoblacion(ui.lineEdit_14->text().toStdString());
696 cliente->setnif(ui.nifEdit->text().toStdString());
697 /**
698 * Guardar los tel�fonos.
699 */
700 list<int> telefonos;
701 int rows = ui.tabla->rowCount();
702 for (int i = 0; i < rows; i++) {
703 telefonos.push_back(ui.tabla->item(i, 0)->text().toInt());
704 }
705 cliente->settelefonos(telefonos);
706 clienteOk = capaNegocio->nuevoCliente(cliente);
707 } else {
708 clienteOk = true;
709 }
710
711 if (clienteOk)
712 nuevaFactura->setcliente(cliente);
713 else
714 QMessageBox::critical(this, tr("Error"), tr("No se pudo guardar el nuevo cliente."));
715
716 if (capaNegocio->nuevaFactura(nuevaFactura) && clienteOk) {
717 if (padre != 0 && !dePresupuesto)
718 padre->actualizar();
719 this->accept();
720 } else
721 QMessageBox::critical(this, tr("Error"), tr("No se pudo guardar la factura."));
722 }
723}
724
725void NuevaFacturaDialog::editar() {
726
727 bool clienteOk;
728
729 if (comprobarDatos()) {
730
731 nuevaFactura->setaparato(ui.lineEdit->text().toStdString());
732 nuevaFactura->setaveria(ui.textEdit->document()->toPlainText().toStdString());
733
734 if (ui.checkBox->isChecked()) {
735 nuevaFactura->setfecha(ui.dateEdit->text().toStdString());
736 } else {
737 nuevaFactura->setfecha(tr("").toStdString());
738 }
739
740 //nuevaFactura->setfecha_terminacion(ui.lineEdit_->text());
741
742 if (!ui.checkBox_2->isChecked() && !ui.checkBox_3->isChecked())
743 nuevaFactura->setlugar_reparacion(0);
744 else {
745 bool *s = new bool;
746 *s = ui.checkBox_2->isChecked();
747 nuevaFactura->setlugar_reparacion(s);
748 }
749 if (ui.checkBox_4->isChecked()) {
750 nuevaFactura->setfecha_terminacion(ui.dateEdit_2->text().toStdString());
751 } else {
752 nuevaFactura->setfecha_terminacion(tr("").toStdString());
753 }
754 nuevaFactura->setmarca(ui.lineEdit_2->text().toStdString());
755 nuevaFactura->setmodelo(ui.lineEdit_3->text().toStdString());
756
757 //nuevaFactura->setn_fabricacion(ui.lineEdit_->text());
758
759 if (ui.lineEdit_4->text() == "") {
760 nuevaFactura->setn_factura(-1);
761 } else {
762 nuevaFactura->setn_factura(ui.lineEdit_4->text().toInt());
763 }
764
765 nuevaFactura->setobservaciones(ui.lineEdit_15->text().toStdString());
766 nuevaFactura->setprecio_desplazamiento(ui.lineEdit_8->text().toDouble());
767 nuevaFactura->setprecio_mano_obra(ui.lineEdit_7->text().toDouble());
768 nuevaFactura->setprecio_materiales(ui.lineEdit_6->text().toDouble());
769 nuevaFactura->setprecio_transporte(ui.lineEdit_9->text().toDouble());
770
771 nuevaFactura->settiempo_empleado(ui.lineEdit_5->text().toStdString());
772 nuevaFactura->settrabajo_realizado(ui.textEdit_2->document()->toPlainText().toStdString());
773
774 if (cliente == 0) {
775 cliente = new Cliente();
776 cliente->setnombre(ui.nombreEdit->text().toStdString());
777 cliente->setapellidos(ui.lineEdit_13->text().toStdString());
778 cliente->setcodigo(ui.codigoEdit->text().toInt());
779 cliente->setdireccion(ui.direccionEdit->document()->toPlainText().toStdString());
780 cliente->setpoblacion(ui.lineEdit_14->text().toStdString());
781 cliente->setnif(ui.nifEdit->text().toStdString());
782 list<int> lista_telefonos;
783 for (int i = 0; i < ui.tabla->rowCount(); i++) {
784 lista_telefonos.push_back(ui.tabla->item(i,0)->text().toInt());
785 }
786 cliente->settelefonos(lista_telefonos);
787 clienteOk = capaNegocio->nuevoCliente(cliente);
788 } else {
789 clienteOk = true;
790 }
791
792 if (clienteOk)
793 nuevaFactura->setcliente(cliente);
794 else
795 QMessageBox::critical(this, tr("Error"), tr("No se pudo guardar el nuevo cliente."));
796
797 if (capaNegocio->modificarFactura(nuevaFactura) && clienteOk) {
798 if (padre != 0)
799 padre->actualizar();
800 this->accept();
801 } else
802 QMessageBox::critical(this, tr("Error"), tr("No se pudo editar la factura."));
803 }
804}
805
806
807bool NuevaFacturaDialog::editarSinSalir() {
808
809 bool clienteOk;
810
811 if (comprobarDatos()) {
812
813 nuevaFactura->setaparato(ui.lineEdit->text().toStdString());
814 nuevaFactura->setaveria(ui.textEdit->document()->toPlainText().toStdString());
815
816 if (ui.checkBox->isChecked()) {
817 nuevaFactura->setfecha(ui.dateEdit->text().toStdString());
818 } else {
819 nuevaFactura->setfecha(tr("").toStdString());
820 }
821
822 //nuevaFactura->setfecha_terminacion(ui.lineEdit_->text());
823
824 if (!ui.checkBox_2->isChecked() && !ui.checkBox_3->isChecked())
825 nuevaFactura->setlugar_reparacion(0);
826 else {
827 bool *s = new bool;
828 *s = ui.checkBox_2->isChecked();
829 nuevaFactura->setlugar_reparacion(s);
830 }
831
832 nuevaFactura->setmarca(ui.lineEdit_2->text().toStdString());
833 nuevaFactura->setmodelo(ui.lineEdit_3->text().toStdString());
834
835 //nuevaFactura->setn_fabricacion(ui.lineEdit_->text());
836
837 if (ui.lineEdit_4->text() == "") {
838 nuevaFactura->setn_factura(-1);
839 } else {
840 nuevaFactura->setn_factura(ui.lineEdit_4->text().toInt());
841 }
842
843 nuevaFactura->setiva(ui.lineEdit_11->text().toInt());
844 nuevaFactura->setobservaciones(ui.textEdit->document()->toPlainText().toStdString());
845 nuevaFactura->setprecio_desplazamiento(ui.lineEdit_8->text().toDouble());
846 nuevaFactura->setprecio_mano_obra(ui.lineEdit_7->text().toDouble());
847 nuevaFactura->setprecio_materiales(ui.lineEdit_6->text().toDouble());
848 nuevaFactura->setprecio_transporte(ui.lineEdit_9->text().toDouble());
849
850 nuevaFactura->settiempo_empleado(ui.lineEdit_5->text().toStdString());
851 nuevaFactura->settrabajo_realizado(ui.textEdit_2->document()->toPlainText().toStdString());
852
853 if (cliente == 0) {
854 cliente = new Cliente();
855 cliente->setnombre(ui.nombreEdit->text().toStdString());
856 cliente->setapellidos(ui.lineEdit_13->text().toStdString());
857 cliente->setcodigo(ui.codigoEdit->text().toInt());
858 cliente->setdireccion(ui.direccionEdit->document()->toPlainText().toStdString());
859 cliente->setpoblacion(ui.lineEdit_14->text().toStdString());
860 cliente->setnif(ui.nifEdit->text().toStdString());
861 list<int> lista_telefonos;
862 for (int i = 0; i < ui.tabla->rowCount(); i++) {
863 lista_telefonos.push_back(ui.tabla->item(i,0)->text().toInt());
864 }
865 cliente->settelefonos(lista_telefonos);
866 clienteOk = capaNegocio->nuevoCliente(cliente);
867 } else {
868 clienteOk = true;
869 }
870
871 if (clienteOk)
872 nuevaFactura->setcliente(cliente);
873 else
874 QMessageBox::critical(this, tr("Error"), tr("No se pudo guardar el nuevo cliente."));
875
876 if (capaNegocio->modificarFactura(nuevaFactura) && clienteOk) {
877 if (padre != 0)
878 padre->actualizar();
879 return true;
880 //this->accept();
881 } else
882 QMessageBox::critical(this, tr("Error"), tr("No se pudo editar la factura."));
883 }
884 return false;
885}
886
887void NuevaFacturaDialog::addRowTelefono(){
888 int row = ui.tabla->rowCount();
889 ui.tabla->insertRow(row);
890
891 QTableWidgetItem *item0 = new QTableWidgetItem;
892 item0->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
893 ui.tabla->setItem(row, 0, item0);
894
895}
896
897void NuevaFacturaDialog::nuevoTelefono () {
898 int row = ui.tabla->currentRow();
899 if (row == -1) {
900 addRowTelefono();
901 ui.tabla->setCurrentCell(0,0);
902 } else if (ui.tabla->item(row,0)->text() != "") {
903 addRowTelefono();
904 ui.tabla->setCurrentCell(row + 1,0);
905 }
906}
907
908void NuevaFacturaDialog::borrarTelefono() {
909 int row = ui.tabla->currentRow();
910 if (row == -1)
911 QMessageBox::warning(this, "Aviso", "No se ha seleccionado ningun telefono.");
912 else
913 ui.tabla->removeRow(row);
914
915}
916
917// Invierte el estado de "habilitado" de los campos de cliente
918void NuevaFacturaDialog::cambiarCliente() {
919 ui.nombreEdit->setEnabled(!ui.nombreEdit->isEnabled());
920 ui.lineEdit_13->setEnabled(!ui.lineEdit_13->isEnabled());
921 ui.codigoEdit->setEnabled(!ui.codigoEdit->isEnabled());
922 ui.direccionEdit->setEnabled(!ui.direccionEdit->isEnabled());
923 ui.lineEdit_14->setEnabled(!ui.lineEdit_14->isEnabled());
924 ui.nifEdit->setEnabled(!ui.nifEdit->isEnabled());
925 ui.tabla->setEnabled(!ui.tabla->isEnabled());
926 ui.pushButton_6->setEnabled(!ui.pushButton_6->isEnabled());
927 ui.pushButton_8->setEnabled(!ui.pushButton_8->isEnabled());
928}
929
930void NuevaFacturaDialog::limpiar() {
931 if (ui.nombreEdit->text() != "" ) {
932 cambiarCliente();
933 }
934 ui.nombreEdit->setText("");
935 ui.lineEdit_13->setText("");
936 ui.codigoEdit->setText("");
937 QString direccion;
938 direccion.append("");
939 QTextDocument *direccionCompleta = new QTextDocument(direccion);
940 ui.direccionEdit->setDocument(direccionCompleta);
941 ui.lineEdit_14->setText("");
942 ui.nifEdit->setText("");
943 cliente = 0;
944 while (ui.tabla->rowCount() > 0) {
945 ui.tabla->removeRow(0);
946 }
947
948 int cod = capaNegocio->getUltimoCodigoCliente();
949 ui.codigoEdit->setText(QString::number(cod));
950}
951
952void NuevaFacturaDialog::cambiarEstadoDomicilio() {
953 if (ui.checkBox_2->isChecked()) {
954 if (ui.checkBox_3->isChecked()) {
955 ui.checkBox_3->setChecked(false);
956 }
957 }
958}
959
960void NuevaFacturaDialog::cambiarEstadoTaller() {
961 if (ui.checkBox_3->isChecked()) {
962 if (ui.checkBox_2->isChecked()) {
963 ui.checkBox_2->setChecked(false);
964 }
965 }
966}
967
968void NuevaFacturaDialog::imprimir() {
969 if (nuevaFactura->getid() == -1) {
970 if (QMessageBox::question(this, tr("Imprimir Factura"), tr("Antes de imprimir es necesario guardar la factura.\n �Desea realmente guardarla?"),tr("Si"),tr("No")) == 0) {
971 if(guardarSinSalir()) {
972 PrintWindow* pq = new PrintWindow(*nuevaFactura);
973 pq->printFactura();
974 this->accept();
975 }
976 }
977 } else {
978 if (QMessageBox::question(this, tr("Imprimir Factura"), tr("Antes de imprimir es necesario guardar la factura.\n �Desea realmente guardarla?"),tr("Si"),tr("No")) == 0) {
979 if(editarSinSalir()) {
980 PrintWindow* pq = new PrintWindow(*nuevaFactura);
981 pq->printFactura();
982 this->accept();
983 }
984 }
985 }
986
987}
988