recusfiscaux/lib/Utils.php

402 lines
14 KiB
PHP
Raw Normal View History

<?php
namespace Garradin\Plugin\RecusFiscaux;
use Garradin\DB;
use KD2\ZipWriter;
class Utils
{
// ------------------------------------------------------------
// test nouvelle organisation
/**
* @return tarifs demandés
* @param array $tarifs
*/
public static function getTarifs($tarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT id, id_service as idActivite, label, description, amount as montant
FROM services_fees
WHERE services_fees.%s',
$db->where('id', $tarifs));
return $db->get($sql);
}
/**
* @return activités correspondant aux tarifs demandés
* @param array $tarifs
*/
public static function getActivites($tarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT services.id, services.label, services.description
FROM services
LEFT JOIN services_fees ON services_fees.id_service = services.id
WHERE services_fees.%s
GROUP BY services.id',
$db->where('id', $tarifs));
return $db->get($sql);
}
/**
* @return versements correspondants à l'année et aux tarifs donnés
* @param $annee
* @param array $tarifs
*/
public static function getVersementsTarifs($annee, $tarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT
services_fees.id as idTarif,
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
WHERE
(strftime(%s, acc_transactions.date) = "%d"
AND
services_fees.%s
AND
acc_transactions_lines.credit > 0)
ORDER by services_fees.id, membres.nom, acc_transactions.date',
'"%Y"',
$annee,
$db->where('id', $tarifs));
return $db->get($sql);
}
/**
* Versements totaux par personne pour une année donnée
* @param année
*/
public static function getVersementsTotaux($annee)
{
$sql =
"SELECT
membres.id as idUser,
sum(acc_transactions_lines.credit) AS versement
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) = ?
AND
acc_transactions_lines.credit > 0
AND
acc_transactions_users.id_transaction = acc_transactions.id
AND
acc_transactions_users.id_user = membres.id
)
GROUP by acc_transactions_users.id_user
ORDER by membres.nom COLLATE U_NOCASE;
";
return DB::getInstance()->get($sql, $annee);
}
/**
* @return personnes ayant versé des dons pour une année donnée
* @param $annee
*/
public static function getDonateurs($annee)
{
$sql =
"SELECT
membres.id as idUser,
membres.nom 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) = ?
AND
acc_transactions_lines.credit > 0
AND
acc_transactions_users.id_transaction = acc_transactions.id
AND
acc_transactions_users.id_user = membres.id
)
GROUP by membres.id
ORDER by membres.nom COLLATE U_NOCASE;
";
return DB::getInstance()->get($sql, $annee);
}
// ------------------------------------------------------------
/**
* @return liste des activités
*/
public static function getToutesActivites()
{
return DB::getInstance()->get(
"SELECT
id as idActivite,
label,
description
FROM services
ORDER BY label"
);
}
/**
* @return liste des tarifs d'une activité
* @param $activite : identifiant de l'activité
*/
public static function getTarifsActivite($activite)
{
return DB::getInstance()->get(
"SELECT
services_fees.id as idTarif,
services_fees.label as titreTarif,
services_fees.description as descTarif,
services_fees.amount as montantTarif
FROM services_fees
WHERE services_fees.id_service = ?",
$activite
);
}
/**
* @return liste de toutes les activités et tarifs
*/
public static function getActivitesEtTarifs()
{
return DB::getInstance()->get(
"SELECT
services.id as idActivite,
services.label as titreActivite,
services.description as descActivite,
services_fees.id as idTarif,
services_fees.label as titreTarif,
services_fees.description as descTarif
FROM services
LEFT JOIN services_fees ON services_fees.id_service = services.id
ORDER BY services.id, services_fees.id"
);
}
/**
* @return liste de toutes les activités, tarifs et comptes associés
*/
public static function getActivitesTarifsEtComptes()
{
return DB::getInstance()->get(
"SELECT
services.id as idActivite,
services.label as titreActivite,
services.description as descActivite,
services_fees.id as idTarif,
services_fees.label as titreTarif,
services_fees.description as descTarif,
acc_accounts.code as numeroCpt,
acc_accounts.label as nomCpt
FROM services
LEFT JOIN services_fees ON services_fees.id_service = services.id
LEFT JOIN acc_accounts ON services_fees.id_account = acc_accounts.id
ORDER BY services.label"
);
}
/**
* @return tous les versements de l'année
* @param $annee
*/
public static function getTousLesVersements($annee)
{
$sql =
"SELECT
services.id as idActivite,
services_fees.id as idTarif,
services.label as activite,
services_fees.label as tarif,
services_fees.amount as montant,
acc_transactions_users.id_user as idUser,
acc_transactions_lines.credit as versement,
membres.nom as nom,
membres.adresse as adresse,
membres.ville as ville,
membres.code_postal as codePostal,
membres.email as courriel,
acc_transactions.date,
acc_transactions_users.id_transaction as idTrans
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 on services_users.id_service = services.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
WHERE
(strftime(\"%Y\", acc_transactions.date) = ?
AND
acc_transactions_lines.credit > 0)
ORDER by services.id, services_fees.id, membres.nom, acc_transactions.date";
return DB::getInstance()->get($sql, $annee);
}
/**
* @return versements d'une année pour un ensemble de tarifs donnés
* @param $annee
* @param array $lesTarifs
*/
public static function getVersementsActivite($annee, $lesTarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT
services.id as idActivite,
services_fees.id as idTarif,
services.label as activite,
services_fees.label as tarif,
services_fees.amount as montant,
acc_transactions_users.id_user as idUser,
acc_transactions_lines.credit as versement,
membres.nom as nom,
membres.adresse as adresse,
membres.ville as ville,
membres.code_postal as codePostal,
membres.email as courriel,
acc_transactions.date,
acc_transactions_users.id_transaction as idTrans
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 on services_users.id_service = services.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
WHERE
(strftime(%s, acc_transactions.date) = "%d"
AND
services_fees.%s
AND
acc_transactions_lines.credit > 0)
ORDER by membres.nom, acc_transactions.date',
'"%Y"',
$annee,
$db->where('id', $lesTarifs));
return $db->get($sql);
}
/**
* Versements totaux par personne pour une année donnée
* @param année
*/
public static function getVersementsTotaux_old($annee) {
$sql =
"SELECT
acc_transactions_users.id_user as idUser,
membres.nom as nom,
sum(acc_transactions_lines.credit) AS montant,
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) = ?
AND
acc_transactions_lines.credit > 0
AND
acc_transactions_users.id_transaction = acc_transactions.id
AND
acc_transactions_users.id_user = membres.id
)
GROUP by acc_transactions_users.id_user
ORDER by membres.nom COLLATE U_NOCASE;
";
return DB::getInstance()->get($sql, $annee);
}
/**
* @return nom de l'association
*/
public static function getNomAsso() {
return DB::getInstance()->first(
"SELECT value
FROM config
WHERE key = 'nom_asso'"
)->value;
}
/**
* @return adresse de l'association
*/
public static function getAdresseAsso() {
return DB::getInstance()->first(
"SELECT value
FROM config
WHERE key = 'adresse_asso'"
)->value;
}
/**
* @return liste des années fiscales
*/
public static function getAnneesFiscales() {
$rows = DB::getInstance()->get(
"SELECT strftime('%Y', start_date) as annee
FROM acc_years
ORDER by start_date DESC"
);
$anneesFiscales = array();
foreach ($rows as $row) {
$anneesFiscales[] = $row->annee;
}
return $anneesFiscales;
}
/** TODO
* générer les reçus
* @param tableau des versements par personne
*/
static function genererRecus() {
}
/**
* 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
}