Modification du versionnage auto

This commit is contained in:
2026-05-10 16:12:23 +02:00
parent 703d2ecda3
commit c2b75076d0
57 changed files with 827 additions and 313 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,2 +0,0 @@
4.2.109
2026-05-08

Binary file not shown.

View File

@@ -1,2 +0,0 @@
2.1.62
2026-05-04

537
README.md
View File

@@ -1,203 +1,428 @@
# Inventaire-Gestion # Ratio Inventaires
Ce projet permet de gérer les inventaires et les ratios de plusieurs sites à partir dun fichier Excel central et dune base MySQL. Projet Excel/VBA permettant de gérer les inventaires, les articles, les fournisseurs, les factures, le chiffre daffaires et les ratios de consommation pour plusieurs activités.
## Fonctionnalités Le projet est organisé pour travailler proprement avec PyCharm, Git/Gitea et des scripts de mise en production automatisés.
* Mise à jour du pilote ODBC sur machine client
* Authentification par site
* Lecture automatique du fichier `ratio.xlsm`
* Insertion des données dans la base correspondante
* Gestion des articles et inventaire par code barres
* Affichage dans Streamlit (à venir)
# 🚀 Installation du pilote MySQL ODBC 8.3
## ✅ Objectif
Assurer une compatibilité totale entre les fichiers Excel connectés à MySQL et le pilote ODBC, en uniformisant tous les postes avec la **version 8.3.0 du connecteur MySQL ODBC**.
--- ---
## 📥 Étapes d'installation ## Objectif du projet
1. Télécharger le fichier `mysql-connector-odbc-8.3.0-winx64.msi` depuis le site officiel : Le projet permet de maintenir plusieurs classeurs Excel métier :
👉 [https://dev.mysql.com/downloads/connector/odbc/](https://dev.mysql.com/downloads/connector/odbc/) - `Ratio_Cuisine.xlsm`
- `Ratio_Restauration.xlsm`
- `Démo_Ratio_Cuisine.xlsm`
2. Copier le fichier dans ce dossier sur chaque poste cible : Les fichiers de développement sont conservés dans `Excel/dev`, puis copiés vers `Excel/prod` par des scripts de mise en production.
``` Le numéro de version est géré automatiquement par fichier `.txt` interne, puis écrit directement dans le classeur Excel livré.
C:\Installers\
```
3. Créer un fichier `Installer_ODBC_93.bat` contenant :
```bat
@echo off
echo ===============================
echo Installation MySQL ODBC 8.3.0
echo ===============================
SET MYPATH=C:\Installers
SET INSTALLER=%MYPATH%\mysql-connector-odbc-8.3.0-winx64.msi
IF EXIST "%INSTALLER%" (
echo >> Démarrage de l'installation silencieuse...
msiexec /i "%INSTALLER%" /qn
echo >> Installation terminée avec succès.
pause
) ELSE (
echo >> Fichier MSI non trouvé :
echo >> %INSTALLER%
pause
)
```
4. Lancer le script :
* clic droit sur `Installer_ODBC_83.bat`
* puis **"Exécuter en tant quadministrateur"**
--- ---
## 🔁 (Optionnel) Désinstallation d'une version précédente ## Organisation des dossiers
Pour supprimer proprement une version antérieure (ex : 8.2), vous pouvez ajouter : ```text
Ratio_Inventaires/
├── Docs/
├── Excel/
│ ├── backup/
│ │ └── anciennes versions sauvegardées
│ │
│ ├── dev/
│ │ ├── Ratio_Cuisine_dev.xlsm
│ │ ├── Ratio_Cuisine_VERSION.txt
│ │ ├── Ratio_Restauration_dev.xlsm
│ │ └── Ratio_Restauration_VERSION.txt
│ │
│ └── prod/
│ ├── Démo_Ratio_Cuisine.xlsm
│ ├── Ratio_Cuisine.xlsm
│ └── Ratio_Restauration.xlsm
└── Scripts/
├── Maj_prod_Cuisine.bat
├── Maj_prod_Restauration.bat
├── maj_version.py
└── set_cell_silent.vbs
```
---
## Rôle des dossiers
### `Excel/dev`
Contient les fichiers de travail.
```text
Ratio_Cuisine_dev.xlsm
Ratio_Restauration_dev.xlsm
```
Ces fichiers sont les fichiers modifiables.
Les fichiers `*_VERSION.txt` restent uniquement dans `dev`. Ils servent de compteurs internes pour les scripts de versionnage.
---
### `Excel/prod`
Contient les fichiers livrables.
```text
Ratio_Cuisine.xlsm
Ratio_Restauration.xlsm
Démo_Ratio_Cuisine.xlsm
```
Les fichiers de production ne nécessitent plus de fichier `.txt` à côté. La version est directement écrite dans le classeur Excel.
---
### `Excel/backup`
Contient les anciennes versions de production sauvegardées automatiquement avant remplacement.
Exemple :
```text
Ratio_Cuisine_Vers1.0.15.xlsm
Ratio_Restauration_Vers2.1.3.xlsm
```
Le nombre de sauvegardes conservées est limité dans les scripts `.bat`.
---
### `Scripts`
Contient les scripts dautomatisation :
```text
Maj_prod_Cuisine.bat
Maj_prod_Restauration.bat
maj_version.py
set_cell_silent.vbs
```
---
## Versionnage
Le projet utilise deux familles de versions :
```text
Cuisine → 1.x.x
Restauration → 2.x.x
```
Les fichiers de version à conserver sont uniquement :
```text
Excel/dev/Ratio_Cuisine_VERSION.txt
Excel/dev/Ratio_Restauration_VERSION.txt
```
Les fichiers `.txt` de version ne doivent plus être copiés dans `Excel/prod`.
---
## Fonctionnement du script de version
Le script :
```text
Scripts/maj_version.py
```
fait les opérations suivantes :
1. lit le fichier `*_VERSION.txt` dans `Excel/dev` ;
2. force le numéro majeur selon le classeur ;
3. incrémente le patch ;
4. réécrit le fichier `.txt` ;
5. écrit la version directement dans le classeur Excel de production.
Exemple de version écrite dans Excel :
```text
Version : 1.0.12
Version : 2.1.4
```
Lécriture dans le classeur Excel est faite par :
```text
Scripts/set_cell_silent.vbs
```
Ce script ouvre Excel en arrière-plan, modifie la cellule de version, sauvegarde et ferme le classeur.
---
## Cellule de version dans Excel
La version est écrite automatiquement dans la feuille :
```text
Tableau de bord
```
La cellule utilisée doit être réservée à la version.
Recommandation actuelle :
```text
E1 = Version : x.x.x
```
Attention : `C1` est utilisé par le contexte du site, notamment `SiteCanonique`, et ne doit donc pas être utilisé pour la version.
---
## Mise en production Cuisine
Depuis le dossier `Scripts`, lancer :
```bat ```bat
msiexec /x {GUID-DE-LA-VERSION-8.2} /qn Maj_prod_Cuisine.bat CUISINE
``` ```
*(à compléter avec l'identifiant de produit si nécessaire)* Le script effectue :
1. sauvegarde de lancienne version de production ;
2. copie de `Excel/dev/Ratio_Cuisine_dev.xlsm` vers `Excel/prod/Ratio_Cuisine.xlsm` ;
3. incrément de `Excel/dev/Ratio_Cuisine_VERSION.txt` ;
4. écriture de la version dans le classeur de production ;
5. nettoyage des anciennes sauvegardes.
--- ---
## 🧩 Conseils ## Mise en production Restauration
* Intégrez ces fichiers dans votre dépôt (ex : dossier `Installers/`) Depuis le dossier `Scripts`, lancer :
* Versionnez votre script dans Git (Gitea) pour faciliter le déploiement sur tous les sites
* Utilisez RustDesk ou accès direct pour l'installation sur les PC distants
# 🔧 Gestion et distribution du fichier Excel `Ratio_prod.xlsm` ```bat
Maj_prod_Restauration.bat RESTAURATION
Ce document décrit le fonctionnement mis en place pour garantir une version stable et toujours à jour du fichier Excel `Ratio_prod.xlsm`, utilisé dans le cadre du projet **Ratio & Inventaires**.
---
## 🗃️ Organisation des fichiers
### Structure dans le projet (Git)
/Excel/
├── dev/
│ └── Ratio\_dev.xlsm ← Fichier de travail
├── prod/
│ └── Ratio\_prod.xlsm ← Fichier de production (non suivi par Git)
* `Ratio_dev.xlsm` : version de développement modifiable, suivie par Git.
* `Ratio_prod.xlsm` : version validée, protégée (ajoutée au `.gitignore` pour éviter tout push accidentel).
---
## 🖥️ Synchronisation automatique avec le NAS Synology
Le fichier `Ratio_prod.xlsm` est copié automatiquement sur le NAS Synology, dans un dossier partagé :
### ⚙️ Configuration
* **Synology Drive Server** est activé sur le NAS.
* **Synology Drive Client** est installé sur le poste de travail.
* Dossier synchronisé : `Partage_Ratio`
* Mode de synchronisation recommandé : `Téléchargement uniquement`.
---
## 🔌 Copie automatique vers clé USB (via NAS)
### Prérequis
* Application **USB Copy** installée et activée sur le NAS.
### Fonctionnement
1. Brancher une clé USB sur le port en façade du NAS.
2. Le NAS copie automatiquement `Ratio_prod.xlsm` sur la clé USB si une version plus récente est disponible.
3. Le fichier est copié dans le dossier racine de la clé, ou dans un dossier `Ratio/`.
### Avantages
* Pas besoin dordinateur pour copier à la main.
* Copie toujours à jour dès que la clé est branchée.
---
## 🛠️ Installation manuelle depuis une clé USB
Contenu du dossier USB :
```
INSTALL_RATIO/
├── Ratio_prod.xlsm
└── Installer_Prod.bat
``` ```
### Étapes : Le script effectue :
1. Brancher la clé USB sur le poste utilisateur. 1. sauvegarde de lancienne version de production ;
2. Lancer `Installer_Prod.bat` **en tant quadministrateur**. 2. copie de `Excel/dev/Ratio_Restauration_dev.xlsm` vers `Excel/prod/Ratio_Restauration.xlsm` ;
3. Le fichier sera copié dans : 3. incrément de `Excel/dev/Ratio_Restauration_VERSION.txt` ;
4. écriture de la version dans le classeur de production ;
``` 5. nettoyage des anciennes sauvegardes.
C:\Program Files\Ratio\Ratio.xlsm
```
et protégé en lecture seule.
--- ---
## ♻️ Restaurer la version de production dans le projet (dev) ## Fichier de démonstration
Si la version de travail (`dev`) a été corrompue ou modifiée par erreur : Le fichier :
```text
Excel/prod/Démo_Ratio_Cuisine.xlsm
```
est destiné à présenter le fonctionnement sans installation réseau obligatoire.
Il peut contenir des données locales dans des feuilles de type :
```text
DATA_Articles
DATA_Fournisseurs
DATA_Factures
DATA_Ca
DATA_Inventaires
```
La version démo peut fonctionner sans connexion MySQL, sans ODBC et sans fichier `.txt` distribué.
Recommandations pour la version démo :
- données locales uniquement ;
- pas didentifiants MySQL ;
- pas de requêtes Power Query actives ;
- pas de fichier de version `.txt` livré ;
- limitation volontaire des ajouts pour éviter un usage réel non maîtrisé.
---
## Connexions MySQL et ODBC
Les classeurs de production connectés peuvent utiliser MySQL via ODBC.
La version recommandée du pilote est :
```text
MySQL ODBC 8.3 Unicode Driver
```
Sur les postes clients connectés, le pilote doit être installé avant utilisation.
La version démo locale, elle, ne doit pas dépendre du pilote ODBC.
---
## Installation du pilote MySQL ODBC 8.3
Télécharger le pilote officiel :
```text
mysql-connector-odbc-8.3.0-winx64.msi
```
Puis le placer dans :
```text
C:\Installers\
```
Exemple de script dinstallation silencieuse :
```bat
@echo off
echo ===============================
echo Installation MySQL ODBC 8.3.0
echo ===============================
set MYPATH=C:\Installers
set INSTALLER=%MYPATH%\mysql-connector-odbc-8.3.0-winx64.msi
if exist "%INSTALLER%" (
echo Démarrage de l'installation silencieuse...
msiexec /i "%INSTALLER%" /qn
echo Installation terminée.
) else (
echo Fichier MSI non trouvé :
echo %INSTALLER%
)
```
À lancer en administrateur.
---
## Bonnes pratiques Git/Gitea
À versionner :
```text
Excel/dev/Ratio_Cuisine_dev.xlsm
Excel/dev/Ratio_Restauration_dev.xlsm
Excel/dev/*_VERSION.txt
Scripts/*.bat
Scripts/*.py
Scripts/*.vbs
README.md
```
À ignorer ou éviter de versionner :
```text
Excel/backup/
~$*.xlsm
*.tmp
*.bak
```
Selon la stratégie choisie, les fichiers de `Excel/prod` peuvent être versionnés ou non. Dans ce projet, ils servent de fichiers livrables générés par les scripts.
---
## Exemple de `.gitignore`
```gitignore
# Fichiers temporaires Excel
~$*.xlsm
~$*.xlsx
*.tmp
*.bak
# Sauvegardes générées
Excel/backup/
# Cache Python
__pycache__/
*.pyc
# Environnements virtuels
.venv/
venv/
```
---
## Checklist avant mise en production
Avant de lancer un script de mise en production :
1. fermer le classeur Excel concerné ;
2. vérifier quaucun fichier `~$Ratio_*.xlsm` nest présent ;
3. sauvegarder les modifications dans le fichier `dev` ;
4. lancer le script `.bat` correspondant ;
5. vérifier que la version est bien écrite dans le classeur `prod` ;
6. faire un commit Git/Gitea.
---
## Commandes utiles
Vérifier létat Git :
```bash ```bash
cp Excel/prod/Ratio_Cuisine.xlsm Excel/dev/Ratio_Cuisine_dev_old.xlsm git status
``` ```
Ou sous Windows : Ajouter les modifications :
```powershell ```bash
Copy-Item -Path "Excel\prod\Ratio_prod.xlsm" -Destination "Excel\dev\Ratio_dev.xlsm" -Force git add README_old.md Scripts/ Excel/dev/
```
Créer un commit :
```bash
git commit -m "Normalise versioning and prod deployment scripts"
```
Envoyer vers Gitea :
```bash
git push
``` ```
--- ---
## 🧾 Notes complémentaires ## Dépannage
* Le fichier `Ratio_prod.xlsm` nest **pas suivi par Git**, car exclu via `.gitignore`. ### Erreur : fichier utilisé par un autre processus
* Il est **protégé en lecture seule** sur le poste utilisateur.
* Une sauvegarde automatique est possible via **Hyper Backup** ou les **snapshots** du NAS. Cause probable : le classeur est encore ouvert dans Excel ou un fichier temporaire existe.
Solution :
```bat
taskkill /F /IM excel.exe
```
Puis vérifier que le fichier temporaire a disparu :
```text
~$Ratio_Cuisine.xlsm
~$Ratio_Restauration.xlsm
```
--- ---
# 📋 Checklist Release DEV → PROD ### Erreur dans `set_cell_silent.vbs` au moment de fermer Excel
Pour garantir que DEV reste ouvert et que PROD soit protégé : Cause probable : Excel est resté en arrière-plan.
1. **Travailler dans DEV** : `Excel/dev/Ratio_dev.xlsm` (projet VBA non verrouillé). Solution : utiliser la version robuste de `set_cell_silent.vbs`, qui ferme explicitement le classeur et lapplication Excel après sauvegarde.
2. **Lancer le script batch** (`build_prod.bat`).
* Copie DEV → PROD
* Application des protections (feuilles, structure, horodatage)
* Vérification/verrouillage du projet VBA PROD (manuel si nécessaire)
3. **Vérifier PROD** :
* Feuilles protégées
* Structure du classeur protégée
* Projet VBA verrouillé (mot de passe, déjà posé une fois)
4. **Distribuer PROD** : via NAS, USB ou dossier client.
👉 DEV reste toujours libre, PROD reste verrouillé et sûr.
--- ---

206
README_old.md Normal file
View File

@@ -0,0 +1,206 @@
# Inventaire-Gestion
Ce projet permet de gérer les inventaires et les ratios de plusieurs sites à partir dun fichier Excel central et dune base MySQL.
## Fonctionnalités
* Mise à jour du pilote ODBC sur machine client
* Authentification par site
* Lecture automatique du fichier `ratio.xlsm`
* Insertion des données dans la base correspondante
* Gestion des articles et inventaire par code barres
* Affichage dans Streamlit (à venir)
# 🚀 Installation du pilote MySQL ODBC 8.3
## ✅ Objectif
Assurer une compatibilité totale entre les fichiers Excel connectés à MySQL et le pilote ODBC, en uniformisant tous les postes avec la **version 8.3.0 du connecteur MySQL ODBC**.
---
## 📥 Étapes d'installation
1. Télécharger le fichier `mysql-connector-odbc-8.3.0-winx64.msi` depuis le site officiel :
👉 [https://dev.mysql.com/downloads/connector/odbc/](https://dev.mysql.com/downloads/connector/odbc/)
2. Copier le fichier dans ce dossier sur chaque poste cible :
```
C:\Installers\
```
3. Créer un fichier `Installer_ODBC_93.bat` contenant :
```bat
@echo off
echo ===============================
echo Installation MySQL ODBC 8.3.0
echo ===============================
SET MYPATH=C:\Installers
SET INSTALLER=%MYPATH%\mysql-connector-odbc-8.3.0-winx64.msi
IF EXIST "%INSTALLER%" (
echo >> Démarrage de l'installation silencieuse...
msiexec /i "%INSTALLER%" /qn
echo >> Installation terminée avec succès.
pause
) ELSE (
echo >> Fichier MSI non trouvé :
echo >> %INSTALLER%
pause
)
```
4. Lancer le script :
* clic droit sur `Installer_ODBC_83.bat`
* puis **"Exécuter en tant quadministrateur"**
---
## 🔁 (Optionnel) Désinstallation d'une version précédente
Pour supprimer proprement une version antérieure (ex : 8.2), vous pouvez ajouter :
```bat
msiexec /x {GUID-DE-LA-VERSION-8.2} /qn
```
*(à compléter avec l'identifiant de produit si nécessaire)*
---
## 🧩 Conseils
* Intégrez ces fichiers dans votre dépôt (ex : dossier `Installers/`)
* Versionnez votre script dans Git (Gitea) pour faciliter le déploiement sur tous les sites
* Utilisez RustDesk ou accès direct pour l'installation sur les PC distants
# 🔧 Gestion et distribution du fichier Excel `Ratio_prod.xlsm`
Ce document décrit le fonctionnement mis en place pour garantir une version stable et toujours à jour du fichier Excel `Ratio_prod.xlsm`, utilisé dans le cadre du projet **Ratio & Inventaires**.
---
## 🗃️ Organisation des fichiers
### Structure dans le projet (Git)
/Excel/
├── dev/
│ └── Ratio\_dev.xlsm ← Fichier de travail
├── prod/
│ └── Ratio\_prod.xlsm ← Fichier de production (non suivi par Git)
* `Ratio_dev.xlsm` : version de développement modifiable, suivie par Git.
* `Ratio_prod.xlsm` : version validée, protégée (ajoutée au `.gitignore` pour éviter tout push accidentel).
---
## 🖥️ Synchronisation automatique avec le NAS Synology
Le fichier `Ratio_prod.xlsm` est copié automatiquement sur le NAS Synology, dans un dossier partagé :
### ⚙️ Configuration
* **Synology Drive Server** est activé sur le NAS.
* **Synology Drive Client** est installé sur le poste de travail.
* Dossier synchronisé : `Partage_Ratio`
* Mode de synchronisation recommandé : `Téléchargement uniquement`.
---
## 🔌 Copie automatique vers clé USB (via NAS)
### Prérequis
* Application **USB Copy** installée et activée sur le NAS.
### Fonctionnement
1. Brancher une clé USB sur le port en façade du NAS.
2. Le NAS copie automatiquement `Ratio_prod.xlsm` sur la clé USB si une version plus récente est disponible.
3. Le fichier est copié dans le dossier racine de la clé, ou dans un dossier `Ratio/`.
### Avantages
* Pas besoin dordinateur pour copier à la main.
* Copie toujours à jour dès que la clé est branchée.
---
## 🛠️ Installation manuelle depuis une clé USB
Contenu du dossier USB :
```
INSTALL_RATIO/
├── Ratio_prod.xlsm
└── Installer_Prod.bat
```
### Étapes :
1. Brancher la clé USB sur le poste utilisateur.
2. Lancer `Installer_Prod.bat` **en tant quadministrateur**.
3. Le fichier sera copié dans :
```
C:\Program Files\Ratio\Ratio.xlsm
```
et protégé en lecture seule.
---
## ♻️ Restaurer la version de production dans le projet (dev)
Si la version de travail (`dev`) a été corrompue ou modifiée par erreur :
```bash
cp Excel/prod/Ratio_Cuisine.xlsm Excel/dev/Ratio_Cuisine_dev_old.xlsm
```
Ou sous Windows :
```powershell
Copy-Item -Path "Excel\prod\Ratio_prod.xlsm" -Destination "Excel\dev\Ratio_dev.xlsm" -Force
```
---
## 🧾 Notes complémentaires
* Le fichier `Ratio_prod.xlsm` nest **pas suivi par Git**, car exclu via `.gitignore`.
* Il est **protégé en lecture seule** sur le poste utilisateur.
* Une sauvegarde automatique est possible via **Hyper Backup** ou les **snapshots** du NAS.
---
# 📋 Checklist Release DEV → PROD
Pour garantir que DEV reste ouvert et que PROD soit protégé :
1. **Travailler dans DEV** : `Excel/dev/Ratio_dev.xlsm` (projet VBA non verrouillé).
2. **Lancer le script batch** (`build_prod.bat`).
* Copie DEV → PROD
* Application des protections (feuilles, structure, horodatage)
* Vérification/verrouillage du projet VBA PROD (manuel si nécessaire)
3. **Vérifier PROD** :
* Feuilles protégées
* Structure du classeur protégée
* Projet VBA verrouillé (mot de passe, déjà posé une fois)
4. **Distribuer PROD** : via NAS, USB ou dossier client.
👉 DEV reste toujours libre, PROD reste verrouillé et sûr.
---
## Auteur
Michel

View File

@@ -1,36 +1,25 @@
@echo off @echo off
setlocal ENABLEDELAYEDEXPANSION setlocal ENABLEDELAYEDEXPANSION
REM --- Se place dans le dossier du .bat ---
cd /d "%~dp0" cd /d "%~dp0"
REM Chemin du fichier de version pour la CUISINE REM === PARAMETRES CUISINE ===
set "VERSION_FILE=..\Excel\prod\Ratio_Cuisine_VERSION.txt" set "ROOT=%~dp0.."
REM On lit l'ANCIENNE version avant de la mettre à jour (pour nommer la sauvegarde) set "VERSION_FILE=%ROOT%\Excel\dev\Ratio_Cuisine_VERSION.txt"
set "SRC=%ROOT%\Excel\dev\Ratio_Cuisine_dev.xlsm"
set "DST_DIR=%ROOT%\Excel\prod"
set "DST=%DST_DIR%\Ratio_Cuisine.xlsm"
set "BACKUP_DIR=%ROOT%\Excel\backup"
set KEEP_BACKUPS=10
REM === Lire ancienne version pour nom sauvegarde ===
set "OLD_VERSION=" set "OLD_VERSION="
if exist "%VERSION_FILE%" ( if exist "%VERSION_FILE%" (
set /p OLD_VERSION=<"%VERSION_FILE%" set /p OLD_VERSION=<"%VERSION_FILE%"
) )
REM Nombre de sauvegardes Cuisine à conserver
set KEEP_BACKUPS=10
echo Mise à jour de version... REM === Vérifications ===
python "maj_version.py" "%VERSION_FILE%"
if errorlevel 1 (
echo ERREUR lors de la mise à jour de version.
pause
exit /b 1
)
REM === 2) CHEMINS DES FICHIERS EXCEL ===
set SRC=..\Excel\dev\Ratio_Cuisine_dev.xlsm
set DST_DIR=..\Excel\prod
REM Dossier commun de sauvegardes (Cuisine + Restauration)
set BACKUP_DIR=..\Excel\backup
REM Vérifications
if not exist "%SRC%" ( if not exist "%SRC%" (
echo ERREUR : fichier source introuvable : echo ERREUR : fichier source introuvable :
echo %SRC% echo %SRC%
@@ -45,33 +34,48 @@ if not exist "%DST_DIR%" (
exit /b 1 exit /b 1
) )
REM Création auto du dossier de sauvegarde s'il n'existe pas
if not exist "%BACKUP_DIR%" ( if not exist "%BACKUP_DIR%" (
mkdir "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"
) )
REM === 3) NOM DU FICHIER DE SAUVEGARDE AVEC ANCIENNE VERSION === REM === Sauvegarde de l'ancienne prod avant remplacement ===
if "%OLD_VERSION%"=="" ( if exist "%DST%" (
REM Sécurité : si on n'a pas réussi à lire la version, on met un nom générique if "%OLD_VERSION%"=="" (
set "BACKUP=%BACKUP_DIR%\Ratio_Cuisine_sansVersion.xlsm" set "BACKUP=%BACKUP_DIR%\Ratio_Cuisine_sansVersion.xlsm"
) else ( ) else (
set "BACKUP=%BACKUP_DIR%\Ratio_Cuisine_Vers%OLD_VERSION%.xlsm" set "BACKUP=%BACKUP_DIR%\Ratio_Cuisine_Vers%OLD_VERSION%.xlsm"
)
echo Sauvegarde de l'ancienne production...
copy /Y "%DST%" "%BACKUP%"
) )
REM === 4) COPIE VERS PROD === REM === Copie DEV vers PROD ===
echo Copie vers la version de production... echo Copie vers la version de production...
copy /Y "%SRC%" "%DST_DIR%\Ratio_Cuisine.xlsm" copy /Y "%SRC%" "%DST%"
REM === 5) SAUVEGARDE === if errorlevel 1 (
echo Création de la sauvegarde datée... echo ERREUR lors de la copie vers production.
copy /Y "%SRC%" "%BACKUP%" pause
exit /b 1
)
echo Terminé. REM === Mise à jour version TXT + cellule C1 du classeur PROD ===
exit /b 0 echo Mise à jour de version...
python "%~dp0maj_version.py" "%VERSION_FILE%" "%DST%"
REM === 6) NETTOYAGE : on ne garde que les %KEEP_BACKUPS% dernières sauvegardes Cuisine === if errorlevel 1 (
REM Tri par date décroissante (les plus récentes d'abord). On supprime au-delà de KEEP_BACKUPS. echo ERREUR lors de la mise à jour de version.
pause
exit /b 1
)
REM === Nettoyage sauvegardes anciennes ===
echo Nettoyage des anciennes sauvegardes Cuisine...
for /f "skip=%KEEP_BACKUPS% delims=" %%F in ('dir /b /a-d /o-d "%BACKUP_DIR%\Ratio_Cuisine_Vers*.xlsm" 2^>nul') do ( for /f "skip=%KEEP_BACKUPS% delims=" %%F in ('dir /b /a-d /o-d "%BACKUP_DIR%\Ratio_Cuisine_Vers*.xlsm" 2^>nul') do (
echo Suppression ancienne sauvegarde : %%F echo Suppression ancienne sauvegarde : %%F
del /q "%BACKUP_DIR%\%%F" del /q "%BACKUP_DIR%\%%F"
) )
echo Terminé.
exit /b 0

View File

@@ -1,80 +1,76 @@
@echo off @echo off
setlocal ENABLEDELAYEDEXPANSION setlocal ENABLEDELAYEDEXPANSION
REM --- Se place dans le dossier du .bat ---
cd /d "%~dp0" cd /d "%~dp0"
echo --- Mise en prod Ratio_Restauration --- echo --- Mise en prod Ratio_Restauration ---
REM Chemin du fichier de version pour la RESTAURATION set "ROOT=%~dp0.."
set "VERSION_FILE=..\Excel\prod\Ratio_Restauration_VERSION.txt"
set "VERSION_FILE=%ROOT%\Excel\dev\Ratio_Restauration_VERSION.txt"
set "SRC=%ROOT%\Excel\dev\Ratio_Restauration_dev.xlsm"
set "DST_DIR=%ROOT%\Excel\prod"
set "DST=%DST_DIR%\Ratio_Restauration.xlsm"
set "BACKUP_DIR=%ROOT%\Excel\backup"
set KEEP_BACKUPS=10
REM On lit l'ANCIENNE version pour la sauvegarde
set "OLD_VERSION=" set "OLD_VERSION="
if exist "%VERSION_FILE%" ( if exist "%VERSION_FILE%" (
set /p OLD_VERSION=<"%VERSION_FILE%" set /p OLD_VERSION=<"%VERSION_FILE%"
) )
REM Nombre de sauvegardes Cuisine à conserver
set KEEP_BACKUPS=10
echo Mise à jour de version...
python "maj_version.py" "%VERSION_FILE%"
if errorlevel 1 (
echo ERREUR lors de la mise à jour de version.
pause
exit /b 1
)
REM === 2) CHEMINS DES FICHIERS EXCEL ===
set SRC=..\Excel\dev\Ratio_Restauration_dev.xlsm
set DST_DIR=..\Excel\prod
REM Dossier commun de sauvegardes (Cuisine + Restauration)
set BACKUP_DIR=..\Excel\backup
if not exist "%BACKUP_DIR%" (
mkdir "%BACKUP_DIR%"
)
REM Vérifications
if not exist "%SRC%" ( if not exist "%SRC%" (
echo ERREUR : fichier source introuvable : echo ERREUR : fichier source introuvable :
echo %SRC% echo %SRC%
endlocal
exit /b 1 exit /b 1
) )
if not exist "%DST_DIR%" ( if not exist "%DST_DIR%" (
echo ERREUR : dossier de destination introuvable : echo ERREUR : dossier de destination introuvable :
echo %DST_DIR% echo %DST_DIR%
endlocal
exit /b 1 exit /b 1
) )
REM === NOM DU FICHIER DE SAUVEGARDE AVEC ANCIENNE VERSION === if not exist "%BACKUP_DIR%" (
if "%OLD_VERSION%"=="" ( mkdir "%BACKUP_DIR%"
REM Sécurité si la lecture a échoué )
set "BACKUP=%BACKUP_DIR%\Ratio_Restauration_sansVersion.xlsm"
) else ( if exist "%DST%" (
set "BACKUP=%BACKUP_DIR%\Ratio_Restauration_Vers%OLD_VERSION%.xlsm" if "%OLD_VERSION%"=="" (
set "BACKUP=%BACKUP_DIR%\Ratio_Restauration_sansVersion.xlsm"
) else (
set "BACKUP=%BACKUP_DIR%\Ratio_Restauration_Vers%OLD_VERSION%.xlsm"
)
echo Sauvegarde de l'ancienne production...
if exist "%DST_DIR%\~$Ratio_Restauration.xlsm" (
echo ERREUR : Ratio_Restauration.xlsm est ouvert dans Excel.
exit /b 1
)
copy /Y "%DST%" "%BACKUP%"
) )
REM === 4) COPIE VERS PROD ===
echo Copie vers la version de production... echo Copie vers la version de production...
copy /Y "%SRC%" "%DST_DIR%\Ratio_Restauration.xlsm" copy /Y "%SRC%" "%DST%"
REM === 5) SAUVEGARDE DATÉE === if errorlevel 1 (
echo Création de la sauvegarde datée... echo ERREUR lors de la copie vers production.
copy /Y "%SRC%" "%BACKUP%" exit /b 1
)
echo --- Mise en prod terminee --- echo Mise à jour de version...
endlocal python "%~dp0maj_version.py" "%VERSION_FILE%" "%DST%"
exit /b 0
REM === 6) NETTOYAGE : on ne garde que les %KEEP_BACKUPS% dernières sauvegardes Restauration === if errorlevel 1 (
REM Tri par date décroissante (les plus récentes d'abord). On supprime au-delà de KEEP_BACKUPS. echo ERREUR lors de la mise à jour de version.
for /f "skip=%KEEP_BACKUPS% delims=" %%F in ('dir /b /a-d /o-d "%BACKUP_DIR%\Ratio_restauration_Vers*.xlsm" 2^>nul') do ( exit /b 1
)
echo Nettoyage des anciennes sauvegardes Restauration...
for /f "skip=%KEEP_BACKUPS% delims=" %%F in ('dir /b /a-d /o-d "%BACKUP_DIR%\Ratio_Restauration_Vers*.xlsm" 2^>nul') do (
echo Suppression ancienne sauvegarde : %%F echo Suppression ancienne sauvegarde : %%F
del /q "%BACKUP_DIR%\%%F" del /q "%BACKUP_DIR%\%%F"
) )
echo --- Mise en prod terminee ---
exit /b 0

View File

@@ -1,51 +1,135 @@
import sys import sys
import subprocess
from pathlib import Path from pathlib import Path
from datetime import date from datetime import date
# =========================================================
# CONFIG
# =========================================================
VBS_SCRIPT = Path(__file__).parent / "set_cell_silent.vbs"
# =========================================================
# PREFIXE VERSION
# =========================================================
def detecter_major(path: Path) -> int:
nom = path.name.lower()
if "restauration" in nom:
return 2
return 1
# =========================================================
# LECTURE VERSION
# =========================================================
def lire_version(path: Path, major: int):
def lire_version(path: Path):
if not path.exists(): if not path.exists():
return [1, 0, 0] return [major, 0, 0]
contenu = path.read_text(encoding="utf-8").strip().splitlines() contenu = path.read_text(encoding="utf-8").strip().splitlines()
if not contenu: if not contenu:
return [1, 0, 0] return [major, 0, 0]
version_str = contenu[0].strip()
try: try:
parts = [int(x) for x in version_str.split(".")] version = [int(x) for x in contenu[0].split(".")]
while len(parts) < 3:
parts.append(0) while len(version) < 3:
return parts[:3] version.append(0)
except ValueError:
return [1, 0, 0] version = version[:3]
# force le major correct
version[0] = major
return version
except Exception:
return [major, 0, 0]
def ecrire_version(path: Path, version): # =========================================================
version_str = ".".join(str(x) for x in version) # INCREMENT
today = date.today().isoformat() # =========================================================
texte = f"{version_str}\n{today}\n"
path.write_text(texte, encoding="utf-8")
return version_str
def increment_patch(version): def increment_patch(version):
version[2] += 1 version[2] += 1
return version return version
# =========================================================
# ECRITURE TXT
# =========================================================
def ecrire_version_txt(path: Path, version):
version_str = ".".join(str(x) for x in version)
contenu = f"{version_str}\n{date.today().isoformat()}\n"
path.write_text(contenu, encoding="utf-8")
return version_str
# =========================================================
# ECRITURE EXCEL
# =========================================================
def ecrire_version_excel(classeur: Path, version_str: str):
if not classeur.exists():
print(f"Classeur introuvable : {classeur}")
return
valeur = f"Version : {version_str}"
cmd = [
"cscript",
"//nologo",
str(VBS_SCRIPT),
str(classeur),
"Tableau de bord",
"C1",
valeur
]
subprocess.run(cmd, check=True)
# =========================================================
# MAIN
# =========================================================
def main(): def main():
if len(sys.argv) < 2:
print("Usage : python maj_version.py chemin_du_VERSION.txt") if len(sys.argv) < 3:
print("Usage :")
print("python maj_version.py VERSION.txt classeur.xlsm")
sys.exit(1) sys.exit(1)
version_file = Path(sys.argv[1]) version_file = Path(sys.argv[1])
version = lire_version(version_file) classeur = Path(sys.argv[2])
major = detecter_major(version_file)
version = lire_version(version_file, major)
version = increment_patch(version) version = increment_patch(version)
new_version_str = ecrire_version(version_file, version)
print(f"Nouvelle version : {new_version_str}") version_str = ecrire_version_txt(version_file, version)
ecrire_version_excel(classeur, version_str)
print(f"Nouvelle version : {version_str}")
print(f"Classeur mis à jour : {classeur.name}")
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -1,68 +1,71 @@
' set_cell_silent.vbs
' Usage: cscript //nologo set_cell_silent.vbs "C:\chemin\fichier.xlsm" "NomFeuille" "A1" "Valeur"
Option Explicit Option Explicit
Dim f, sheetName, addr, val
Dim xl, wb, ws Dim xl, wb
Dim filePath, sheetName, cellAddress, cellValue
If WScript.Arguments.Count < 4 Then If WScript.Arguments.Count < 4 Then
WScript.Echo "[ERR] Args: set_cell_silent.vbs <fichier.xlsm> <feuille> <cellule> <valeur>" WScript.Echo "[ERR] Usage : set_cell_silent.vbs fichier.xlsm feuille cellule valeur"
WScript.Quit 1 WScript.Quit 1
End If End If
f = WScript.Arguments(0) filePath = WScript.Arguments(0)
sheetName = WScript.Arguments(1) sheetName = WScript.Arguments(1)
addr = WScript.Arguments(2) cellAddress = WScript.Arguments(2)
val = WScript.Arguments(3) cellValue = WScript.Arguments(3)
On Error Resume Next On Error Resume Next
Set xl = CreateObject("Excel.Application") Set xl = CreateObject("Excel.Application")
If Err.Number <> 0 Then If Err.Number <> 0 Then
WScript.Echo "[ERR] Excel non disponible (" & Err.Description & ")" WScript.Echo "[ERR] Creation Excel : " & Err.Description
WScript.Quit 1 WScript.Quit 1
End If End If
On Error GoTo 0
xl.Visible = False xl.Visible = False
xl.DisplayAlerts = False xl.DisplayAlerts = False
' Désactiver macros et événements AVANT douvrir
On Error Resume Next
xl.AutomationSecurity = 3 ' msoAutomationSecurityForceDisable
xl.EnableEvents = False xl.EnableEvents = False
xl.ScreenUpdating = False xl.AskToUpdateLinks = False
On Error GoTo 0 xl.AutomationSecurity = 3
Err.Clear
Set wb = xl.Workbooks.Open(filePath, 0, False)
On Error Resume Next
Set wb = xl.Workbooks.Open(f, False, False)
If Err.Number <> 0 Then If Err.Number <> 0 Then
xl.Quit WScript.Echo "[ERR] Ouverture classeur: " & Err.Description
WScript.Echo "[ERR] Ouverture classeur: " & Err.Description xl.Quit
WScript.Quit 1 Set xl = Nothing
WScript.Quit 1
End If End If
On Error GoTo 0
On Error Resume Next Err.Clear
Set ws = wb.Worksheets.Item(sheetName) wb.Worksheets(sheetName).Range(cellAddress).Value = cellValue
If Err.Number <> 0 Then If Err.Number <> 0 Then
wb.Close False WScript.Echo "[ERR] Ecriture cellule: " & Err.Description
xl.Quit wb.Close False
WScript.Echo "[ERR] Feuille introuvable: " & sheetName xl.Quit
WScript.Quit 1 Set wb = Nothing
Set xl = Nothing
WScript.Quit 1
End If End If
On Error GoTo 0
On Error Resume Next
ws.Range(addr).Value2 = val
If Err.Number <> 0 Then
wb.Close False
xl.Quit
WScript.Echo "[ERR] Ecriture cellule " & addr & " : " & Err.Description
WScript.Quit 1
End If
On Error GoTo 0
Err.Clear
wb.Save wb.Save
If Err.Number <> 0 Then
WScript.Echo "[ERR] Sauvegarde: " & Err.Description
wb.Close False
xl.Quit
Set wb = Nothing
Set xl = Nothing
WScript.Quit 1
End If
Err.Clear
wb.Close False wb.Close False
Set wb = Nothing
xl.Quit xl.Quit
WScript.Quit 0 Set xl = Nothing
WScript.Quit 0

Binary file not shown.