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.

infosproduitdialog.cpp 12 KiB

10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
10 年之前
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. }