From ff14091476a35de16a9ea3208501040cfae93a06 Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 14 Dec 2022 12:55:46 +0100 Subject: MODEL + reorganisation --- data/latex/devis.tex | 79 +++++++++++ data/latex/enveloppe_recto.tex | 21 +++ data/latex/enveloppe_verso.tex | 13 ++ data/latex/facture.tex | 80 +++++++++++ data/latex/location.tex | 44 ++++++ data/latex/ordipolo.png | Bin 0 -> 46751 bytes src/Dates.php | 105 ++++++++++++++ src/Latex.php | 84 +++++++++++ src/dependances.php | 100 +++++++++++++ src/functions.php | 51 +++++++ src/latex_templates/devis.php | 84 +++++++++++ src/latex_templates/enveloppe_recto.php | 26 ++++ src/latex_templates/enveloppe_verso.php | 18 +++ src/latex_templates/facture.php | 85 ++++++++++++ src/latex_templates/location.php | 49 +++++++ src/main.php | 239 ++++++++++++++++++++++++++++++++ src/model/CESU.php | 46 ++++++ src/model/Clients.php | 50 +++++++ src/model/DB.php | 48 +++++++ src/model/DevisFactures.php | 98 +++++++++++++ src/model/Locations.php | 74 ++++++++++ src/model/Model.php | 162 ++++++++++++++++++++++ src/model/Prestations.php | 62 +++++++++ src/model/StructTablesDB.php | 35 +++++ src/view/Zenity.php | 110 +++++++++++++++ src/view/zenity_setup.php | 37 +++++ 26 files changed, 1800 insertions(+) create mode 100644 data/latex/devis.tex create mode 100644 data/latex/enveloppe_recto.tex create mode 100644 data/latex/enveloppe_verso.tex create mode 100644 data/latex/facture.tex create mode 100644 data/latex/location.tex create mode 100644 data/latex/ordipolo.png create mode 100644 src/Dates.php create mode 100644 src/Latex.php create mode 100644 src/dependances.php create mode 100644 src/functions.php create mode 100644 src/latex_templates/devis.php create mode 100644 src/latex_templates/enveloppe_recto.php create mode 100644 src/latex_templates/enveloppe_verso.php create mode 100644 src/latex_templates/facture.php create mode 100644 src/latex_templates/location.php create mode 100755 src/main.php create mode 100644 src/model/CESU.php create mode 100644 src/model/Clients.php create mode 100644 src/model/DB.php create mode 100644 src/model/DevisFactures.php create mode 100644 src/model/Locations.php create mode 100644 src/model/Model.php create mode 100644 src/model/Prestations.php create mode 100644 src/model/StructTablesDB.php create mode 100644 src/view/Zenity.php create mode 100644 src/view/zenity_setup.php diff --git a/data/latex/devis.tex b/data/latex/devis.tex new file mode 100644 index 0000000..debcdc5 --- /dev/null +++ b/data/latex/devis.tex @@ -0,0 +1,79 @@ +\documentclass{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} % marges +\usepackage{graphicx} % insertions d'images +\usepackage{textcomp} % pour N° +\usepackage{xcolor} % texte en couleur +\usepackage{tabularx} % dimensions des tableaux automatique +\usepackage{tikz} % le rectangle + +\begin{document} + \setlength{\parindent}{0cm} % supprimer les alinéas + \large{} + \pagestyle{empty} % en-tête et pied de page vides + \definecolor{vert}{rgb}{0.07, 0.46, 0.13} % saisie en vert + + \begin{center} + \includegraphics{ordipolo.png}\\ + \Large\textbf{Dépannage informatique - Assistance à domicile} + \end{center} + + 2 A rue de l'île de Man, 29000 Quimper + + SIRET : 814 320 610 00011 + + \begin{tabularx}{0.67\linewidth}{@{}X@{}@{}X@{}} + Tel : 06.63.85.48.82 & Courriel : ordipolo@gmx.fr + \end{tabularx} + + Plus d'infos sur le site web: https\string://ordipolo.fr\\ + % \string supprime l'espace devant les : + + \begin{center} + \large\textbf{DEVIS} + \end{center} + + CLIENT\\ + + \begin{tabularx}{\linewidth}{@{}X@{}@{}X@{}} + Mme, M : \textcolor{vert}{} & + Date du devis : \textcolor{vert}{}\\ + Adresse : \textcolor{vert}{} & + Delai de livraison : \textcolor{vert}{}\\ + \end{tabularx}\\\\ + + PRESTATION\\ + + \textcolor{vert}{} + + Total main d'oeuvre : \textcolor{vert}{}\\ + + PIÈCES\\ + + \textcolor{vert}{} + + Total pièces : \textcolor{vert}{}\\ + + TOTAL\\ + + Déplacement : \textcolor{vert}{} + + Total HT : \textcolor{vert}{} + + \textit{(TVA non applicable, article 293B du code général des impôts)} + + Référence du devis : \textcolor{vert}{}\\ + + Devis reçu avant l'exécution des travaux, signature du client :\\ + \begin{tikzpicture} + \draw (0,0) rectangle (4,2); + \end{tikzpicture}\\ + + \small{}NOTA BENE\\ + + Si le délai de livraison n’est pas précisé, c’est naturellement le délai légal de 30 jours qui est appliqué. Lorsqu'Ordi Polo garde (ou prête) un ordinateur le temps nécessaire à la réparation, le prêt peut être formalisé par un document signé par les deux parties. Le dépannage inclut principalement l'intervention sur les logiciels et si nécessaire le démontage et remontage de la machine nécessaires au nettoyage de la poussière ou au remplacement d'une pièce. Ordi Polo ne répare pas les composants électroniques défectueux et n'est pas responsable des dysfonctionnements de l'ordinateur dont l'origine est matérielle. Ordi Polo ne vend pas de matériel mais peut conseiller ou réaliser les démarches d’un achat. +\end{document} \ No newline at end of file diff --git a/data/latex/enveloppe_recto.tex b/data/latex/enveloppe_recto.tex new file mode 100644 index 0000000..d1f3f43 --- /dev/null +++ b/data/latex/enveloppe_recto.tex @@ -0,0 +1,21 @@ +\documentclass[]{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage{graphicx} % insertions d'images +\usepackage[papersize={22cm, 11cm}, top=1cm, left=1cm, bottom=1cm]{geometry} +\pagestyle{empty} + +\begin{document} + \setlength{\parindent}{0cm} + \includegraphics{ordipolo.png}\\ + \large\textbf{Dépannage informatique - Assistance à domicile} + + \setlength{\parindent}{7,9cm} + \begin{minipage}[b][5,8cm]{12cm} + \LARGE{M. Truc\\3, rue Machin\\\\\\} + \LARGE{2 \ 9 \ 0 \ 0 \ 0 \ \ \ \ QUIMPER} + \end{minipage} +\end{document} \ No newline at end of file diff --git a/data/latex/enveloppe_verso.tex b/data/latex/enveloppe_verso.tex new file mode 100644 index 0000000..24baa8a --- /dev/null +++ b/data/latex/enveloppe_verso.tex @@ -0,0 +1,13 @@ +\documentclass[]{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[papersize={22cm, 11cm}, top=0.6cm, left=4.5cm]{geometry} +\pagestyle{empty} + +\begin{document} + \setlength{\parindent}{0cm} + \Large{Paul Jusot\\2A, rue de l'île de Man\\29000 QUIMPER} +\end{document} \ No newline at end of file diff --git a/data/latex/facture.tex b/data/latex/facture.tex new file mode 100644 index 0000000..babb2ab --- /dev/null +++ b/data/latex/facture.tex @@ -0,0 +1,80 @@ +\documentclass{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} % marges +\usepackage{graphicx} % insertions d'images +\usepackage{textcomp} % pour N° +\usepackage{xcolor} % texte en couleur +\usepackage{tabularx} % dimensions des tableaux automatique + +\begin{document} + \setlength{\parindent}{0cm} % supprimer les alinéas + \large{} + \pagestyle{empty} % en-tête et pied de page vides + \definecolor{vert}{rgb}{0.07, 0.46, 0.13} % saisie en vert + + \begin{center} + \includegraphics{ordipolo.png}\\ + \Large\textbf{Dépannage informatique - Assistance à domicile} + \end{center} + + 2 A rue de l'île de Man, 29000 Quimper + + SIRET : 814 320 610 00011 + + \begin{tabularx}{0.67\linewidth}{@{}X@{}@{}X@{}} + Tel : 06.63.85.48.82 & Courriel : ordipolo@gmx.fr + \end{tabularx} + + Plus d'infos sur le site web: https\string://ordipolo.fr\\ + % \string supprime l'espace devant les : + + \begin{center} + \large\textbf{FACTURE} + \end{center} + + CLIENT\\ + + \begin{tabularx}{\linewidth}{@{}X@{}@{}X@{}} + Mme, M : \textcolor{vert}{} & + Date : \textcolor{vert}{}\\ + \end{tabularx}\\ + Adresse : \textcolor{vert}{}\\ + + PRESTATION\\ + + \textcolor{vert}{} + + Modèle de l'ordinateur : \textcolor{vert}{} + + Système d'exploitation : \textcolor{vert}{} + + Données à conserver : \textcolor{vert}{} + + Clé d'activation : \textcolor{vert}{}\\ + + Total main d'oeuvre : \textcolor{vert}{}\\ + + PIÈCES\\ + + \textcolor{vert}{} + + Total pièces : \textcolor{vert}{}\\ + + TOTAL\\ + + Déplacement : \textcolor{vert}{} + + Total HT : \textcolor{vert}{} + + \textit{(TVA non applicable, article 293B du code général des impôts)} + + Référence de la facture : \textcolor{vert}{}\\ + + \small{}NOTA BENE\\ + + Lorsqu'Ordi Polo garde (ou prête) un ordinateur le temps nécessaire à la réparation, le prêt peut être formalisé par un document signé par les deux parties. Le dépannage inclut principalement l'intervention sur les logiciels et si nécessaire le démontage et remontage de la machine nécessaires au nettoyage de la poussière ou au remplacement d'une pièce. Ordi Polo ne répare pas les composants électroniques défectueux et n'est pas responsable des dysfonctionnements de l'ordinateur dont l'origine est matérielle. Ordi Polo ne vend pas de matériel mais peut conseiller ou réaliser les démarches d’un achat. +\end{document} \ No newline at end of file diff --git a/data/latex/location.tex b/data/latex/location.tex new file mode 100644 index 0000000..bcfb1e5 --- /dev/null +++ b/data/latex/location.tex @@ -0,0 +1,44 @@ +\documentclass{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} % marges +\usepackage{graphicx} % insertions d'images +\usepackage{textcomp} % pour N° +\usepackage{xcolor} % texte en couleur +%\usepackage{wrapfig} % placer texte et image côte-à-côte +\usepackage{tabularx} % dimensions des tableaux automatique + +\begin{document} + \setlength{\parindent}{0cm} % supprimer les alinéas + \large{} + \pagestyle{empty} % en-tête et pied de page vides + \definecolor{vert}{rgb}{0.07, 0.46, 0.13} % saisie en vert + + \begin{center} + \includegraphics{ordipolo.png}\\ + \Large\textbf{Dépannage informatique - Assistance à domicile} + \end{center} + + 2 A rue de l'île de Man, 29000 Quimper + + SIRET : 814 320 610 00011 + + \begin{tabularx}{0.67\linewidth}{@{}X@{}@{}X@{}} + Tel : 06.63.85.48.82 & Courriel : ordipolo@gmx.fr + \end{tabularx} + + Plus d'infos sur le site web: https\string://ordipolo.fr\\ + % \string supprime l'espace devant les : + + CLIENT\\ + + \begin{tabularx}{\linewidth}{@{}X@{}@{}X@{}} + Mme, M : \textcolor{vert}{} & + Date : \textcolor{vert}{}\\ + \end{tabularx}\\ + Adresse : \textcolor{vert}{}\\ + +\end{document} \ No newline at end of file diff --git a/data/latex/ordipolo.png b/data/latex/ordipolo.png new file mode 100644 index 0000000..2acd67d Binary files /dev/null and b/data/latex/ordipolo.png differ diff --git a/src/Dates.php b/src/Dates.php new file mode 100644 index 0000000..de71b08 --- /dev/null +++ b/src/Dates.php @@ -0,0 +1,105 @@ + dates avant 1970 + static public $date_format = 'EU'; // dates européennes jj-mm-aaaa (EU) ou américaines mm/dd/yyyy (US) + + + public function __construct($entry = NULL) + { + if(gettype($entry) === 'string') // une date est attendue + { + $this->setDate($entry); + } + elseif(gettype($entry) === 'integer') + { + $this->setTimestamp($entry); + } + } + + + public function setDate(string $entry) + { + $entry = $this->dashOrSlash($entry); // pour strtotime() + + $splitedDate = preg_split('#\D#', $entry); // \D = tout sauf chiffre + + if(self::$date_format === 'EU') + { + $tmp = $splitedDate[0]; + $splitedDate[0] = $splitedDate[1]; + $splitedDate[1] = $tmp; + } + + if(checkdate($splitedDate[0], $splitedDate[1], $splitedDate[2])) + { + $this->date = $entry; + $this->timestamp = strtotime($entry); // date (string) -> timestamp (int) + // strtotime() devine le format en analysant la chaîne en entrée, on l'aide un peu + // avec des /, php considère que la date est américaine + // avec des - ou des ., php considère que la date est européenne + } + else + { + echo("Date incorrecte, le format de la date dans le fichier config.php est " . self::$date_format . ".\nLes choix possibles sont EU pour Europe et US pour États-Unis."); + die(); + } + } + + public function setTimestamp(int $entry) + { + $this->timestamp = $entry; + $this->date = $this->timestamp_to_date($entry); // timestamp (int) -> date (string) + } + + + public function getDate(): string + { + return($this->date); + } + + public function getTimestamp(): int + { + return($this->timestamp); + } + + + private function dashOrSlash(string $date): string + { + if(self::$date_format === 'EU') + { + // change jj/mm/aaaa en jj-mm-aaaa + return(preg_replace('#\D#', '-', $date)); // \D = tout sauf chiffre + } + elseif(self::$date_format === 'US') + { + // change mm-dd.yyyy en mm/dd/yyyy + return(preg_replace('#\D#', '/', $date)); + } + else + { + echo('Le fichier config.php comporte une erreur. La variable $date_format doit avoir pour valeur "EU" ou "US"'); + die(); // brutal + } + } + + private function timestamp_to_date(int $timestamp): string + { + if(self::$date_format === 'EU') + { + return(date("j-m-Y", $timestamp)); + } + elseif(self::$date_format === 'US') + { + return(date("m/d/Y", $timestamp)); + } + else + { + echo('Le fichier config.php comporte une erreur. La variable $date_format doit avoir pour valeur "EU" ou "US"'); + die(); // brutal + } + } +} diff --git a/src/Latex.php b/src/Latex.php new file mode 100644 index 0000000..c3d56af --- /dev/null +++ b/src/Latex.php @@ -0,0 +1,84 @@ +fileName = $quoi . '-' . $codePresta . '.tex'; + } +} + +class DevisLatex extends PrestaLatex +{} + +class FactureLatex extends PrestaLatex +{} + +class LocationLatex extends PrestaLatex +{} + +class EnveloppeRectoLatex extends PrestaLatex +{} +class EnveloppeVersoLatex extends PrestaLatex +{} + + +abstract class ComptaLatex extends Latex +{ + public function __construct(string $quoi, string $annee, int $numeroMois = 0) + { + nameTheFile($quoi, $annee, $numeroMois); + } + + // forme = Recettes-2022-06-Juin.tex ou Recettes-2022.tex + // type de 'annee'? + protected function nameTheFile(string $quoi, string $annee, int $numeroMois = 0) + { + $this->fileName = $quoi . '-' . $annee; + $mois = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']; + if($numeroMois > 0 && $numeroMois <= 12) + { + $this->fileName .= '-' . $numeroMois . '-' . $mois[$numeroMois]; + } + $this->fileName .= '.tex'; + } +} + +class LivreRecettesLatex extends ComptaLatex +{} + +class RegistreAchatsLatex extends ComptaLatex +{} + +class BilanLatex extends ComptaLatex +{} diff --git a/src/dependances.php b/src/dependances.php new file mode 100644 index 0000000..66ce414 --- /dev/null +++ b/src/dependances.php @@ -0,0 +1,100 @@ + /dev/null") === '') // commande qui n'ouvre pas de fenêtre, erreur si la chaine est vide parce que la sortie d'erreur va dans /dev/null +{ + printf("Impossible de lancer zenity. Veuillez installer le paquet zenity\n"); + exit(); +} + +// compilateur pdflatex disponible +if(exec("pdflatex -version 2> /dev/null") === '') // erreur si la chaine est vide parce que la sortie d'erreur va dans /dev/null +{ + printf("Impossible de lancer pdflatex. Veuillez installer une distribution LaTeX.\n"); + exit(); +} + +// test de la présence du paquet php-sqlite +// compliqué? dépend de l'OS? +// note: l'erreur se produit dès le démarrage de PHP si le php.ini est bon mais qu'il manque le paquet + +// module pdo_sqlite de PHP activé? +if(!extension_loaded("pdo_sqlite")) +{ + printf("Impossible d'utiliser la base de données. Veuillez installer le paquet php-sqlite ET activer l'extension pdo_sqlite dans le fichier php.ini.\n"); + exit(); +} + + +// client sqlite +if($exec_mode === 'gui') +{ + // sqlitebrowser disponible + if(exec("which sqlitebrowser 2> /dev/null") !== '') // which parcourt les dossiers du PATH et affiche les chemins trouvés, erreur si la chaine est vide parce que la sortie d'erreur va dans /dev/null + { + $sqlitebrowser_enable = true; + } + // terminal en mode graphique disponible, permettra d'y utiliser sqlite dans la console + else + { + printf("Sqlitebrowser n'est pas disponible. J'espère que vous maîtrisez le SQL.\n"); + + if(exec("which xterm 2> /dev/null") !== '' && exec("xterm -v 2> /dev/null") !== '') + { + $x_term_ccommand = 'xterm -e'; + } + elseif(exec("which urxvt 2> /dev/null") !== '') + { + $x_term_ccommand = 'urxvt -e'; + } + elseif(exec("which lxterminal 2> /dev/null") !== '' && exec("lxterminal -v 2> /dev/null") !== '') + { + $x_term_ccommand = 'lxterminal -e'; + } + elseif(exec("which xfce4-terminal 2> /dev/null") !== '' && exec("xfce4-terminal -V 2> /dev/null") !== '') + { + $x_term_ccommand = 'xfce4-terminal -x'; + } + elseif(exec("which gnome-terminal 2> /dev/null") !== '') + { + $x_term_ccommand = 'gnome-terminal --'; + } + elseif(exec("which konsole 2> /dev/null") !== '' && exec("konsole -v 2> /dev/null") !== '') + { + $x_term_ccommand = 'konsole -e'; + } + // pour MAC - NON TESTÉ !! (possibilité de détecter le système avec uname?) + //~ elseif(exec("which Terminal 2> /dev/null") !== '') + //~ { + //~ $x_term_ccommand = 'open -a Terminal -e'; // ne marche probablement pas + //~ } + else + { + printf("Impossible d'ouvrir un terminal pour y lancer sqlite. Veuillez installer un terminal en mode graphique (par exemple xterm).\n"); + } + } +} + +// sqlite CLI disponible +if(exec("which sqlite 2> /dev/null") !== '' && exec("sqlite --version 2> /dev/null") !== '') +{ + $sqlite_cli = 'sqlite'; +} +elseif(exec("which sqlite3 2> /dev/null") !== '' && exec("sqlite3 --version 2> /dev/null") !== '') +{ + $sqlite_cli = 'sqlite3'; +} +else +{ + printf("Impossible de lancer sqlite dans le terminal en utilisant la commande ' . $sqlite_cli . '\n"); +} diff --git a/src/functions.php b/src/functions.php new file mode 100644 index 0000000..d67a05e --- /dev/null +++ b/src/functions.php @@ -0,0 +1,51 @@ + /dev/null 2>&1 &'; + // stdout > /dev/null et & permettent de rendre la main à PHP + // stderr > stdout pour cacher un message inutile + return $command; +} + +function recherche_client(string $saisie): array +{ + $resultats = []; + + // recherche dans la BDD + + + return($resultats); +} + +// compilation à partir d'un fichier .tex +function latexToPdf(string $fileName, string $latexPath, string $pdfPath) +{ + $outputDir = ''; + if($pdfPath !== '') + { + $outputDir = '-output-directory=' . $pdfPath . ' '; + } + + // compilation + exec('pdflatex ' . $outputDir . $latexPath . $fileName); + + // nettoyage + $basename = basename($fileName, '.tex'); + unlink($pdfPath . $basename . '.aux'); + unlink($pdfPath . $basename . '.log'); +} diff --git a/src/latex_templates/devis.php b/src/latex_templates/devis.php new file mode 100644 index 0000000..7df98e8 --- /dev/null +++ b/src/latex_templates/devis.php @@ -0,0 +1,84 @@ + +\documentclass{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} % marges +\usepackage{graphicx} % insertions d'images +\usepackage{textcomp} % pour N° +\usepackage{xcolor} % texte en couleur +\usepackage{tabularx} % dimensions des tableaux automatique +\usepackage{tikz} % le rectangle + +\begin{document} + \setlength{\parindent}{0cm} % supprimer les alinéas + \large{} + \pagestyle{empty} % en-tête et pied de page vides + \definecolor{vert}{rgb}{0.07, 0.46, 0.13} % saisie en vert + + \begin{center} + \includegraphics{ordipolo.png}\\ + \Large\textbf{Dépannage informatique - Assistance à domicile} + \end{center} + + 2 A rue de l'île de Man, 29000 Quimper + + SIRET : 814 320 610 00011 + + \begin{tabularx}{0.67\linewidth}{@{}X@{}@{}X@{}} + Tel : 06.63.85.48.82 & Courriel : ordipolo@gmx.fr + \end{tabularx} + + Plus d'infos sur le site web: https\string://ordipolo.fr\\ + % \string supprime l'espace devant les : + + \begin{center} + \large\textbf{DEVIS} + \end{center} + + CLIENT\\ + + \begin{tabularx}{\linewidth}{@{}X@{}@{}X@{}} + Mme, M : \textcolor{vert}{} & + Date du devis : \textcolor{vert}{}\\ + Adresse : \textcolor{vert}{} & + Delai de livraison : \textcolor{vert}{}\\ + \end{tabularx}\\\\ + + PRESTATION\\ + + \textcolor{vert}{} + + Total main d'oeuvre : \textcolor{vert}{}\\ + + PIÈCES\\ + + \textcolor{vert}{} + + Total pièces : \textcolor{vert}{}\\ + + TOTAL\\ + + Déplacement : \textcolor{vert}{} + + Total HT : \textcolor{vert}{} + + \textit{(TVA non applicable, article 293B du code général des impôts)} + + Référence du devis : \textcolor{vert}{}\\ + + Devis reçu avant l'exécution des travaux, signature du client :\\ + \begin{tikzpicture} + \draw (0,0) rectangle (4,2); + \end{tikzpicture}\\ + + \small{}NOTA BENE\\ + + Si le délai de livraison n’est pas précisé, c’est naturellement le délai légal de 30 jours qui est appliqué. Lorsqu'Ordi Polo garde (ou prête) un ordinateur le temps nécessaire à la réparation, le prêt peut être formalisé par un document signé par les deux parties. Le dépannage inclut principalement l'intervention sur les logiciels et si nécessaire le démontage et remontage de la machine nécessaires au nettoyage de la poussière ou au remplacement d'une pièce. Ordi Polo ne répare pas les composants électroniques défectueux et n'est pas responsable des dysfonctionnements de l'ordinateur dont l'origine est matérielle. Ordi Polo ne vend pas de matériel mais peut conseiller ou réaliser les démarches d’un achat. +\end{document} + +\documentclass[]{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage{graphicx} % insertions d'images +\usepackage[papersize={22cm, 11cm}, top=1cm, left=1cm, bottom=1cm]{geometry} +\pagestyle{empty} + +\begin{document} + \setlength{\parindent}{0cm} + \includegraphics{ordipolo.png}\\ + \large\textbf{Dépannage informatique - Assistance à domicile} + + \setlength{\parindent}{7,9cm} + \begin{minipage}[b][5,8cm]{12cm} + \LARGE{M. Truc\\3, rue Machin\\\\\\} + \LARGE{2 \ 9 \ 0 \ 0 \ 0 \ \ \ \ QUIMPER} + \end{minipage} +\end{document} + +\documentclass[]{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[papersize={22cm, 11cm}, top=0.6cm, left=4.5cm]{geometry} +\pagestyle{empty} + +\begin{document} + \setlength{\parindent}{0cm} + \Large{Paul Jusot\\2A, rue de l'île de Man\\29000 QUIMPER} +\end{document} + +\documentclass{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} % marges +\usepackage{graphicx} % insertions d'images +\usepackage{textcomp} % pour N° +\usepackage{xcolor} % texte en couleur +\usepackage{tabularx} % dimensions des tableaux automatique + +\begin{document} + \setlength{\parindent}{0cm} % supprimer les alinéas + \large{} + \pagestyle{empty} % en-tête et pied de page vides + \definecolor{vert}{rgb}{0.07, 0.46, 0.13} % saisie en vert + + \begin{center} + \includegraphics{ordipolo.png}\\ + \Large\textbf{Dépannage informatique - Assistance à domicile} + \end{center} + + 2 A rue de l'île de Man, 29000 Quimper + + SIRET : 814 320 610 00011 + + \begin{tabularx}{0.67\linewidth}{@{}X@{}@{}X@{}} + Tel : 06.63.85.48.82 & Courriel : ordipolo@gmx.fr + \end{tabularx} + + Plus d'infos sur le site web: https\string://ordipolo.fr\\ + % \string supprime l'espace devant les : + + \begin{center} + \large\textbf{FACTURE} + \end{center} + + CLIENT\\ + + \begin{tabularx}{\linewidth}{@{}X@{}@{}X@{}} + Mme, M : \textcolor{vert}{} & + Date : \textcolor{vert}{}\\ + \end{tabularx}\\ + Adresse : \textcolor{vert}{}\\ + + PRESTATION\\ + + \textcolor{vert}{} + + Modèle de l'ordinateur : \textcolor{vert}{} + + Système d'exploitation : \textcolor{vert}{} + + Données à conserver : \textcolor{vert}{} + + Clé d'activation : \textcolor{vert}{}\\ + + Total main d'oeuvre : \textcolor{vert}{}\\ + + PIÈCES\\ + + \textcolor{vert}{} + + Total pièces : \textcolor{vert}{}\\ + + TOTAL\\ + + Déplacement : \textcolor{vert}{} + + Total HT : \textcolor{vert}{} + + \textit{(TVA non applicable, article 293B du code général des impôts)} + + Référence de la facture : \textcolor{vert}{}\\ + + \small{}NOTA BENE\\ + + Lorsqu'Ordi Polo garde (ou prête) un ordinateur le temps nécessaire à la réparation, le prêt peut être formalisé par un document signé par les deux parties. Le dépannage inclut principalement l'intervention sur les logiciels et si nécessaire le démontage et remontage de la machine nécessaires au nettoyage de la poussière ou au remplacement d'une pièce. Ordi Polo ne répare pas les composants électroniques défectueux et n'est pas responsable des dysfonctionnements de l'ordinateur dont l'origine est matérielle. Ordi Polo ne vend pas de matériel mais peut conseiller ou réaliser les démarches d’un achat. +\end{document} + +\documentclass{report} + +\usepackage[french]{babel} +\usepackage{lmodern} % police latin modern +\usepackage[utf8]{inputenc} % encodage d'entrée (document) +\usepackage[T1]{fontenc} % encodage de sortie (rendu) +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} % marges +\usepackage{graphicx} % insertions d'images +\usepackage{textcomp} % pour N° +\usepackage{xcolor} % texte en couleur +%\usepackage{wrapfig} % placer texte et image côte-à-côte +\usepackage{tabularx} % dimensions des tableaux automatique + +\begin{document} + \setlength{\parindent}{0cm} % supprimer les alinéas + \large{} + \pagestyle{empty} % en-tête et pied de page vides + \definecolor{vert}{rgb}{0.07, 0.46, 0.13} % saisie en vert + + \begin{center} + \includegraphics{ordipolo.png}\\ + \Large\textbf{Dépannage informatique - Assistance à domicile} + \end{center} + + 2 A rue de l'île de Man, 29000 Quimper + + SIRET : 814 320 610 00011 + + \begin{tabularx}{0.67\linewidth}{@{}X@{}@{}X@{}} + Tel : 06.63.85.48.82 & Courriel : ordipolo@gmx.fr + \end{tabularx} + + Plus d'infos sur le site web: https\string://ordipolo.fr\\ + % \string supprime l'espace devant les : + + CLIENT\\ + + \begin{tabularx}{\linewidth}{@{}X@{}@{}X@{}} + Mme, M : \textcolor{vert}{} & + Date : \textcolor{vert}{}\\ + \end{tabularx}\\ + Adresse : \textcolor{vert}{}\\ + +\end{document} +setPrenom_nom('Jean Némar')->setAdresse('10, rue des douves')->setCode_client('464653476')->setCommentaires('un peu chiant'); +$Client->create(); + +// même chose avec un tableau en entrée au lieu d'écrire toutes les méthodes +$input = ['prenom_nom' => 'Eva Casquer', 'adresse' => "2, place d'Écosse", 'code_client' => '958465875', 'commentaires' => 'bonne vache à lait']; +$Client->hydrate($input); +$Client->create(); + +$input = ['prenom_nom' => 'Eva Paparla', 'commentaires' => 'grosse nunuche']; +$Client->hydrate($input); +$Client->update(2); + +$Client->delete(3); + +//$Date = new Dates; + + +require('view/Zenity.php'); // commande système zenity +require('view/zenity_setup.php'); // texte dans les fenêtres ET instanciation (un objet = une commande) +require('Latex.php'); // générer le code LaTeX + +// injection de variables dans le document +// problème à régler: et si je veux faire une deuxième facture? +//~ include('latex_templates/devis.php'); +//~ include('latex_templates/facture.php'); +//~ include('latex_templates/enveloppe_recto.php'); +//~ include('latex_templates/enveloppe_verso.php'); +//~ include('latex_templates/location.php'); + + +// boucle principale +$boucle = true; +while($boucle) +{ + // menu principal + $choix_niv1 = exec($MenuPrincipal->get()); + + // enregistrement + if($choix_niv1 === $menu_principal_entrees[0]) // = Nouvelle prestation + { + // est ce que le client est déjà dans la base? + if(exec($QuestionNouveauClient->get()) === 0) // $? = 0 signifie oui + { + // saisie du nom du client et recherche + $client_saisie = exec($RechercheClient->get()); + + // sélection parmi les résultats + $ResultatsRechercheClient->setEntries(recherche_client($client_saisie)); + $choix_niv2 = exec($ResultatsRechercheClient->get()); + if($choix_niv2 !== '') + { + echo "client trouvé\n"; + } + else // chaîne vide + { + echo "client pas trouvé\n"; + exec($NouveauClient->get()); + + // enregistrement dans la BDD + + } + + // récupération des infos dans la BDD + + } + else + { + echo "nouveau client\n"; + exec($NouveauClient->get()); + + // enregistrement dans la BDD + + } + + // choix type comptable: devis, facture, cesu + $choix_niv2 = exec($MenuEnregistrement->get()); + $continuer = true; + if($choix_niv2 === $menu_enregistrement_entrees[0]) + { + // + } + elseif($choix_niv2 === $menu_enregistrement_entrees[1]) + { + // + } + elseif($choix_niv2 === $menu_enregistrement_entrees[2]) + { + // + } + elseif($choix_niv2 === $menu_enregistrement_entrees[3]) + { + // + } + else + { + $continuer = false; // retour menu principal + } + + // détail de la prestation + if($continuer) + { + exec($Calendrier->get()); + exec($FormulairePrestation->get()); + // enregistrement date et prestation en BDD + exec($CommentairePrestation->get()); + // enregistrement commentaire en BDD + // vérification? + + // tableau récaptilatif et demande de confirmation des informations + // création fichiers LaTeX et PDF + + // imprimer? + //~ $imprimer_facture = exec('zenity --question --width=250 --title="Base de données mise à jour" --text="Imprimer la facture?"'); + //~ $imprimer_enveloppe = exec('zenity --question --width=250 --title="Base de données mise à jour" --text="Imprimer l\'adresse sur une enveloppe? (insérer une enveloppe DL sans fenêtre dans l\'imprimante"'); + } + } + + elseif($choix_niv1 === $menu_principal_entrees[1]) // = Modifier un enregistrement + {} + + elseif($choix_niv1 === $menu_principal_entrees[2]) // = Fichier clients + { + // quel affichage? un grand tableau avec zenity? une page web? un document LaTeX? + } + + // documents à imprimer + elseif($choix_niv1 === $menu_principal_entrees[3]) // = Créer/imprimer un document + { + $choix_niv2 = exec($MenuDocuments->get()); + if($choix_niv2 === $menu_documents_entrees[0]) + { + + } + elseif($choix_niv2 === $menu_documents_entrees[1]) // = Facture + { + + } + elseif($choix_niv2 === $menu_documents_entrees[2]) // = Lettre avec adresse + { + + } + elseif($choix_niv2 === $menu_documents_entrees[3]) // = Livre des recettes + { + + } + elseif($choix_niv2 === $menu_documents_entrees[4]) // = Registre des achats + { + + } + elseif($choix_niv2 === $menu_documents_entrees[5]) // = Bilan annuel + { + + } + else + { + // retour menu principal + } + } + + // Supports de communication + elseif($choix_niv1 === $menu_principal_entrees[4]) // = Communication + { + $choix_niv2 = exec($MenuCommunication->get()); + if($choix_niv2 === $menu_communication_entrees[0]) // = Flyer (nécessite gimp) + { + exec(window_app_command($image_editor, $flyer)); + } + elseif($choix_niv2 === $menu_communication_entrees[1]) // = Carte de visite (nécessite scribus) + { + exec(window_app_command($publishing, $business_card)); + } + elseif($choix_niv2 === $menu_communication_entrees[2]) // = Explorateur de fichiers + { + exec(window_app_command($file_explorer, $pub)); + } + else + { + // retour menu principal + } + } + + // BDD + elseif($choix_niv1 === $menu_principal_entrees[5]) // = Base de données + { + if($sqlitebrowser_enable) + { + exec(window_app_command($sqlite_gui, $db_place)); + } + else + { + exec($x_term_command . ' ' . $sqlite_cli . ' ' . $db_place); // correpond à priori à: xterm -e sqlite3 ~/ORDIPOLO/Appli_PHP/ordipolo.sqlite + } + } + + // arrêt + else + { + $boucle = false; + } +} diff --git a/src/model/CESU.php b/src/model/CESU.php new file mode 100644 index 0000000..4679da2 --- /dev/null +++ b/src/model/CESU.php @@ -0,0 +1,46 @@ +table = self::TABLE; // => Model::$table + } + + // setters + public function setID(int $value) + { + $this->ID = $value; + return($this); + } + public function setIDPresta(int $value) + { + $this->ID_presta = $value; + return($this); + } + public function setTaches(string $value) + { + $this->taches = $value; + return($this); + } + public function setDureeTravail(string $value) + { + $this->duree_travail = $value; + return($this); + } + public function setSalaire(float $value) + { + $this->salaire = $value; + return($this); + } +} diff --git a/src/model/Clients.php b/src/model/Clients.php new file mode 100644 index 0000000..1256458 --- /dev/null +++ b/src/model/Clients.php @@ -0,0 +1,50 @@ +table = strtolower(__CLASS__); // simple parce que la classe a le nom de la table + } + + //~ public function set(string $variable, $value) + //~ { + //~ $this->$variable = $value; + //~ return($this); + //~ } + + // setters + public function setID(int $value) // inutile? il s'autoincrémente + { + $this->ID = $value; + return($this); + } + public function setPrenom_nom(string $value) + { + $this->prenom_nom = $value; + return($this); + } + public function setAdresse(string $value) + { + $this->adresse = $value; + return($this); + } + public function setCode_client(string $value) + { + $this->code_client = $value; + return($this); + } + public function setCommentaires(string $value) + { + $this->commentaires = $value; + return($this); + } +} diff --git a/src/model/DB.php b/src/model/DB.php new file mode 100644 index 0000000..381623b --- /dev/null +++ b/src/model/DB.php @@ -0,0 +1,48 @@ + PDO::$dsn + //$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8'); // pour mysql/mariadb + $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // $this pour la méthode du parent PDO + $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); // pour PDO:fetch() et PDO::fetchAll() + // avec PDO::FETCH_ASSOC on obtient un tableau associatif, marche très bien puisqu'on utilise déjà des ID avec incrémentation automatique + // avec PDO::FETCH_BOTH (par défaut) on récupère les données en double (identifiants partant de 0 + tableau associatif) + } + catch(PDOException $e) + { + die("Impossible de se connecter à la base de données.\n" . $e->getMessage()); + } + } + + // créer son objet avec: $Bdd = parent::getInstance(); + public static function getInstance(): self + { + if(self::$Instance === null) + { + self::$Instance = new self(); + } + return self::$Instance; + } +} diff --git a/src/model/DevisFactures.php b/src/model/DevisFactures.php new file mode 100644 index 0000000..be733dd --- /dev/null +++ b/src/model/DevisFactures.php @@ -0,0 +1,98 @@ +table = strtolower(__CLASS__); + } + + // setters + public function setID(int $value) + { + $this->ID = $value; + return($this); + } + public function setIDPresta(int $value) + { + $this->ID_presta = $value; + return($this); + } + public function setValiditeDdevis(string $value) + { + $this->validite_devis = $value; + return($this); + } + public function setSignatureDevis(string $value) + { + $this->signature_devis = $value; + return($this); + } + public function setTaches(string $value) + { + $this->taches = $value; + return($this); + } + public function setMachine(string $value) + { + $this->machine = $value; + return($this); + } + public function setOS(string $value) + { + $this->OS = $value; + return($this); + } + public function setDonnees(string $value) + { + $this->donnees = $value; + return($this); + } + public function setClesLicences(string $value) + { + $this->cles_licences = $value; + return($this); + } + public function setTotalMainDOeuvre(float $value) + { + $this->total_main_d_oeuvre = $value; + return($this); + } + public function setPieces(string $value) + { + $this->pieces = $value; + return($this); + } + public function setTotalPieces(float $value) + { + $this->total_pieces = $value; + return($this); + } + public function setDeplacement(float $value) + { + $this->deplacement = $value; + return($this); + } + public function setTotalHT(float $value) + { + $this->total_HT = $value; + return($this); + } +} diff --git a/src/model/Locations.php b/src/model/Locations.php new file mode 100644 index 0000000..2aa175a --- /dev/null +++ b/src/model/Locations.php @@ -0,0 +1,74 @@ +table = strtolower(__CLASS__); + } + + // setters + public function setID(int $value) + { + $this->ID = $value; + return($this); + } + public function setIDPresta(int $value) + { + $this->ID_presta = $value; + return($this); + } + public function setNatureBien(string $value) + { + $this->nature_bien = $value; + return($this); + } + public function setModele(string $value) + { + $this->modele = $value; + return($this); + } + public function setValeur(float $value) + { + $this->valeur = $value; + return($this); + } + public function setEtatDesLieuxDebut(string $value) + { + $this->etat_des_lieux_debut = $value; + return($this); + } + public function setEtatDesLieuxFin(string $value) + { + $this->etat_des_lieux_fin = $value; + return($this); + } + public function setDureeLocation(string $value) + { + $this->duree_location = $value; + return($this); + } + public function setlLyerMensuel(float $value) + { + $this->loyer_mensuel = $value; + return($this); + } + public function setTotalHT(float $value) + { + $this->total_HT = $value; + return($this); + } +} diff --git a/src/model/Model.php b/src/model/Model.php new file mode 100644 index 0000000..ad9e6c7 --- /dev/null +++ b/src/model/Model.php @@ -0,0 +1,162 @@ +db = parent::getInstance(); // connexion + } + + + // setters (plusieurs en même temps) + public function hydrate(array $data) // $data = tableau associatif en entrée: nom_du_champ => valeur + { + foreach($data as $key => $value) + { + // nom d'un setter, forme "setMachin()" + $setterName = 'set' . ucfirst($key); // ucfirst met la première lettre en majuscule + // détection + if(method_exists($this, $setterName)) // on trouve aussi la méthode is_callable() + { + // on renseigne les propriétés des l'instance + $this->$setterName($value); // nom d'une méthode dans une variable + } + } + return($this); + } + + + // exécuter le SQL + // les attributs correspondent aux ? dans les requêtes préparées + // ne pas surcharger la méthode PDO::query() qui n'est pas compatible + protected function execQuery(string $sql, array $attributes = null) + { + $this->db = parent::getInstance(); // connexion + + if($attributes !== null) // requête préparée + { + $query = $this->db->prepare($sql); + $query->execute($attributes); + return $query; + } + else // requête simple + { + return $this->db->query($sql); + } + } + + + // méthodes CRUD qui marchent (les spécifiques sont dans les classes enfant) + + // create INSERT + public function create() // = write + { + $fields = []; + $question_marks = []; // ? + $values = []; + foreach($this as $field => $value) + { + // champs non renseignées et variables de l'objet qui ne sont pas des champs + // note: avec le !== (au lieu de !=) une valeur 0 passe le filtre + if($value !== null && $field != 'db' && $field != 'table') + { + $fields[] = $field; // push + $question_marks[] = '?'; + $values[] = $value; + } + } + $field_list = implode(', ', $fields); + $question_mark_list = implode(', ', $question_marks); + + // INSERT INTO annonces (titre, description, actif) VALUES (?, ?, ?) + return($this->execQuery('INSERT INTO ' . $this->table . ' (' . $field_list . ') VALUES (' . $question_mark_list . ')', $values)); + } + + + // read SELECT + public function readAll() + { + $query = $this->execQuery('SELECT * FROM ' . $this->table . ';'); // fonctionne aussi sans le point virgule dans le SQL!! + return($query->fetchAll()); + } + public function findById(int $id) + { + return($this->execQuery('SELECT * FROM ' . $this->table . ' WHERE id = ' . $id)->fetch()); + } + + public function find(array $criteria) + { + $fields = []; + $values = []; + + // change "'ID' => 2" en "'ID' = ?" et "2" + foreach($criteria as $field => $value) + { + $fields[] = "$field = ?"; // même chose que: $field . " = ?" + $values[] = $value; + } + $field_list = implode(' AND ', $fields); // créer une chaîne reliant les morceaux avec le morceau AND en paramètre: 'adresse = ? AND ID = ?' + + // SELECT * FROM annonces WHERE actif = 1; + return($this->execQuery('SELECT * FROM ' . $this->table . ' WHERE ' . $field_list, $values)->fetchAll()); + } + + + // update UPDATE + public function update(int $id) + { + $fields = []; + $values = []; + foreach($this as $field => $value) + { + if($value !== null && $field != 'db' && $field != 'table') // champs non renseignées et variables de l'objet qui ne sont pas des champs + { + $fields[] = $field . ' = ?'; + $values[] = $value; + } + } + $values[] = $id; + $field_list = implode(', ', $fields); + + // UPDATE annonces SET titre = ?, description = ?, actif = ? WHERE id= ? + return($this->execQuery('UPDATE ' . $this->table . ' SET ' . $field_list . ' WHERE id = ?', $values)); + } + + + // delete DELETE + public function delete(int $id) + { + return($this->execQuery("DELETE FROM {$this->table} WHERE id = ?", [$id])); // double quotes "" pour insertion de variable, paramètre [$id] parce qu'on veut un tableau + } + + + // fonction appelée une seule fois pour chaque table + // le tableau nécessaire n'est pas copié en mémoire à l'instanciation (pas de fuite de mémoire), mais uniquement à l'appel de cette fonction statique, à la fin de la fonction la mémoire est libérée + // DBStructure::${self::$tableStructure} permet de nommer une variable statique de classe + static public function createTables() + { + //~ var_dump(StructTablesDB::$structureOfTables); + foreach(StructTablesDB::$structureOfTables as $tableName => $oneTable) + { + //var_dump(StructTablesDB::${self::$tableStructure}); => propriété statique de classe dans une variable + $fields_and_types = []; + $query = 'CREATE TABLE IF NOT EXISTS ' . $tableName . ' ('; + foreach($oneTable as $key => $value) + { + $fields_and_types[] = $key . ' ' . $value; + } + $query .= implode(', ', $fields_and_types); // implode() convertit un tableau en une chaîne avec un séparateur entre chaque élément + $query .= ', PRIMARY KEY(ID AUTOINCREMENT));'; + //echo($query . "\n\n"); + + parent::getInstance()->exec($query); // merci singleton! + } + + + } +} diff --git a/src/model/Prestations.php b/src/model/Prestations.php new file mode 100644 index 0000000..4f58d70 --- /dev/null +++ b/src/model/Prestations.php @@ -0,0 +1,62 @@ +table = strtolower(__CLASS__); + } + + // setters + public function setID(int $value) + { + $this->ID = $value; + return($this); + } + public function setIDClient(int $value) + { + $this->ID_client = $value; + return($this); + } + public function setCombientiemeFois(int $value) + { + $this->combientieme_fois = $value; + return($this); + } + public function setCodePresta(string $value) + { + $this->code_presta = $value; + return($this); + } + public function setDate(int $value) + { + $this->date = $value; + return($this); + } + public function setType(string $value) + { + $this->type = $value; + return($this); + } + public function setModePaiement(string $value) + { + $this->mode_paiement = $value; + return($this); + } + public function setCommentaires(string $value) + { + $this->commentaires = $value; + return($this); + } +} diff --git a/src/model/StructTablesDB.php b/src/model/StructTablesDB.php new file mode 100644 index 0000000..cf6de5d --- /dev/null +++ b/src/model/StructTablesDB.php @@ -0,0 +1,35 @@ + ['ID' => 'INTEGER', 'prenom_nom' => 'TEXT', 'adresse' => 'TEXT', 'code_client' => 'TEXT', 'commentaires' => 'TEXT'], + 'prestations' => ['ID' => 'INTEGER', 'ID_client' => 'INTEGER', 'combientieme_fois' => 'INTEGER', 'code_presta' => 'TEXT', 'date' => 'INTEGER', 'type' => 'TEXT', 'mode_paiement' => 'TEXT', 'commentaires' => 'TEXT'], + 'devisfactures' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'validite_devis' => 'TEXT', 'signature_devis' => 'TEXT', 'taches' => 'TEXT', 'machine' => 'TEXT', 'OS' => 'TEXT', 'donnees' => 'TEXT', 'cles_licences' => 'TEXT', 'total_main_d_oeuvre' => 'REAL', 'pieces' => 'TEXT', 'total_pieces' => 'REAL', 'deplacement' => 'REAL', 'total_HT' => 'REAL'], + 'cesu' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'taches' => 'TEXT', 'duree_travail' => 'TEXT', 'salaire' => 'REAL'], + 'locations' => ['ID' => 'INTEGER', 'ID_presta' => 'INTEGER', 'nature_bien' => 'TEXT', 'modele' => 'TEXT', 'valeur' => 'REAL', 'etat_des_lieux_debut' => 'TEXT', 'etat_des_lieux_fin' => 'TEXT', 'duree_location' => 'TEXT', 'loyer_mensuel' => 'REAL', 'total_HT' => 'REAL'] + ]; + + // les types de variables de sqlite sont peu nombreux et autorisent un typage automatique + // le "type indiqué" est indiqué dans l'instruction CREATE TABLE + // https://www.leppf.com/site/spip.php?article89 + + // || type indiqué || type choisi automatiquement || autre types possibles || + // --------------------------------------------------------------------------- + // || TEXT || TEXT || BLOB, NULL || + // || INTEGER || INTEGER (de 1 à 8 octets) || REAL, TEXT, BLOB, NULL || + // || REAL || REAL (flottant sur 9 octets) || TEXT, BLOB, NULL || + // || NUMERIC || INTEGER ou REAL || TEXT, BLOB, NULL || + // || NONE || indéfini || dépend des données || + + // du code SQL écrit pour d'autres SGBD devrait fonctionner, + // sqlite fera des conversions dans ses propres types avec les problèmes qu'on peut imaginer + + // pour les dates, on stockera à priori le timestamp +} diff --git a/src/view/Zenity.php b/src/view/Zenity.php new file mode 100644 index 0000000..a04b794 --- /dev/null +++ b/src/view/Zenity.php @@ -0,0 +1,110 @@ +text = $text; + $this->rows= $rows; + $this->command .= $this->command_type; + $this->command .= ' --title="' . $this->title . '"'; + $this->command .= ' --text="' . $this->text . '"'; + } + + public function get() + { + return($this->command); + } +} + + +class ZenityList extends ZenityCmd +{ + public function __construct($text, array $rows) + { + $this->command_type = ' --list'; + parent::__construct($text, $rows); + $this->height = 80 + count($this->rows) * 25; + $this->command .= ' --width=' . $this->width; + $this->command .= ' --height=' . $this->height; + $this->command .= ' --hide-header'; // ligne inutile, il y a déjà le --text + self::one_column_zenity_list($this->rows); + } + + public function set_entries($rows_set) // variable renseignée après la construction + { + $this->rows = $rows_set; + } + + private function one_column_zenity_list($rows) + { + $output = ' --column=""'; + foreach($rows as $entry) + { + $output .= ' "' . $entry . '"'; // forme: ' "choix 1" "choix 2"' + } + $this->command .= $output; + } +} + +class ZenityQuestion extends ZenityCmd +{ + public function __construct($text) + { + $this->command_type = ' --question'; + parent::__construct($text); + $this->command .= ' && echo $?'; + // la sortie de "zenity --question" est le statut de sortie "$?" + // $? vaut 0 pour oui, 1 pour non, à ceci près que pour non zenity ne renvoie rien + } +} + +class ZenityForms extends ZenityCmd +{ + public function __construct($text, array $rows) + { + $this->command_type = ' --forms'; + parent::__construct($text, $rows); + //$this->height = 80 + count($this->rows) * 25; // à tester, mais devrait produire le rendu attendu + self::entries_zenity_forms($this->rows); + } + + private function entries_zenity_forms($entries) + { + $output = ''; + foreach($entries as $one_entry) + { + $output .= ' --add-entry="' . $one_entry . '"'; // forme: ' "choix 1" "choix 2"' + } + $this->command .= $output; + } +} + +class ZenityCalendar extends ZenityCmd +{ + public function __construct($text) + { + $this->command_type = ' --calendar'; + parent::__construct($text); + } +} + +class ZenityEntry extends ZenityCmd +{ + public function __construct($text) + { + $this->command_type = ' --entry'; + parent::__construct($text); + } +} diff --git a/src/view/zenity_setup.php b/src/view/zenity_setup.php new file mode 100644 index 0000000..2f55cf2 --- /dev/null +++ b/src/view/zenity_setup.php @@ -0,0 +1,37 @@ +get()); +$MenuPrincipal = new ZenityList($menu_principal_text, $menu_principal_entrees); +$QuestionNouveauClient = new ZenityQuestion($question_nouveau_client_text); +$MenuEnregistrement = new ZenityList($menu_enregistrement_text, $menu_enregistrement_entrees); +$MenuDocuments = new ZenityList($menu_documents_text, $menu_documents_entrees); +$MenuCommunication = new ZenityList($menu_communication_text, $menu_communication_entrees); +$RechercheClient = new zenityEntry($recherche_client_text); +$ResultatsRechercheClient = new zenityList($resultats_recherche_client_text, []); +$NouveauClient = new ZenityForms($nouveau_client_text, $nouveau_client_entrees); +$Calendrier = new ZenityCalendar($calendar_text); +$FormulairePrestation = new ZenityForms($formulaire_text, $formulaire_entrees); +$CommentairePrestation = new ZenityEntry($commentaire_prestation_text); -- cgit v1.2.3