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.
 
 
 

304 lines
10 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. }
  70. void InfosProduitDialog::on_btnImageParcourir_clicked()
  71. {
  72. QString filename = QFileDialog::getOpenFileName(this, "Sélectionnez une image", "", "Images supportées (*.bmp *.gif *.jpg *.jpeg *.png *.pbm *.pgm *.ppm *.xbm *.xpm)");
  73. if(filename != "")
  74. {
  75. image = QPixmap(filename);
  76. image = image.scaled(QSize(128, 128), Qt::KeepAspectRatio);
  77. ui->image->setPixmap(image);
  78. }
  79. }
  80. void InfosProduitDialog::on_btnImageSupprimer_clicked()
  81. {
  82. image = QPixmap(":/images/no-picture.jpg");
  83. ui->image->setPixmap(image);
  84. }
  85. void InfosProduitDialog::on_btnAjoutFacture_clicked()
  86. {
  87. QString fileName = QFileDialog::getOpenFileName(this, "Sélectionnez une facture", "", "Fichiers PDF (*.pdf);;Image (*.jpg *.jpeg *.png)");
  88. if(fileName != "")
  89. {
  90. QFile fichier(fileName);
  91. QFileInfo infoFile(fichier.fileName());
  92. fichier.open(QFile::ReadOnly);
  93. if(fichier.isReadable())
  94. {
  95. QByteArray contenuFichier = fichier.readAll();
  96. fichier.close();
  97. facturePDF.insert(infoFile.fileName(), contenuFichier);
  98. ui->listFactures->addItem(infoFile.fileName());
  99. }
  100. else
  101. QMessageBox::critical(this, "Erreur", "Impossible de lire le fichier "+fichier.fileName()+"\nVérifiez qu'il est bien accessible en lecture et réessayez.");
  102. }
  103. }
  104. void InfosProduitDialog::on_btnScannerFacture_clicked()
  105. {
  106. // Ne fonctionne que sous Linux pour le moment. Dépendances : libsane et imagemagick
  107. #ifdef Q_OS_LINUX
  108. ScannerDialog *dialog = new ScannerDialog(this);
  109. dialog->setModal(true);
  110. dialog->show();
  111. connect(dialog, SIGNAL(accepted()), SLOT(on_factureScanned()));
  112. #else
  113. QMessageBox::warning(this, "Fonction indisponible", "Cette fonction n'est pas disponible pour votre système actuellement.\nDésolé pour la gêne.");
  114. #endif
  115. }
  116. void InfosProduitDialog::on_factureScanned()
  117. {
  118. QString fileName = QDir::tempPath()+"/output.pdf";
  119. QFile::rename(fileName, QDir::tempPath()+"/Facture.pdf");
  120. fileName = QDir::tempPath()+"/Facture.pdf";
  121. QFile fichier(fileName);
  122. QFileInfo infoFile(fichier.fileName());
  123. fichier.open(QFile::ReadOnly);
  124. if(fichier.isReadable())
  125. {
  126. QByteArray contenuFichier = fichier.readAll();
  127. fichier.close();
  128. facturePDF.insert(infoFile.fileName(), contenuFichier);
  129. ui->listFactures->addItem(infoFile.fileName());
  130. }
  131. else
  132. 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);
  133. }
  134. void InfosProduitDialog::on_listFactures_currentRowChanged()
  135. {
  136. ui->btnSupprFacture->setEnabled(true);
  137. }
  138. void InfosProduitDialog::on_listFactures_itemDoubleClicked(QListWidgetItem *item)
  139. {
  140. QByteArray contentFile = facturePDF.value(item->text());
  141. QFile tempFile(QDir::tempPath()+"/"+item->text());
  142. tempFile.open(QFile::WriteOnly);
  143. tempFile.write(contentFile);
  144. tempFile.close();
  145. QDesktopServices::openUrl(QUrl("file:///"+tempFile.fileName()));
  146. }
  147. void InfosProduitDialog::on_btnSupprFacture_clicked()
  148. {
  149. 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)
  150. {
  151. QListWidgetItem *item = ui->listFactures->selectedItems().value(0);
  152. facturePDF.remove(item->text());
  153. delete item;
  154. }
  155. if(ui->listFactures->count() == 0)
  156. ui->btnSupprFacture->setEnabled(false);
  157. }
  158. void InfosProduitDialog::on_btnAjoutGarantie_clicked()
  159. {
  160. QString fileName = QFileDialog::getOpenFileName(this, "Sélectionnez une fiche garantie", "", "Fichiers PDF (*.pdf);;Image (*.jpg *.jpeg *.png)");
  161. if(fileName != "")
  162. {
  163. QFile fichier(fileName);
  164. QFileInfo infoFile(fichier.fileName());
  165. fichier.open(QFile::ReadOnly);
  166. if(fichier.isReadable())
  167. {
  168. QByteArray contenuFichier = fichier.readAll();
  169. fichier.close();
  170. garantiePDF.insert(infoFile.fileName(), contenuFichier);
  171. ui->listGaranties->addItem(infoFile.fileName());
  172. }
  173. else
  174. QMessageBox::critical(this, "Erreur", "Impossible de lire le fichier "+fichier.fileName()+"\nVérifiez qu'il est bien accessible en lecture et réessayez.");
  175. }
  176. }
  177. void InfosProduitDialog::on_btnScannerGarantie_clicked()
  178. {
  179. // Ne fonctionne que sous Linux pour le moment. Dépendances : libsane et imagemagick
  180. #ifdef Q_OS_LINUX
  181. ScannerDialog *dialog = new ScannerDialog(this);
  182. dialog->setModal(true);
  183. dialog->show();
  184. connect(dialog, SIGNAL(accepted()), SLOT(on_garantieScanned()));
  185. #else
  186. QMessageBox::warning(this, "Fonction indisponible", "Cette fonction n'est pas disponible pour votre système actuellement.\nDésolé pour la gêne.");
  187. #endif
  188. }
  189. void InfosProduitDialog::on_garantieScanned()
  190. {
  191. QString fileName = QDir::tempPath()+"/output.pdf";
  192. QFile::rename(fileName, QDir::tempPath()+"/Garantie.pdf");
  193. fileName = QDir::tempPath()+"/Garantie.pdf";
  194. QFile fichier(fileName);
  195. QFileInfo infoFile(fichier.fileName());
  196. fichier.open(QFile::ReadOnly);
  197. if(fichier.isReadable())
  198. {
  199. QByteArray contenuFichier = fichier.readAll();
  200. fichier.close();
  201. garantiePDF.insert(infoFile.fileName(), contenuFichier);
  202. ui->listGaranties->addItem(infoFile.fileName());
  203. }
  204. else
  205. 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);
  206. }
  207. void InfosProduitDialog::on_listGaranties_currentRowChanged()
  208. {
  209. ui->btnSupprGarantie->setEnabled(true);
  210. }
  211. void InfosProduitDialog::on_listGaranties_itemDoubleClicked(QListWidgetItem *item)
  212. {
  213. QByteArray contentFile = garantiePDF.value(item->text());
  214. QFile tempFile(QDir::tempPath()+"/"+item->text());
  215. tempFile.open(QFile::WriteOnly);
  216. tempFile.write(contentFile);
  217. tempFile.close();
  218. QDesktopServices::openUrl(QUrl("file:///"+tempFile.fileName()));
  219. }
  220. void InfosProduitDialog::on_btnSupprGarantie_clicked()
  221. {
  222. 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)
  223. {
  224. QListWidgetItem *item = ui->listGaranties->selectedItems().value(0);
  225. garantiePDF.remove(item->text());
  226. delete item;
  227. }
  228. if(ui->listGaranties->count() == 0)
  229. ui->btnSupprGarantie->setEnabled(false);
  230. }
  231. // Bouton "OK"
  232. void InfosProduitDialog::on_buttonBox_accepted()
  233. {
  234. getParentItem()->setNomProduit(ui->txtNom->text());
  235. getParentItem()->setDateAchat(ui->dateAchat->date());
  236. if(!ui->checkGarantieAVie->isChecked())
  237. getParentItem()->setDateFinGarantie(ui->dateFinGarantie->date());
  238. else
  239. getParentItem()->setDateFinGarantie(QDate(1970, 1, 1));
  240. getParentItem()->setImage(this->image);
  241. getParentItem()->setMagasin(ui->comboMagasin->currentIndex()-1);
  242. getParentItem()->setEnSAV(ui->checkSAV->isChecked());
  243. getParentItem()->setFactures(this->facturePDF);
  244. getParentItem()->setGaranties(this->garantiePDF);
  245. }
  246. ProduitItem* InfosProduitDialog::getParentItem()
  247. {
  248. return static_cast<ProduitItem*>(this->parentWidget);
  249. }
  250. InfosProduitDialog::~InfosProduitDialog()
  251. {
  252. delete ui;
  253. }
  254. void InfosProduitDialog::on_checkGarantieAVie_toggled(bool checked)
  255. {
  256. if(checked)
  257. ui->dateFinGarantie->setEnabled(false);
  258. else
  259. ui->dateFinGarantie->setEnabled(true);
  260. }