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.
 
 
 

331 lines
10 KiB

  1. #include "mainwindow.h"
  2. #include "produititem.h"
  3. #include "aboutdialog.h"
  4. #include "settingsdialog.h"
  5. #include "ui_mainwindow.h"
  6. #include "manufacturersmanager.h"
  7. #include <QSpacerItem>
  8. #include <QWidget>
  9. #include <QListWidgetItem>
  10. #include <QPixmap>
  11. #include <QSpacerItem>
  12. #include <QDate>
  13. #include <QMessageBox>
  14. #include <QListWidget>
  15. #include <QListWidgetItem>
  16. #include <QDir>
  17. #include <QFile>
  18. #include <QDataStream>
  19. #include <QList>
  20. #include <QDesktopServices>
  21. #include <QUrl>
  22. #include <QtXml/QDomDocument>
  23. #include <QNetworkAccessManager>
  24. #include <QNetworkReply>
  25. #include <QPushButton>
  26. #include <QJsonArray>
  27. #include <QJsonDocument>
  28. MainWindow::MainWindow(QWidget *parent) :
  29. QMainWindow(parent),
  30. ui(new Ui::MainWindow)
  31. {
  32. ui->setupUi(this);
  33. saveOnQuit = true;
  34. version = "0.7";
  35. searchBox = new QLineEdit(this);
  36. searchBox->addAction(QIcon(":/icons/icon-search.png"), QLineEdit::LeadingPosition);
  37. searchBox->setPlaceholderText(tr("Rechercher..."));
  38. searchBox->setClearButtonEnabled(true);
  39. connect(searchBox, SIGNAL(textChanged(QString)), SLOT(searchProduit(QString)));
  40. ui->mainToolBar->addSeparator();
  41. ui->mainToolBar->addWidget(searchBox);
  42. // Migration des fichiers si l'utilisateur vient d'une version antérieure à la 0.3
  43. QDir dir(QDir::homePath()+"/.deuchnord-hermes");
  44. if(dir.exists(QDir::homePath()+"/.deuchnord-hermes"))
  45. dir.rename(QDir::homePath()+"/.deuchnord-hermes", QDir::homePath()+"/deuchnord-hermes");
  46. if(QFile::exists(QDir::homePath()+"/hermes.hrms"))
  47. QFile::rename(QDir::homePath()+"/hermes.hrms", QDir::homePath()+"/deuchnord-hermes/products.hrms");
  48. // Récupération de la configuration
  49. settings = new QSettings("Deuchnord", "Hermes");
  50. QString placeSave = settings->value("placeSave").toString();
  51. if(placeSave == "")
  52. {
  53. settings->setValue("placeSave", QDir::homePath());
  54. placeSave = settings->value("placeSave").toString();
  55. }
  56. settings->setValue("lastExecutedVersion", version);
  57. QFile saveFile(placeSave + "/deuchnord-hermes/products.hrms");
  58. QDataStream content(&saveFile);
  59. content.setVersion(QDataStream::Qt_5_0);
  60. if(saveFile.open(QFile::ReadOnly))
  61. {
  62. QList<ProduitInfo> listInfoProd;
  63. content >> listInfoProd;
  64. for(ProduitInfo i : listInfoProd)
  65. ajouterProduit(new ProduitItem(this, i.nomProduit, i.dateAchat, i.dateFinGarantie, i.image, i.indexMagasin, i.enSAV, i.factures, i.garanties));
  66. }
  67. if(ui->listeProduits->count() > 0)
  68. ui->listeProduits->item(0)->setSelected(true);
  69. else
  70. ui->actionSupprimerProduit->setEnabled(false);
  71. // Recherche de nouvelle version :
  72. QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  73. connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(dlVersionFinished(QNetworkReply*)));
  74. manager->get(QNetworkRequest(QUrl("https://www.deuchnord.fr/updates/hermes")));
  75. }
  76. void MainWindow::dlVersionFinished(QNetworkReply *reply)
  77. {
  78. #ifdef Q_OS_LINUX
  79. QString os = "linux";
  80. #endif
  81. #ifdef Q_OS_WIN32
  82. QString os = "windows";
  83. #endif
  84. #ifdef Q_OS_DARWIN
  85. QString os = "darwin";
  86. #endif
  87. if(reply->error() != QNetworkReply::NoError)
  88. return;
  89. QString versionsAvailable = reply->readAll();
  90. QJsonDocument versionJson = QJsonDocument::fromJson(versionsAvailable.toUtf8());
  91. QJsonObject lastVersions = versionJson.object();
  92. if(lastVersions.contains("error"))
  93. return;
  94. if(version != lastVersions[os].toString())
  95. {
  96. ui->statusBar->showMessage(tr("Une nouvelle version (%1) est disponible !", "%1 represents the number of the new version (for instance: 0.4.1)").arg(lastVersions[os].toString()));
  97. QPushButton* btnUpdate = new QPushButton(tr("Télécharger la nouvelle version"));
  98. connect(btnUpdate, SIGNAL(clicked()), this, SLOT(dlNewVersionBtnClicked()));
  99. ui->statusBar->addPermanentWidget(btnUpdate);
  100. }
  101. }
  102. void MainWindow::dlNewVersionBtnClicked()
  103. {
  104. QDesktopServices::openUrl(QUrl("https://www.deuchnord.fr/projets/hermes"));
  105. }
  106. void MainWindow::searchProduit(QString search)
  107. {
  108. if(search != "")
  109. {
  110. for(int i = 0; i < ui->listeProduits->count(); i++)
  111. {
  112. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  113. ProduitInfo prod = item->getProduitInfo();
  114. // On cache les produits qui ne correspondent pas
  115. if(prod.nomProduit.contains(search, Qt::CaseInsensitive))
  116. ui->listeProduits->item(i)->setHidden(false);
  117. else
  118. ui->listeProduits->item(i)->setHidden(true);
  119. }
  120. }
  121. else
  122. {
  123. // Si la zone de recherche est vide, on affiche tout
  124. for(int i = 0; i < ui->listeProduits->count(); i++)
  125. ui->listeProduits->item(i)->setHidden(false);
  126. }
  127. updateStatusMessage();
  128. }
  129. void MainWindow::on_actionNouveauProduit_triggered()
  130. {
  131. ProduitItem *prod = new ProduitItem(this, tr("Nouveau produit", "Showed in the field \"Name\" in the product information window by default."), QDate::currentDate(), QDate::currentDate().addYears(1));
  132. prod->openDialog(true);
  133. QListWidgetItem* item = ajouterProduit(prod);
  134. item->setSelected(true);
  135. connect(prod, SIGNAL(deleteAsked()), SLOT(deleteAsked()));
  136. ui->actionSupprimerProduit->setEnabled(true);
  137. }
  138. void MainWindow::deleteAsked()
  139. {
  140. on_actionSupprimerProduit_triggered(true);
  141. }
  142. void MainWindow::on_actionSupprimerProduit_triggered(bool dontAskConfirm)
  143. {
  144. if(ui->listeProduits->selectedItems().count() == 1)
  145. {
  146. QListWidgetItem *item = ui->listeProduits->selectedItems()[0];
  147. int answer;
  148. if(!dontAskConfirm)
  149. answer = QMessageBox::question(this, tr("Supprimer le produit"), tr("Êtes-vous sûr de vouloir supprimer ce produit ?\nCette action n'est pas réversible."), QMessageBox::Yes | QMessageBox::No);
  150. else
  151. answer = QMessageBox::Yes;
  152. if(answer == QMessageBox::Yes)
  153. {
  154. ui->listeProduits->setCurrentRow(ui->listeProduits->row(item));
  155. // Étape 1 : on vérifie si le magasin du produit est encore utilisé par d'autres produits
  156. ProduitItem *prodToRemove = ((ProduitItem*) ui->listeProduits->itemWidget(item));
  157. int manufacturer = prodToRemove->getMagasin();
  158. bool manufacturerIsUsedByAnotherProduct = false;
  159. for(int i = 0; i < ui->listeProduits->count(); i++) {
  160. if(i != ui->listeProduits->currentRow()) {
  161. QListWidgetItem *itemProd = ui->listeProduits->item(i);
  162. ProduitItem *prod = (ProduitItem*) ui->listeProduits->itemWidget(itemProd);
  163. if(prod->getMagasin() == manufacturer)
  164. manufacturerIsUsedByAnotherProduct = true;
  165. }
  166. }
  167. // Si le magasin n'est plus utilisé, on le supprime
  168. if(!manufacturerIsUsedByAnotherProduct) {
  169. ManufacturersManager mg;
  170. mg.deleteManufacturer(manufacturer);
  171. mg.save();
  172. }
  173. // Étae 2 : on suppprime le produit
  174. ui->listeProduits->removeItemWidget(item);
  175. delete item;
  176. if(ui->listeProduits->count() == 0)
  177. ui->actionSupprimerProduit->setEnabled(false);
  178. updateStatusMessage();
  179. }
  180. }
  181. }
  182. QListWidgetItem* MainWindow::ajouterProduit(ProduitItem *produit)
  183. {
  184. QListWidgetItem *widgetItem = new QListWidgetItem();
  185. widgetItem->setSizeHint(QSize(0, 128));
  186. ui->listeProduits->addItem(widgetItem);
  187. ui->listeProduits->setItemWidget(widgetItem, produit);
  188. updateStatusMessage();
  189. return widgetItem;
  190. }
  191. void MainWindow::on_actionSettings_triggered()
  192. {
  193. SettingsDialog *settingsDialog = new SettingsDialog(this);
  194. settingsDialog->setModal(true);
  195. settingsDialog->show();
  196. connect(settingsDialog, SIGNAL(dontSaveOnQuit()), SLOT(settings_dontSaveOnQuit()));
  197. }
  198. void MainWindow::settings_dontSaveOnQuit()
  199. {
  200. saveOnQuit = false;
  201. }
  202. void MainWindow::on_actionAPropos_triggered()
  203. {
  204. AboutDialog *dialog = new AboutDialog(this, version);
  205. dialog->setModal(true);
  206. dialog->show();
  207. }
  208. void MainWindow::on_actionReportBug_triggered()
  209. {
  210. QDesktopServices::openUrl(QUrl("https://tickets.deuchnord.fr/index.php?project=2&do=index&switch=1"));
  211. }
  212. void MainWindow::on_actionAide_triggered()
  213. {
  214. QDesktopServices::openUrl(QUrl("https://doc.deuchnord.fr/hermes/start"));
  215. }
  216. Ui::MainWindow *MainWindow::getUI()
  217. {
  218. return ui;
  219. }
  220. void MainWindow::updateStatusMessage()
  221. {
  222. int nb = 0;
  223. for(int i = 0; i < ui->listeProduits->count(); i++)
  224. if(!ui->listeProduits->item(i)->isHidden())
  225. nb++;
  226. ui->statusBar->showMessage(tr("%n produit(s) affiché(s).", "", nb));
  227. }
  228. MainWindow::~MainWindow()
  229. {
  230. // Enregistrement de la configuration
  231. if(saveOnQuit)
  232. {
  233. QString place = settings->value("placeSave").toString();
  234. QDir dir(place+"/deuchnord-hermes");
  235. if(!dir.exists())
  236. dir.mkdir(place+"/deuchnord-hermes");
  237. QDir v1Dir(place+"/deuchnord-hermes/json");
  238. if(!v1Dir.exists())
  239. dir.mkdir(place+"/deuchnord-hermes/json");
  240. // Save in JSON format for version 1.0 (one file per product to avoid huge file issue)
  241. for(int i = 0; i < ui->listeProduits->count(); i++)
  242. {
  243. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  244. QJsonDocument jsonDocument(item->getJSON());
  245. QFile jsonFile(place + "/deuchnord-hermes/json/" + QString::number(i) + ".json");
  246. if(jsonFile.open((QFile::WriteOnly)))
  247. {
  248. jsonFile.write(jsonDocument.toJson());
  249. jsonFile.close();
  250. }
  251. }
  252. // Legacy 0.x file
  253. QFile saveFile(place+"/deuchnord-hermes/products.hrms");
  254. QDataStream content(&saveFile);
  255. content.setVersion(QDataStream::Qt_5_0);
  256. QList<ProduitInfo> listProd;
  257. if(saveFile.open(QFile::WriteOnly))
  258. {
  259. for(int i = 0; i < ui->listeProduits->count(); i++)
  260. {
  261. ProduitItem* item = (ProduitItem*) ui->listeProduits->itemWidget(ui->listeProduits->item(i));
  262. ProduitInfo prod = item->getProduitInfo();
  263. listProd << prod;
  264. }
  265. }
  266. content << listProd;
  267. saveFile.close();
  268. }
  269. delete ui;
  270. }