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.
 
 
 

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