diff --git a/www/admin/action.php b/admin/action.php similarity index 98% rename from www/admin/action.php rename to admin/action.php index e9785c2..b0500ac 100644 --- a/www/admin/action.php +++ b/admin/action.php @@ -1,8 +1,9 @@ register_function('afficher_debut_tarif', function ($params) { $versement = $params['versement']; $idTarif = $versement->idTarif; - + $out = sprintf('
diff --git a/www/admin/choix_annee.php b/admin/choix_annee.php similarity index 60% rename from www/admin/choix_annee.php rename to admin/choix_annee.php index a10167a..4a95bdb 100644 --- a/www/admin/choix_annee.php +++ b/admin/choix_annee.php @@ -1,8 +1,9 @@ runIf('change', function () { $_SESSION['annee_recu'] = f('annee_recu'); - \Garradin\Utils::redirect(f('from') ?: PLUGIN_URL); -} +}, $csrf_key, PLUGIN_ROOT . '/admin/index.php'); + +$tpl->assign(compact('anneesFiscales', 'csrf_key')); -$tpl->assign('anneesFiscales', $anneesFiscales); $tpl->assign('annee_recu', $_SESSION['annee_recu']); -$tpl->assign('from', qg('from')); $tpl->display(PLUGIN_ROOT . '/templates/choix_annee.tpl'); diff --git a/admin/config.php b/admin/config.php new file mode 100644 index 0000000..a5d7c51 --- /dev/null +++ b/admin/config.php @@ -0,0 +1,123 @@ +requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN); + +// récupérer les champs des noms +$champsNom = Utils::getChampsNom($config, $plugin); + +$csrf_key = 'recusfiscaux_config'; + +$form->runIf('save', function () use ($plugin, $champsNom) { + // Objet de l'asso + $plugin->setConfigProperty('objet_asso', trim(f('objet_asso'))); + + // Articles du CGI + $confArticles = $plugin->getConfig('articlesCGI'); + // effacer l'ancienne configuration + for ($i = 0; $i < count($confArticles); ++$i) { + $confArticles[$i]->valeur = false; + } + // et copier la nouvelle + $art_sel = f('articlesCGI') ?: []; + foreach ($art_sel as $article) { + $confArticles[$article]->valeur = true; + } + $plugin->setConfigProperty('articlesCGI', $confArticles); + + // Taux de réduction + $confTaux = $plugin->getConfig('reduction'); + // effacer l'ancienne configuration + for ($i = 0; $i < count($confTaux); ++$i) { + $confTaux[$i]->valeur = false; + } + // et copier la nouvelle + $taux_sel = f('tauxReduction') ?: []; + foreach ($taux_sel as $taux) { + $confTaux[$taux]->valeur = true; + } + $plugin->setConfigProperty("reduction", $confTaux); + + // Informations au sujet du responsable + $plugin->setConfigProperty('nom_responsable', trim(f('nom_responsable') ?: '') ?: null); + $plugin->setConfigProperty('fonction_responsable', trim(f('fonction_responsable') ?: '') ?: null); + $plugin->setConfigProperty('ville_asso', trim(f('ville_asso') ?: '') ?: null); + + // signature + if (isset($_SESSION['sig_file']) && count($_SESSION['sig_file']) > 0) { + // supprimer la signature précédente, si besoin + if ( + null !== $plugin->getConfig('signature') + && + $plugin->getConfig('signature') != $_SESSION['sig_file'][0]->path + ) { + $sig_file = \Paheko\Files\Files::get($plugin->getConfig('signature')); + if (null !== $sig_file) { + $sig_file->delete(); + } + } + // puis installer la nouvelle + $plugin->setConfigProperty('signature', $_SESSION['sig_file'][0]->path); + } + + // Numérotation des reçus + $configNum = $plugin->getConfig('numerotation'); + $formNum = clone $configNum; + if ($configNum->prefixe != trim(f('prefixe'))) { + $formNum->prefixe = trim(f('prefixe')); + } + $formNum->annee = f('annee'); + $formNum->membre = f('membre'); + $formNum->sequentiel = f('sequentiel'); + $formNum->valeur_init = f('valeur_init'); + $plugin->setConfigProperty('numerotation', $formNum); + + // Impression des adresses de courriel + $plugin->setConfigProperty('imprimerCourriel', trim(f('imprimerCourriel') ?: '') ?: null); + + // champs pour le nom et prénom + foreach ($champsNom as $nom => $champ) { + $champ->position = 0; + } + $noms_sel = f('champsNom') ?: []; + $i = -count($noms_sel); + foreach ($noms_sel as $nom) { + $champsNom[$nom]->position = $i++; + } + $plugin->setConfigProperty('champsNom', $champsNom); + + // enregistrer la nouvelle config + $plugin->save(); +}, $csrf_key, PLUGIN_ADMIN_URL . 'config.php?ok'); + + +// test fonctions fichiers : voir files.sor +// $fichiers = Files::list('config'); +// error_log("fichiers config = " . print_r($fichiers, true)); +// $fichiers = Files::list('ext/recusfiscaux'); +// error_log("fichiers ext/recusfiscaux = " . print_r($fichiers, true)); +$sig_file = Files::get('ext/recusfiscaux/default_signature.png'); +// error_log("sig_file = " . print_r($sig_file, true)); + +//error_log("config.php::config=" . print_r($plugin->getConfig(), true)); + + +// trier les champs de nom pour l'affichage +uasort($champsNom, function ($a, $b) { + return $a->position - $b->position; +}); + +$path = qg('path') ?: File::CONTEXT_CONFIG; +$tpl->assign('default_signature', '/' . 'ext/recusfiscaux/default_signature.png'); +// $tpl->assign('default_signature', \Paheko\WWW_URL . "plugin/recusfiscaux/default_signature.png"); +$tpl->assign('plugin_config', $plugin->getConfig()); +$tpl->assign('plugin_css', ['style.css']); +$tpl->assign('numerotation', $plugin->getConfig('numerotation')); +$tpl->assign(compact('csrf_key', 'path', 'champsNom')); +$tpl->display(PLUGIN_ROOT . '/templates/config.tpl'); diff --git a/www/admin/generer_recus.php b/admin/generer_recus.php similarity index 87% rename from www/admin/generer_recus.php rename to admin/generer_recus.php index 47437eb..b903c40 100644 --- a/www/admin/generer_recus.php +++ b/admin/generer_recus.php @@ -1,13 +1,14 @@ getConfig('signature')) ? - \KD2\HTTP::getScheme() . '://' . \KD2\HTTP::getHost() . WWW_URI . "/" . $plugin->getConfig('signature') : - ""; + (null !== $config->fileURL('signature')) ? + $config->fileURL('signature') : + ((null !== $plugin->getConfig('signature')) ? + \KD2\HTTP::getScheme() . '://' . \KD2\HTTP::getHost() . WWW_URI . $plugin->getConfig('signature') : + ""); +// http://test.paheko.bzh/config/cavalier.png +error_log('signature = ' . $signature); // logo $config = Config::getInstance(); $logo_asso = @@ -101,13 +106,17 @@ function genererRecusPDF($totalPersonnes, $libelles_taux ) { + // + $fichierHTML = sprintf('%s/print-%s.html', CACHE_ROOT, md5(random_bytes(16))); + // $listeFichiersPDF = array(); $fmt = new \NumberFormatter('fr_FR', \NumberFormatter::SPELLOUT); $prefixeNum = getNumPrefixe($configNum); $numero_sequentiel = getNumSequentiel($configNum); foreach ($totalPersonnes as $idPersonne => $personne) { - $tpl = new UserTemplate(); - $tpl->setSource(PLUGIN_ROOT . '/templates/recu.skel'); + $tpl = new UserTemplate(null); + /* $tpl->setSource(PLUGIN_ROOT . '/templates/recu.skel'); */ + $tpl->setSourcePath(PLUGIN_ROOT . '/templates/recu.skel'); $tpl->assignArray(compact('signature', 'logo_asso', 'texteArticles')); $tpl->assign('objet_asso', $plugin->getConfig('objet_asso')); @@ -121,7 +130,7 @@ function genererRecusPDF($totalPersonnes, $tpl->assign('date', date("j/m/Y")); // numéro de reçu - $tpl->assign('numero', + $tpl->assign('numero', faireNumeroRecu($prefixeNum, $configNum->membre, $personne->numero, @@ -166,11 +175,33 @@ function genererRecusPDF($totalPersonnes, } } ); - + + // + // récupérer les reçus au format html + $recuHTML = $tpl->fetch(); + // enregistrer dans le fichier + file_put_contents($fichierHTML, $recuHTML, FILE_APPEND); + // + // fabriquer le fichier PDF genererPDF($tpl->fetch(), $personne->nomPrenom, $listeFichiersPDF); } + // afficher dans un dialog + //marche pas + // printf(' + // + // + // + // + // ', $fichierHTML, "90%", "90%"); + + // affiche une page vide + // $link = ""; + // echo $link; + // faire une archive zip $fichierZip = Utils::makeArchive( $listeFichiersPDF, @@ -178,10 +209,10 @@ function genererRecusPDF($totalPersonnes, PLUGIN_ROOT . "/zip" ); - //supprimer les fichiers pdf (utile ?) - foreach ($listeFichiersPDF as $f) { - // Utils::safe_unlink($f); - } + //supprimer les fichiers pdf + // foreach ($listeFichiersPDF as $f) { + // \Paheko\Utils::safe_unlink($f); + // } } // genererRecusPDF function generererRecusHTML($tpl, @@ -221,8 +252,8 @@ function generererRecusHTML($tpl, $tpl->assign('prefixeNum', getNumPrefixe($configNum)); $tpl->assign('membre', $configNum->membre); $tpl->assign('numero_sequentiel', getNumSequentiel($configNum)); - $tpl->assign('nom_asso', Config::getInstance()->get('nom_asso')); - $tpl->assign('adresse_asso', Config::getInstance()->get('adresse_asso')); + $tpl->assign('org_name', Config::getInstance()->get('org_name')); + $tpl->assign('org_address', Config::getInstance()->get('org_address')); $tpl->assign('objet_asso', $plugin->getConfig('objet_asso')); $tpl->assign('courriel', $plugin->getConfig('imprimerCourriel')); $tpl->assign('complements', mentionsComplémentaires()); @@ -360,7 +391,7 @@ function cumulerVersementsTarif($versements) function genererPDF($docHTML, $nomPersonne, &$listeFichiersPDF) { // fabriquer le fichier PDF - $nomPDF = \Garradin\Utils::filePDF($docHTML); + $nomPDF = \Paheko\Utils::filePDF($docHTML); // changer le nom du fichier $nom = str_replace(' ', '_', $nomPersonne); $nom = str_replace("'", "", $nom); diff --git a/www/admin/imprimer_recu.css b/admin/imprimer_recu.css similarity index 100% rename from www/admin/imprimer_recu.css rename to admin/imprimer_recu.css diff --git a/www/admin/index.php b/admin/index.php similarity index 94% rename from www/admin/index.php rename to admin/index.php index 2426c07..3b1e76f 100644 --- a/www/admin/index.php +++ b/admin/index.php @@ -1,8 +1,9 @@ needUpgrade()) { @@ -68,7 +69,7 @@ $tpl->assign('plugin_config', $plugin->getConfig()); $tpl->assign('nbTaux', $nbTaux); $tpl->assign('nbChamps', $nbChamps); $tpl->assign('plugin_css', ['style.css']); -$tpl->assign('plugin_url', \Garradin\Utils::plugin_url()); +$tpl->assign('plugin_url', \Paheko\Utils::plugin_url()); // envoyer au template $tpl->display(PLUGIN_ROOT . '/templates/index.tpl'); diff --git a/www/admin/previs_recu.css b/admin/previs_recu.css similarity index 92% rename from www/admin/previs_recu.css rename to admin/previs_recu.css index 0bf2103..3605d4b 100644 --- a/www/admin/previs_recu.css +++ b/admin/previs_recu.css @@ -95,3 +95,9 @@ span.titre, span.libelle { display : inline; } + +/* Ne pas imprimer le bandeau des boutons du profiler */ +#__profiler +{ + display: none; +} diff --git a/www/admin/script.js b/admin/script.js similarity index 100% rename from www/admin/script.js rename to admin/script.js diff --git a/www/admin/style.css b/admin/style.css similarity index 96% rename from www/admin/style.css rename to admin/style.css index eb52c78..e096fff 100644 --- a/www/admin/style.css +++ b/admin/style.css @@ -109,6 +109,11 @@ div.actions display : inline; } +a.icn-btn { + font-family: "paheko", sans-serif; + font-size : 1.2em; +} + dl.config { padding-bottom : 1ex; diff --git a/www/admin/upload.php b/admin/upload.php similarity index 57% rename from www/admin/upload.php rename to admin/upload.php index 7fd5387..c98fcd3 100644 --- a/www/admin/upload.php +++ b/admin/upload.php @@ -1,20 +1,23 @@ runIf('upload', function () use ($parent) { - $_SESSION['sig_file'] = File::uploadMultiple($parent, 'file'); -}, $csrf_key, PLUGIN_ROOT . '/www/admin/config.php'); + $_SESSION['sig_file'] = \Paheko\Files\Files::uploadMultiple($parent, 'file'); +}, $csrf_key, PLUGIN_ROOT . '/admin/config.php'); $tpl->assign(compact('parent', 'csrf_key')); diff --git a/www/admin/versements_activites.php b/admin/versements_activites.php similarity index 84% rename from www/admin/versements_activites.php rename to admin/versements_activites.php index 7ffc9ec..56114bf 100644 --- a/www/admin/versements_activites.php +++ b/admin/versements_activites.php @@ -1,9 +1,9 @@ assign('lesVersements', $_SESSION['lesVersements']); $tpl->assign('annee_recu', $_SESSION['annee_recu']); diff --git a/www/admin/versements_personnes.php b/admin/versements_personnes.php similarity index 81% rename from www/admin/versements_personnes.php rename to admin/versements_personnes.php index 74e7d95..8db95e8 100644 --- a/www/admin/versements_personnes.php +++ b/admin/versements_personnes.php @@ -1,9 +1,9 @@ get('name'); +const SIGNATURE_DEFAUT = 'default_signature.png'; +const CONFIG_INIT = 'config.json'; + +// configuration initiale +$config_init = json_decode(file_get_contents(Plugins::getPath($nom_plugin) . '/' . CONFIG_INIT), + true); + +// enregistrer dans la config du plugin +foreach ($config_init as $cle => $valeur) { + $plugin->setConfigProperty($cle, $valeur); +} +$plugin->save(); // « signature » par défaut à remplacer (voir l'onglet de configuration) -$path = __DIR__ . '/data/default_signature.png'; -$default_signature_file = (new File)->createAndStore('skel/plugin/recusfiscaux', - 'default_signature.png', - $path, - null); +$path = __DIR__ . '/data/' . SIGNATURE_DEFAUT; +$default_signature_file = Files::createFromPath('ext/' . $nom_plugin . '/' . SIGNATURE_DEFAUT, + $path); diff --git a/lib/Personne.php b/lib/Personne.php index 2a58115..1f639af 100644 --- a/lib/Personne.php +++ b/lib/Personne.php @@ -1,6 +1,6 @@ get($sql), 'id'); - } + /** + * @return informations sur les tarifs + */ + public static function getTarifs() + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + id, + id_service as idActivite, + label, + description, + amount as montant + FROM services_fees'); + return Utils::toAssoc($db->get($sql), 'id'); + } - /** - * @return informations sur les activités - */ - public static function getActivites() - { - $db = DB::getInstance(); - $sql = sprintf( - 'SELECT - services.id, - services.label, - services.description - FROM services'); - return Utils::toAssoc($db->get($sql), 'id'); - } + /** + * @return informations sur les activités + */ + public static function getActivites() + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + services.id, + services.label, + services.description + FROM services'); + return Utils::toAssoc($db->get($sql), 'id'); + } - /** - * @return comptes sur lesquels des versements de membres ont été faits - * @param string $annee - * @param $op : opérateur de combinaison des comptes - * @param array $comptes - */ - public static function getComptes($annee, $op, $comptes) - { - $db = DB::getInstance(); - $sql = sprintf( - 'SELECT - acc_accounts.id, - acc_accounts.code as codeCompte, - acc_accounts.label as nomCompte - FROM acc_transactions_users - INNER JOIN membres - ON acc_transactions_users.id_user = membres.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP by acc_accounts.code - ORDER by acc_accounts.code', - $annee, - $db->where('code', $op, $comptes) - ); - return Utils::toAssoc($db->get($sql), 'id'); - } + /** + * @return comptes sur lesquels des versements de membres ont été faits + * @param string $annee + * @param $op : opérateur de combinaison des comptes + * @param array $comptes + */ + public static function getComptes($annee, $op, $comptes) + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + acc_accounts.id, + acc_years.label, + acc_accounts.code as codeCompte, + acc_accounts.label as nomCompte + FROM acc_transactions_users + INNER JOIN users + ON acc_transactions_users.id_user = users.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + INNER JOIN acc_years + ON acc_transactions.id_year = acc_years.id + WHERE + (strftime("%%Y", acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP by acc_accounts.id + ORDER by acc_accounts.code', + $annee, + $db->where('code', $op, $comptes) + ); + return Utils::toAssoc($db->get($sql), 'id'); + } - /** - * @return tarifs des activités et comptes ayant des versements de - * membres dans l'année - * @param string $annee - * @param $op : opérateur de combinaison des comptes - * @param array $comptes - */ - public static function getTarifsComptes($annee, $op, $comptes) - { - $db = DB::getInstance(); - $sql = sprintf( - ' - SELECT - services_users.id_fee as idTarif, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte - FROM acc_transactions_users - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN services_users - ON acc_transactions_users.id_service_user = services_users.id - INNER JOIN services_fees - ON services_users.id_fee = services_fees.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP BY services_fees.id, acc_accounts.code - ORDER BY acc_accounts.code - ', - $annee, - $db->where('code', $op, $comptes) - ); - return $db->get($sql); - } + /** + * @return tarifs des activités et comptes ayant des versements de + * membres dans l'année + * @param string $annee + * @param $op : opérateur de combinaison des comptes + * @param array $comptes + */ + public static function getTarifsComptes($annee, $op, $comptes) + { + $db = DB::getInstance(); + $sql = sprintf( + ' + SELECT + services_users.id_fee as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte + FROM acc_transactions_users + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN services_users + ON acc_transactions_users.id_service_user = services_users.id + INNER JOIN services_fees + ON services_users.id_fee = services_fees.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime("%%Y", acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP BY services_fees.id, acc_accounts.code + ORDER BY acc_accounts.code + ', + $annee, + $db->where('code', $op, $comptes) + ); + return $db->get($sql); + } - /** - * faire un tableau associatif avec le résultat d'une requête - */ - static function toAssoc($array, $nomCle) - { - $assoc = array(); - foreach ($array as $elem) - { - $ro = new \ReflectionObject($elem); - $proprietes = $ro->getProperties(); - $obj = new \stdClass(); - foreach ($proprietes as $p) - { - $pname = $p->getName(); - if ($pname == $nomCle) { - $key = $p->getValue($elem); - } - else { - $obj->$pname = $p->getValue($elem); - } - } - $assoc[$key] = $obj; - } - return $assoc; - } + /** + * faire un tableau associatif avec le résultat d'une requête + */ + static function toAssoc($array, $nomCle) + { + $assoc = array(); + foreach ($array as $elem) + { + $ro = new \ReflectionObject($elem); + $proprietes = $ro->getProperties(); + $obj = new \stdClass(); + foreach ($proprietes as $p) + { + $pname = $p->getName(); + if ($pname == $nomCle) { + $key = $p->getValue($elem); + } + else { + $obj->$pname = $p->getValue($elem); + } + } + $assoc[$key] = $obj; + } + return $assoc; + } - /** - * @return versements correspondants à l'année donnée - * @param $annee - * @param array $champsNom : liste non vide des champs de nom/prénom - */ - public static function getVersementsPersonnes($annee, $op, $comptes, $champsNom) - { - $db = DB::getInstance(); - $tri = Utils::combinerTri($champsNom); - $sql = sprintf( - 'SELECT - membres.id as idUser, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte, - acc_transactions_lines.credit as versement, - acc_transactions.date - FROM acc_transactions_users - INNER JOIN membres - ON acc_transactions_users.id_user = membres.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP BY acc_transactions.id, acc_accounts.id - ORDER by %s, acc_accounts.code, acc_transactions.date', - $annee, - $db->where('code', $op, $comptes), - $tri - ); - return $db->get($sql); - } + /** + * @return versements correspondants à l'année donnée + * @param $annee + * @param array $champsNom : liste non vide des champs de nom/prénom + */ + public static function getVersementsPersonnes($annee, $op, $comptes, $champsNom) + { + $db = DB::getInstance(); + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + 'SELECT + users.id as idUser, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + acc_transactions_lines.credit as versement, + acc_transactions.date + FROM acc_transactions_users + INNER JOIN users + ON acc_transactions_users.id_user = users.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime("%%Y", acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP BY acc_transactions.id, acc_accounts.id + ORDER by %s, acc_accounts.code, acc_transactions.date', + $annee, + $db->where('code', $op, $comptes), + $tri + ); + return $db->get($sql); + } - /** - * @return versements correspondants à : - * @param $annee : année fiscale - * @param array $tarifs : tarifs sélectionnés - * @param array $comptes : comptes associés aux tarifs - * @param array $champsNom : liste non vide des champs de nom/prénom - * @remarks tri par tarif, nom, compte, date - */ - public static function getVersementsTarifsComptes($annee, - $tarifs, - $comptes, - $champsNom) - { - $db = DB::getInstance(); - $tri = Utils::combinerTri($champsNom); - $condition = Utils::combinerTarifsComptes($tarifs, $comptes); - $sql = sprintf( - 'SELECT - services_fees.id as idTarif, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte, - membres.id as idUser, - acc_transactions_lines.credit as versement, - acc_transactions.date - FROM acc_transactions_users - INNER JOIN membres - ON acc_transactions_users.id_user = membres.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN services_users - ON acc_transactions_users.id_service_user = services_users.id - INNER JOIN services_fees - ON services_users.id_fee = services_fees.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - %s - ) - GROUP BY acc_transactions.id, acc_accounts.id - ORDER by %s, acc_accounts.code, acc_transactions.date', - $annee, - $condition, - $tri - ); - return $db->get($sql); - } + /** + * @return versements correspondants à : + * @param $annee : année fiscale + * @param array $tarifs : tarifs sélectionnés + * @param array $comptes : comptes associés aux tarifs + * @param array $champsNom : liste non vide des champs de nom/prénom + * @remarks tri par tarif, nom, compte, date + */ + public static function getVersementsTarifsComptes($annee, + $tarifs, + $comptes, + $champsNom) + { + $db = DB::getInstance(); + $tri = Utils::combinerTri($champsNom); + $condition = Utils::combinerTarifsComptes($tarifs, $comptes); + $sql = sprintf( + 'SELECT + services_fees.id as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + users.id as idUser, + acc_transactions_lines.credit as versement, + acc_transactions.date + FROM acc_transactions_users + INNER JOIN users + ON acc_transactions_users.id_user = users.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN services_users + ON acc_transactions_users.id_service_user = services_users.id + INNER JOIN services_fees + ON services_users.id_fee = services_fees.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime("%%Y", acc_transactions.date) = "%d" + AND + %s + ) + GROUP BY acc_transactions.id, acc_accounts.id + ORDER by %s, acc_accounts.code, acc_transactions.date', + $annee, + $condition, + $tri + ); + // error_log("\ngetVersementsTarifsComptes : sql=" . $sql); + return $db->get($sql); + } - /** - * @return versements correspondants à : - * @param $annee année fiscale - * @param $comptesIsoles comptes NON associés à un tarif - * @param array $champsNom : liste non vide des champs de nom/prénom - * @remarks tri par nom, compte, date - */ - public static function getVersementsComptes($annee, - $comptesIsoles, - $champsNom) - { - $db = DB::getInstance(); - $tri = Utils::combinerTri($champsNom); - $sql = sprintf( - ' - SELECT - 0 as idTarif, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte, - membres.id as idUser, - acc_transactions_lines.credit as versement, - acc_transactions.date - FROM acc_transactions_users - INNER JOIN membres - ON acc_transactions_users.id_user = membres.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP BY acc_transactions.id, acc_accounts.id - ORDER by %s, acc_accounts.code, acc_transactions.date - ', - $annee, - $db->where('id', 'in', $comptesIsoles), - $tri - ); - return $db->get($sql); - } + /** + * @return versements correspondants à : + * @param $annee année fiscale + * @param $comptesIsoles comptes NON associés à un tarif + * @param array $champsNom : liste non vide des champs de nom/prénom + * @remarks tri par nom, compte, date + */ + public static function getVersementsComptes($annee, + $comptesIsoles, + $champsNom) + { + $db = DB::getInstance(); + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + ' + SELECT + 0 as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + users.id as idUser, + acc_transactions_lines.credit as versement, + acc_transactions.date + FROM acc_transactions_users + INNER JOIN users + ON acc_transactions_users.id_user = users.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime("%%Y", acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP BY acc_transactions.id, acc_accounts.id + ORDER by %s, acc_accounts.code, acc_transactions.date + ', + $annee, + $db->where('id', 'in', $comptesIsoles), + $tri + ); + return $db->get($sql); + } - /** - * @return personnes ayant versé des dons pour une année donnée - * @param $annee - * @param array $champsNom : champs qui définissent le nom et le prénom d'une personne - */ - public static function getDonateurs($annee, $champsNom) : array - { - // concaténer les champs nom/prénoms pour la sélection - $nom = Utils::combinerChamps($champsNom); - // et pour le tri - $tri = Utils::combinerTri($champsNom); - $sql = sprintf( - 'SELECT - membres.id as idUser, - membres.numero, - membres.email, - row_number() over(order by %s) as rang, - %s as nom, - membres.adresse as adresse, - membres.code_postal as codePostal, - membres.ville as ville - FROM - acc_transactions_users, - membres, - acc_transactions - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - WHERE ( - strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_transactions_users.id_transaction = acc_transactions.id - AND - acc_transactions_users.id_user = membres.id - ) - GROUP by membres.id - ORDER by %1$s COLLATE U_NOCASE - ', - $tri, - $nom, - $annee - ); - $donateurs = array(); - foreach (DB::getInstance()->iterate($sql) as $personne) - { - $donateurs[$personne->idUser] = new Personne($personne->idUser, - $personne->numero, - $personne->email, - $personne->rang, - $personne->nom, - $personne->adresse, - $personne->codePostal, - $personne->ville); - } - return $donateurs; - } + /** + * @return personnes ayant versé des dons pour une année donnée + * @param $annee + * @param array $champsNom : champs qui définissent le nom et le prénom d'une personne + */ + public static function getDonateurs($annee, $champsNom) : array + { + // concaténer les champs nom/prénoms pour la sélection + $nom = Utils::combinerChamps($champsNom); + // et pour le tri + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + 'SELECT + users.id as idUser, + users.numero, + users.email, + row_number() over(order by %s) as rang, + %s as nom, + users.adresse as adresse, + users.code_postal as codePostal, + users.ville as ville + FROM + acc_transactions_users, + users, + acc_transactions + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + WHERE ( + strftime("%%Y", acc_transactions.date) = "%d" + AND + acc_transactions_users.id_transaction = acc_transactions.id + AND + acc_transactions_users.id_user = users.id + ) + GROUP by users.id + ORDER by %1$s COLLATE U_NOCASE + ', + $tri, + $nom, + $annee + ); + $donateurs = array(); + foreach (DB::getInstance()->iterate($sql) as $personne) + { + $donateurs[$personne->idUser] = new Personne($personne->idUser, + $personne->numero, + $personne->email, + $personne->rang, + $personne->nom, + $personne->adresse, + $personne->codePostal, + $personne->ville); + } + return $donateurs; + } - /** - * combiner les champs avec un opérateur - * @param array $champs : liste (non vide) de champs - * @return chaîne combinée - */ - private static function combinerChamps($champs) - { - $op = ' || " " || '; - $result = 'ifnull(membres.' . $champs[0] . ', "")'; - for ($i = 1; $i < count($champs); ++$i) - { - $result .= $op . 'ifnull(membres.' . $champs[$i] . ', "")'; - } - return 'trim(' . $result . ')'; - } + /** + * combiner les champs avec un opérateur + * @param array $champs : liste (non vide) de champs + * @return chaîne combinée + */ + private static function combinerChamps($champs) + { + $op = ' || " " || '; + $result = 'ifnull(users.' . $champs[0] . ', "")'; + for ($i = 1; $i < count($champs); ++$i) + { + $result .= $op . 'ifnull(users.' . $champs[$i] . ', "")'; + } + return 'trim(' . $result . ')'; + } - /** - * combiner les clés de tri - * @param clés de tri - * @return chaîne combinée - */ - private static function combinerTri(array $champs) : string - { - $tri = 'membres.' . $champs[0]; - for ($i = 1; $i < count($champs); ++$i) - { - $tri .= ', membres.' . $champs[$i]; - } - return $tri; - } + /** + * combiner les clés de tri + * @param clés de tri + * @return chaîne combinée + */ + private static function combinerTri(array $champs) : string + { + $tri = 'users.' . $champs[0]; + for ($i = 1; $i < count($champs); ++$i) + { + $tri .= ', users.' . $champs[$i]; + } + return $tri; + } - /** - * combiner chaque tarif avec le numéro de compte associé - */ - private static function combinerTarifsComptes($tarifs, $comptes) - { - $condition = '('; - $lesCond = array_map(fn($e1, $e2) : string => - "(services_fees.id = '$e1' AND acc_accounts.id = '$e2')", - $tarifs, $comptes); - $nb = 0; - foreach ($lesCond as $cond) - { - if ($nb > 0) { $condition .= ' OR '; } - $condition .= $cond; - ++$nb; - } - $condition .= ')'; - return $condition; - } + /** + * combiner chaque tarif avec le numéro de compte associé + */ + private static function combinerTarifsComptes($tarifs, $comptes) + { + $condition = '('; + $lesCond = array_map(fn($e1, $e2) : string => + "(services_fees.id = '$e1' AND acc_accounts.id = '$e2')", + $tarifs, $comptes); + $nb = 0; + foreach ($lesCond as $cond) + { + if ($nb > 0) { $condition .= ' OR '; } + $condition .= $cond; + ++$nb; + } + $condition .= ')'; + return $condition; + } - /** - * @return liste des années fiscales - */ - public static function getAnneesFiscales() : array - { - $rows = DB::getInstance()->get( - "SELECT strftime('%Y', start_date) as annee - FROM acc_years - UNION - SELECT strftime('%Y', end_date) as annee - FROM acc_years - ORDER by annee DESC" - ); - $anneesFiscales = array(); - foreach ($rows as $row) { - $anneesFiscales[] = $row->annee; - } - return $anneesFiscales; - } + /** + * @return liste des années fiscales + */ + public static function getAnneesFiscales() : array + { + $rows = DB::getInstance()->get( + "SELECT strftime('%Y', start_date) as annee + FROM acc_years + UNION + SELECT strftime('%Y', end_date) as annee + FROM acc_years + ORDER by annee DESC" + ); + $anneesFiscales = array(); + foreach ($rows as $row) { + $anneesFiscales[] = $row->annee; + } + return $anneesFiscales; + } - public static function getLignesReduction($lesTaux) - { - foreach ($lesTaux as $elem) - { - $lignes[$elem->taux] = $elem->remarque; - } - return $lignes; - } + public static function getLignesReduction($lesTaux) + { + foreach ($lesTaux as $elem) + { + $lignes[$elem->taux] = $elem->remarque; + } + return $lignes; + } - /** - * récupérer dans la config du plugin les champs des membres - * utilisés pour le nom et le prénom ; ajouter/supprimer les - * modifications par rapport à la config garradin - * @return array tableau des champs : clé = nom, valeur = { titre, position } - */ - public static function getChampsNom($config, $plugin) : array - { - // récupérer dans la config du plugin les champs mémorisés - // pour le nom et le prénom (le tableau est vide si pas mémorisé) - $champsNom = (array) $plugin->getConfig('champsNom'); + /** + * récupérer dans la config du plugin les champs des membres + * utilisés pour le nom et le prénom ; ajouter/supprimer les + * modifications par rapport à la config paheko + * @return array tableau des champs : clé = nom, valeur = { titre, position } + */ + public static function getChampsNom($config, $plugin) : array + { + // récupérer dans la config du plugin les champs mémorisés + // pour le nom et le prénom (le tableau est vide si pas mémorisé) + $champsNom = (array) $plugin->getConfig('champsNom'); - // récupérer dans la config Garradin les champs des membres - // utilisés pour le nom et le préno - $champsGarradin = $config->get('champs_membres')->listAssocNames(); + // récupérer dans la config Paheko les champs des membres + // utilisés pour le nom et le prénom + $champsPaheko = DynamicFields::getInstance()->listAssocNames(); - foreach ($champsGarradin as $name => $title) - { - if (stristr($title, 'nom')) - { - // retenir les champs dont le titre contient le terme 'nom' - // est-il présent dans la config du plugin ? - if (! array_key_exists($name, $champsNom)) - { - // absent => l'ajouter - $champ = new \stdClass(); - $champ->titre = $title; - $champ->position = 0; - $champsNom[$name] = $champ; - } - } - } - // opération symétrique : un champ mémorisé dans la config du - // plugin a-t-il disparu de la config garradin ? - foreach ($champsNom as $nom => $champ) - { - if (! array_key_exists($nom, $champsGarradin)) - { - // absent => le supprimer - unset($champsNom[$nom]); - } - } - // mettre à jour la config du plugin - $plugin->setConfig('champsNom', $champsNom); - return $champsNom; - } + foreach ($champsPaheko as $name => $title) + { + if (stristr($title, 'nom')) + { + // retenir les champs dont le titre contient le terme 'nom' + // est-il présent dans la config du plugin ? + if (! array_key_exists($name, $champsNom)) + { + // absent => l'ajouter + $champ = new \stdClass(); + $champ->titre = $title; + $champ->position = 0; + $champsNom[$name] = $champ; + } + } + } + // opération symétrique : un champ mémorisé dans la config du + // plugin a-t-il disparu de la config paheko ? + foreach ($champsNom as $nom => $champ) + { + if (! array_key_exists($nom, $champsPaheko)) + { + // absent => le supprimer + unset($champsNom[$nom]); + } + } + // mettre à jour la config du plugin + $plugin->setConfigProperty('champsNom', $champsNom); + return $champsNom; + } - /** - * enregistrer les fichiers dans une archive zip - * @param $fileList : liste des fichiers à archiver - * @param $year : pour générer le nom de l'archive - * @param $archiveDir : ne sert plus - */ - static function makeArchive( - $fileList, - $year, - $archiveDir = null) - { - $zipFilename = "recus_dons" . $year . ".zip"; - header('Content-type: application/zip'); - header(sprintf('Content-Disposition: attachment; filename="%s"', $zipFilename)); - $zip = new ZipWriter('php://output'); - $zip->setCompression(0); - foreach ($fileList as $fileName) - { - $zip->add(basename($fileName), null, $fileName); - } - $zip->close(); - } // makeArchive + /** + * enregistrer les fichiers dans une archive zip + * @param $fileList : liste des fichiers à archiver + * @param $year : pour générer le nom de l'archive + * @param $archiveDir : ne sert plus + */ + static function makeArchive( + $fileList, + $year, + $archiveDir = null) + { + $zipFilename = "recus_dons" . $year . ".zip"; + header('Content-type: application/zip'); + header(sprintf('Content-Disposition: attachment; filename="%s"', $zipFilename)); + $zip = new ZipWriter('php://output'); + $zip->setCompression(0); + foreach ($fileList as $fileName) + { + $zip->add(basename($fileName), null, $fileName); + } + $zip->close(); + } // makeArchive } diff --git a/lib/Versement.php b/lib/Versement.php index e52f98c..35fa9ec 100644 --- a/lib/Versement.php +++ b/lib/Versement.php @@ -1,6 +1,6 @@ -{include file="admin/_head.tpl" title="%s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id} +{include file="_head.tpl" title="%s"|args:$plugin.label current="plugin_%s"|args:$plugin.id}