diff options
Diffstat (limited to 'php')
-rw-r--r-- | php/Database.php | 26 | ||||
-rw-r--r-- | php/ZenityClasses.php | 111 | ||||
-rw-r--r-- | php/compileLatex.php | 30 | ||||
-rw-r--r-- | php/dependances.php | 100 | ||||
-rw-r--r-- | php/functions.php | 26 | ||||
-rw-r--r-- | php/saisie.php | 59 | ||||
-rw-r--r-- | php/zenity_text.php | 21 |
7 files changed, 373 insertions, 0 deletions
diff --git a/php/Database.php b/php/Database.php new file mode 100644 index 0000000..81ce669 --- /dev/null +++ b/php/Database.php | |||
@@ -0,0 +1,26 @@ | |||
1 | <?php | ||
2 | // php/Database.php | ||
3 | |||
4 | // connexion avec PDO_sqlite | ||
5 | try | ||
6 | { | ||
7 | $db = new PDO('sqlite:' . $db_name . '.sqlite'); | ||
8 | $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | ||
9 | } | ||
10 | catch (Exception $e) | ||
11 | { | ||
12 | die('Erreur : '.$e->getMessage()); | ||
13 | } | ||
14 | |||
15 | |||
16 | // requêtes SQL | ||
17 | class SQL | ||
18 | { | ||
19 | // créer les tables si elles n'existent pas encore | ||
20 | static function create_tables() | ||
21 | { | ||
22 | //$db->exec("CREATE TABLE IF NOT EXISTS matable (ID INTEGER PRIMARY KEY, champ1 INTEGER, champ2 TEXT);"); | ||
23 | // | ||
24 | // | ||
25 | } | ||
26 | } | ||
diff --git a/php/ZenityClasses.php b/php/ZenityClasses.php new file mode 100644 index 0000000..c286d14 --- /dev/null +++ b/php/ZenityClasses.php | |||
@@ -0,0 +1,111 @@ | |||
1 | <?php | ||
2 | // php/ZenityClasses.php | ||
3 | // | ||
4 | // commande système zenity | ||
5 | |||
6 | abstract class Zenity_cmd | ||
7 | { | ||
8 | protected $command = 'zenity'; | ||
9 | protected $command_type = ''; | ||
10 | protected $rows = []; | ||
11 | private $title = 'ORDIPOLO'; | ||
12 | private $text = ''; | ||
13 | protected $width = 300; | ||
14 | protected $height = 200; // recalculée en fonction du contenu, vaut au minimum 150 | ||
15 | |||
16 | |||
17 | protected function __construct($text, array $rows = []) // $rows est optionnel | ||
18 | { | ||
19 | $this->text = $text; | ||
20 | $this->rows= $rows; | ||
21 | $this->command .= $this->command_type; | ||
22 | $this->command .= ' --title="' . $this->title . '"'; | ||
23 | $this->command .= ' --text="' . $this->text . '"'; | ||
24 | } | ||
25 | |||
26 | public function get() | ||
27 | { | ||
28 | return($this->command); | ||
29 | } | ||
30 | } | ||
31 | |||
32 | |||
33 | class Zenity_list extends Zenity_cmd | ||
34 | { | ||
35 | public function __construct($text, array $rows) | ||
36 | { | ||
37 | $this->command_type = ' --list'; | ||
38 | parent::__construct($text, $rows); | ||
39 | $this->height = 80 + count($this->rows) * 25; | ||
40 | $this->command .= ' --width=' . $this->width; | ||
41 | $this->command .= ' --height=' . $this->height; | ||
42 | $this->command .= ' --hide-header'; // ligne inutile, il y a déjà le --text | ||
43 | self::one_column_zenity_list($this->rows); | ||
44 | } | ||
45 | |||
46 | public function set_entries($rows_set) // variable renseignée après la construction | ||
47 | { | ||
48 | $this->rows = $rows_set; | ||
49 | } | ||
50 | |||
51 | private function one_column_zenity_list($rows) | ||
52 | { | ||
53 | $output = ' --column=""'; | ||
54 | foreach($rows as $entry) | ||
55 | { | ||
56 | $output .= ' "' . $entry . '"'; // forme: ' "choix 1" "choix 2"' | ||
57 | } | ||
58 | $this->command .= $output; | ||
59 | } | ||
60 | } | ||
61 | |||
62 | class Zenity_question extends Zenity_cmd | ||
63 | { | ||
64 | public function __construct($text) | ||
65 | { | ||
66 | $this->command_type = ' --question'; | ||
67 | parent::__construct($text); | ||
68 | $this->command .= ' && echo $?'; | ||
69 | // la sortie de "zenity --question" est le statut de sortie "$?" | ||
70 | // $? vaut 0 pour oui, 1 pour non, à ceci près que pour non zenity ne renvoie rien | ||
71 | } | ||
72 | } | ||
73 | |||
74 | class Zenity_forms extends Zenity_cmd | ||
75 | { | ||
76 | public function __construct($text, array $rows) | ||
77 | { | ||
78 | $this->command_type = ' --forms'; | ||
79 | parent::__construct($text, $rows); | ||
80 | //$this->height = 80 + count($this->rows) * 25; // à tester, mais devrait produire le rendu attendu | ||
81 | self::entries_zenity_forms($this->rows); | ||
82 | } | ||
83 | |||
84 | private function entries_zenity_forms($entries) | ||
85 | { | ||
86 | $output = ''; | ||
87 | foreach($entries as $one_entry) | ||
88 | { | ||
89 | $output .= ' --add-entry="' . $one_entry . '"'; // forme: ' "choix 1" "choix 2"' | ||
90 | } | ||
91 | $this->command .= $output; | ||
92 | } | ||
93 | } | ||
94 | |||
95 | class Zenity_calendar extends Zenity_cmd | ||
96 | { | ||
97 | public function __construct($text) | ||
98 | { | ||
99 | $this->command_type = ' --calendar'; | ||
100 | parent::__construct($text); | ||
101 | } | ||
102 | } | ||
103 | |||
104 | class Zenity_entry extends Zenity_cmd | ||
105 | { | ||
106 | public function __construct($text) | ||
107 | { | ||
108 | $this->command_type = ' --entry'; | ||
109 | parent::__construct($text); | ||
110 | } | ||
111 | } | ||
diff --git a/php/compileLatex.php b/php/compileLatex.php new file mode 100644 index 0000000..ccd9dab --- /dev/null +++ b/php/compileLatex.php | |||
@@ -0,0 +1,30 @@ | |||
1 | <?php | ||
2 | // compileLatex.php | ||
3 | |||
4 | // contenu | ||
5 | $codeLaTeX = '\documentclass{article} | ||
6 | |||
7 | \usepackage[francais]{babel} | ||
8 | \usepackage[utf8]{inputenc} | ||
9 | \usepackage[T1]{fontenc} | ||
10 | |||
11 | \begin{document} | ||
12 | Bravo, ça compile !! | ||
13 | \end{document}'; | ||
14 | |||
15 | |||
16 | // ficher tex | ||
17 | // regarder la doc, php-cli permettrait de manipuler les fichiers directement comme le bash | ||
18 | $fichier = fopen("latex.tex", "w+"); | ||
19 | fputs($fichier, $codeLaTeX); | ||
20 | fclose($fichier); | ||
21 | |||
22 | // compilation | ||
23 | exec('pdflatex latex.tex'); | ||
24 | |||
25 | // nettoyage | ||
26 | unlink("latex.aux"); | ||
27 | unlink("latex.log"); | ||
28 | unlink("latex.tex"); | ||
29 | |||
30 | exec('xdg-open latex.pdf'); | ||
diff --git a/php/dependances.php b/php/dependances.php new file mode 100644 index 0000000..4a5667e --- /dev/null +++ b/php/dependances.php | |||
@@ -0,0 +1,100 @@ | |||
1 | <?php | ||
2 | // php/dependances.php | ||
3 | // Vérification des dépendances nécessaires au fonctionnement de ce programmes. | ||
4 | |||
5 | // Environnement dans lequel ce programmes a été créé: | ||
6 | // - système archlinux avec l'interpréteur bash | ||
7 | // - PHP 8.1 + paquet php-sqlite | ||
8 | // - module pdo_sqlite activé dans le fichier php.ini | ||
9 | // - sqlitebrowser (interface graphique pour sqlite) | ||
10 | // - distribution LaTeX texlive | ||
11 | // - zenity | ||
12 | |||
13 | // zenity disponible | ||
14 | if(exec("zenity --version 2> /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 | ||
15 | { | ||
16 | printf("Impossible de lancer zenity. Veuillez installer le paquet zenity\n"); | ||
17 | exit(); | ||
18 | } | ||
19 | |||
20 | // compilateur pdflatex disponible | ||
21 | if(exec("pdflatex -version 2> /dev/null") == '') // erreur si la chaine est vide parce que la sortie d'erreur va dans /dev/null | ||
22 | { | ||
23 | printf("Impossible de lancer pdflatex. Veuillez installer une distribution LaTeX.\n"); | ||
24 | exit(); | ||
25 | } | ||
26 | |||
27 | // test de la présence du paquet php-sqlite | ||
28 | // compliqué? dépend de l'OS? | ||
29 | // note: l'erreur se produit dès le démarrage de PHP si le php.ini est bon mais qu'il manque le paquet | ||
30 | |||
31 | // module pdo_sqlite de PHP activé? | ||
32 | if(!extension_loaded("pdo_sqlite")) | ||
33 | { | ||
34 | 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"); | ||
35 | exit(); | ||
36 | } | ||
37 | |||
38 | |||
39 | // client sqlite | ||
40 | if($exec_mode == 'gui') | ||
41 | { | ||
42 | // sqlitebrowser disponible | ||
43 | 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 | ||
44 | { | ||
45 | $sqlitebrowser_enable = true; | ||
46 | } | ||
47 | // terminal en mode graphique disponible, permettra d'y utiliser sqlite dans la console | ||
48 | else | ||
49 | { | ||
50 | printf("Sqlitebrowser n'est pas disponible. J'espère que vous maîtrisez le SQL.\n"); | ||
51 | |||
52 | if(exec("which xterm 2> /dev/null") != '' && exec("xterm -v 2> /dev/null") != '') | ||
53 | { | ||
54 | $x_term_ccommand = 'xterm -e'; | ||
55 | } | ||
56 | elseif(exec("which urxvt 2> /dev/null") != '') | ||
57 | { | ||
58 | $x_term_ccommand = 'urxvt -e'; | ||
59 | } | ||
60 | elseif(exec("which lxterminal 2> /dev/null") != '' && exec("lxterminal -v 2> /dev/null") != '') | ||
61 | { | ||
62 | $x_term_ccommand = 'lxterminal -e'; | ||
63 | } | ||
64 | elseif(exec("which xfce4-terminal 2> /dev/null") != '' && exec("xfce4-terminal -V 2> /dev/null") != '') | ||
65 | { | ||
66 | $x_term_ccommand = 'xfce4-terminal -x'; | ||
67 | } | ||
68 | elseif(exec("which gnome-terminal 2> /dev/null") != '') | ||
69 | { | ||
70 | $x_term_ccommand = 'gnome-terminal --'; | ||
71 | } | ||
72 | elseif(exec("which konsole 2> /dev/null") != '' && exec("konsole -v 2> /dev/null") != '') | ||
73 | { | ||
74 | $x_term_ccommand = 'konsole -e'; | ||
75 | } | ||
76 | // pour MAC - NON TESTÉ !! (possibilité de détecter le système avec uname?) | ||
77 | //~ elseif(exec("which Terminal 2> /dev/null") != '') | ||
78 | //~ { | ||
79 | //~ $x_term_ccommand = 'open -a Terminal -e'; // ne marche probablement pas | ||
80 | //~ } | ||
81 | else | ||
82 | { | ||
83 | printf("Impossible d'ouvrir un terminal pour y lancer sqlite. Veuillez installer un terminal en mode graphique (par exemple xterm).\n"); | ||
84 | } | ||
85 | } | ||
86 | } | ||
87 | |||
88 | // sqlite CLI disponible | ||
89 | if(exec("which sqlite 2> /dev/null") != '' && exec("sqlite --version 2> /dev/null") != '') | ||
90 | { | ||
91 | $sqlite_cli = 'sqlite'; | ||
92 | } | ||
93 | elseif(exec("which sqlite3 2> /dev/null") != '' && exec("sqlite3 --version 2> /dev/null") != '') | ||
94 | { | ||
95 | $sqlite_cli = 'sqlite3'; | ||
96 | } | ||
97 | else | ||
98 | { | ||
99 | printf("Impossible de lancer sqlite dans le terminal en utilisant la commande ' . $sqlite_cli . '\n"); | ||
100 | } | ||
diff --git a/php/functions.php b/php/functions.php new file mode 100644 index 0000000..61bc13e --- /dev/null +++ b/php/functions.php | |||
@@ -0,0 +1,26 @@ | |||
1 | <?php | ||
2 | // php/functions.php | ||
3 | |||
4 | // commande pour lancer une application graphique en ouvrant un fichier | ||
5 | function window_app_command(string $app, string $path = ''): string | ||
6 | { | ||
7 | $command = 'nohup ' . $app; // détache l'appli du script PHP | ||
8 | if($path != '') | ||
9 | { | ||
10 | $command .= ' ' . $path; | ||
11 | } | ||
12 | $command .= ' > /dev/null 2>&1 &'; | ||
13 | // stdout > /dev/null et & permettent de rendre la main à PHP | ||
14 | // stderr > stdout pour cacher un message inutile | ||
15 | return $command; | ||
16 | } | ||
17 | |||
18 | function recherche_client(string $saisie): array | ||
19 | { | ||
20 | $resultats = []; | ||
21 | |||
22 | // recherche dans la BDD | ||
23 | |||
24 | |||
25 | return($resultats); | ||
26 | } | ||
diff --git a/php/saisie.php b/php/saisie.php new file mode 100644 index 0000000..4b41fbf --- /dev/null +++ b/php/saisie.php | |||
@@ -0,0 +1,59 @@ | |||
1 | <?php | ||
2 | // saisie.php | ||
3 | |||
4 | $date = exec('zenity --calendar --width=320 --title="Enregistrer une prestation avec un nouveau client 1/2" --text="Choisir une date."'); | ||
5 | var_dump($date); | ||
6 | |||
7 | $start_command = 'zenity --forms'; | ||
8 | $title = ' --title="Enregistrer une prestation avec un nouveau client 2/2"'; | ||
9 | $text = ' --text="Nouveau client"'; | ||
10 | $name = ' --add-entry="Prénom Nom:"'; | ||
11 | $adresse = ' --add-entry="Adresse:"'; | ||
12 | $prestation_type = ' --add-entry="Type de prestation:"'; | ||
13 | $tasks = ' --add-entry="Tâches effectuées:"'; | ||
14 | $computer_model = ' --add-entry="Modèle du PC:"'; | ||
15 | $system = ' --add-entry="OS:"'; | ||
16 | $computer_data = ' --add-entry="Données sauvegardées:"'; | ||
17 | $activation_keys = ' --add-entry="Clés d\'activation:"'; | ||
18 | $labour_time = ' --add-entry="Temps main d\'oeuvre (heures):"'; | ||
19 | $total_labour = ' --add-entry="Total main d\'oeuvre (euros):"'; | ||
20 | $total_parts = ' --add-entry="Total pièces (euros):"'; | ||
21 | $trip = ' --add-entry="Déplacement (euros)"'; | ||
22 | $total = ' --add-entry="Total HT (euros):"'; | ||
23 | $comments = ' --add-entry="Commentaires:"'; | ||
24 | |||
25 | $command = $start_command . $title . $text . $name . $adresse . $prestation_type . $tasks. $computer_model . $system . $computer_data . $activation_keys . $labour_time . $total_labour . $total_parts . $trip . $total . $comments; | ||
26 | //$result = explode('|', "alain dubois|2 rue foch, rennes|assistance|boum le PC !!|tour acer|win 10|sur DD externe|dans le BIOS|2h, 80€|15,80€|10€|105,80€|client chiant"); | ||
27 | $result = explode('|', exec($command)); | ||
28 | var_dump($result); | ||
29 | //exit(); | ||
30 | |||
31 | // nouveau client | ||
32 | #$choix = exec('zenity --forms --title="Enregistrer une prestation 1/4" --text="Nouveau client" --add-entry="Prénom, nom:" --add-entry="Adresse:" --add-calendar="Date: (ici ou fenêtre suivante?)" --add-entry="Type de prestation:" --add-entry="Prix prestation:" --add-entry="Prix déplacement:" --add-entry="Total HT:"'); | ||
33 | |||
34 | // date | ||
35 | #$date = exec('zenity --calendar --width=320 --title="Enregistrer une prestation 2/4" --text="Choisir une date."'); | ||
36 | // date sous la forme jj/mm/aaaa | ||
37 | // utiliser ensuite cette option: --forms-date-format=MODÈLE Définit le format de la date retournée | ||
38 | |||
39 | // détail prestation | ||
40 | #$prestation = exec('zenity --forms --title="Enregistrer une prestation 3/4" --text="Tâches effectuées" --add-entry="Détails:" --add-entry="Modèle de l\'ordinateur:" --add-entry="OS:" --add-entry="Sauvegarde:" --add-entry="Clé d\'activation"'); | ||
41 | // infos saisies sous la forme aaa|bbb|ccc|ddd|eee | ||
42 | |||
43 | // Prix total calculé automatiquement | ||
44 | |||
45 | // référence de la facture avec format automatique par concaténation | ||
46 | |||
47 | // commentaire personnel enregistré à part | ||
48 | $commentaire = exec('zenity --entry --width=400 --title="Enregistrer une prestation 4/4" --text="Commentaire sur le déroulement de la prestation."'); | ||
49 | var_dump($result); | ||
50 | // afficher le résultat en LaTeX et demande de confirmation | ||
51 | // écrire du LaTeX avec PHP | ||
52 | |||
53 | // mise à jour de la base de données | ||
54 | |||
55 | // message de confirmation (si la base a bien été mise à jour), puis demande pour imprimer une facture | ||
56 | $imprimer_facture = exec('zenity --question --width=250 --title="Base de données mise à jour" --text="Imprimer la facture?"'); | ||
57 | |||
58 | // imprimer une enveloppe | ||
59 | $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"'); | ||
diff --git a/php/zenity_text.php b/php/zenity_text.php new file mode 100644 index 0000000..2246463 --- /dev/null +++ b/php/zenity_text.php | |||
@@ -0,0 +1,21 @@ | |||
1 | <?php | ||
2 | // php/zenity_text.php | ||
3 | |||
4 | // contenu des fenêtres zenity | ||
5 | $menu_principal_text = "Gestion d'une micro-entreprise"; | ||
6 | $menu_principal_entrees = ["Nouvelle prestation", "Fichier clients", "Créer/imprimer un document", "Communication", "Base de données"]; | ||
7 | $question_nouveau_client_text = "Ce client figure t\'il déjà dans le fichier clients?"; | ||
8 | $menu_enregistrement_text = "Type d\'enregistrement?"; | ||
9 | $menu_enregistrement_entrees = ["Devis", "Facture", "CESU", "Pas de prestation"]; | ||
10 | $menu_documents_text = "Création de documents LaTeX"; | ||
11 | $menu_documents_entrees = ["Devis", "Facture", "Lettre avec adresse", "Livre des recettes", "Registre des achats", "Bilan annuel"]; | ||
12 | $menu_communication_text = "Imprimer un support de communication"; | ||
13 | $menu_communication_entrees = ["Flyer (nécessite gimp)", "Carte de visite (nécessite scribus)", "Explorateur de fichiers"]; | ||
14 | $recherche_client_text = "Recherche d'un client avec son nom ou son code client"; | ||
15 | $resultats_recherche_client_text = "Résultats de la recherche, sélectionner un client"; | ||
16 | $nouveau_client_text = "Nouveau client"; | ||
17 | $nouveau_client_entrees = ["Prénom Nom:", "Adresse:", "Code client, type: J.P.Duchmol"]; | ||
18 | $calendar_text = 'Nouvelle prestation étape 1/3 - Choisir une date'; | ||
19 | $formulaire_text = 'Nouvelle prestation 2/3 - Détail des travaux'; | ||
20 | $formulaire_entrees = ["Tâches effectuées:", "Modèle du PC:", "OS:", "Données sauvegardées:", "Clés d\'activation:", "Temps main d\'oeuvre (heures):", "Total main d\'oeuvre (euros):", "Total pièces (euros):", "Déplacement (euros)", "Total HT (euros):",]; | ||
21 | $commentaire_prestation_text = 'Nouvelle prestation 3/3 - Commentaires'; | ||