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.
 
 
 

303 lines
9.9 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. 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) :
  14. QDialog(mainWindow),
  15. ui(new Ui::InfosProduitDialog)
  16. {
  17. ui->setupUi(this);
  18. parentWidget = parent;
  19. // On ajoute une ligne vide, conrrespondant à un magasin non reseigné. Il correspond à un indexMagasin de -1
  20. ui->comboMagasin->addItem("");
  21. // Récupération de la liste des magasins enregistrés
  22. QFile fichierMagasins(QDir::homePath()+"/deuchnord-hermes/manufacturers.xml");
  23. fichierMagasins.open(QFile::ReadOnly);
  24. if(fichierMagasins.isOpen())
  25. {
  26. QString contenuFichier = fichierMagasins.readAll();
  27. fichierMagasins.close();
  28. QDomDocument dom;
  29. dom.setContent(contenuFichier);
  30. QDomElement root = dom.firstChildElement();
  31. QDomElement manufacturer;
  32. QDomNode node = root.firstChild();
  33. while(!node.isNull())
  34. {
  35. manufacturer = node.toElement();
  36. if(manufacturer.tagName() == "manufacturer")
  37. ui->comboMagasin->addItem(manufacturer.firstChild().toText().data());
  38. node = node.nextSibling();
  39. }
  40. }
  41. // Remplissage des données
  42. ui->txtNom->setText(nomProduit);
  43. ui->dateAchat->setDate(dateAchat);
  44. if(dateFinGarantie != QDate(1970, 1, 1))
  45. ui->dateFinGarantie->setDate(dateFinGarantie);
  46. else
  47. {
  48. ui->dateFinGarantie->setDate(QDate::currentDate().addYears(1));
  49. ui->checkGarantieAVie->setChecked(true);
  50. }
  51. ui->comboMagasin->setCurrentIndex(indexMagasin+1);
  52. ui->checkSAV->setChecked(enSAV);
  53. ui->image->setPixmap(image);
  54. this->image = image;
  55. // Factures & garanties
  56. this->facturePDF = facturePDF;
  57. this->garantiePDF = garantiePDF;
  58. for(QString i : this->facturePDF.keys())
  59. {
  60. ui->listFactures->addItem(i);
  61. }
  62. for(QString i : this->garantiePDF.keys())
  63. {
  64. ui->listGaranties->addItem(i);
  65. }
  66. ui->txtNom->setFocus();
  67. ui->listFactures->setCurrentItem(ui->listFactures->item(0));
  68. ui->listGaranties->setCurrentItem(ui->listGaranties->item(0));
  69. #if !defined Q_OS_LINUX
  70. // Le bouton ne sera pas disponible sur les systèmes autres que GNU/Linux
  71. ui->btnScannerFacture->hide();
  72. ui->btnScannerGarantie->hide();
  73. #endif
  74. }
  75. void InfosProduitDialog::on_btnImageParcourir_clicked()
  76. {
  77. QString filename = QFileDialog::getOpenFileName(this, "Sélectionnez une image", "", "Images supportées (*.bmp *.gif *.jpg *.jpeg *.png *.pbm *.pgm *.ppm *.xbm *.xpm)");
  78. if(filename != "")
  79. {
  80. image = QPixmap(filename);
  81. image = image.scaled(QSize(128, 128), Qt::KeepAspectRatio);
  82. ui->image->setPixmap(image);
  83. }
  84. }
  85. void InfosProduitDialog::on_btnImageSupprimer_clicked()
  86. {
  87. image = QPixmap(":/images/no-picture.jpg");
  88. ui->image->setPixmap(image);
  89. }
  90. void InfosProduitDialog::on_btnAjoutFacture_clicked()
  91. {
  92. QString fileName = QFileDialog::getOpenFileName(this, "Sélectionnez une facture", "", "Fichiers supportés (*.pdf *.jpg *.jpeg *.png);;Fichiers PDF (*.pdf);;Images (*.jpg *.jpeg *.png)");
  93. if(fileName != "")
  94. {
  95. QFile fichier(fileName);
  96. QFileInfo infoFile(fichier.fileName());
  97. fichier.open(QFile::ReadOnly);
  98. if(fichier.isReadable())
  99. {
  100. QByteArray contenuFichier = fichier.readAll();
  101. fichier.close();
  102. facturePDF.insert(infoFile.fileName(), contenuFichier);
  103. ui->listFactures->addItem(infoFile.fileName());
  104. }
  105. else
  106. QMessageBox::critical(this, "Erreur", "Impossible de lire le fichier "+fichier.fileName()+"\nVérifiez qu'il est bien accessible en lecture et réessayez.");
  107. }
  108. }
  109. void InfosProduitDialog::on_btnScannerFacture_clicked()
  110. {
  111. // Ne fonctionne que sous Linux pour le moment. Dépendances : sane et imagemagick
  112. ScannerDialog *dialog = new ScannerDialog(this);
  113. dialog->setModal(true);
  114. dialog->show();
  115. connect(dialog, SIGNAL(accepted()), SLOT(on_factureScanned()));
  116. }
  117. void InfosProduitDialog::on_factureScanned()
  118. {
  119. QString fileName = QDir::tempPath()+"/output.pdf";
  120. QFile::rename(fileName, QDir::tempPath()+"/Facture.pdf");
  121. fileName = QDir::tempPath()+"/Facture.pdf";
  122. QFile fichier(fileName);
  123. QFileInfo infoFile(fichier.fileName());
  124. fichier.open(QFile::ReadOnly);
  125. if(fichier.isReadable())
  126. {
  127. QByteArray contenuFichier = fichier.readAll();
  128. fichier.close();
  129. facturePDF.insert(infoFile.fileName(), contenuFichier);
  130. ui->listFactures->addItem(infoFile.fileName());
  131. }
  132. else
  133. QMessageBox::critical(this, "Erreur", "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 : "+fileName);
  134. }
  135. void InfosProduitDialog::on_listFactures_currentRowChanged()
  136. {
  137. ui->btnSupprFacture->setEnabled(true);
  138. }
  139. void InfosProduitDialog::on_listFactures_itemDoubleClicked(QListWidgetItem *item)
  140. {
  141. QByteArray contentFile = facturePDF.value(item->text());
  142. QFile tempFile(QDir::tempPath()+"/"+item->text());
  143. tempFile.open(QFile::WriteOnly);
  144. tempFile.write(contentFile);
  145. tempFile.close();
  146. QDesktopServices::openUrl(QUrl("file:///"+tempFile.fileName()));
  147. }
  148. void InfosProduitDialog::on_btnSupprFacture_clicked()
  149. {
  150. if(QMessageBox::question(this, "Hermès", "Voulez-vous vraiment supprimer cette facture ?\nCette action n'est pas réversible.", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
  151. {
  152. QListWidgetItem *item = ui->listFactures->selectedItems().value(0);
  153. facturePDF.remove(item->text());
  154. delete item;
  155. }
  156. if(ui->listFactures->count() == 0)
  157. ui->btnSupprFacture->setEnabled(false);
  158. }
  159. void InfosProduitDialog::on_btnAjoutGarantie_clicked()
  160. {
  161. QString fileName = QFileDialog::getOpenFileName(this, "Sélectionnez une fiche garantie", "", "Fichiers PDF (*.pdf);;Image (*.jpg *.jpeg *.png)");
  162. if(fileName != "")
  163. {
  164. QFile fichier(fileName);
  165. QFileInfo infoFile(fichier.fileName());
  166. fichier.open(QFile::ReadOnly);
  167. if(fichier.isReadable())
  168. {
  169. QByteArray contenuFichier = fichier.readAll();
  170. fichier.close();
  171. garantiePDF.insert(infoFile.fileName(), contenuFichier);
  172. ui->listGaranties->addItem(infoFile.fileName());
  173. }
  174. else
  175. QMessageBox::critical(this, "Erreur", "Impossible de lire le fichier "+fichier.fileName()+"\nVérifiez qu'il est bien accessible en lecture et réessayez.");
  176. }
  177. }
  178. void InfosProduitDialog::on_btnScannerGarantie_clicked()
  179. {
  180. // Ne fonctionne que sous Linux pour le moment. Dépendances : libsane et imagemagick
  181. ScannerDialog *dialog = new ScannerDialog(this);
  182. dialog->setModal(true);
  183. dialog->show();
  184. connect(dialog, SIGNAL(accepted()), SLOT(on_garantieScanned()));
  185. }
  186. void InfosProduitDialog::on_garantieScanned()
  187. {
  188. QString fileName = QDir::tempPath()+"/output.pdf";
  189. QFile::rename(fileName, QDir::tempPath()+"/Garantie.pdf");
  190. fileName = QDir::tempPath()+"/Garantie.pdf";
  191. QFile fichier(fileName);
  192. QFileInfo infoFile(fichier.fileName());
  193. fichier.open(QFile::ReadOnly);
  194. if(fichier.isReadable())
  195. {
  196. QByteArray contenuFichier = fichier.readAll();
  197. fichier.close();
  198. garantiePDF.insert(infoFile.fileName(), contenuFichier);
  199. ui->listGaranties->addItem(infoFile.fileName());
  200. }
  201. else
  202. QMessageBox::critical(this, "Erreur", "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 : "+fileName);
  203. }
  204. void InfosProduitDialog::on_listGaranties_currentRowChanged()
  205. {
  206. ui->btnSupprGarantie->setEnabled(true);
  207. }
  208. void InfosProduitDialog::on_listGaranties_itemDoubleClicked(QListWidgetItem *item)
  209. {
  210. QByteArray contentFile = garantiePDF.value(item->text());
  211. QFile tempFile(QDir::tempPath()+"/"+item->text());
  212. tempFile.open(QFile::WriteOnly);
  213. tempFile.write(contentFile);
  214. tempFile.close();
  215. QDesktopServices::openUrl(QUrl("file:///"+tempFile.fileName()));
  216. }
  217. void InfosProduitDialog::on_btnSupprGarantie_clicked()
  218. {
  219. if(QMessageBox::question(this, "Hermès", "Voulez-vous vraiment supprimer cette fiche garantie ?\nCette action n'est pas réversible.", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
  220. {
  221. QListWidgetItem *item = ui->listGaranties->selectedItems().value(0);
  222. garantiePDF.remove(item->text());
  223. delete item;
  224. }
  225. if(ui->listGaranties->count() == 0)
  226. ui->btnSupprGarantie->setEnabled(false);
  227. }
  228. // Bouton "OK"
  229. void InfosProduitDialog::on_buttonBox_accepted()
  230. {
  231. getParentItem()->setNomProduit(ui->txtNom->text());
  232. getParentItem()->setDateAchat(ui->dateAchat->date());
  233. if(!ui->checkGarantieAVie->isChecked())
  234. getParentItem()->setDateFinGarantie(ui->dateFinGarantie->date());
  235. else
  236. getParentItem()->setDateFinGarantie(QDate(1970, 1, 1));
  237. getParentItem()->setImage(this->image);
  238. getParentItem()->setMagasin(ui->comboMagasin->currentIndex()-1);
  239. getParentItem()->setEnSAV(ui->checkSAV->isChecked());
  240. getParentItem()->setFactures(this->facturePDF);
  241. getParentItem()->setGaranties(this->garantiePDF);
  242. }
  243. ProduitItem* InfosProduitDialog::getParentItem()
  244. {
  245. return static_cast<ProduitItem*>(this->parentWidget);
  246. }
  247. InfosProduitDialog::~InfosProduitDialog()
  248. {
  249. delete ui;
  250. }
  251. void InfosProduitDialog::on_checkGarantieAVie_toggled(bool checked)
  252. {
  253. if(checked)
  254. ui->dateFinGarantie->setEnabled(false);
  255. else
  256. ui->dateFinGarantie->setEnabled(true);
  257. }