#!/usr/bin/php -q * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * *************************************************************************** * File : export_extraits_comptes_grisbi_via_sqlite.php * Author : Eric SEIGNE * mailto:eric.seigne@ryxeo.com * http://www.ryxeo.com/ * Date : 25/03/2007 * Licence : GNU/GPL Version 2 * * Description: * ------------ * * Ce script permet d'extraire les écritures rapprochées d'un fichier * grisbi pour re-générer les extraits de compte et ainsi les comparer * avec ceux de la banque. * * J'ai du coder ce script pour corriger mes comptes suite à un transfert * de GNUCash à Grisbi et pour lequel j'ai perdu les numéros des extraits * de compte ... bref * * ************************************************************************* */ //si on veut utiliser un nom de fichier "en dur" $db_path = "grisbi.sqlite"; $db_path = tempnam(".","extraits_grisbi_db"); //Le nom du fichier grisbi a analyser (accès en lecture seule) $file = "grisbi.gsb"; //Le répertoire dans lequel on va créer tous les fichiers html d'extraits de comptes $rep_dest = "extraits"; // Connexion/création de la base l_echo("Création d'un fichier SQLite temporaire ...\n"); $db = sqlite_open($db_path) or die("Impossible de créer la base !"); /******************************************* LES FONCTIONS ******************************************/ // Création de la base de données // note: je n'exporte pas tout le contenu du fichier grisbi // et me concentre sur ce dont j'ai besoins function create_database($db){ sqlite_query($db,"CREATE TABLE comptes( ID INTEGER PRIMARY KEY, N varchar(50) )"); sqlite_query($db,"CREATE TABLE operations( ID INTEGER PRIMARY KEY, N varchar(250), M FLOAT, Ct FLOAT, D DATE, T INTEGER, R INTEGER, Compte INTEGER )"); sqlite_query($db,"CREATE TABLE tiers( ID INTEGER PRIMARY KEY, N varchar(250) )"); sqlite_query($db,"CREATE TABLE rapprochements( ID INTEGER PRIMARY KEY, Nom varchar(250) )"); } // transforme une date française en SQL function fr2sqlDate($text) { $split = split("/",$text); $jour = $split[0]; $mois = $split[1]; $annee = $split[2]; return $annee."/".$mois."/".$jour; } // transforme une date SQL en fr function sqlDate2fr($text) { $split = split("/",$text); $annee = $split[0]; $mois = $split[1]; $jour = $split[2]; return strftime("%d/%m",strtotime($annee."/".$mois."/".$jour)); } // SQLite n'aime pas les apostrophes/quotes function sql($txt) { return str_replace("'","’",$txt); } // Lecture du fichier grisbi et remplissage de la base function lit_fichier($fic,$db) { // Lecture du flux if($flux=simplexml_load_file($fic)) { //On passe en revue tous les comptes foreach($flux->Comptes->Compte as $compte) { $N = $compte->Details->Nom; $IdCompte = $compte->Details->No_de_compte; // Mise à jour du flux sqlite_query($db,"INSERT INTO comptes VALUES($IdCompte,'".sql($N)."')"); // print_r($compte->Detail_des_operations->Operation); // Pour chaque foreach($compte->Detail_des_operations->Operation as $operation) { // print_r($operation); // On récupère les champs $numop = $operation["No"]; $numCt = $operation["Ct"]; $desc = $operation["N"]; $montant = $operation["M"]; $date = fr2sqlDate($operation["D"]); $tiers = $operation["T"]; $rappro = $operation["R"]; $result = sqlite_query($db,"SELECT ID FROM operations WHERE ID='".$numop."' AND Compte=".$IdCompte); // Mise à jour if(sqlite_num_rows($result)>0) { sqlite_query($db,"UPDATE operations SET N='".sql($desc)."',M='".sql($montant) ."',D='".sql($date)."',T='".sql($tiers)."',R='".sql($rappro) ."',Ct='".sql($numCt)."' WHERE ID=".sqlite_fetch_single($result)); // ou ajout à la BD } else { $req = "INSERT INTO operations VALUES(".$numop.",'".sql($desc)."','".sql($montant)."','".sql($numCt)."','".sql($date)."','".sql($tiers)."','".sql($rappro)."','".$IdCompte."')"; //print "-> $req\n"; sqlite_query($db,$req); } } } //Puis les comptes des tiers // print_r($flux->Tiers->Detail_des_tiers->Tiers); foreach($flux->Tiers->Detail_des_tiers->Tiers as $tier) { $No = $tier["No"]; $Nom = $tier["Nom"]; // Mise à jour du flux sqlite_query($db,"INSERT INTO tiers VALUES('".sql($No)."','".sql($Nom)."')"); } //Et les rapprochements // print_r($flux->Rapprochements->Detail_des_rapprochements->Rapprochement); foreach($flux->Rapprochements->Detail_des_rapprochements->Rapprochement as $rapprochement) { $No = $rapprochement["No"]; $Nom = $rapprochement["Nom"]; // Mise à jour du flux $req = "INSERT INTO rapprochements VALUES('".sql($No)."','".sql($Nom)."')"; //print "-> $req \n"; sqlite_query($db,$req); } } } //Supprime le fichier temporaires function erase_file($f) { l_echo(". Suppression du fichier temporaire ...\n"); unlink($f); } // Entête du fichier HTML // remarquez bien que ce n'est pas du xhtml valide et tout ça // je n'ai pas vraiment le temps de faire beaucoup plus propre // note: pensez à prendre la feuille de style avec vous ... function html_debut($titre) { return " $titre \n"; } // Pied du fichier HTML function html_fin($deb, $cre) { return "
$titre
Date Num Intitulé Débit Crédit Vérification
Totaux $deb $cre
\n"; } //retourne le nombre en affichage financier a la francaise function nombre($nb) { return number_format($nb, 2, ',', ' '); } // fonction qui boucle juste sur tous les rapprochements pour // créer tous les extraits function make_extraits($db) { $result = sqlite_query($db,"select ID from rapprochements"); while (sqlite_has_more($result)) { $tab = sqlite_fetch_array($result); make_extrait($db,$tab[0]); } } //Génere l'extrait dont le numero est $releve function make_extrait($db,$releve) { global $totaux; $result = sqlite_query($db,"select Nom from rapprochements where ID=$releve"); $tab = sqlite_fetch_array($result); $releveNom = $tab[0]; $html = html_debut("Relevé de compte numéro $releveNom ($releve)"); $result = sqlite_query($db,"select o.ID,o.N,o.Ct,o.M,o.D,o.R,t.N,r.Nom from operations as o,tiers as t,rapprochements as r where R=$releve and o.T=t.ID and o.R=r.ID order by o.D ASC"); while (sqlite_has_more($result)) { $tab = sqlite_fetch_array($result, SQLITE_ASSOC); $montant = strtr($tab["o.M"],",","."); $debit = ""; $credit = ""; if($montant > 0) { $Totcredit += $montant; $credit = nombre($montant); } else { $Totdebit += $montant; $debit = nombre($montant); } $html .= " " . sqlDate2fr($tab["o.D"]) . " ". $tab["o.ID"] . " - " . $tab["o.Ct"] . " " . $tab["t.N"] . " " . $tab["o.N"] . " " . $debit . " " . $credit . "   \n"; } $html .= html_fin(nombre($Totdebit),nombre($Totcredit)); //une idee comme ca pour sortir les grand totaux $totaux[$releve]["debit"] = $Totdebit; $totaux[$releve]["credit"] = $Totcredit; print "\n\"$releveNom\";\"$Totdebit\";\"$Totcredit\"\n"; //On sauvegarde le fichier html généré sauvegarde_fichier($html,$releveNom); } //Sauvegarde le fichier HTML function sauvegarde_fichier($html,$releveNom) { global $rep_dest; if(!is_dir($rep_dest)) { l_echo("\n\n\n ERREUR FATALE: LE REPERTOIRE DE DESTINATION '$rep_dest' N'EXISTE PAS ... \n\n\n"); exit; } l_echo(" -> Ecriture du fichier $releveNom ..."); $fp = fopen ($rep_dest . "/" . $releveNom . ".html", "w"); fputs ($fp, $html); fclose ($fp); l_echo("[OK]\n"); } // wrapper pour gerer les sorties si on veut ou pas function l_echo($t) { global $step; if($t[0] != "[" && $t[0] != " ") { $step++; print $step . "."; } print $t; } l_echo("Création de la structure du fichier SQLite ..."); create_database($db); l_echo("[OK]\n"); l_echo("Transformation du fichier XML en SQLite ..."); lit_fichier($file,$db); l_echo("[OK]\n"); l_echo("Lancement de la requete pour generer les extraits de compte ...\n"); make_extraits($db); l_echo("[OK]\n"); // Déconnexion l_echo("Déconnexion de la base de données ..."); sqlite_close($db); l_echo("[OK]\n"); l_echo("Suppression du fichier SQLite temporaire ..."); //erase_file($file); l_echo("[OK]\n"); ?>