Your warranties manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

369 lines
12 KiB

  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. }