diff options
| -rwxr-xr-x | bin/livre_recettes.php | 6 | ||||
| -rw-r--r-- | src/File.php | 129 | ||||
| -rw-r--r-- | src/Latex.php | 34 | ||||
| -rw-r--r-- | src/files.php | 99 | ||||
| -rw-r--r-- | src/main.php | 8 | ||||
| -rw-r--r-- | src/sections/2_service.php | 6 | ||||
| -rw-r--r-- | src/sections/3_modify_data.php | 10 | ||||
| -rw-r--r-- | à faire.txt | 11 |
8 files changed, 89 insertions, 214 deletions
diff --git a/bin/livre_recettes.php b/bin/livre_recettes.php index 9e39f39..54418a4 100755 --- a/bin/livre_recettes.php +++ b/bin/livre_recettes.php | |||
| @@ -15,9 +15,9 @@ Config::readFile('config/config.ini'); | |||
| 15 | Config::hydrate(); | 15 | Config::hydrate(); |
| 16 | 16 | ||
| 17 | // créer les dossiers si nécéssaire | 17 | // créer les dossiers si nécéssaire |
| 18 | makeFolder(Config::$db_path); | 18 | File::makeFolder(Config::$db_path); |
| 19 | makeFolder(Config::$latex_path); | 19 | File::makeFolder(Config::$latex_path); |
| 20 | makeFolder(Config::$pdf_path); | 20 | File::makeFolder(Config::$pdf_path); |
| 21 | 21 | ||
| 22 | //require 'src/model/doctrine-bootstrap.php'; | 22 | //require 'src/model/doctrine-bootstrap.php'; |
| 23 | require __DIR__ . '/../src/model/doctrine-bootstrap.php'; // chemin absolu | 23 | require __DIR__ . '/../src/model/doctrine-bootstrap.php'; // chemin absolu |
diff --git a/src/File.php b/src/File.php index 660a2e1..f4fdf76 100644 --- a/src/File.php +++ b/src/File.php | |||
| @@ -1,101 +1,54 @@ | |||
| 1 | <?php | 1 | <?php |
| 2 | // src/File.php | 2 | // src/File.php |
| 3 | // | ||
| 4 | // manipulations des fichiers | ||
| 5 | 3 | ||
| 6 | class File | 4 | class File |
| 7 | { | 5 | { |
| 8 | private $file_name = ''; | 6 | static public function makeFile(string $path, string $file_name, mixed $data): void |
| 9 | private $path = ''; | ||
| 10 | private $data = ''; // écriture de binaire (blob) non prévue | ||
| 11 | private $file_rights = 0644; | ||
| 12 | private $folder_rights = 0755; // droits en octal | ||
| 13 | private $write_mod = 0; // 0 = écraser, 1 = ajouter à la suite, 2 = nouveau fichier | ||
| 14 | |||
| 15 | |||
| 16 | public function __construct(string $file_name, string $path) | ||
| 17 | { | 7 | { |
| 18 | $this->file_name = $file_name; | 8 | if(!is_dir($path) || !is_writable($path)){ |
| 19 | $this->path = $path; | 9 | echo "erreur: dossier de destination interdit en écriture\n"; |
| 20 | } | 10 | } |
| 21 | 11 | ||
| 22 | // getters | 12 | if(!file_put_contents($path . $file_name, $data)){ // le / ajouté dans PrestaLatex::setData |
| 23 | public function getData(): string | 13 | echo "erreur: dossier de destination interdit en écriture\n"; |
| 24 | { | 14 | } |
| 25 | return $this->data; | 15 | chmod($path . $file_name, 0644); // droits en octal |
| 26 | } | 16 | } |
| 27 | 17 | //~ protected function createFile(string $latex, string $file_name, string $latexPath) | |
| 28 | // setters | 18 | //~ { |
| 29 | public function setFileName($file_name) | 19 | //~ // nom du fichier créé = nom.tex |
| 30 | { | 20 | //~ // pour les devis, factures et enveloppes, le nom est le code la prestation |
| 31 | $this->file_name = $file_name; | 21 | //~ // pour les livre de recettes et registres des achats mensuels: |
| 32 | } | 22 | //~ // le nom du fichier suit cet exemple: "Recettes-2022-06-Juin.tex" |
| 33 | 23 | //~ // pour le livre de recette ou le registre des achats annuel, même principe: "Achats-2022.tex" | |
| 34 | public function setPath($path) | 24 | //~ // pour le bilan comptable annuel, ça donne: "Bilan-2022.tex" |
| 35 | { | 25 | //~ $fichier = fopen($latexPath . $file_name, "w+"); |
| 36 | $this->path = $path; | 26 | //~ fputs($fichier, $latex); |
| 37 | } | 27 | //~ fclose($fichier); |
| 38 | 28 | //~ } | |
| 39 | public function setData($data) | 29 | |
| 40 | { | 30 | static public function makeFolder(string $path): void |
| 41 | $this->data = $data; | ||
| 42 | } | ||
| 43 | |||
| 44 | public function setFileRights(int $octal) | ||
| 45 | { | ||
| 46 | $this->file_rights($octal); | ||
| 47 | } | ||
| 48 | public function setFolderRights(int $octal) | ||
| 49 | { | ||
| 50 | $this->folder_rights($octal); | ||
| 51 | } | ||
| 52 | |||
| 53 | public function setWriteMod(int $mod) | ||
| 54 | { | ||
| 55 | $this->write_mod = $mod; | ||
| 56 | } | ||
| 57 | |||
| 58 | |||
| 59 | // fichiers | ||
| 60 | public function readFile(): string | ||
| 61 | {} | ||
| 62 | |||
| 63 | public function writeFile() | ||
| 64 | { | ||
| 65 | file_put_contents($this->path. $this->file_name, $data); | ||
| 66 | chmod($this->path, $this->file_rights); | ||
| 67 | } | ||
| 68 | |||
| 69 | |||
| 70 | // dossiers | ||
| 71 | public function makeFolder() | ||
| 72 | { | 31 | { |
| 73 | if(!file_exists($this->path)) | 32 | if(!is_dir($path)){ |
| 74 | { | 33 | if(!mkdir($path, 0755)){ |
| 75 | mkdir($this->path); | 34 | echo "erreur : impossible de créer le dossier.\n"; |
| 76 | chmod($this->path, $this->folder_rights); | 35 | return; |
| 36 | } | ||
| 37 | } | ||
| 38 | elseif(!chmod($path, 0755)){ | ||
| 39 | echo "erreur: impossible de modifier les permissions du dossier\n"; | ||
| 77 | } | 40 | } |
| 78 | } | 41 | } |
| 79 | } | ||
| 80 | 42 | ||
| 81 | // compilation à partir d'un fichier .tex | 43 | // équivalent de la commande mv |
| 82 | class latexToPdf extends File | 44 | static public function renameFiles(Object $Object, string $old_code, string $new_code): void |
| 83 | { | ||
| 84 | public function __construct(string $latex_path, string $file_name, string $pdf_path) | ||
| 85 | {} | ||
| 86 | |||
| 87 | $output_dir = ''; | ||
| 88 | if($pdf_path !== '') | ||
| 89 | { | 45 | { |
| 90 | $output_dir = '-output-directory=' . $pdf_path . ' '; | 46 | rename($Object->getLatexPath() . $old_code . '.tex', |
| 47 | $Object->getLatexPath() . $new_code . '.tex'); | ||
| 48 | rename($Object->getPdfPath() . $old_code . '.pdf', | ||
| 49 | $Object->getPdfPath() . $new_code . '.pdf'); | ||
| 91 | } | 50 | } |
| 92 | 51 | ||
| 93 | // compilation | 52 | //~ function removeFile(Object $Object) |
| 94 | //echo 'pdflatex ' . $output_dir . $latex_path . $file_name . "\n"; | 53 | //~ {} |
| 95 | exec('pdflatex ' . $output_dir . $latex_path . $file_name); | ||
| 96 | |||
| 97 | // nettoyage | ||
| 98 | $basename = basename($file_name, '.tex'); | ||
| 99 | unlink($pdf_path . $basename . '.aux'); | ||
| 100 | unlink($pdf_path . $basename . '.log'); | ||
| 101 | } | 54 | } |
diff --git a/src/Latex.php b/src/Latex.php index f49fdea..c638264 100644 --- a/src/Latex.php +++ b/src/Latex.php | |||
| @@ -57,6 +57,36 @@ abstract class Latex | |||
| 57 | // puis la mémoire est libérée à la fin de la fonction | 57 | // puis la mémoire est libérée à la fin de la fonction |
| 58 | // le PHP inséré fait donc partie de cette "mémoire" | 58 | // le PHP inséré fait donc partie de cette "mémoire" |
| 59 | } | 59 | } |
| 60 | |||
| 61 | public function makeTexAndPdf(): void // document polymorphe | ||
| 62 | { | ||
| 63 | if(get_class($this) !== 'EnveloppeVersoLatex') | ||
| 64 | { | ||
| 65 | File::makeFolder($this->latex_path); | ||
| 66 | File::makeFolder($this->pdf_path); | ||
| 67 | } | ||
| 68 | File::makeFile($this->latex_path, $this->file_name, $this->latex); // fichier .tex | ||
| 69 | $this->latexToPdf(); | ||
| 70 | } | ||
| 71 | |||
| 72 | // commande système pdflatex | ||
| 73 | private function latexToPdf(): void | ||
| 74 | { | ||
| 75 | // paramètre optionnel | ||
| 76 | $output_dir = ''; | ||
| 77 | if($this->pdf_path !== '') | ||
| 78 | { | ||
| 79 | $output_dir = '-output-directory=' . $this->pdf_path; | ||
| 80 | } | ||
| 81 | |||
| 82 | // compilation | ||
| 83 | exec('pdflatex ' . $output_dir . ' ' . $this->latex_path . $this->file_name); | ||
| 84 | |||
| 85 | // nettoyage | ||
| 86 | $basename = basename($this->file_name, '.tex'); | ||
| 87 | unlink($this->pdf_path . $basename . '.aux'); | ||
| 88 | unlink($this->pdf_path . $basename . '.log'); | ||
| 89 | } | ||
| 60 | 90 | ||
| 61 | // getters | 91 | // getters |
| 62 | public function getFileName(): string | 92 | public function getFileName(): string |
| @@ -109,8 +139,8 @@ abstract class PrestaLatex extends Latex | |||
| 109 | { | 139 | { |
| 110 | $this->file_name = $Object->getCodePresta() . '.tex'; | 140 | $this->file_name = $Object->getCodePresta() . '.tex'; |
| 111 | $this->date_array = explode('-', $Object->getdate()); | 141 | $this->date_array = explode('-', $Object->getdate()); |
| 112 | $this->latex_path = Config::$latex_path . $this->date_array[0] . '/'; | 142 | $this->latex_path = Config::$latex_path . $this->date_array[0] . DIRECTORY_SEPARATOR; |
| 113 | $this->pdf_path = Config::$pdf_path . $this->date_array[0] . '/'; | 143 | $this->pdf_path = Config::$pdf_path . $this->date_array[0] . DIRECTORY_SEPARATOR; |
| 114 | } | 144 | } |
| 115 | 145 | ||
| 116 | return $this; // pour chainer les méthodes | 146 | return $this; // pour chainer les méthodes |
diff --git a/src/files.php b/src/files.php deleted file mode 100644 index 2a68d9d..0000000 --- a/src/files.php +++ /dev/null | |||
| @@ -1,99 +0,0 @@ | |||
| 1 | <?php | ||
| 2 | // src/files.php | ||
| 3 | // | ||
| 4 | // fonctions pour manipuler les fichiers latex et pdf | ||
| 5 | |||
| 6 | function makeFile($path, $file_name, $data) | ||
| 7 | { | ||
| 8 | //~ if(is_writable('../' . $path)) | ||
| 9 | //~ { | ||
| 10 | file_put_contents($path. $file_name, $data); | ||
| 11 | chmod($path . $file_name, 0644); // droits en octal | ||
| 12 | //~ } | ||
| 13 | |||
| 14 | //~ protected function createFile(string $latex, string $file_name, string $latexPath) | ||
| 15 | //~ { | ||
| 16 | //~ // nom du fichier créé = nom.tex | ||
| 17 | //~ // pour les devis, factures et enveloppes, le nom est le code la prestation | ||
| 18 | //~ // pour les livre de recettes et registres des achats mensuels: | ||
| 19 | //~ // le nom du fichier suit cet exemple: "Recettes-2022-06-Juin.tex" | ||
| 20 | //~ // pour le livre de recette ou le registre des achats annuel, même principe: "Achats-2022.tex" | ||
| 21 | //~ // pour le bilan comptable annuel, ça donne: "Bilan-2022.tex" | ||
| 22 | //~ $fichier = fopen($latexPath . $file_name, "w+"); | ||
| 23 | //~ fputs($fichier, $latex); | ||
| 24 | //~ fclose($fichier); | ||
| 25 | //~ } | ||
| 26 | } | ||
| 27 | |||
| 28 | function makeFolder(string $path) | ||
| 29 | { | ||
| 30 | $rights = 0755; // droits en octal | ||
| 31 | |||
| 32 | if(!file_exists($path)) | ||
| 33 | { | ||
| 34 | //~ if(is_writable('../' . $path)) | ||
| 35 | //~ { | ||
| 36 | mkdir($path); | ||
| 37 | chmod($path, $rights); | ||
| 38 | //~ } | ||
| 39 | //~ else | ||
| 40 | //~ { | ||
| 41 | //~ echo "debug: la création du dossier " . $path . " est impossible\n"; | ||
| 42 | //~ } | ||
| 43 | } | ||
| 44 | else | ||
| 45 | { | ||
| 46 | //~ if(is_writable($path)) | ||
| 47 | //~ { | ||
| 48 | chmod($path, $rights); | ||
| 49 | //~ } | ||
| 50 | //~ else | ||
| 51 | //~ { | ||
| 52 | //~ echo "debug: la modification des droits du dossier " . $path . " est impossible\n"; | ||
| 53 | //~ } | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | // commande système pdflatex | ||
| 58 | function latexToPdf(string $latex_path, string $file_name, string $pdf_path) | ||
| 59 | { | ||
| 60 | // paramètre optionnel | ||
| 61 | $output_dir = ''; | ||
| 62 | if($pdf_path !== '') | ||
| 63 | { | ||
| 64 | $output_dir = '-output-directory=' . $pdf_path; | ||
| 65 | } | ||
| 66 | |||
| 67 | // compilation | ||
| 68 | //echo 'pdflatex ' . $output_dir . ' ' . $latex_path . $file_name . "\n"; | ||
| 69 | //die; | ||
| 70 | exec('pdflatex ' . $output_dir . ' ' . $latex_path . $file_name); | ||
| 71 | |||
| 72 | // nettoyage | ||
| 73 | $basename = basename($file_name, '.tex'); | ||
| 74 | unlink($pdf_path . $basename . '.aux'); | ||
| 75 | unlink($pdf_path . $basename . '.log'); | ||
| 76 | } | ||
| 77 | |||
| 78 | // équivalent de la commande mv | ||
| 79 | function renameFiles(Object $Object, string $old_code, string $new_code) | ||
| 80 | { | ||
| 81 | rename($Object->getLatexPath() . $old_code . '.tex', | ||
| 82 | $Object->getLatexPath() . $new_code . '.tex'); | ||
| 83 | rename($Object->getPdfPath() . $old_code . '.pdf', | ||
| 84 | $Object->getPdfPath() . $new_code . '.pdf'); | ||
| 85 | } | ||
| 86 | |||
| 87 | function makeTexAndPdf(Object $Object) // paramètre = enfant de Latex | ||
| 88 | { | ||
| 89 | if(get_class($Object) !== 'EnveloppeVersoLatex') | ||
| 90 | { | ||
| 91 | makeFolder($Object->getLatexPath()); | ||
| 92 | makeFolder($Object->getPdfPath()); | ||
| 93 | } | ||
| 94 | makeFile($Object->getLatexPath(), $Object->getFileName(), $Object->getLatex()); // fichier .tex | ||
| 95 | latexToPdf($Object->getLatexPath(), $Object->getFileName(), $Object->getPdfPath()); // fichier .pdf avec pdflatex | ||
| 96 | } | ||
| 97 | |||
| 98 | //~ function removeFile(Object $Object) | ||
| 99 | //~ {} | ||
diff --git a/src/main.php b/src/main.php index 9b8cf8e..edf10f2 100644 --- a/src/main.php +++ b/src/main.php | |||
| @@ -11,11 +11,9 @@ Config::hydrate(); | |||
| 11 | //require('config_window.php'); // configuration user-friendly et assistée avec des messages d'erreur et des indications | 11 | //require('config_window.php'); // configuration user-friendly et assistée avec des messages d'erreur et des indications |
| 12 | 12 | ||
| 13 | // création du dossier data et sous-dossiers | 13 | // création du dossier data et sous-dossiers |
| 14 | //require('model/File.php'); // utilité d'une classe File? | 14 | File::makeFolder(Config::$db_path); |
| 15 | require 'src/files.php'; | 15 | File::makeFolder(Config::$latex_path); |
| 16 | makeFolder(Config::$db_path); | 16 | File::makeFolder(Config::$pdf_path); |
| 17 | makeFolder(Config::$latex_path); | ||
| 18 | makeFolder(Config::$pdf_path); | ||
| 19 | 17 | ||
| 20 | // variables diverses | 18 | // variables diverses |
| 21 | $exec_mode = 'gui'; // les versions pure console (CLI) et serveur web (CGI) de ce programme ne sont pas prévues pour l'instant | 19 | $exec_mode = 'gui'; // les versions pure console (CLI) et serveur web (CGI) de ce programme ne sont pas prévues pour l'instant |
diff --git a/src/sections/2_service.php b/src/sections/2_service.php index 4dccdb9..dc16fe8 100644 --- a/src/sections/2_service.php +++ b/src/sections/2_service.php | |||
| @@ -169,12 +169,12 @@ function newService(?Client $Client = null): array | |||
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | // création des fichiers | 171 | // création des fichiers |
| 172 | makeTexAndPdf($EnveloppeRecto); | 172 | $EnveloppeRecto->makeTexAndPdf(); |
| 173 | makeTexAndPdf($EnveloppeVerso); | 173 | $EnveloppeVerso->makeTexAndPdf(); |
| 174 | 174 | ||
| 175 | if($DocumentPresta !== null) | 175 | if($DocumentPresta !== null) |
| 176 | { | 176 | { |
| 177 | makeTexAndPdf($DocumentPresta); | 177 | $DocumentPresta->makeTexAndPdf(); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | 180 | ||
diff --git a/src/sections/3_modify_data.php b/src/sections/3_modify_data.php index f021285..d70c7d6 100644 --- a/src/sections/3_modify_data.php +++ b/src/sections/3_modify_data.php | |||
| @@ -77,7 +77,7 @@ function modifyData(?Client $Client = null): array | |||
| 77 | $EnveloppeRecto = Latex::makeInstance('enveloppe_recto'); | 77 | $EnveloppeRecto = Latex::makeInstance('enveloppe_recto'); |
| 78 | $EnveloppeRecto->setData($Client); | 78 | $EnveloppeRecto->setData($Client); |
| 79 | $EnveloppeRecto->makeLatex(); | 79 | $EnveloppeRecto->makeLatex(); |
| 80 | makeTexAndPdf($EnveloppeRecto); | 80 | $EnveloppeRecto->makeTexAndPdf(); |
| 81 | } | 81 | } |
| 82 | else | 82 | else |
| 83 | { | 83 | { |
| @@ -155,8 +155,8 @@ function modifyData(?Client $Client = null): array | |||
| 155 | $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); | 155 | $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); |
| 156 | $DocumentPresta->makeLatex(); // en mémoire | 156 | $DocumentPresta->makeLatex(); // en mémoire |
| 157 | 157 | ||
| 158 | renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); | 158 | File::renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); |
| 159 | makeTexAndPdf($DocumentPresta); // une nouvelle facture est créée, supprimer l'ancienne ou la renommer avec la nouvelle date | 159 | $DocumentPresta->makeTexAndPdf(); // une nouvelle facture est créée, supprimer l'ancienne ou la renommer avec la nouvelle date |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | return [3, $Client]; // menu précédent | 162 | return [3, $Client]; // menu précédent |
| @@ -194,8 +194,8 @@ function modifyData(?Client $Client = null): array | |||
| 194 | $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); // polymorphisme | 194 | $DocumentPresta->setData($Client)->setData($Presta)->setData($PrestaDetails); // polymorphisme |
| 195 | $DocumentPresta->makeLatex(); | 195 | $DocumentPresta->makeLatex(); |
| 196 | 196 | ||
| 197 | renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); | 197 | File::renameFiles($DocumentPresta, $old_code, $Presta->getCodePresta()); |
| 198 | makeTexAndPdf($DocumentPresta); | 198 | $DocumentPresta->makeTexAndPdf(); |
| 199 | } | 199 | } |
| 200 | } | 200 | } |
| 201 | else | 201 | else |
diff --git a/à faire.txt b/à faire.txt index 7530062..15275a9 100644 --- a/à faire.txt +++ b/à faire.txt | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | Prestations classe abstraite + héritage? | 3 | Prestations classe abstraite + héritage? |
| 4 | 4 | ||
| 5 | calcul correct des code presta si une ancienne facture est modifiée | 5 | calcul correct des code presta si une ancienne facture est modifiée |
| 6 | permettre de modifier le code_presta dans "Modifier une prestation" | ||
| 7 | une classe CodePresta? | ||
| 6 | 8 | ||
| 7 | structure BDD en anglais | 9 | structure BDD en anglais |
| 8 | 10 | ||
| @@ -32,15 +34,8 @@ changer les fichiers dans "pub" | |||
| 32 | 34 | ||
| 33 | factoriser la partie 4 dans 3_modify_data.php | 35 | factoriser la partie 4 dans 3_modify_data.php |
| 34 | 36 | ||
| 35 | décider quoi faire avec le fichier File.php | ||
| 36 | |||
| 37 | src/files.php: dans makeFile() et makeFolder() | ||
| 38 | améliorer is_writable() pour renvoyer true du moment que PHP peut écrire | ||
| 39 | |||
| 40 | src/dependances.php: tester les dépendances de texlive | 37 | src/dependances.php: tester les dépendances de texlive |
| 41 | 38 | ||
| 42 | permettre de modifier le code_presta dans "Modifier une prestation" | ||
| 43 | |||
| 44 | erreur de bash avec zenity: > | 39 | erreur de bash avec zenity: > |
| 45 | 40 | ||
| 46 | remplacer la durée de location par les dates de début et de fin | 41 | remplacer la durée de location par les dates de début et de fin |
| @@ -49,8 +44,6 @@ taille des fenêtres zenity (avec gtk4) | |||
| 49 | 44 | ||
| 50 | les constantes sont globales, remplacer donc ZenitySetup.php par un vrai fichier de données (json, yaml, ini) | 45 | les constantes sont globales, remplacer donc ZenitySetup.php par un vrai fichier de données (json, yaml, ini) |
| 51 | 46 | ||
| 52 | une classe CodePresta? | ||
| 53 | |||
| 54 | pouvoir faire plusieurs modifications d'une presta sans devoir la retrouver à chaque fois | 47 | pouvoir faire plusieurs modifications d'une presta sans devoir la retrouver à chaque fois |
| 55 | 48 | ||
| 56 | possibilité d'imprimer une facture vierge avec juste les coordonnées d'un client pour remplir sur-place | 49 | possibilité d'imprimer une facture vierge avec juste les coordonnées d'un client pour remplir sur-place |
