Your warranties manager
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

infosproduitdialog.cpp 12 KiB

hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #include "infosproduitdialog.h"
  2. #include "ui_infosproduitdialog.h"
  3. #include <QDate>
  4. #include <QDir>
  5. #include <QFile>
  6. #include <QtXml/QDomDocument>
  7. #include <QMessageBox>
  8. #include <QFileDialog>
  9. #include <QFileInfo>
  10. #include <QDesktopServices>
  11. #include <QUrl>
  12. #include <QTransform>
  13. #include <QSettings>
  14. #include <iostream>
  15. InfosProduitDialog::InfosProduitDialog(QWidget *parent, QWidget *mainWindow, QString nomProduit, QDate dateAchat, QDate dateFinGarantie, QPixmap image, int indexMagasin, bool enSAV, QHash<QString, QByteArray> facturePDF, QHash<QString, QByteArray> garantiePDF) :
  16. QDialog(mainWindow),
  17. ui(new Ui::InfosProduitDialog)
  18. {
  19. ui->setupUi(this);
  20. parentWidget = parent;
  21. // Récupération de la liste des magasins enregistrés
  22. QSettings *settings = new QSettings("Deuchnord", "Hermes");
  23. QFile fichierMagasins(settings->value("placeSave").toString()+"/deuchnord-hermes/manufacturers.xml");
  24. fichierMagasins.open(QFile::ReadOnly);
  25. if(fichierMagasins.isOpen())
  26. {
  27. QString contenuFichier = fichierMagasins.readAll();
  28. fichierMagasins.close();
  29. QDomDocument dom;
  30. dom.setContent(contenuFichier);
  31. QDomElement root = dom.firstChildElement();
  32. QDomElement manufacturer;
  33. QDomNode node = root.firstChild();
  34. while(!node.isNull())
  35. {
  36. manufacturer = node.toElement();
  37. if(manufacturer.tagName() == "manufacturer")
  38. ui->comboMagasin->addItem(manufacturer.firstChild().toText().data());
  39. node = node.nextSibling();
  40. }
  41. }
  42. // Remplissage des données
  43. ui->txtNom->setText(nomProduit);
  44. ui->dateAchat->setDate(dateAchat);
  45. if(dateFinGarantie != QDate(1970, 1, 1))
  46. ui->dateFinGarantie->setDate(dateFinGarantie);
  47. else
  48. {
  49. ui->dateFinGarantie->setDate(QDate::currentDate().addYears(1));
  50. ui->checkGarantieAVie->setChecked(true);
  51. }
  52. ui->comboMagasin->setCurrentIndex(indexMagasin);
  53. ui->checkSAV->setChecked(enSAV);
  54. ui->image->setPixmap(image);
  55. this->image = image;
  56. // Factures & garanties
  57. this->facturePDF = facturePDF;
  58. this->garantiePDF = garantiePDF;
  59. for(QString i : this->facturePDF.keys())
  60. {
  61. ui->listFactures->addItem(i);
  62. }
  63. for(QString i : this->garantiePDF.keys())
  64. {
  65. ui->listGaranties->addItem(i);
  66. }
  67. ui->txtNom->setFocus();
  68. ui->listFactures->setCurrentItem(ui->listFactures->item(0));
  69. ui->listGaranties->setCurrentItem(ui->listGaranties->item(0));
  70. #if !defined Q_OS_LINUX
  71. // Le bouton ne sera pas disponible sur les systèmes autres que GNU/Linux
  72. ui->btnScannerFacture->hide();
  73. ui->btnScannerGarantie->hide();
  74. #endif
  75. }
  76. void InfosProduitDialog::on_btnImageParcourir_clicked()
  77. {
  78. QString filename = QFileDialog::getOpenFileName(this, tr("Sélectionnez une image"), "", tr("Images supportées")+" (*.bmp *.gif *.jpg *.jpeg *.png *.pbm *.pgm *.ppm *.xbm *.xpm)");
  79. if(filename != "")
  80. {
  81. image = QPixmap(filename);
  82. image = image.scaled(QSize(128, 128), Qt::KeepAspectRatio);
  83. ui->image->setPixmap(image);
  84. }
  85. }
  86. void InfosProduitDialog::on_btnImageSupprimer_clicked()
  87. {
  88. image = QPixmap(":/images/no-picture.jpg");
  89. ui->image->setPixmap(image);
  90. }
  91. void InfosProduitDialog::on_btnAjoutFacture_clicked()
  92. {
  93. QString fileName = QFileDialog::getOpenFileName(this, tr("Sélectionnez une facture"), "", tr("Fichiers supportés")+" (*.pdf *.jpg *.jpeg *.png);;"+tr("Fichiers PDF")+" (*.pdf);;"+tr("Images")+" (*.jpg *.jpeg *.png)");
  94. if(fileName != "")
  95. {
  96. QFile fichier(fileName);
  97. QFileInfo infoFile(fichier.fileName());
  98. fichier.open(QFile::ReadOnly);
  99. if(fichier.isReadable())
  100. {
  101. QByteArray contenuFichier = fichier.readAll();
  102. fichier.close();
  103. facturePDF.insert(infoFile.fileName(), contenuFichier);
  104. ui->listFactures->addItem(infoFile.fileName());
  105. }
  106. else
  107. QMessageBox::critical(this, tr("Erreur"), tr("Impossible de lire le fichier %1\nVérifiez qu'il est bien accessible en lecture et réessayez.", "%1 represents the file name").arg(fichier.fileName()));
  108. }
  109. }
  110. void InfosProduitDialog::on_btnScannerFacture_clicked()
  111. {
  112. // Ne fonctionne que sous Linux pour le moment. Dépendances : sane et imagemagick
  113. ScannerDialog *dialog = new ScannerDialog(this);
  114. dialog->setModal(true);
  115. dialog->show();
  116. connect(dialog, SIGNAL(accepted()), SLOT(on_factureScanned()));
  117. }
  118. void InfosProduitDialog::on_factureScanned()
  119. {
  120. QString fileName = QDir::tempPath()+"/output.pdf";
  121. QFile::rename(fileName, QDir::tempPath()+"/Facture.pdf");
  122. fileName = QDir::tempPath()+"/Facture.pdf";
  123. QFile fichier(fileName);
  124. QFileInfo infoFile(fichier.fileName());
  125. fichier.open(QFile::ReadOnly);
  126. if(fichier.isReadable())
  127. {
  128. QByteArray contenuFichier = fichier.readAll();
  129. fichier.close();
  130. facturePDF.insert(infoFile.fileName(), contenuFichier);
  131. ui->listFactures->addItem(infoFile.fileName());
  132. }
  133. else
  134. QMessageBox::critical(this, tr("Erreur"), tr("Une erreur s'est produite lors de l'ajout de votre document numérisé.\nVous pouvez toujours ajouter le document manuellement, il se trouve ici : %1", "%1 represents the place of the file in the temp directory").arg(fileName));
  135. }
  136. void InfosProduitDialog::on_listFactures_currentRowChanged()
  137. {
  138. ui->btnSupprFacture->setEnabled(true);
  139. }
  140. void InfosProduitDialog::on_listFactures_itemDoubleClicked(QListWidgetItem *item)
  141. {
  142. QByteArray contentFile = facturePDF.value(item->text());
  143. QFile tempFile(QDir::tempPath()+"/"+item->text());
  144. tempFile.open(QFile::WriteOnly);
  145. tempFile.write(contentFile);
  146. tempFile.close();
  147. QDesktopServices::openUrl(QUrl("file:///"+tempFile.fileName()));
  148. }
  149. void InfosProduitDialog::on_btnSupprFacture_clicked()
  150. {
  151. if(QMessageBox::question(this, tr("Hermès"), tr("Voulez-vous vraiment supprimer cette facture ?\nCette action n'est pas réversible."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
  152. {
  153. QListWidgetItem *item = ui->listFactures->selectedItems().value(0);
  154. facturePDF.remove(item->text());
  155. delete item;
  156. }
  157. if(ui->listFactures->count() == 0)
  158. ui->btnSupprFacture->setEnabled(false);
  159. }
  160. void InfosProduitDialog::on_btnAjoutGarantie_clicked()
  161. {
  162. QString fileName = QFileDialog::getOpenFileName(this, tr("Sélectionnez une fiche garantie"), "", tr("Fichiers supportés")+" (*.pdf *.jpg *.jpeg *.png);;"+tr("Fichiers PDF")+" (*.pdf);;"+tr("Images")+" (*.jpg *.jpeg *.png)");
  163. if(fileName != "")
  164. {
  165. QFile fichier(fileName);
  166. QFileInfo infoFile(fichier.fileName());
  167. fichier.open(QFile::ReadOnly);
  168. if(fichier.isReadable())
  169. {
  170. QByteArray contenuFichier = fichier.readAll();
  171. fichier.close();
  172. garantiePDF.insert(infoFile.fileName(), contenuFichier);
  173. ui->listGaranties->addItem(infoFile.fileName());
  174. }
  175. else
  176. QMessageBox::critical(this, tr("Erreur"), tr("Impossible de lire le fichier %1\nVérifiez qu'il est bien accessible en lecture et réessayez.", "%1 represents the file name").arg(fichier.fileName()));
  177. }
  178. }
  179. void InfosProduitDialog::on_btnScannerGarantie_clicked()
  180. {
  181. // Ne fonctionne que sous Linux pour le moment. Dépendances : libsane et imagemagick
  182. ScannerDialog *dialog = new ScannerDialog(this);
  183. dialog->setModal(true);
  184. dialog->show();
  185. connect(dialog, SIGNAL(accepted()), SLOT(on_garantieScanned()));
  186. }
  187. void InfosProduitDialog::on_garantieScanned()
  188. {
  189. QString fileName = QDir::tempPath()+"/output.pdf";
  190. QFile::rename(fileName, QDir::tempPath()+"/Garantie.pdf");
  191. fileName = QDir::tempPath()+"/Garantie.pdf";
  192. QFile fichier(fileName);
  193. QFileInfo infoFile(fichier.fileName());
  194. fichier.open(QFile::ReadOnly);
  195. if(fichier.isReadable())
  196. {
  197. QByteArray contenuFichier = fichier.readAll();
  198. fichier.close();
  199. garantiePDF.insert(infoFile.fileName(), contenuFichier);
  200. ui->listGaranties->addItem(infoFile.fileName());
  201. }
  202. else
  203. QMessageBox::critical(this, tr("Erreur"), tr("Une erreur s'est produite lors de l'ajout de votre document numérisé.\nVous pouvez toujours ajouter le document manuellement, il se trouve ici : %1", "%1 represents the place of the file in the temp directory").arg(fileName));
  204. }
  205. void InfosProduitDialog::on_listGaranties_currentRowChanged()
  206. {
  207. ui->btnSupprGarantie->setEnabled(true);
  208. }
  209. void InfosProduitDialog::on_listGaranties_itemDoubleClicked(QListWidgetItem *item)
  210. {
  211. QByteArray contentFile = garantiePDF.value(item->text());
  212. QFile tempFile(QDir::tempPath()+"/"+item->text());
  213. tempFile.open(QFile::WriteOnly);
  214. tempFile.write(contentFile);
  215. tempFile.close();
  216. QDesktopServices::openUrl(QUrl("file:///"+tempFile.fileName()));
  217. }
  218. void InfosProduitDialog::on_btnSupprGarantie_clicked()
  219. {
  220. if(QMessageBox::question(this, tr("Hermès"), tr("Voulez-vous vraiment supprimer cette fiche garantie ?\nCette action n'est pas réversible."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
  221. {
  222. QListWidgetItem *item = ui->listGaranties->selectedItems().value(0);
  223. garantiePDF.remove(item->text());
  224. delete item;
  225. }
  226. if(ui->listGaranties->count() == 0)
  227. ui->btnSupprGarantie->setEnabled(false);
  228. }
  229. // Bouton "OK"
  230. void InfosProduitDialog::on_buttonBox_accepted()
  231. {
  232. getParentItem()->setNomProduit(ui->txtNom->text());
  233. getParentItem()->setDateAchat(ui->dateAchat->date());
  234. if(!ui->checkGarantieAVie->isChecked())
  235. getParentItem()->setDateFinGarantie(ui->dateFinGarantie->date());
  236. else
  237. getParentItem()->setDateFinGarantie(QDate(1970, 1, 1));
  238. getParentItem()->setImage(this->image);
  239. QSettings *settings = new QSettings("Deuchnord", "Hermes");
  240. QFile fichierMagasins(settings->value("placeSave").toString()+"/deuchnord-hermes/manufacturers.xml");
  241. bool manufacturerAllreadyExists = false;
  242. QDomDocument dom;
  243. QDomElement root, manufacturer;
  244. QDomNode node;
  245. if(fichierMagasins.open(QFile::ReadOnly)) {
  246. QString contenuFichier = fichierMagasins.readAll();
  247. fichierMagasins.close();
  248. dom.setContent(contenuFichier);
  249. root = dom.firstChildElement();
  250. node = root.firstChild();
  251. while(!node.isNull())
  252. {
  253. manufacturer = node.toElement();
  254. if(manufacturer.tagName() == "manufacturer")
  255. if(ui->comboMagasin->currentText() == manufacturer.firstChild().toText().data())
  256. manufacturerAllreadyExists = true;
  257. node = node.nextSibling();
  258. }
  259. }
  260. if(!manufacturerAllreadyExists) {
  261. dom = QDomDocument("manufacturers");
  262. root = dom.createElement("manufacturers");
  263. dom.appendChild(root);
  264. // Boucle d'enregistrement des éléments du combo
  265. for(int i = 0; i < ui->comboMagasin->count(); i++) {
  266. QDomElement domManufacturer = dom.createElement("manufacturer");
  267. root.appendChild(domManufacturer);
  268. QDomText textManufacturer = dom.createTextNode(ui->comboMagasin->itemText(i));
  269. domManufacturer.appendChild(textManufacturer);
  270. }
  271. // Enregistrement du nouveau magasin
  272. QDomElement domNewManufacturer = dom.createElement("manufacturer");
  273. root.appendChild(domNewManufacturer);
  274. QDomText textNewManufacturer = dom.createTextNode(ui->comboMagasin->currentText());
  275. domNewManufacturer.appendChild(textNewManufacturer);
  276. // Enregistrement du fichier XML
  277. QFile fileManufacturers(settings->value("placeSave").toString()+"/deuchnord-hermes/manufacturers.xml");
  278. if(fileManufacturers.open(QFile::WriteOnly)) {
  279. fileManufacturers.write(dom.toString().toUtf8());
  280. fileManufacturers.close();
  281. }
  282. getParentItem()->setMagasin(ui->comboMagasin->count());
  283. }
  284. else
  285. getParentItem()->setMagasin(ui->comboMagasin->currentIndex());
  286. getParentItem()->setEnSAV(ui->checkSAV->isChecked());
  287. getParentItem()->setFactures(this->facturePDF);
  288. getParentItem()->setGaranties(this->garantiePDF);
  289. }
  290. ProduitItem* InfosProduitDialog::getParentItem()
  291. {
  292. return static_cast<ProduitItem*>(this->parentWidget);
  293. }
  294. InfosProduitDialog::~InfosProduitDialog()
  295. {
  296. delete ui;
  297. }
  298. void InfosProduitDialog::on_checkGarantieAVie_toggled(bool checked)
  299. {
  300. if(checked)
  301. ui->dateFinGarantie->setEnabled(false);
  302. else
  303. ui->dateFinGarantie->setEnabled(true);
  304. }