4509 lines
220 KiB
PHP

<?php
namespace OCA\Gestion\Db;
use OCA\Gestion\Constants\ClientTemplateTypeConstant;
use OCA\Gestion\Constants\FactureStatusConstant;
use OCA\Gestion\Constants\FactureTypeConstant;
use OCA\Gestion\Helpers\DateHelpers;
use OCA\Gestion\Helpers\PriceHelpers;
use OCP\IDBConnection;
use OCP\IL10N;
use \Datetime;
use OCA\Gestion\Constants\BddConstant;
use OCA\Gestion\Constants\DevisMentionConstant;
use OCA\Gestion\Constants\MultipleFactureTypeConstant;
use OCA\Gestion\Constants\ProductConstant;
use OCA\Gestion\Helpers\FileExportHelpers;
use Psr\Log\LoggerInterface;
use OCA\Gestion\Helpers\VCalendarHelpers;
class Bdd {
private String $charset = 'utf8mb4';
public const DEFAULT_CALENDAR_UUID_FOR_DEVIS = "not-related";
public const DEFAULT_TABLE_PREFIX = "*PREFIX*";
public const DEFAULT_CLIENT_GROUP_NAME = "Nom du groupe";
public const DEFAULT_CLIENT_GROUP_FACTURATION_NAME = "Nom du groupe";
private IDbConnection $pdo;
private array $whiteColumn;
private array $whiteTable;
private String $tableprefix;
private $l;
/** @var LoggerInterface */
private $logger;
public function __construct(IDbConnection $db, IL10N $l, LoggerInterface $logger) {
$this->whiteColumn = array("date", "num", "id_client", "id_thanato", "entreprise", "nom", "prenom", "legal_one", "telephone", "mail", "adresse", "produit_id",
"quantite", "date_paiement", "type_paiement", "id_devis", "reference", "description", "prix_unitaire", "legal_two", "path", "tva_default", "coefficient_ik",
"mentions_default", "version", "mentions", "comment", "status_paiement", "devise", "auto_invoice_number", "changelog", "format", "comment", "user_id",
"facture_prefixe", "arrivee", "depart", "latitude", "longitude", "id_lieu", "rang", "mois", "annee", "id_trajet", "commentaire","source",
"date_habilitation", "sexe", "observations_generales", "ref_pacemaker", "id_defunt", "article_id", "corpulence",
"date_naissance", "heure_debut", "heure_fin", "rigidite", "lividite", "observations_corps", "acces", "acces_recherche", "acces_etat",
"injection", "injection_diffusion", "injection_qte", "preinjection", "preinjection_qte", "coinjection", "coinjection_qte",
"drainage", "drainage_qte", "drainage_etat", "ponction", "ponction_qte", "cavite", "cavite_qte", "desinfection", "lavage",
"rasage", "presentation_cosmetique", "presentation_sur", "hypodermiques", "hypodermiques_sur", "local", "local_sur", "contenu",
"commentaire", "designation", "hypodermiques_text1", "hypodermiques_text2", "qte", "endroit",
"fk_client_group_id","fk_produit_id","ht_amount","client_group_name",
"fk_client_group_facturation_id","group_facturation_name",
"fk_product_type_id",
"portal_code","alarm_code","funeral_code",
"product_brand","product_reference",
"fk_user_uuid",
"phone_number","address",'postal_code','city','email','siret_number','tva_intracommu',
'order_number','case_number','fk_template_type_key',
'facture_case_number','facture_order_number','taker_name');
$this->whiteTable = array(
"client", "lieu", "trajet", "devis", "produit_devis", "facture", "produit", "configuration", "ligne_trajet", "thanato", "article", "defunt", "article_devis", "bibliotheque", "bijou_defunt", "obs_defunt", "hypo_defunt",
"client_group_discount","client_group",
"client_group_facturation");
$this->tableprefix = '*PREFIX*' ."gestion_";
$this->pdo = $db;
$this->l = $l;
$this->logger = $logger;
}
public function getConfiguration($idNextcloud){
$sql = "SELECT * FROM `".$this->tableprefix."configuration` WHERE id_nextcloud = ?";
return $this->execSQL($sql, array($idNextcloud));
}
public function getTotalDevis($iddevis, $idNextcloud) {
$articles = json_decode($this->getListArticle($iddevis, $idNextcloud));
$produits = json_decode($this->getListProduit($iddevis, $idNextcloud));
$total=0;
foreach($articles as $key => $article) {
$total += $article->prix_unitaire*$article->quantite;
}
foreach($produits as $key => $produit) {
$total += $produit->prix_unitaire*$produit->quantite;
}
return $total;
}
public function getClients($idNextcloud){
$sql = "SELECT * FROM ".$this->tableprefix."client;";
$clients = $this->execSQLNoJsonReturn($sql,[]);
foreach($clients as &$client){
if($client['fk_client_group_id'] == null){
$client['client_group_name'] = '';
}
else{
$clientGroup = $this->getClientGroupById($client['fk_client_group_id']);
$client['client_group_name'] = $clientGroup != null ? $clientGroup['client_group_name'] : '';
}
if($client['fk_client_group_facturation_id'] == null){
$client['client_group_facturation_name'] = '';
}
else{
$clientGroupFacturation = $this->getClientGroupFacturationById($client['fk_client_group_facturation_id']);
$client['client_group_facturation_name'] = $clientGroupFacturation != null ? $clientGroupFacturation['group_facturation_name'] : '';
}
}
return json_encode($clients);
}
private function getClientGroupById($clientGroupId){
$sql = "SELECT *
FROM ".$this->tableprefix."client_group as client_group
WHERE client_group.id = ? ;";
$clientGroup = $this->execSQLNoJsonReturn($sql, array($clientGroupId));
if(!empty($clientGroup)){
return $clientGroup[0];
}
return null;
}
public function getClientsName(){
$sql = "SELECT client.nom, client.prenom, client.id
FROM ".$this->tableprefix."client as client
ORDER BY client.id DESC";
return $this->execSQL($sql, array());
}
public function getClient($id,$idNextcloud){
$sql = "SELECT * FROM ".$this->tableprefix."client WHERE id = ?";
return $this->execSQL($sql, array($id));
}
public function getClientbyiddevis($id, $idNextcloud){
$sql = "SELECT * FROM ".$this->tableprefix."devis as d, ".$this->tableprefix."client as c WHERE d.id_client = c.id AND d.id = ?";
return $this->execSQL($sql, array($id));
}
public function getThanatopracteurs($idNextcloud){
$sql = "SELECT
thanato.*,
users.uid as user_uuid,
users.displayname as user_display_name
FROM ".$this->tableprefix."thanato as thanato
LEFT JOIN ".self::DEFAULT_TABLE_PREFIX."users as users on thanato.fk_user_uuid = users.uid
;";
return $this->execSQL($sql, array());
}
public function getThanatoByIds(array $thanatoIds){
if(empty($thanatoIds)){
return [];
}
$sqlConditionsPlaceholder = implode(',', array_fill(0, count($thanatoIds), '?'));
$sql = "SELECT
thanato.id,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom
FROM ".$this->tableprefix."thanato as thanato
WHERE thanato.id IN ($sqlConditionsPlaceholder)";
$thanatoList = $this->execSQLNoJsonReturn(
$sql,
$thanatoIds);
return $thanatoList;
}
public function getBibliotheques($idNextcloud) {
$sql = "SELECT * FROM ".$this->tableprefix."bibliotheque;";
return $this->execSQL($sql, array());
}
public function getTrajets($idNextcloud) {
// $sql_delete = "DELETE FROM ".$this->tableprefix."ligne_trajet";
// $this->execSQL($sql_delete, array());
// $sql_delete = "DELETE FROM ".$this->tableprefix."trajet";
// $this->execSQL($sql_delete, array());
$sql = "SELECT trajet.id, trajet.mois, trajet.annee, trajet.distance, trajet.id_nextcloud, trajet.user_id,
thanato.id as id_thanato, thanato.nom as nom_thanato, thanato.prenom as prenom_thanato
FROM ".$this->tableprefix."trajet as trajet
LEFT JOIN ".$this->tableprefix."thanato as thanato on trajet.id_thanato = thanato.id
ORDER BY trajet.annee DESC, trajet.mois DESC;";
return $this->execSQL($sql, array());
}
public function getTrajetById($numtrajet, $idNextcloud) {
$sql = "SELECT trajet.id, trajet.mois, trajet.annee, trajet.distance, trajet.id_nextcloud, trajet.user_id,
thanato.id as id_thanato, thanato.nom as nom_thanato, thanato.prenom as prenom_thanato
FROM ".$this->tableprefix."trajet as trajet
LEFT JOIN ".$this->tableprefix."thanato as thanato on trajet.id_thanato = thanato.id
WHERE trajet.id = ?";
return $this->execSQL($sql, array($numtrajet));
}
public function getTrajetsdetails($numtrajet, $idNextcloud) {
$sql = "SELECT ligne_trajet.id, ligne_trajet.rang, ligne_trajet.id_nextcloud, ligne_trajet.date, ligne_trajet.user_id, ligne_trajet.commentaire, ligne_trajet.source,
lieu.id as lid, lieu.nom as lieu, lieu.latitude as latitude, lieu.longitude as longitude,
devis.id as did, devis.num as dnum, client_devis.nom as dnom, client_devis.prenom as dprenoms, devis.id_nextcloud as didnextcloud,
defunt.nom as nom_defunt,
client.nom as cnom, client.id as cid, client.prenom as cprenoms
FROM (".$this->tableprefix."ligne_trajet as ligne_trajet
LEFT JOIN ".$this->tableprefix."lieu as lieu on ligne_trajet.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."devis as devis on ligne_trajet.id_devis = devis.id
LEFT JOIN ".$this->tableprefix."client as client_devis on devis.id_client = client_devis.id
LEFT JOIN ".$this->tableprefix."client as client on ligne_trajet.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
) WHERE ligne_trajet.id_trajet = ? ORDER BY ligne_trajet.rang ASC;";
return $this->execSQL($sql, array($numtrajet));
}
public function getTrajetsdetails_orderByDate($numtrajet, $idNextcloud) {
$sql = "SELECT ligne_trajet.id, ligne_trajet.rang, ligne_trajet.id_nextcloud, ligne_trajet.date, ligne_trajet.user_id, ligne_trajet.commentaire, ligne_trajet.source,
lieu.id as lid, lieu.nom as lieu, lieu.latitude as latitude, lieu.longitude as longitude,
client.nom as cnom, client.id as cid, client.prenom as cprenoms
FROM (".$this->tableprefix."ligne_trajet as ligne_trajet
LEFT JOIN ".$this->tableprefix."lieu as lieu on ligne_trajet.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."client as client on ligne_trajet.id_client = client.id)
WHERE ligne_trajet.id_trajet = ?
ORDER BY ligne_trajet.date ASC, ligne_trajet.rang ASC;";
return $this->execSQL($sql, array($numtrajet));
}
public function getOneTrajetdetails($id, $idNextcloud) {
$sql = "SELECT * FROM ".$this->tableprefix."ligne_trajet WHERE ".$this->tableprefix."ligne_trajet.id = ?;";
return $this->execSQL($sql, array($id));
}
public function getOneTrajetdetails_byIdDevis($id_devis, $idNextcloud) {
$sql = "SELECT * FROM ".$this->tableprefix."ligne_trajet WHERE ".$this->tableprefix."ligne_trajet.id_devis = ? AND ".$this->tableprefix."ligne_trajet.source LIKE 'devis';";
return $this->execSQL($sql, array($id_devis));
}
public function getOneTrajetdetails_byRang($id_trajet, $rang, $idNextcloud) {
$sql = "SELECT * FROM ".$this->tableprefix."ligne_trajet WHERE ".$this->tableprefix."ligne_trajet.id_trajet = ? AND ".$this->tableprefix."ligne_trajet.rang = ?;";
return $this->execSQL($sql, array($id_trajet, $rang));
}
public function getOneTrajet($id, $idNextcloud) {
$sql = "SELECT trajet.id, trajet.mois, trajet.annee, trajet.distance, trajet.id_nextcloud, trajet.user_id,
thanato.id as id_thanato, thanato.nom as nom_thanato, thanato.prenom as prenom_thanato
FROM ".$this->tableprefix."trajet as trajet
LEFT JOIN ".$this->tableprefix."thanato as thanato on trajet.id_thanato = thanato.id
WHERE trajet.id = ".$id." ORDER BY trajet.id DESC;";
return $this->execSQL($sql, array());
}
public function getLieux($idNextcloud){
$sql = "SELECT lieu.nom, lieu.adresse, lieu.latitude,lieu.longitude, lieu.user_id, lieu.id,
lieu.portal_code,lieu.alarm_code,lieu.funeral_code
FROM ".$this->tableprefix."lieu as lieu
ORDER BY lieu.id DESC";
return $this->execSQL($sql, array());
}
public function getLieu($id,$idNextcloud){
$sql = "SELECT * FROM ".$this->tableprefix."lieu WHERE id = ?";
return $this->execSQL($sql, array($id));
}
public function getDevis($idNextcloud,$mentionFilters = []){
$sql = "SELECT ".$this->tableprefix."devis.id, ".$this->tableprefix."devis.id as devisid, ".$this->tableprefix."devis.user_id,".$this->tableprefix."devis.id_nextcloud ,".$this->tableprefix."devis.comment ,"
.$this->tableprefix."client.nom, ".$this->tableprefix."client.prenom, ".$this->tableprefix."client.id as cid, ".$this->tableprefix."client.id as id_client, "
.$this->tableprefix."client.adresse as adresse_cli,".$this->tableprefix."client.mail as mail_cli,".$this->tableprefix."client.telephone as telephone_cli,".$this->tableprefix."client.legal_one as legalone_cli,"
.$this->tableprefix."client.fk_client_group_facturation_id as fk_client_group_facturation_id,"
.$this->tableprefix."thanato.nom as nom_thanato, ".$this->tableprefix."thanato.prenom as prenom_thanato, ".$this->tableprefix."thanato.id as tid, "
.$this->tableprefix."devis.num, ".$this->tableprefix."devis.date, ".$this->tableprefix."devis.version, ".$this->tableprefix."devis.mentions, "
.$this->tableprefix."devis.order_number, ".$this->tableprefix."devis.case_number, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,".$this->tableprefix."devis.id_lieu, "
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt, "
.$this->tableprefix."devis.devis_full_number as devis_full_number
FROM ".$this->tableprefix."devis
LEFT JOIN ".$this->tableprefix."defunt on id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."client on id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."thanato on id_thanato = ".$this->tableprefix."thanato.id
LEFT JOIN ".$this->tableprefix."lieu on id_lieu = ".$this->tableprefix."lieu.id";
$conditions = [];
if(!empty($mentionFilters)){
$mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionFilters), '?'));
$sql .= " WHERE ". $this->tableprefix."devis.mentions IN ($mentionsFilterPlaceholders)";
$conditions = array_merge($conditions, $mentionFilters);
}
$sql .= " ORDER BY ".$this->tableprefix."devis.id DESC, ".$this->tableprefix."devis.date DESC;";
return $this->execSQL($sql, $conditions);
}
public function getDevisWithProduits($idNextcloud){
$devis = $this->getDevis($idNextcloud);
$devisList = json_decode($devis);
foreach($devisList as $currentDevis){
$produits = $this->getProduitsDevisByDevisId($currentDevis->devisid);
$currentDevis->produits = $produits;
}
return json_encode($devisList);
}
public function getDevisEmmanuelle($idNextcloud){
$sql = "SELECT ".$this->tableprefix."devis.id, ".$this->tableprefix."devis.id as devisid, ".$this->tableprefix."devis.user_id,".$this->tableprefix."devis.id_nextcloud ,".$this->tableprefix."devis.comment ,"
.$this->tableprefix."client.nom, ".$this->tableprefix."client.prenom, ".$this->tableprefix."client.id as cid, ".$this->tableprefix."client.id as id_client, "
.$this->tableprefix."client.adresse as adresse_cli,".$this->tableprefix."client.mail as mail_cli,".$this->tableprefix."client.telephone as telephone_cli,".$this->tableprefix."client.legal_one as legalone_cli,"
.$this->tableprefix."thanato.nom as nom_thanato, ".$this->tableprefix."thanato.prenom as prenom_thanato, ".$this->tableprefix."thanato.id as tid, "
.$this->tableprefix."devis.num, ".$this->tableprefix."devis.date, ".$this->tableprefix."devis.version, ".$this->tableprefix."devis.mentions, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,".$this->tableprefix."devis.id_lieu, "
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt
FROM (".$this->tableprefix."devis
LEFT JOIN ".$this->tableprefix."client on id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."thanato on id_thanato = ".$this->tableprefix."thanato.id
LEFT JOIN ".$this->tableprefix."lieu on id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."defunt on id_defunt = ".$this->tableprefix."defunt.id
) WHERE LOWER(".$this->tableprefix."devis.id_nextcloud) LIKE 'emmanuelle' ORDER BY ".$this->tableprefix."devis.id DESC, ".$this->tableprefix."devis.date DESC;";
return $this->execSQL($sql, array());
}
public function getDevisDelphine($idtrajetdetails, $idNextcloud) {
$ligne_trajet = json_decode($this->getOneTrajetdetails($idtrajetdetails, $idNextcloud))[0];
$sql = "SELECT ".$this->tableprefix."devis.id, ".$this->tableprefix."devis.user_id,".$this->tableprefix."devis.id_nextcloud ,"
.$this->tableprefix."client.nom, ".$this->tableprefix."client.prenom, ".$this->tableprefix."client.id as cid, "
.$this->tableprefix."thanato.nom as nom_thanato, ".$this->tableprefix."thanato.prenom as prenom_thanato, ".$this->tableprefix."thanato.id as tid, "
.$this->tableprefix."devis.num, ".$this->tableprefix."devis.date, ".$this->tableprefix."devis.version, ".$this->tableprefix."devis.mentions, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."devis.id_lieu
FROM (".$this->tableprefix."devis
LEFT JOIN ".$this->tableprefix."client on id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."thanato on id_thanato = ".$this->tableprefix."thanato.id
LEFT JOIN ".$this->tableprefix."lieu on id_lieu = ".$this->tableprefix."lieu.id
) WHERE LOWER(".$this->tableprefix."devis.id_nextcloud) LIKE 'delphine'
AND ".$this->tableprefix."devis.date LIKE '".$ligne_trajet->date."'";
if($ligne_trajet->id_client != NULL) $sql = $sql." AND ".$this->tableprefix."devis.id_client = ".$ligne_trajet->id_client;
if($ligne_trajet->id_lieu != NULL) $sql = $sql." AND ".$this->tableprefix."devis.id_lieu = ".$ligne_trajet->id_lieu;
$sql = $sql." ORDER BY ".$this->tableprefix."devis.id DESC, ".$this->tableprefix."devis.date DESC;";
return $this->execSQL($sql, array());
}
private function getClientsWithClientType(bool $includeClientInsideGroup = true){
$sql = "SELECT client.*,'client' as client_type FROM ".$this->tableprefix."client as client";
if($includeClientInsideGroup == false){
$sql .= " WHERE client.fk_client_group_facturation_id IS NULL";
}
$sql .= ";";
$clientsWithClientType = $this->execSQLNoJsonReturn($sql,[]);
return $clientsWithClientType;
}
public function getClientsAndClientGroupFacturations(bool $includeClientInsideGroup = true){
$clients = $this->getClientsWithClientType($includeClientInsideGroup);
$clientGroupFacturations = $this->getClientGroupFacturationsWithType();
$result = [...$clientGroupFacturations,...$clients];
return json_encode($result);
}
public function getFactures($idNextcloud){
$sql = "SELECT ".$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, "
.$this->tableprefix."facture.fk_facture_status_key, ".$this->tableprefix."facture.fk_facture_payment_type_id, ".$this->tableprefix."facture.payment_date, "
.$this->tableprefix."facture_payment_type.facture_payment_type_label, "
.$this->tableprefix."facture_status.facture_status_label, "
.$this->tableprefix."facture.facture_type, "
.$this->tableprefix."facture.fk_client_id as facture_client_id, "
.$this->tableprefix."facture.fk_client_group_facturation_id as facture_client_group_facturation_id, "
.$this->tableprefix."devis.num as dnum, ".$this->tableprefix."devis.comment as dcomment, date_paiement, type_paiement, id_devis, entreprise, "
.$this->tableprefix."facture.version, status_paiement,"
.$this->tableprefix."client.nom, ".$this->tableprefix."client.prenom, "
.$this->tableprefix."client.id as id_cli, ".$this->tableprefix."client.entreprise as client_entreprise, ".$this->tableprefix."client.fk_client_group_facturation_id as fk_client_group_facturation_id, "
.$this->tableprefix."client.adresse as adresse_cli,".$this->tableprefix."client.mail as mail_cli, "
.$this->tableprefix."client.telephone as telephone_cli,".$this->tableprefix."client.legal_one as legalone_cli, "
.$this->tableprefix."client.fk_client_group_id as fk_client_group_id, "
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,".$this->tableprefix."devis.id_lieu
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id)
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."facture_payment_type on fk_facture_payment_type_id = ".$this->tableprefix."facture_payment_type.id
LEFT JOIN ".$this->tableprefix."facture_status on fk_facture_status_key = ".$this->tableprefix."facture_status.facture_status_key
ORDER BY ".$this->tableprefix."facture.id DESC, ".$this->tableprefix."facture.date_paiement DESC";
$result = $this->execSQL($sql, array());
return $result;
}
public function getFacturesWithProduits($idNextCloud){
$factures = $this->getFactures($idNextCloud);
$facturesList = json_decode($factures);
foreach($facturesList as $currentFacture){
$produits = $this->getProduitsDevisByDevisId($currentFacture->id_devis);
$currentFacture->produits = $produits;
}
return json_encode($facturesList);
}
private function getClientFacturesByClientIdListAndDate($clientIdList,$date) {
$clientIdsSqlPlaceholder = implode(',', array_fill(0, count($clientIdList), '?'));
$sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,"
.$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, "
.$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."devis.comment as numero_commande, "
.$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, "
.$this->tableprefix."client.legal_one as client_siret, "
.$this->tableprefix."client.mail as mail_client, ".$this->tableprefix."client.entreprise as client_entreprise, ".$this->tableprefix."client.fk_client_group_id as fk_client_group_id, "
.$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom as nom, prenom, entreprise, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,"
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,"
.$this->tableprefix."client_group_facturation.id as client_group_facturation_id, ".$this->tableprefix."client_group_facturation.group_facturation_name as group_facturation_name,"
.$this->tableprefix."facture.version, status_paiement
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id)
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."client_group_facturation on ".$this->tableprefix."client.fk_client_group_facturation_id = ".$this->tableprefix."client_group_facturation.id
WHERE YEAR(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[2]." AND MONTH(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[1]."
AND ".$this->tableprefix."client.id IN($clientIdsSqlPlaceholder) ORDER BY date_soin ASC";
$result = $this->execSQL(
sql: $sql,
conditions: $clientIdList );
return $result;
}
public function getClientFacturesByClientGroupFacturationIdAndDate($clientGroupFacturationId,$date){
$clientIds = $this->getClientIdsByClientGroupFacturationId($clientGroupFacturationId);
if(empty($clientIds)){
return [];
}
return $this->getClientFacturesByClientIdListAndDate($clientIds,$date);
}
public function getClientFacturesByClientIdAndDate($clientId,$date){
$sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,"
.$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, "
.$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."devis.comment as numero_commande, "
.$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, "
.$this->tableprefix."client.mail as mail_client, ".$this->tableprefix."client.entreprise as client_entreprise, ".$this->tableprefix."client.fk_client_group_id as fk_client_group_id, "
.$this->tableprefix."client.legal_one as client_siret, "
.$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom as nom, prenom, entreprise, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,"
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,"
.$this->tableprefix."facture.version, status_paiement, "
.$this->tableprefix."client_group_facturation.id as group_id, "
.$this->tableprefix."client_group_facturation.group_facturation_name as group_name, "
.$this->tableprefix."client_group_facturation.address as group_address, "
.$this->tableprefix."client_group_facturation.postal_code as group_postal_code, "
.$this->tableprefix."client_group_facturation.city as group_city, "
.$this->tableprefix."client_group_facturation.email as group_email, "
.$this->tableprefix."client_group_facturation.siret_number as group_siret_number
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id)
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."client_group_facturation on ".$this->tableprefix."client.fk_client_group_facturation_id = ".$this->tableprefix."client_group_facturation.id
WHERE YEAR(".$this->tableprefix."facture.date_paiement) = ".explode('-', string: $date)[2]." AND MONTH(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[1]."
AND ".$this->tableprefix."client.id = ? ORDER BY date_soin ASC";
$result = $this->execSQL($sql, array($clientId));
return $result;
}
public function getCurrentMonthFactures_byClient($idNextcloud, $date, $idclient) {
$sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,"
.$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, "
.$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."devis.comment as numero_commande, "
.$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, "
.$this->tableprefix."client.mail as mail_client, "
.$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom as nom, prenom, entreprise, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,"
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,"
.$this->tableprefix."facture.version, status_paiement
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id)
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
WHERE YEAR(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[2]." AND MONTH(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[1]."
AND ".$this->tableprefix."client.id = ".$idclient." ORDER BY year DESC, month DESC;";
// $sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,".$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, ".$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, nom, prenom, entreprise, ".$this->tableprefix."facture.version, status_paiement FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id) LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
// WHERE YEAR(".$this->tableprefix."facture.date_paiement) = YEAR(CURRENT_DATE) AND MONTH(".$this->tableprefix."facture.date_paiement) = MONTH(CURRENT_DATE)
// ORDER BY year DESC, month DESC;";
// $sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,".$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, ".$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, nom, prenom, entreprise, ".$this->tableprefix."facture.version, status_paiement FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id) LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
// ORDER BY year DESC, month DESC;";
$result = $this->execSQL($sql, array());
return $result;
}
public function getCurrentMonthFactures($idNextcloud, $date) {
$sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,"
.$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, "
.$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."devis.comment as numero_commande, "
.$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, "
.$this->tableprefix."client.mail as mail_client, "
.$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom as nom, prenom, entreprise, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,"
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,"
.$this->tableprefix."facture.version, status_paiement
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id)
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
WHERE YEAR(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[2]." AND MONTH(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[1]."
ORDER BY year DESC, month DESC;";
// $sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,".$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, ".$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, nom, prenom, entreprise, ".$this->tableprefix."facture.version, status_paiement FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id) LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
// WHERE YEAR(".$this->tableprefix."facture.date_paiement) = YEAR(CURRENT_DATE) AND MONTH(".$this->tableprefix."facture.date_paiement) = MONTH(CURRENT_DATE)
// ORDER BY year DESC, month DESC;";
// $sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,".$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, ".$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, nom, prenom, entreprise, ".$this->tableprefix."facture.version, status_paiement FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id) LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
// ORDER BY year DESC, month DESC;";
$result = $this->execSQL($sql, array());
return $result;
}
public function getCurrentMonthFactures_COGF($idNextcloud, $date) {
$sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,"
.$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, "
.$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."devis.comment as numero_commande, "
.$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, "
.$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom as nom, prenom, entreprise, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin,"
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,"
.$this->tableprefix."facture.version, status_paiement
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id)
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
WHERE YEAR(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[2]." AND MONTH(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[1]." AND LOWER(".$this->tableprefix."client.entreprise) LIKE LOWER('COGF')
ORDER BY year DESC, month DESC;";
// $sql = "SELECT YEAR(".$this->tableprefix."facture.date_paiement) AS year, MONTH(".$this->tableprefix."facture.date_paiement) AS month,".$this->tableprefix."facture.id, ".$this->tableprefix."facture.user_id, ".$this->tableprefix."facture.num, ".$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum,".$this->tableprefix."devis.version as adresse_devis,".$this->tableprefix."client.adresse as adresse_client, ".$this->tableprefix."devis.date as date_soin, ".$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, nom, prenom, entreprise, ".$this->tableprefix."facture.version, status_paiement FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id) LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
// WHERE LOWER(".$this->tableprefix."client.entreprise) LIKE LOWER('COGF')
// ORDER BY year DESC, month DESC;";
$result = $this->execSQL($sql, array());
return $result;
}
public function getCurrentMonthTrajet($idNextcloud, $date) {
$sql = "SELECT t.id_nextcloud, t.date, t.distance, depart.nom as lieu_depart, arrivee.nom as lieu_arrivee,
depart_c.nom as depart_cnom, depart_c.prenom as depart_cprenoms, arrivee_c.nom as arrivee_cnom, arrivee_c.prenom as arrivee_cprenoms,
thanato.id as id_thanato, thanato.nom as nom_thanato, thanato.prenom as prenom_thanato
FROM ".$this->tableprefix."trajet t
INNER JOIN ".$this->tableprefix."lieu depart ON t.id_lieu_depart = depart.id
INNER JOIN ".$this->tableprefix."lieu arrivee ON t.id_lieu_arrivee = arrivee.id
INNER JOIN ".$this->tableprefix."client depart_c ON depart.id_client = depart_c.id
INNER JOIN ".$this->tableprefix."client arrivee_c ON arrivee.id_client = arrivee_c.id
WHERE MONTH(t.date) = ".explode('-', $date)[1].";";
$result = $this->execSQL($sql, array());
return $result;
}
public function getOneFacture($numfacture, $idNextcloud){
// $sql = "SELECT ".$this->tableprefix."facture.id," . $this->tableprefix . "facture.version," . $this->tableprefix . "facture.num, ".$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum, comment, date_paiement, type_paiement, id_devis, nom, prenom, entreprise FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id AND ".$this->tableprefix."facture.id_nextcloud = ".$this->tableprefix."devis.id_nextcloud) LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id AND ".$this->tableprefix."devis.id_nextcloud = ".$this->tableprefix."client.id_nextcloud WHERE ".$this->tableprefix."facture.id = ? AND ".$this->tableprefix."facture.id_nextcloud = ?";
$sql = "SELECT ".$this->tableprefix."facture.id," . $this->tableprefix . "facture.version," . $this->tableprefix . "facture.num, "
.$this->tableprefix."facture.date, ".$this->tableprefix."devis.num as dnum, comment, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom, prenom, entreprise,"
.$this->tableprefix."devis.comment as dcomment,".$this->tableprefix."lieu.nom as lieu, ".$this->tableprefix."lieu.adresse as adresse_soin,"
.$this->tableprefix."defunt.nom as nom_defunt, "
.$this->tableprefix."devis.order_number as order_number, "
.$this->tableprefix."devis.case_number as case_number, "
.$this->tableprefix."facture_payment_type.facture_payment_type_label as facture_payment_type_label
FROM (".$this->tableprefix."facture
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id)
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."facture_payment_type on ".$this->tableprefix."facture.fk_facture_payment_type_id = ".$this->tableprefix."facture_payment_type.id
WHERE ".$this->tableprefix."facture.id = ?";
// return $this->execSQL($sql, array($numfacture, $idNextcloud));
return $this->execSQL($sql, array($numfacture));
}
public function getProduits($idNextcloud,$orderDirection = 'DESC'){
$sql = "SELECT
produit.id,
produit.reference,
produit.description,
produit.prix_unitaire,
produit.vat,
produit.fk_product_type_id,
product_type.id as product_type_id,
product_type.product_type_key as product_type_key,
product_type.product_type_name as product_type_name
FROM ".$this->tableprefix."produit as produit
LEFT JOIN ".$this->tableprefix."product_type as product_type on produit.fk_product_type_id = product_type.id
ORDER BY produit.id ". $orderDirection. ";";
return $this->execSQL($sql, array());
}
private function getThanatoByIdNextcloud($idNextcloud){
$sql = "SELECT *
FROM ".$this->tableprefix."thanato as thanato
WHERE LOWER(thanato.nom) = LOWER(?)
ORDER BY thanato.id ASC;";
$thanato = $this->execSQLNoJsonReturn($sql, array($idNextcloud));
if(!empty($thanato)){
return $thanato[0];
}
return null;
}
private function getDefuntIdsRelatedToThanato($thanatoId){
$devis = $this->getDevisMadeByAThanato($thanatoId);
$defuntIds = $this->getDefuntIdsFromDevisList($devis);
return $defuntIds;
}
private function getDefuntIdsFromDevisList($devisList){
$defuntIds = [];
foreach($devisList as $devis){
$defuntIds[] = $devis["id_defunt"];
}
return $defuntIds;
}
private function getDevisMadeByAThanato($thanatoId){
$sql = "SELECT
devis.id,
devis.id_thanato,
devis.id_defunt
FROM ".$this->tableprefix."devis as devis
WHERE devis.id_thanato = ? ;";
$devisList = $this->execSQLNoJsonReturn($sql, array($thanatoId));
return $devisList;
}
public function getDefunts($idNextcloud, $isUserThanatoOnly = false)
{
$sql = "SELECT ".$this->tableprefix."defunt.id, ".$this->tableprefix."defunt.nom, ".$this->tableprefix."defunt.date_naissance, ".$this->tableprefix."defunt.ref_pacemaker, ".$this->tableprefix."defunt.sexe, "
.$this->tableprefix."client.nom as nom_client, ".$this->tableprefix."client.id as id_client, "
.$this->tableprefix."devis.num as numero_devis, ".$this->tableprefix."devis.id as id_devis, ".$this->tableprefix."devis.user_id as user_id, "
.$this->tableprefix."devis.date as devis_date, "
.$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu
FROM ".$this->tableprefix."defunt
LEFT JOIN ".$this->tableprefix."devis ON ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."client ON ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."lieu ON ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id";
$conditions = [];
if($isUserThanatoOnly){
$thanato = $this->getThanatoByIdNextcloud($idNextcloud);
if($thanato == null){
return json_encode([]);
}
$thanatoId = $thanato["id"];
$defuntsIdRelatedToThanato = $this->getDefuntIdsRelatedToThanato($thanatoId);
if(empty($defuntsIdRelatedToThanato)){
return json_encode([]);
}
$defuntListConditionPlaceholder = implode(',', array_fill(0, count($defuntsIdRelatedToThanato), '?'));
$conditions = $defuntsIdRelatedToThanato;
$sql .= " WHERE ".$this->tableprefix."defunt.id IN ($defuntListConditionPlaceholder)";
}
$sql .= " ORDER BY ".$this->tableprefix."defunt.id DESC;";
$defuntsList = $this->execSQLNoJsonReturn($sql,$conditions);
foreach($defuntsList as &$defunt){
$defunt["product_cover_description"] = null;
$defuntHasDevis = $defunt["id_devis"] != null;
if($defuntHasDevis){
$productCover = $this->getProductCoverByDevisId($defunt["id_devis"]);
if($productCover != null){
$defunt["product_cover_description"] = $productCover["description"];
}
}
}
return json_encode($defuntsList);
}
public function getUnusedDefunts($idNextcloud) {
$sql = "SELECT ".$this->tableprefix."defunt.id, ".$this->tableprefix."defunt.nom, ".$this->tableprefix."defunt.date_naissance, ".$this->tableprefix."defunt.ref_pacemaker, ".$this->tableprefix."defunt.sexe,"
.$this->tableprefix."devis.user_id as user_id
FROM ".$this->tableprefix."defunt
LEFT JOIN ".$this->tableprefix."devis ON ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
WHERE ".$this->tableprefix."devis.id_defunt IS NULL
ORDER BY ".$this->tableprefix."defunt.id DESC;";
return $this->execSQL($sql, array());
}
public function getOneDevis($numdevis,$idNextcloud){
$sql = "SELECT ".$this->tableprefix."devis.id as devisid, ".$this->tableprefix."devis.version, ".$this->tableprefix."devis.comment, ".$this->tableprefix."devis.date, num,"
.$this->tableprefix."devis.id_nextcloud as didnextcloud,".$this->tableprefix."devis.id_client, id_lieu, id_thanato,case_number,order_number,"
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,"
.$this->tableprefix."client.id as clientid, ".$this->tableprefix."client.nom, "
.$this->tableprefix."client.prenom, legal_one, entreprise, telephone, mail, ".$this->tableprefix."client.adresse,"
.$this->tableprefix."lieu.nom as lieu, ".$this->tableprefix."lieu.adresse as adresse_soin ,"
.$this->tableprefix."lieu.portal_code as portal_code,"
.$this->tableprefix."lieu.alarm_code as alarm_code,"
.$this->tableprefix."lieu.funeral_code as funeral_code,"
.$this->tableprefix."thanato.nom as nom_thanato, ".$this->tableprefix."thanato.prenom as prenom_thanato
FROM ".$this->tableprefix."devis
LEFT JOIN ".$this->tableprefix."client on id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."defunt on id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."thanato on ".$this->tableprefix."devis.id_thanato = ".$this->tableprefix."thanato.id
WHERE ".$this->tableprefix."devis.id = ?";
return $this->execSQL($sql, array($numdevis));
}
public function getOneDefunt($numdefunt,$idNextcloud,$includeDefuntProductCover = false){
$sql = "SELECT ".$this->tableprefix."defunt.id, ".$this->tableprefix."devis.version, ".$this->tableprefix."devis.comment, ".$this->tableprefix."devis.date, num,"
.$this->tableprefix."devis.id as id_devis,".$this->tableprefix."devis.id_client, id_lieu, id_thanato,".$this->tableprefix."devis.user_id as user_id, "
.$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt,".$this->tableprefix."defunt.date_naissance,".$this->tableprefix."defunt.sexe,".$this->tableprefix."defunt.ref_pacemaker,"
.$this->tableprefix."defunt.date as date_defunt,"
.$this->tableprefix."defunt.heure_debut,"
.$this->tableprefix."defunt.heure_fin,"
.$this->tableprefix."defunt.corpulence,"
.$this->tableprefix."defunt.rigidite,"
.$this->tableprefix."defunt.lividite,"
.$this->tableprefix."defunt.observations_corps,"
.$this->tableprefix."defunt.acces,"
.$this->tableprefix."defunt.acces_recherche,"
.$this->tableprefix."defunt.acces_etat,"
.$this->tableprefix."defunt.injection,"
.$this->tableprefix."defunt.injection_diffusion,"
.$this->tableprefix."defunt.injection_qte,"
.$this->tableprefix."defunt.preinjection,"
.$this->tableprefix."defunt.preinjection_qte,"
.$this->tableprefix."defunt.coinjection,"
.$this->tableprefix."defunt.coinjection_qte,"
.$this->tableprefix."defunt.drainage,"
.$this->tableprefix."defunt.drainage_qte,"
.$this->tableprefix."defunt.drainage_etat,"
.$this->tableprefix."defunt.ponction,"
.$this->tableprefix."defunt.ponction_qte,"
.$this->tableprefix."defunt.cavite,"
.$this->tableprefix."defunt.cavite_qte,"
.$this->tableprefix."defunt.desinfection,"
.$this->tableprefix."defunt.lavage,"
.$this->tableprefix."defunt.rasage,"
.$this->tableprefix."defunt.presentation_cosmetique,"
.$this->tableprefix."defunt.presentation_sur,"
.$this->tableprefix."defunt.observations_generales,"
.$this->tableprefix."defunt.product_photo,"
.$this->tableprefix."defunt.product_photo_name,"
.$this->tableprefix."client.id as clientid, ".$this->tableprefix."client.nom, ".$this->tableprefix."client.prenom, legal_one, entreprise, telephone, mail, ".$this->tableprefix."client.adresse,"
.$this->tableprefix."lieu.nom as lieu, ".$this->tableprefix."lieu.adresse as adresse_soin ,"
.$this->tableprefix."thanato.nom as nom_thanato, ".$this->tableprefix."thanato.prenom as prenom_thanato, "
.$this->tableprefix."thanato.date_habilitation, "
.$this->tableprefix."thanato.reference as reference_habilitation, "
.$this->tableprefix."lieu.adresse as adresse_lieu, "
.$this->tableprefix."lieu.nom as nom_lieu
FROM ".$this->tableprefix."defunt
LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id
LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id
LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id
LEFT JOIN ".$this->tableprefix."thanato on ".$this->tableprefix."devis.id_thanato = ".$this->tableprefix."thanato.id
WHERE ".$this->tableprefix."defunt.id = ?";
$defunts = $this->execSQLNoJsonReturn($sql,[$numdefunt]);
if($includeDefuntProductCover){
foreach($defunts as &$defunt){
$defunt["product_cover_id"] = null;
$defuntHasDevis = $defunt["id_devis"] != null;
if($defuntHasDevis){
$productCover = $this->getProductCoverByDevisId($defunt["id_devis"]);
if($productCover != null){
$defunt["product_cover_id"] = $productCover["produit_id"];
}
}
}
}
return json_encode($defunts);
}
public function getListProduit($numdevis, $idNextcloud){
$sql = "SELECT ".
$this->tableprefix."produit.id as pid,"
.$this->tableprefix."produit_devis.id as pdid, reference, description,"
.$this->tableprefix."produit_devis.comment, quantite, prix_unitaire, "
.$this->tableprefix."devis.id_client
FROM ".$this->tableprefix."produit, ".$this->tableprefix."devis, ".$this->tableprefix."produit_devis
WHERE ".$this->tableprefix."produit.id = produit_id AND ".$this->tableprefix."devis.id = devis_id AND ".$this->tableprefix."devis.id = ?";
$produits = $this->execSQLNoJsonReturn($sql,[$numdevis]);
if(!empty($produits)){
$clientId = $produits[0]["id_client"];
$client = $this->getClientById($clientId);
foreach($produits as &$produit){
$productPrice = $this->getProductPriceByClientGroupId($client['fk_client_group_id'],$produit['pid']);
$produit['prix_unitaire'] = $productPrice ?? $produit['prix_unitaire'];
}
}
return json_encode($produits);
}
public function getListArticle($numdevis, $idNextcloud) {
$sql = "SELECT ".$this->tableprefix."article.id as aid,".$this->tableprefix."article_devis.id as adid, reference, description,".$this->tableprefix."article_devis.comment, quantite, prix_unitaire FROM ".$this->tableprefix."article, ".$this->tableprefix."devis, ".$this->tableprefix."article_devis WHERE ".$this->tableprefix."article.id = article_id AND ".$this->tableprefix."devis.id = devis_id AND ".$this->tableprefix."devis.id = ?";
return $this->execSQL($sql, array($numdevis));
}
public function getArticles($idNextcloud){
$sql = "SELECT * FROM ".$this->tableprefix."article";
return $this->execSQL($sql, array());
}
private function getFunctionCall(){
$trace = debug_backtrace();
return $trace[2]['function'];
}
public function getListObservations($numdefunt, $idNextcloud) {
$sql = "SELECT ".$this->tableprefix."obs_defunt.id as odid, designation, commentaire FROM "
.$this->tableprefix."obs_defunt, ".$this->tableprefix."defunt
WHERE ".$this->tableprefix."defunt.id = defunt_id AND ".$this->tableprefix."defunt.id = ?";
return $this->execSQL($sql, array($numdefunt));
}
public function getListBijoux($numdefunt, $idNextcloud) {
$sql = "SELECT ".$this->tableprefix."bijou_defunt.id as bdid, designation, commentaire,photo,photo_name,taker_name FROM "
.$this->tableprefix."bijou_defunt, ".$this->tableprefix."defunt
WHERE ".$this->tableprefix."defunt.id = defunt_id AND ".$this->tableprefix."defunt.id = ?";
return $this->execSQL($sql, array($numdefunt));
}
public function getListHypodermiques($numdefunt, $idNextcloud) {
$sql = "SELECT ".$this->tableprefix."hypo_defunt.id as hdid, designation, qte, endroit FROM "
.$this->tableprefix."hypo_defunt, ".$this->tableprefix."defunt
WHERE ".$this->tableprefix."defunt.id = defunt_id AND ".$this->tableprefix."defunt.id = ?";
return $this->execSQL($sql, array($numdefunt));
}
/**
* INSERT client
* @$idnextcloud
*/
public function insertClient($idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."client` (`id_nextcloud`,`nom`,`prenom`,`legal_one`,`entreprise`,`telephone`,`mail`,`adresse`) VALUES (?,?,?,?,?,?,?,?)";
$this->execSQLNoData($sql,array($idNextcloud,
$this->l->t('Last name'),
$this->l->t('First name'),
$this->l->t('Limited company'),
$this->l->t('Company'),
$this->l->t('Phone number'),
$this->l->t('Email'),
$this->l->t('Address')
)
);
return true;
}
/**
*
*/
public function insertThanatopracteur($idNextcloud) {
$sql = "INSERT INTO `".$this->tableprefix."thanato` (`id_nextcloud`,`nom`,`prenom`,`reference`,`date_habilitation`) VALUES (?,?,?,?,NOW())";
$this->execSQLNoData($sql,array($idNextcloud,
$this->l->t('Last name'),
$this->l->t('First name'),
'reference',
)
);
return true;
}
/**
* Insert lieu
*/
public function insertTrajet($id_thanato, $mois, $annee, $idNextcloud){
$last=0;
$last = $this->lastinsertid("trajet", $idNextcloud) + 1;
// $sql = "INSERT INTO `".$this->tableprefix."trajet` ( `id_nextcloud`,
// `date`,
// `annee`,
// `mois`,
// `id_client`,
// `id_lieu_depart`,
// `id_lieu_arrivee`,
// `distance`,
// `user_id`
// )
// VALUES (?,NOW(),?,?,0,0,0,0,?);";
$sql = "INSERT INTO `".$this->tableprefix."trajet` ( `id_nextcloud`,
`date`,
`annee`,
`mois`,
`distance`,
`id_thanato`,
`user_id`
)
VALUES (?,NOW(),?,?,0,?,?);";
$this->execSQLNoData($sql, array($idNextcloud,$annee, $mois, $id_thanato, $last));
return true;
}
/**
* Insert lieu
*/
public function insertTrajetdetails($numtrajet, $idNextcloud){
$last=0;
$last = $this->lastinsertid("ligne_trajet", $idNextcloud) + 1;
$rang = $this->get_last_rang_trajetdetails($numtrajet, $idNextcloud);
$current_trajet = json_decode($this->getOneTrajet($numtrajet, $idNextcloud))[0];
$trajetdetails = json_decode($this->getTrajetsdetails_orderByDate($numtrajet, $idNextcloud));
$sql = "INSERT INTO `".$this->tableprefix."ligne_trajet` ( `id_nextcloud`,
`date`,
`id_devis`,
`id_lieu`,
`id_trajet`,
`rang`,
`commentaire`,
`source`,
`user_id`
)
VALUES (?,?,0,0,?,?,'','lieu',?);";
$this->execSQLNoData($sql, array($idNextcloud,$trajetdetails[sizeof($trajetdetails)-1]->date,$numtrajet,$rang+1,$last));
return true;
}
public function insertTrajetdetails_h2f($numtrajet, $date, $idNextcloud,$lieuSiege = "siege",$devisId = 0){
$lieuSiege = strtolower($lieuSiege);
$last=0;
$last = $this->lastinsertid("ligne_trajet", $idNextcloud) + 1;
$rang = $this->get_last_rang_trajetdetails($numtrajet, $idNextcloud);
$current_trajet = json_decode($this->getOneTrajet($numtrajet, $idNextcloud))[0];
$trajetdetails = json_decode($this->getTrajetsdetails_orderByDate($numtrajet, $idNextcloud));
$sql_h2f = "SELECT * FROM ".$this->tableprefix."lieu WHERE LOWER(".$this->tableprefix."lieu.nom) = ?";
$response_h2f = $this->execSQL($sql_h2f, array($lieuSiege));
$h2f = json_decode($response_h2f)[0];
$id_h2f = ($h2f!=NULL)?$h2f->id:0;
$sql = "INSERT INTO `".$this->tableprefix."ligne_trajet` ( `id_nextcloud`,
`date`,
`id_devis`,
`id_lieu`,
`id_trajet`,
`rang`,
`commentaire`,
`source`,
`user_id`
)
VALUES (?,?,?,?,?,?,'','siege',?);";
$this->execSQLNoData($sql, array($idNextcloud,$date,$devisId,$id_h2f,$numtrajet,$rang+1,$last));
return true;
}
/**
* Insert lieu
*/
public function insertTrajetdetails_byDevis($numtrajet, $devis, $idNextcloud){
$last=0;
$last = $this->lastinsertid("ligne_trajet", $idNextcloud) + 1;
$rang = $this->get_last_rang_trajetdetails($numtrajet, $idNextcloud);
$current_trajet = json_decode($this->getOneTrajet($numtrajet, $idNextcloud))[0];
$trajetdetails = json_decode($this->getTrajetsdetails_orderByDate($numtrajet, $idNextcloud));
$id_client = ($devis->id_client != NULL)?$devis->id_client:0;
$id_lieu = ($devis->id_lieu != NULL)?$devis->id_lieu:0;
$sql = "INSERT INTO `".$this->tableprefix."ligne_trajet` ( `id_nextcloud`,
`date`,
`id_devis`,
`id_client`,
`id_lieu`,
`id_trajet`,
`rang`,
`commentaire`,
`source`,
`user_id`
)
VALUES (?,?,?,?,?,?,?,'','devis',?);";
$this->execSQLNoData($sql, array($idNextcloud,$devis->date,$devis->devisid,$id_client,$id_lieu,$numtrajet,$rang+1,$last));
return true;
}
public function get_last_rang_trajetdetails($numtrajet, $idNextcloud) {
$trajetdetails = json_decode($this->getTrajetsdetails($numtrajet, $idNextcloud));
$rang_max = 0;
foreach ($trajetdetails as $key => $details) {
if($rang_max<=$details->rang) $rang_max = $details->rang;
}
return $rang_max;
}
/**
* Insert Defunt
*/
public function insertDefunt($idNextcloud) {
$sql = "INSERT INTO `".$this->tableprefix."defunt` (
`id_nextcloud`, `nom`, `sexe`, `date_naissance`, `ref_pacemaker`, `date`,
`corpulence`, `observations_corps`, `observations_generales`
) VALUES (?,?,?,?,?,NOW(),?,?,?);";
$this->execSQLNoData($sql, array($idNextcloud, 'Nom du défunt', 'm', '1973-11-11', '', '', '', ''));
return true;
}
/**
* Insert Defunt
*/
public function insertDefuntByName($name) {
$sql = "INSERT INTO `".$this->tableprefix."defunt` (
`id_nextcloud`, `nom`, `sexe`, `date_naissance`, `ref_pacemaker`, `date`,
`corpulence`, `observations_corps`, `observations_generales`
) VALUES (?,?,?,?,?,NOW(),?,?,?);";
$this->execSQLNoData($sql, array('admin',$name, 'm', '1973-11-11', '', '', '', ''));
return true;
}
public function insertDefuntByNameAndReturnId($name) {
$this->insertDefuntByName($name);
return $this->getLastDefuntIdByName($name);
}
public function getLastDefuntIdByName( $name ) {
$sql = "SELECT max(id) as LAST_INSERT_ID
FROM ".$this->tableprefix."defunt
WHERE nom = ?";
$res = $this->execSQLNoJsonReturn($sql,array($name));
if($res){
return $res[0]['LAST_INSERT_ID'];
}
return null;
}
public function getLastClientIdByName($name) {
$sql = "SELECT max(id) as LAST_INSERT_ID
FROM ".$this->tableprefix."client
WHERE nom = ?";
$res = $this->execSQLNoJsonReturn($sql,array($name));
if($res){
return $res[0]['LAST_INSERT_ID'];
}
return null;
}
public function getLastLocationIdByName($name) {
$sql = "SELECT max(id) as LAST_INSERT_ID
FROM ".$this->tableprefix."lieu
WHERE nom = ?";
$res = $this->execSQLNoJsonReturn($sql,array($name));
if($res){
return $res[0]['LAST_INSERT_ID'];
}
return null;
}
public function getOrCreateThanatoIdByLastName($name){
$thanatoId = $this->getLastThanatoIdByName($name);
if($thanatoId == null){
$this->createThanatoByLastName($name);
$thanatoId = $this->getLastThanatoIdByName($name);
}
return $thanatoId;
}
private function createThanatoByLastName($name){
$idNextcloud = "admin";
$sql = "INSERT INTO `".$this->tableprefix."thanato` (`id_nextcloud`,`nom`,`prenom`,`reference`,`date_habilitation`) VALUES (?,?,?,?,NOW())";
$this->execSQLNoData($sql,array($idNextcloud,
$name,
$this->l->t('First name'),
'reference',
)
);
return true;
}
public function getLastThanatoIdByName($name) {
$sql = "SELECT max(id) as LAST_INSERT_ID
FROM ".$this->tableprefix."thanato
WHERE nom = ?";
$res = $this->execSQLNoJsonReturn($sql,array($name));
if($res){
return $res[0]['LAST_INSERT_ID'];
}
return null;
}
public function getFirstThanatoIdByName($name) {
$sql = "SELECT min(id) as FIRST_INSERT_ID
FROM ".$this->tableprefix."thanato
WHERE nom = ?";
$res = $this->execSQLNoJsonReturn($sql,array($name));
if($res){
return $res[0]['FIRST_INSERT_ID'];
}
return null;
}
public function getThanatoIdByUserUuid($userUuid){
$sql = "SELECT min(id) as FIRST_INSERT_ID
FROM ".$this->tableprefix."thanato
WHERE fk_user_uuid = ?";
$res = $this->execSQLNoJsonReturn($sql,array($userUuid));
if($res){
return $res[0]['FIRST_INSERT_ID'];
}
return null;
}
/**
* Insert lieu
*/
public function insertLieu($idNextcloud){
$last=0;
$last = $this->lastinsertid("lieu", $idNextcloud) + 1;
// $sql = "INSERT INTO `".$this->tableprefix."lieu` ( `id_nextcloud`,
// `nom`,
// `date`,
// `id_client`,
// `adresse`,
// `latitude`,
// `longitude`,
// `distance`,
// `depart`,
// `arrivee`,
// `user_id`
// )
// VALUES (?,?,NOW(),0,'',?,?,0,'','',?);";
$sql = "INSERT INTO `".$this->tableprefix."lieu` ( `id_nextcloud`,
`nom`,
`adresse`,
`latitude`,
`longitude`
)
VALUES (?,?,'',?,?);";
$this->execSQLNoData($sql, array($idNextcloud,"Ajouter un lieu",'46.73','1.56'));
return true;
}
/**
* Insert quote
*/
public function insertDevis($idNextcloud){
$last=0;
$last = $this->lastinsertid("devis", $idNextcloud) + 1;
$sql = "INSERT INTO `".$this->tableprefix."devis` ( `date`,
`id_nextcloud`,
`num`,
`id_defunt`,
`id_client`,
`id_thanato`,
`version`,
`id_lieu`,
`mentions`,
`comment`,
`user_id`
)
VALUES (NOW(),?,?,0,0,0,?,0,?,?,?);";
$this->execSQLNoData($sql, array(
$idNextcloud,
"Nom du defunt",
'Ajouter un lieu',
DevisMentionConstant::NEW,
'',
$last
));
return true;
}
private function getLastDevisNumberByMonthAndYear($month,$year){
$sql = "SELECT
max(devis.devis_number) as LAST_DEVIS_NUMBER, devis.date FROM "
. $this->tableprefix."devis as devis
WHERE YEAR(devis.date) = ? AND
MONTH(devis.date) = ?;";
$res = $this->execSQLNoJsonReturn($sql,array($year,$month));
$lastNumber = 0;
if(!empty($res)){
$lastNumber = $res[0]['LAST_DEVIS_NUMBER'];
}
return $lastNumber;
}
public function insertDevisFromVCalendarAndReturnId($thanatoId,$clientId,$locationId,$defuntId,$calendarUuid = self::DEFAULT_CALENDAR_UUID_FOR_DEVIS,$date = null,$devisComment = "Commentaire"){
if($date == null){
$dateTime = new Datetime();
$date = $dateTime->format('Y-m-d');
}
else{
$dateTime = new DateTime($date);
}
$idNextcloud = "admin";
$last=0;
$last = $this->lastinsertid("devis", "admin") + 1;
$dateMonth = $dateTime->format('m');
$dateYear = $dateTime->format('Y');
$devisLastNumber = $this->getLastDevisNumberByMonthAndYear($dateMonth,$dateYear);
$devisNumber = $devisLastNumber + 1;
$devisFullNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($dateTime,$devisNumber,'DEV');
$sql = "INSERT INTO `".$this->tableprefix."devis` ( `date`,
`id_nextcloud`,
`num`,
`id_defunt`,
`id_client`,
`id_thanato`,
`version`,
`id_lieu`,
`mentions`,
`comment`,
`user_id`,
`devis_number`,
`devis_full_number`
)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);";
$this->execSQLNoData($sql, array(
$date,
$idNextcloud,
$calendarUuid,
$defuntId,
$clientId,
$thanatoId,
$this->l->t('New'),
$locationId,
DevisMentionConstant::NEW,
$devisComment,
$last,
$devisNumber,
$devisFullNumber
)
);
return $this->getLastDevisIdFromVCalendarProperty($thanatoId,$clientId,$locationId,$defuntId,$calendarUuid);
}
public function getLastDevisIdFromVCalendarProperty($thanatoId,$clientId,$locationId,$defuntId,$calendarUuid=self::DEFAULT_CALENDAR_UUID_FOR_DEVIS){
$sql = "SELECT max(id) as LAST_INSERT_ID
FROM ".$this->tableprefix."devis
WHERE id_defunt = ? AND id_lieu = ? AND id_client = ? AND id_thanato = ? AND num = ?";
$res = $this->execSQLNoJsonReturn($sql,array(
$defuntId,
$locationId,
$clientId,
$thanatoId,
$calendarUuid
));
if($res){
return $res[0]['LAST_INSERT_ID'];
}
return null;
}
public function getArticlesIdFromArticlesNameArray(array $articles): array {
$articleIds = [];
foreach ($articles as $article) {
$sql = "SELECT id FROM ".$this->tableprefix."produit WHERE description = ?";
$res = $this->execSQLNoJsonReturn($sql, array($article));
if ($res) {
$articleIds[] = $res[0]['id'];
}
}
return $articleIds;
}
public function insertDevisArticleFromDevisIdAndArticlesIdArray($devisId, $articleIds) {
if (!empty($articleIds)) {
$idNextcloud = "admin";
foreach ($articleIds as $articleId) {
$this->insertDevisArticle(devisId: $devisId, articleId: $articleId,idNextcloud: $idNextcloud);
}
}
return true;
}
private function insertDevisArticle($devisId,$articleId,$idNextcloud){
$sql = "INSERT INTO ".$this->tableprefix."produit_devis (devis_id, produit_id, quantite, discount, comment,id_nextcloud) VALUES (?, ?, 1, 0, '-',?)";
$this->execSQLNoData($sql, array($devisId, $articleId,$idNextcloud));
return true;
}
/**
* Insert invoice
*/
public function insertFacture($idNextcloud){
$last = 0;
$last = $this->lastNumFacture($idNextcloud);
$pref = $this->execSQLNoJsonReturn("SELECT * FROM ".$this->tableprefix."configuration WHERE id_nextcloud LIKE ?",array($idNextcloud));
$sql = "INSERT INTO `".$this->tableprefix."facture` (`date`,`id_nextcloud`,`num`,`date_paiement`,`type_paiement`,`id_devis`,`user_id`, `version`,`facture_number`) VALUES (?,?,?,NOW(),?,0,?,?,?);";
$date_temp = new DateTime();
$date = $date_temp->format('Y-m-d');
$dateMonth = $date_temp->format('m');
$dateYear = $date_temp->format('Y');
$factureLastNumber = $this->getLastFactureNumberByMonthAndYear($dateMonth,$dateYear);
$factureNumber = $factureLastNumber + 1;
$factureFullNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($date_temp,$factureNumber,'FAC');
$datesplit = explode('-', $date);
$this->execSQLNoData($sql, array($date , $idNextcloud, $factureFullNumber,"Comptant",$last+1,"Ajouter un lieu",$factureNumber));
return $last;
}
private function getDevisIdListFilteredByMentionAndDevisListId($mentionsFilter,$devisListId){
if (empty($devisListId)) {
return [];
}
$placeholders = implode(',', array_fill(0, count($devisListId), '?'));
$mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionsFilter), '?'));
$sql = "SELECT devis.id as id,devis.date as devis_date
FROM ".$this->tableprefix."devis as devis
WHERE devis.id IN ($placeholders) AND
mentions IN ($mentionsFilterPlaceholders)";
$result = $this->execSQLNoJsonReturn($sql,array_merge(
$devisListId,
$mentionsFilter));
return $result;
}
public function insertFactureForeEachDevisId($idNextCloud,$devisIdArray,$facturationDate = null){
$mentionsFilter = [
DevisMentionConstant::NEW,
DevisMentionConstant::MENTION
];
$devisIdListFiltered = $this->getDevisIdListFilteredByMentionAndDevisListId($mentionsFilter,$devisIdArray);
$factureIdsGenerated = [];
foreach($devisIdListFiltered as $devis){
$factureId = $this->insertFactureByDevisId($idNextCloud,$devis['id'],$devis['devis_date'],$facturationDate);
$factureIdsGenerated[] = $factureId;
}
return $factureIdsGenerated;
}
/**
* Insert invoice with a devis
*/
public function insertFactureByDevisId($idNextcloud,$devisId,$devisDate = null,$facturationDate = null){
if($facturationDate == null || $facturationDate == ""){
$datetimeNow = new Datetime();
$facturationDate = DateHelpers::GetLastDayOfTheMonthOfADate($datetimeNow);
$facturationDate = $facturationDate->format('Y-m-d');
}
else{
$facturationDate = Datetime::createFromFormat('Y-m-d',$facturationDate);
$facturationDate = $facturationDate->format('Y-m-d');
}
$devisDatetime = new Datetime();
if($devisDate != null){
$devisDatetime = new Datetime($devisDate);
}
$factureDate = $devisDatetime->format('Y-m-d');
$factureNumber = $this->getFactureNumberByDate($devisDatetime);
$fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($devisDatetime,$factureNumber,"FAC");
$last = 0;
$last = $this->lastNumFacture($idNextcloud);
$sql = "INSERT INTO `".$this->tableprefix."facture` (`date`,`id_nextcloud`,`num`,`date_paiement`,`type_paiement`,`id_devis`,`user_id`, `version`,`facture_number`) VALUES (?,?,?,?,?,?,?,?,?);";
$this->execSQLNoData($sql, array(
$factureDate ,
$idNextcloud,
$fullFactureNumber,
$facturationDate,
"Comptant",
$devisId,
$last+1,
"Ajouter un lieu",
$factureNumber)
);
$factureId = $this->getFactureIdByDevisId($devisId);
//update devis status
$this->gestion_update('devis','mentions',DevisMentionConstant::FACTURED_FORMATTED,$devisId,$idNextcloud);
return $factureId;
}
private function getFactureIdByDevisId($devisId){
$sql = "SELECT
facture.id
FROM ".$this->tableprefix."facture as facture
WHERE facture.id_devis = ?
ORDER BY facture.id DESC;";
$facture = $this->execSQLNoJsonReturn(
$sql,
[$devisId]);
if(!empty($facture)){
return $facture[0]['id'];
}
return null;
}
public function insertProduit($idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."produit` (`id_nextcloud`,`reference`,`description`,`prix_unitaire`) VALUES (?,?,?,0);";
$this->execSQLNoData($sql, array($idNextcloud,$this->l->t('Reference'),$this->l->t('Designation')));
return true;
}
public function insertProduitDevis($id,$idNextcloud){
$res = $this->searchMaxIdProduit($idNextcloud);
$sql = "INSERT INTO `".$this->tableprefix."produit_devis` (`devis_id`, `id_nextcloud`,`produit_id`,`quantite`,`discount`) VALUES (?,?,?,1,0);";
$this->execSQLNoData($sql, array($id,$idNextcloud,($res[0]['id']==NULL)?0:$res[0]['id']));
return true;
}
public function insertArticle($idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."article` (`id_nextcloud`,`reference`,`description`,`prix_unitaire`) VALUES (?,?,?,0);";
$this->execSQLNoData($sql, array($idNextcloud,$this->l->t('Reference'),$this->l->t('Designation')));
return true;
}
public function insertArticleDevis($id,$idNextcloud){
$res = $this->searchMaxIdArticle($idNextcloud);
$sql = "INSERT INTO `".$this->tableprefix."article_devis` (`devis_id`, `id_nextcloud`,`article_id`,`quantite`,`discount`, `comment`) VALUES (?,?,?,1,0,'-');";
$this->execSQLNoData($sql, array($id,$idNextcloud,($res[0]['id']==NULL)?0:$res[0]['id']));
return true;
}
public function insertObservationDefunt($id,$idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."obs_defunt` (`defunt_id`, `id_nextcloud`,`designation`,`commentaire`) VALUES (?,?,?,?);";
$this->execSQLNoData($sql, array($id,$idNextcloud,'inserer une observation', 'inserer un commentaire'));
return true;
}
public function insertBijouDefunt($id,$idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."bijou_defunt` (`defunt_id`, `id_nextcloud`,`designation`,`commentaire`) VALUES (?,?,?,?);";
$this->execSQLNoData($sql, array($id,$idNextcloud,'', ''));
return true;
}
public function insertHypoDefunt($id,$idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."hypo_defunt` (`defunt_id`, `id_nextcloud`,`designation`,`qte`, `endroit`) VALUES (?,?,?,?,?);";
$this->execSQLNoData($sql, array($id,$idNextcloud,'', 0, ''));
return true;
}
public function searchMaxIdProduit($idNextcloud){
// $sqlSearchMax = "SELECT MIN(id) as id FROM `".$this->tableprefix."produit` WHERE id_nextcloud = ?";
$sqlSearchMax = "SELECT MIN(id) as id FROM `".$this->tableprefix."produit`";
// return $this->execSQLNoJsonReturn($sqlSearchMax, array($idNextcloud));
return $this->execSQLNoJsonReturn($sqlSearchMax, array());
}
public function searchMaxIdArticle($idNextcloud){
$sqlSearchMax = "SELECT MIN(id) as id FROM `".$this->tableprefix."article`";
return $this->execSQLNoJsonReturn($sqlSearchMax, array());
}
public function insertBibliotheque($idNextcloud){
$sql = "INSERT INTO `".$this->tableprefix."bibliotheque` (`id_nextcloud`,`contenu`) VALUES (?,?);";
$this->execSQLNoData($sql, array($idNextcloud,'inserer un texte ici'));
return true;
}
/**
* UPDATE
*/
public function gestion_update($table, $column, $data, $id, $idNextcloud){
if(in_array($table, $this->whiteTable) && in_array($column, $this->whiteColumn)){
if(strcmp($table, "facture")==0 && strcmp($column, "date_paiement")==0) {
$facture = $this->getFactureByFactureId($id);
if($facture['date_paiement'] != $data){
$facturationDatetime = Datetime::createFromFormat('Y-m-d',$data);
$factureNumber = $this->getFactureNumberByDate($facturationDatetime);
$fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($facturationDatetime,$factureNumber,"FAC");
$sql = "UPDATE ".$this->tableprefix.$table." SET `facture_number`= ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($factureNumber, $id));
$sql = "UPDATE ".$this->tableprefix.$table." SET $column = ?, `num`= ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $fullFactureNumber, $id));
}
} else if(strcmp($table, "facture")==0 && strcmp($column, "id_devis")==0) {
$facture = json_decode($this->getOneFacture($id, $idNextcloud))[0];
$devis = json_decode($this->getOneDevis(htmlentities(rtrim($data)), $idNextcloud))[0];
$sql = "UPDATE ".$this->tableprefix.$table." SET $column = ?, `date`= ?, `version`= ? WHERE `id` = ?";
$this->execSQLNoData($sql, array(htmlentities(rtrim($data)), $devis->date, html_entity_decode($devis->version),$id));
} else if(strcmp($table, "lieu")==0 && (strcmp($column, "latitude")==0 || strcmp($column, "longitude")==0)) {
$lieu = json_decode($this->getLieu($id, $idNextcloud))[0];
if(floatval($data)!=0) {
$sql = "UPDATE ".$this->tableprefix.$table." SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array(htmlentities(rtrim(floatval($data))), $id));
$lieu = json_decode($this->getLieu($id, $idNextcloud))[0];
if(floatval($lieu->latitude)!=0 && floatval($lieu->longitude)!=0) {
$adresse = $this->recuperer_adresse(floatval($lieu->latitude), floatval($lieu->longitude));
$sql = "UPDATE ".$this->tableprefix.$table." SET adresse = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($adresse, $id));
}
}
} else if(strcmp($table, "devis")==0 && (strcmp($column, "id_lieu")==0 || strcmp($column, "date")==0 || strcmp($column, "id_client")==0 || strcmp($column, "id_thanato")==0)) {
$devis = json_decode($this->getOneDevis($id, $idNextcloud))[0];
$this->update_lieu_date_devis($devis, $column, htmlentities(rtrim($data)), $idNextcloud);
} else if(strcmp($table, "ligne_trajet")==0 && (strcmp($column, "id_devis")==0 || strcmp($column, "date")==0 || strcmp($column, "id_lieu")==0 || strcmp($column, "rang")==0)) {
$ligne_trajet = json_decode($this->getOneTrajetdetails($id, $idNextcloud))[0];
$this->update_lieu_date_devis_rang_ligneTrajet($ligne_trajet, $column, htmlentities(rtrim($data)), $idNextcloud);
} else {
$sql = "UPDATE ".$this->tableprefix.$table." SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array(trim($data), $id));
}
return true;
}
return false;
}
public function init_trajets_data($idNextcloud) {
// supprimer d'abord les lignes de trajet ainsi que les trajets existants
$sqldeletelignetrajet = "DELETE FROM ".$this->tableprefix."ligne_trajet;";
$this->execSQLNoData($sqldeletelignetrajet, array());
$sqldeletetrajet = "DELETE FROM ".$this->tableprefix."trajet;";
$this->execSQLNoData($sqldeletetrajet, array());
//recuperer tous les trajets
// $all_devis = json_decode($this->getDevisEmmanuelle($idNextcloud));
$all_devis = json_decode($this->getDevis($idNextcloud));
foreach ($all_devis as $key => $devis) {
if($devis->id_lieu != NULL) {
$this->update_lieu_date_devis($devis, 'id_lieu', $devis->id_lieu, $idNextcloud);
}
}
}
public function createDevisTrajetFromVCalendar($devisId,$idNextcloud = "admin"){
$devis = json_decode($this->getOneDevis($devisId, $idNextcloud))[0];
$this->generate_ligneTrajet($devis, $idNextcloud);
$ligne_trajet = json_decode(json: $this->getOneTrajetdetails_byIdDevis($devis->devisid, $idNextcloud))[0];
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud,$devis->devisid);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
}
/**
* update lieu et date devis
*/
public function update_lieu_date_devis($devis, $column, $data, $idNextcloud) {
$ligne_trajet = json_decode($this->getOneTrajetdetails_byIdDevis($devis->devisid, $idNextcloud))[0];
switch ($column) {
case 'id_client':
$sql = "UPDATE ".$this->tableprefix."devis SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $devis->devisid));
$updated_devis = json_decode($this->getOneDevis($devis->devisid, $idNextcloud))[0];
if($ligne_trajet != NULL) { // si il existe déja une ligne trajet
$sql = "UPDATE ".$this->tableprefix."ligne_trajet SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $ligne_trajet->id));
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
} else {
if($updated_devis->id_lieu!=0) {
// ajouter le devis dans trajet s'il n'existe pas encore
$this->generate_ligneTrajet($updated_devis, $idNextcloud);
$ligne_trajet = json_decode($this->getOneTrajetdetails_byIdDevis($updated_devis->devisid, $idNextcloud))[0];
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
}
}
break;
case 'date':
$sql = "UPDATE ".$this->tableprefix."devis SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $devis->devisid));
$updated_devis = json_decode($this->getOneDevis($devis->devisid, $idNextcloud))[0];
if($devis->id_lieu!=NULL) {
if(strcmp(explode('-', $devis->date)[1], explode('-', $updated_devis->date)[1]) != 0) { // si le mois a changé
// deplacer la ligne de trajet
if($ligne_trajet != NULL) $this->gestion_delete('ligne_trajet', $ligne_trajet->id, $idNextcloud);
$this->generate_ligneTrajet($updated_devis, $idNextcloud);
$ligne_trajet = json_decode($this->getOneTrajetdetails_byIdDevis($updated_devis->devisid, $idNextcloud))[0];
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
} else {
// mettre a jour ligne_trajet
if($ligne_trajet != NULL) {
$sql = "UPDATE ".$this->tableprefix."ligne_trajet SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $ligne_trajet->id));
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
}
}
}
break;
case 'id_lieu':
// mettre a jour devis et ligne_trajet
$sql = "UPDATE ".$this->tableprefix."devis SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $devis->devisid));
$updated_devis = json_decode($this->getOneDevis($devis->devisid, $idNextcloud))[0];
if($ligne_trajet != NULL) {
$sql = "UPDATE ".$this->tableprefix."ligne_trajet SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $ligne_trajet->id));
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
} else {
if($updated_devis->id_lieu!=0 && $updated_devis->id_thanato!=0) {
// ajouter le devis dans trajet s'il n'existe pas encore
$this->generate_ligneTrajet($updated_devis, $idNextcloud);
$ligne_trajet = json_decode($this->getOneTrajetdetails_byIdDevis($updated_devis->devisid, $idNextcloud))[0];
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
}
}
break;
case 'id_thanato':
// mettre a jour devis et ligne_trajet
$sql = "UPDATE ".$this->tableprefix."devis SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $devis->devisid));
$updated_devis = json_decode($this->getOneDevis($devis->devisid, $idNextcloud))[0];
if($ligne_trajet != NULL) {
$this->gestion_delete('ligne_trajet', $ligne_trajet->id, $idNextcloud);
}
$this->generate_ligneTrajet($updated_devis, $idNextcloud);
$ligne_trajet = json_decode($this->getOneTrajetdetails_byIdDevis($updated_devis->devisid, $idNextcloud))[0];
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
break;
}
}
public function update_lieu_date_devis_rang_ligneTrajet($ligne_trajet, $column, $data, $idNextcloud) {
switch ($column) {
case 'id_devis':
$current_devis = json_decode($this->getOneDevis($data, $idNextcloud))[0];
$this->update_ligneTrajet('ligne_trajet', 'id_devis', $current_devis->devisid, $ligne_trajet->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'date', $current_devis->date, $ligne_trajet->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'id_client', $current_devis->id_client, $ligne_trajet->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'id_lieu', $current_devis->id_lieu, $ligne_trajet->id, $idNextcloud);
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
break;
case 'id_lieu':
$this->update_ligneTrajet('ligne_trajet', 'id_lieu', $data, $ligne_trajet->id, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
break;
case 'date':
$this->update_ligneTrajet('ligne_trajet', 'date', $data, $ligne_trajet->id, $idNextcloud);
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
break;
case 'rang':
$ligneTrajet_surLeRang = json_decode($this->getOneTrajetdetails_byRang($ligne_trajet->id_trajet, $data, $idNextcloud))[0];
if($ligneTrajet_surLeRang != NULL) {
$this->update_ligneTrajet('ligne_trajet', 'rang', intval($data), $ligne_trajet->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'rang', intval($data)+1, $ligneTrajet_surLeRang->id, $idNextcloud);
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
} else {
$this->update_ligneTrajet('ligne_trajet', 'rang', $data, $ligne_trajet->id, $idNextcloud);
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
}
break;
}
}
/**
* generer une ligne de trajet par un devis
*/
public function generate_ligneTrajet($devis, $idNextcloud) {
$date_devis_split = explode('-', $devis->date);
// creer le trajet s'il n'existe pas
$trajet = json_decode($this->getOneTrajet_byThanatoMonthYear($devis->id_thanato, $date_devis_split[1], $date_devis_split[0]))[0];
if($trajet == NULL) {
$this->insertTrajet($devis->id_thanato, $date_devis_split[1], $date_devis_split[0], $idNextcloud);
$trajet = json_decode($this->getOneTrajet_byThanatoMonthYear($devis->id_thanato, $date_devis_split[1], $date_devis_split[0]))[0];
}
$this->insertTrajetdetails_byDevis($trajet->id, $devis, $idNextcloud);
}
/**
* ranger les lignes de trajet dans un trajet par date et par rang
* inserer ligne siege au debut et fin de chaque journee s'il n'existe pas
*/
public function range_ligneTrajet($id_trajet, $idNextcloud,$devisId = 0) {
$lignes = json_decode($this->getTrajetsdetails_orderByDate($id_trajet, $idNextcloud));
$nb_jour = 0;
if(sizeof($lignes)>0) {
$nb_jour = 1;
$dates = array(0=>$lignes[0]->date);
$date_temp = $lignes[0]->date;
foreach ($lignes as $key => $ligne) {
if(strcmp($date_temp, string2: $ligne->date)!=0) {
$date_temp = $ligne->date;
array_push($dates, $date_temp);
$nb_jour++;
}
}
// on verifie si le nombre de ligne ets correspond à 2*nb_jour (debut et fin de journee)
$reste = (2*$nb_jour) - (sizeof(array_filter($lignes, function($ligne) {return strcmp($ligne->source,'siege')==0;})));
while ($reste>0) {
$this->insertTrajetdetails_h2f($id_trajet, $lignes[0]->date, $idNextcloud,$idNextcloud,$devisId);
$reste--;
}
$current_lines = json_decode($this->getTrajetsdetails_orderByDate($id_trajet, $idNextcloud));
// ici le nombre de ligne h2f est egale au nb_jour*2
$array_siege = array();
foreach ($current_lines as $key => $ligne) {
if(strcmp($ligne->source,'siege')==0) array_push($array_siege, $ligne);
}
$j=0;
for ($i=0; $i < sizeof($dates); $i++) {
$this->update_ligneTrajet('ligne_trajet', 'rang', 0, $array_siege[$j]->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'date', $dates[$i], $array_siege[$j]->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'rang', sizeof($current_lines)+1, $array_siege[$j+1]->id, $idNextcloud);
$this->update_ligneTrajet('ligne_trajet', 'date', $dates[$i], $array_siege[$j+1]->id, $idNextcloud);
$j+=2;
}
$ordered_lines = json_decode($this->getTrajetsdetails_orderByDate($id_trajet, $idNextcloud));
foreach ($ordered_lines as $key => $line) {
$this->update_ligneTrajet('ligne_trajet', 'rang', $key+1, $line->id, $idNextcloud);
}
}
}
public function update_ligneTrajet($table, $column, $data, $id, $idNextcloud){
if(in_array($table, $this->whiteTable) && in_array($column, $this->whiteColumn)){
$sql = "UPDATE ".$this->tableprefix.$table." SET $column = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($data, $id));
}
}
public function calculer_distance_trajet($numtrajet, $idNextcloud) {
$trajetdetails = json_decode($this->getTrajetsdetails_orderByDate($numtrajet, $idNextcloud));
$distance_temp = 0;
$distances = array();
$last_point = NULL;
for ($i=0; $i < sizeof($trajetdetails); $i++) {
if(strcmp(explode('-', $trajetdetails[$i]->date)[2], explode('-', $trajetdetails[$i+1]->date)[2])!=0) {
array_push($distances, $distance_temp);
$distance_temp = 0;
$last_point = NULL;
} else {
if($trajetdetails[$i]->lid != NULL) $last_point = $trajetdetails[$i];
if($last_point->lid != NULL && $trajetdetails[$i+1]->lid != NULL) $distance_temp += $this->calcul_distance(floatval($last_point->latitude), floatval($last_point->longitude), floatval($trajetdetails[$i+1]->latitude), floatval($trajetdetails[$i+1]->longitude));
}
}
if(sizeof($trajetdetails)>1 && sizeof($distances)==0) array_push($distances, $distance_temp);
$distance_final = 0;
foreach ($distances as $key => $valdistance) {
$distance_final += $valdistance;
}
$sql = "UPDATE ".$this->tableprefix."trajet SET `distance` = ? WHERE `id` = ?";
$this->execSQLNoData($sql, array($distance_final, $numtrajet));
}
public function getOneTrajet_byThanatoMonthYear($id_thanato, $mois, $annee) {
$sql = "SELECT " . $this->tableprefix . "trajet.id, " . $this->tableprefix . "trajet.distance, " . $this->tableprefix . "trajet.date, " . $this->tableprefix . "trajet.mois, " . $this->tableprefix . "trajet.annee
FROM " . $this->tableprefix . "trajet
WHERE " . $this->tableprefix . "trajet.annee = " . $annee . " AND " . $this->tableprefix . "trajet.mois = " . $mois . " AND " . $this->tableprefix . "trajet.id_thanato = " . $id_thanato . ";";
return $this->execSQL($sql, array());
}
public function recuperer_adresse($latitude, $longitude) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.geoapify.com/v1/geocode/reverse?lat='.$latitude.'&lon='.$longitude.'&format=json&apiKey=8dadbe28a8894e9ebb7d0d1053b743f4',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$response = curl_exec($curl);
curl_close($curl);
// Vérifiez s'il y a eu une erreur lors de la requête cURL
if ($response === false) {
return '';
} else {
return (json_decode($response)->results)[0]->formatted;
}
}
/**
* Calcul la distance entre les deux points à vol d'oiseau
*/
public function calcul_distance($lat1, $lon1, $lat2, $lon2) {
$R = 6371; // Rayon moyen de la Terre en kilomètres
$dLat = deg2rad($lat2 - $lat1);
$dLon = deg2rad($lon2 - $lon1);
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$d = $R * $c;
return round($d, 2);
}
/**
* Verification si la valeur d'un coordonnees est valide
*/
private function is_valid_gps($latitude, $longitude) {
// Vérifie si les valeurs sont des nombres décimaux valides entre -90 et 90 pour la latitude et -180 et 180 pour la longitude
if (is_numeric($latitude) && is_numeric($longitude) && $latitude >= -90 && $latitude <= 90 && $longitude >= -180 && $longitude <= 180) {
return true;
} else {
return false;
}
}
/**
* DELETE
*/
public function gestion_delete($table, $id, $idNextcloud){
if(in_array($table, $this->whiteTable)){
if(strcmp($table, "ligne_trajet")==0) {
$distance = 0;
$ligne_trajet = json_decode($this->getOneTrajetdetails($id, $idNextcloud))[0];
$sql = "DELETE FROM ".$this->tableprefix.$table." WHERE `id` = ?";
$this->execSQLNoData($sql, array($id));
$this->range_ligneTrajet($ligne_trajet->id_trajet, $idNextcloud);
$this->calculer_distance_trajet($ligne_trajet->id_trajet, $idNextcloud);
} else {
$sql = "DELETE FROM ".$this->tableprefix.$table." WHERE `id` = ?";
$this->execSQLNoData($sql, array($id));
}
return true;
}
return false;
}
/**
* Check
* TODO Translation
*/
public function checkConfig($idNextcloud){
$sql = "SELECT count(*) as res FROM `".$this->tableprefix."configuration` WHERE `id_nextcloud` = ?";
$res = json_decode($this->execSQL($sql, array($idNextcloud)))[0]->res;
if ( $res < 1 ){
$sql = "INSERT INTO `".$this->tableprefix."configuration` (`entreprise`, `nom`, `prenom`, `legal_one`, `legal_two`, `mail`, `telephone`, `adresse`, `path`, `id_nextcloud`,`mentions_default`,`tva_default`,`devise`,`facture_prefixe`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, '', ?, ?, '0',?,?);";
$this->execSQLNoData($sql, array($this->l->t('Your company name'),
$this->l->t('Your company contact last name'),
$this->l->t('Your company contact first name'),
$this->l->t('Company legal information line one'),
$this->l->t('Company legal information line two'),
$this->l->t('Your company email'),
$this->l->t('Your company phone'),
$this->l->t('Your company address'),
$idNextcloud,
$this->l->t('All Legal mentions, disclaimer or everything you want to place in the footer.'),
$this->l->t('EUR'),
$this->l->t('INVOICE')
)
);
}
return $res;
}
public function isConfig($idNextcloud){
$changelog = 9; //+1 if you want changelog appear for everybody one time !
$sql = "SELECT count(*) as res FROM `".$this->tableprefix."configuration` WHERE `id_nextcloud` = ?";
$res = json_decode($this->execSQL($sql, array($idNextcloud)))[0]->res;
// Utilisateur jamais utilisé l'application
if ( $res < 1 ){
return false;
}else{
$sql = "SELECT id as id, changelog as res FROM `".$this->tableprefix."configuration` WHERE `id_nextcloud` = ?";
$res = json_decode($this->execSQL($sql, array($idNextcloud)))[0]->res;
$id = json_decode($this->execSQL($sql, array($idNextcloud)))[0]->id;
if($res < $changelog){
$this->gestion_update("configuration","changelog",$changelog,$id,$idNextcloud);
return false;
}else{
return true;
}
}
}
/**
* Number client
*/
public function numberClient($idNextcloud){
// $sql = "SELECT count(*) as c from ".$this->tableprefix."client WHERE `id_nextcloud` = ?;";
$sql = "SELECT count(*) as c from ".$this->tableprefix."client;";
return $this->execSQL($sql, array());
// return $this->execSQL($sql, array($idNextcloud));
}
/**
* Number thanatopracteur
*/
public function numberThanato($idNextcloud){
// $sql = "SELECT count(*) as c from ".$this->tableprefix."thanato WHERE `id_nextcloud` = ?;";
$sql = "SELECT count(*) as c from ".$this->tableprefix."thanato;";
return $this->execSQL($sql, array());
// return $this->execSQL($sql, array($idNextcloud));
}
/**
* Number devis
*/
public function numberDevis($idNextcloud){
// $sql = "SELECT count(*) as c from ".$this->tableprefix."devis WHERE `id_nextcloud` = ? AND `mentions` NOT LIKE 'factur&eacute;';";
// $sql = "SELECT count(*) as c from ".$this->tableprefix."devis WHERE `mentions` NOT LIKE 'factur&eacute;';";
$sql = "SELECT count(*) as c from ".$this->tableprefix."devis;";
// $sql = "SELECT count(*) as c from ".$this->tableprefix."devis WHERE `id_nextcloud` = ?;";
// return $this->execSQL($sql, array($idNextcloud));
return $this->execSQL($sql, array());
}
/**
* Number facture
*/
public function numberFacture($idNextcloud){
// $sql = "SELECT count(*) as c from ".$this->tableprefix."facture WHERE `id_nextcloud` = ?;";
$sql = "SELECT count(*) as c from ".$this->tableprefix."facture;";
// return $this->execSQL($sql, array($idNextcloud));
return $this->execSQL($sql, array());
}
/**
* Number lieu
*/
public function numberLieu($idNextcloud){
$sql = "SELECT count(*) as c from ".$this->tableprefix."lieu;";
return $this->execSQL($sql, array());
}
/**
* Number trajet
*/
public function numberTrajet($idNextcloud){
$sql = "SELECT count(*) as c from ".$this->tableprefix."trajet;";
return $this->execSQL($sql, array());
}
/**
* Number produit
*/
public function numberProduit($idNextcloud){
// $sql = "SELECT count(*) as c from ".$this->tableprefix."produit WHERE `id_nextcloud` = ?;";
$sql = "SELECT count(*) as c from ".$this->tableprefix."produit;";
// return $this->execSQL($sql, array($idNextcloud));
return $this->execSQL($sql, array());
}
/**
* Number article
*/
public function numberArticle($idNextcloud){
$sql = "SELECT count(*) as c from ".$this->tableprefix."article;";
return $this->execSQL($sql, array());
}
/**
* Number défunt
*/
public function numberDefunt($idNextcloud, $isUserThanatoOnly = false){
$defuntCount = 0;
if($isUserThanatoOnly == false){
$sql = "SELECT count(*) as c from ".$this->tableprefix."defunt;";
$defuntCountBythanato = $this->execSQLNoJsonReturn($sql, array());
if(!empty($defuntCountBythanato)){
$defuntCount = $defuntCountBythanato[0]['c'];
}
}
else{
$thanato = $this->getThanatoByIdNextcloud($idNextcloud);
if($thanato != null){
$thanatoId = $thanato["id"];
$defuntsIdRelatedToThanato = $this->getDefuntIdsRelatedToThanato($thanatoId);
$defuntCount = count($defuntsIdRelatedToThanato);
}
}
return $defuntCount;
}
/**
* Number bibliotheque
*/
public function numberBibliotheque($idNextcloud){
$sql = "SELECT count(*) as c from ".$this->tableprefix."bibliotheque;";
return $this->execSQL($sql, array());
}
/**
* Annual turnover per month without VAT
*/
public function getAnnualTurnoverPerMonthNoVat($idNextcloud){
$sql = "SELECT
EXTRACT(YEAR FROM facture.date_paiement) AS y,
EXTRACT(MONTH FROM facture.date_paiement) AS m,
SUM(
COALESCE(client_group_discount.ht_amount,produit.prix_unitaire)
* produit_devis.quantite
) AS total
FROM ".$this->tableprefix."facture AS facture
JOIN ".$this->tableprefix."produit_devis AS produit_devis
ON facture.id_devis = produit_devis.devis_id
JOIN ".$this->tableprefix."produit AS produit
ON produit_devis.produit_id = produit.id
JOIN ".$this->tableprefix."devis AS devis
ON facture.id_devis = devis.id
JOIN ".$this->tableprefix."client AS client
ON devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."client_group AS client_group
ON client.fk_client_group_id = client_group.id
LEFT JOIN ".$this->tableprefix."client_group_discount AS client_group_discount
ON client_group.id = client_group_discount.fk_client_group_id
AND produit.id = client_group_discount.fk_produit_id
GROUP BY
EXTRACT(YEAR FROM facture.date_paiement),
EXTRACT(MONTH FROM facture.date_paiement)
ORDER BY
EXTRACT(YEAR FROM facture.date_paiement) DESC,
EXTRACT(MONTH FROM facture.date_paiement);";
return $this->execSQL($sql, array());
}
public function getStatArticleAnnuel($idNextcloud, $annee) {
$sql = "SELECT p.id, p.reference,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 1 THEN pd.quantite ELSE 0 END), 0) AS janvier,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 2 THEN pd.quantite ELSE 0 END), 0) AS fevrier,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 3 THEN pd.quantite ELSE 0 END), 0) AS mars,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 4 THEN pd.quantite ELSE 0 END), 0) AS avril,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 5 THEN pd.quantite ELSE 0 END), 0) AS mai,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 6 THEN pd.quantite ELSE 0 END), 0) AS juin,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 7 THEN pd.quantite ELSE 0 END), 0) AS juillet,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 8 THEN pd.quantite ELSE 0 END), 0) AS aout,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 9 THEN pd.quantite ELSE 0 END), 0) AS septembre,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 10 THEN pd.quantite ELSE 0 END), 0) AS octobre,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 11 THEN pd.quantite ELSE 0 END), 0) AS novembre,
COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 12 THEN pd.quantite ELSE 0 END), 0) AS decembre
FROM ".$this->tableprefix."produit p
LEFT JOIN ".$this->tableprefix."produit_devis pd ON p.id = pd.produit_id
LEFT JOIN ".$this->tableprefix."devis d ON pd.devis_id = d.id
LEFT JOIN ".$this->tableprefix."facture f ON f.id_devis = d.id
WHERE YEAR(f.date_paiement) = ".$annee." AND pd.devis_id IS NOT NULL
GROUP BY p.id, p.reference;";
return $this->execSQL($sql, array());
}
public function getStatSoinsThanatoAnnuel($idNextcloud, $annee) {
$sql = "SELECT
thanato.nom AS nom_thanato,
thanato.prenom AS prenom_thanato,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 1 THEN 1 ELSE 0 END), 0) AS janvier,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 2 THEN 1 ELSE 0 END), 0) AS fevrier,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 3 THEN 1 ELSE 0 END), 0) AS mars,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 4 THEN 1 ELSE 0 END), 0) AS avril,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 5 THEN 1 ELSE 0 END), 0) AS mai,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 6 THEN 1 ELSE 0 END), 0) AS juin,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 7 THEN 1 ELSE 0 END), 0) AS juillet,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 8 THEN 1 ELSE 0 END), 0) AS aout,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 9 THEN 1 ELSE 0 END), 0) AS septembre,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 10 THEN 1 ELSE 0 END), 0) AS octobre,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 11 THEN 1 ELSE 0 END), 0) AS novembre,
COALESCE(SUM(CASE WHEN MONTH(d.date) = 12 THEN 1 ELSE 0 END), 0) AS decembre
FROM ".$this->tableprefix."devis d
LEFT JOIN ".$this->tableprefix."facture f ON f.id_devis = d.id
LEFT JOIN ".$this->tableprefix."thanato thanato ON d.id_thanato = thanato.id
WHERE YEAR(d.date) = ".$annee." AND d.id_thanato IS NOT NULL
AND thanato.id IS NOT NULL
GROUP BY nom_thanato, prenom_thanato
ORDER BY nom_thanato;";
return $this->execSQL($sql, array());
}
public function getStatSoinsThanatoWeekend($idNextcloud, $annee, $mois) {
/**
* stat nombre de soins samedis et dimanches
* */
// $sql = "SELECT
// thanato.nom AS nom_thanato,
// thanato.prenom AS prenom_thanato,
// SUM(CASE WHEN DAYOFWEEK(DISTINCT d.date) = 1 THEN 1 ELSE 0 END) AS sunday,
// SUM(CASE WHEN DAYOFWEEK(DISTINCT d.date) = 7 THEN 1 ELSE 0 END) AS saturday,
// SUM(CASE WHEN DAYOFWEEK(DISTINCT d.date) IN (1, 7) THEN 1 ELSE 0 END) AS total_devis
// FROM ".$this->tableprefix."devis d
// LEFT JOIN ".$this->tableprefix."facture f ON f.id_devis = d.id
// LEFT JOIN ".$this->tableprefix."thanato thanato ON d.id_thanato = thanato.id
// WHERE MONTH(d.date) = ".$mois." AND YEAR(d.date) = ".$annee."
// GROUP BY nom_thanato, prenom_thanato;";
/**
* stat nombre de jours travaillés les weekends d'un mois
* */
$sql = "SELECT
thanato.id,
thanato.nom as nom_thanato,
thanato.prenom AS prenom_thanato,
COUNT(DISTINCT DATE_FORMAT(devis.date, '%Y-%m-%d')) AS weekends_travailles
FROM
".$this->tableprefix."thanato as thanato
JOIN
".$this->tableprefix."devis as devis ON thanato.id = devis.id_thanato
WHERE
MONTH(devis.date) = ".$mois."
AND YEAR(devis.date) = ".$annee."
AND DAYOFWEEK(devis.date) IN (1, 7)
GROUP BY
thanato.id, nom_thanato, prenom_thanato;";
return $this->execSQL($sql, array());
}
/**
* Get last insert id
*/
public function lastinsertid($table,$idNextcloud){
// $sql = "SELECT max(user_id) as LAST_INSERT_ID FROM `" . $this->tableprefix . $table . "` WHERE " . $this->tableprefix . $table .".id_nextcloud = ?;";
// $res = $this->execSQLNoJsonReturn($sql,array($idNextcloud));
$sql = "SELECT max(user_id) as LAST_INSERT_ID FROM `" . $this->tableprefix . $table. "`;";
$res = $this->execSQLNoJsonReturn($sql,array());
return $res[0]['LAST_INSERT_ID'];
}
public function lastNumFacture($idNextcloud) {
$lastFactureId = $this->getLastFactureId();
return $lastFactureId;
}
private function getLastFactureId(){
$sql = "SELECT
max(facture.id) as LAST_FACTURE_ID FROM "
. $this->tableprefix."facture as facture;";
$res = $this->execSQLNoJsonReturn($sql,[]);
$lastId = 0;
if(!empty($res)){
$lastId = $res[0]['LAST_FACTURE_ID'];
}
return $lastId;
}
public function backup(){
$res = array();
$res[] = array("===client===");
$sql = "SELECT * FROM ".$this->tableprefix."client";
$res = array_merge($res, $this->execSQLNoJsonReturn($sql, array()));
$res[] = array("===devis===");
$sql = "SELECT * FROM ".$this->tableprefix."devis";
$res = array_merge($res,$this->execSQLNoJsonReturn($sql, array()));
$res[] = array("===facture===");
$sql = "SELECT * FROM ".$this->tableprefix."facture";
$res = array_merge($res,$this->execSQLNoJsonReturn($sql, array()));
$res[] = array("===produit===");
$sql = "SELECT * FROM ".$this->tableprefix."produit";
$res = array_merge($res,$this->execSQLNoJsonReturn($sql, array()));
$res[] = array("===produit_devis===");
$sql = "SELECT * FROM ".$this->tableprefix."produit_devis";
$res = array_merge($res,$this->execSQLNoJsonReturn($sql, array()));
$res[] = array("===configuration===");
$sql = "SELECT * FROM ".$this->tableprefix."configuration";
$res = array_merge($res,$this->execSQLNoJsonReturn($sql, array()));
return $res;
}
/**
* @sql
* @array() //prepare statement
*/
private function execSQL($sql, $conditions){
$stmt = $this->pdo->prepare($sql);
$stmt->execute($conditions);
$data = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$stmt->closeCursor();
return json_encode($data);
}
private function execSQLNoData($sql, $conditions){
$stmt = $this->pdo->prepare($sql);
$stmt->execute($conditions);
$stmt->closeCursor();
}
private function execSQLNoJsonReturn($sql, $conditions){
$stmt = $this->pdo->prepare($sql);
$stmt->execute($conditions);
$data = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$stmt->closeCursor();
return $data;
}
private function getThanatoDevisListByDate($thanatoId,$date){
$dateFormatted = $date->format('Y-m-d');
$sql = "SELECT
devis.id,
devis.date,
devis.mentions,
devis.num as calendar_uuid,
devis.id_defunt as id_defunt,
devis.id_lieu as id_lieu,
devis.id_client as id_client,
devis.id_thanato as id_thanato,
thanato.nom as nom_thanato,
thanato.prenom as prenom_thanato,
defunt.nom as nom_defunt,
lieu.nom as nom_lieu,
lieu.latitude as lieu_latitude,
lieu.longitude as lieu_longitude,
client.nom as nom_client,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
facture.num as facture_num
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."facture as facture on devis.id = facture.id_devis
WHERE devis.date = ? AND
devis.id_thanato = ? AND
(devis.mentions = ? OR devis.mentions = ?)
ORDER BY devis.date ASC;";
$devisList = $this->execSQLNoJsonReturn(
$sql,
[$dateFormatted,$thanatoId,DevisMentionConstant::FACTURED,DevisMentionConstant::FACTURED_FORMATTED]);
return $devisList;
}
public function getThanatoById($thanatoId){
$sql = "SELECT id, nom, prenom,fk_user_uuid FROM ".$this->tableprefix."thanato WHERE id = ? LIMIT 1;";
$thanato = $this->execSQLNoJsonReturn($sql,[$thanatoId]);
if(!empty($thanato)){
return $thanato[0];
}
return null;
}
private function getCalendarByThanatoIdNextcloud($idNextCloud){
$searchString = "%principals/users/$idNextCloud%";
$sql = "SELECT * FROM ".self::DEFAULT_TABLE_PREFIX."calendars as calendar WHERE calendar.principaluri LIKE ? LIMIT 1;";
$calendar = $this->execSQLNoJsonReturn($sql,[$searchString]);
if(!empty($calendar)){
return $calendar[0];
}
return null;
}
private function getThanatoLeaveByCalendarAndDate($calendarId,$date){
$datetimeFormatted = $date->format('Ymd');
$dateCondition = "%DTSTART%".$datetimeFormatted."%";
$isLeaveConditionAsString = "%".BddConstant::ISLEAVEPROPERTYONVCALENDAR.":1%";
$sql = "SELECT * FROM ".self::DEFAULT_TABLE_PREFIX."calendarobjects as calendarobject WHERE
calendarobject.calendarid = ? AND
calendarobject.calendardata LIKE ? AND
calendarobject.calendardata LIKE ? AND
calendarobject.deleted_at IS NULL;";
$leaves = $this->execSQLNoJsonReturn($sql,[$calendarId,$isLeaveConditionAsString,$dateCondition]);
return $leaves;
}
public function getThanatoDevisPerDateInAMonthYear($thanatoId,$month,$year){
$dateOfMonths = DateHelpers::getDatesOfMonth($year,$month);
$devisListPerThanatoPerDate = [];
$thanato = $this->getThanatoById($thanatoId);
$thanatoName = $thanato["nom"];
$thanatoCalendar = $this->getCalendarByThanatoIdNextcloud($thanato["fk_user_uuid"] ?? $thanato["nom"]);
if($thanatoCalendar == null){
return [];
}
$thanatoCalendarId = $thanatoCalendar["id"];
foreach($dateOfMonths as $currentDate){
$currentDateFormatted = $currentDate->format('Y-m-d');
$isPublicHoliday = DateHelpers::isPublicHoliday($currentDateFormatted);
$devisList = $this->getThanatoDevisListByDate($thanatoId,$currentDate);
$thereIsNoDevisForCurrentDate = empty($devisList);
if($thereIsNoDevisForCurrentDate){
$devisListPerThanatoPerDate[$currentDateFormatted]["hasDevis"] = false;
$thanatoLeavesThisDay = $this->getThanatoLeaveByCalendarAndDate($thanatoCalendarId,$currentDate);
if(empty($thanatoLeavesThisDay)){
$devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [
"onLeave" => false,
"startTime" => null,
"endTime" => null,
"thanatoName"=>$thanatoName,
"date" => $currentDateFormatted,
"totalHours" => 0,
"totalWorkedHours" => 8,
"isPublicHoliday" => $isPublicHoliday
];
}
else{
foreach($thanatoLeavesThisDay as $currentLeave){
$leaveTime = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($currentLeave['calendardata']);
$devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [
"onLeave" => true,
"startTime" => $leaveTime["startTime"],
"endTime" => $leaveTime["endTime"],
"thanatoName"=>$thanatoName,
"date" => $currentDateFormatted,
"totalHours" => $leaveTime["totalHours"],
"totalWorkedHours" => $leaveTime["totalWorkedHours"],
"isPublicHoliday" => $isPublicHoliday
];
}
}
}
else{
foreach($devisList as $devis){
$devis = $this->setDevisStartAndEndTime($devis);
$devis = $this->setDevisIsPublicHolidayOrNotText($devis);
$devis = $this->setDevisProduitsList($devis);
if (!isset($devisListPerThanatoPerDate[$currentDateFormatted])) {
$devisListPerThanatoPerDate[$currentDateFormatted] = [
'total_distance' => 0,
"devis" => [],
"devisId" => [],
"hasDevis" => true,
"leaves" => []
];
}
$devisListPerThanatoPerDate[$currentDateFormatted]["devis"][] = $devis;
$devisListPerThanatoPerDate[$currentDateFormatted]["devisId"][] = $devis['id'];
}
$devisListPerThanatoPerDate[$currentDateFormatted]["leaves"] = [];
$thanatoLeavesThisDay = $this->getThanatoLeaveByCalendarAndDate($thanatoCalendarId,$currentDate);
foreach($thanatoLeavesThisDay as $currentLeave){
$leaveTime = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($currentLeave['calendardata']);
$devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [
"onLeave" => true,
"startTime" => $leaveTime["startTime"],
"endTime" => $leaveTime["endTime"],
"thanatoName"=>$thanatoName,
"date" => $currentDateFormatted,
"totalHours" => $leaveTime["totalHours"],
"totalWorkedHours" => $leaveTime["totalWorkedHours"],
"isPublicHoliday" => $isPublicHoliday
];
}
}
}
return $devisListPerThanatoPerDate;
}
public function getExportThanatoStatisticData($thanatoId,$month,$year){
$devisList = $this->getThanatoDevisPerDateInAMonthYear($thanatoId,$month,$year);
return $devisList;
}
public function getProduitsDevisByDevisId($devisId){
$sql = "SELECT
produit_devis.id as produit_devis_id,
produit.id as produit_id,
produit.reference as produit_reference,
produit.description as produit_description
FROM ".$this->tableprefix."produit_devis as produit_devis
LEFT JOIN ".$this->tableprefix."produit as produit on produit_devis.produit_id = produit.id
WHERE produit_devis.devis_id = ?;";
$produitsList = $this->execSQLNoJsonReturn(
$sql,
[$devisId]);
$finalProduitList = [];
foreach($produitsList as $produit){
if($produit['produit_id'] != null){
$finalProduitList[] = $produit;
}
}
return $finalProduitList;
}
private function getDevisListGroupedByDateAndThenByThanato(array $devisListPerDate){
$devisListGroupedByThanatoAndThenByDate = [];
foreach($devisListPerDate as $date => $devisList){
foreach($devisList as $devis){
$devisDate = $devis["date"];
$devisThanatoId = $devis["id_thanato"];
$devis = $this->setDevisStartAndEndTime($devis);
$devis = $this->setDevisIsPublicHolidayOrNotText($devis);
$devis = $this->setDevisProduitsList($devis);
//set devis articles list into devis data
if (!isset($devisListGroupedByThanatoAndThenByDate[$devisThanatoId])) {
$devisListGroupedByThanatoAndThenByDate[$devisThanatoId] = [];
}
if (!isset($devisListGroupedByThanatoAndThenByDate[$devisThanatoId][$devisDate])) {
$devisListGroupedByThanatoAndThenByDate[$devisThanatoId][$devisDate] = [
'total_distance' => 0,
"devis" => [],
"devisId" => []
];
}
$devisListGroupedByThanatoAndThenByDate[$devisThanatoId][$date]["devis"][] = $devis;
$devisListGroupedByThanatoAndThenByDate[$devisThanatoId][$date]["devisId"][] = $devis['id'];
}
}
return $devisListGroupedByThanatoAndThenByDate;
}
private function setDevisProduitsList($devis){
$produitsList = $this->getProduitsDevisByDevisId($devis['id']);
foreach($produitsList as $produit){
if (!isset($devis['produits'])) {
$devis['produits'] = [];
}
$devis['produits'][] = $produit;
}
return $devis;
}
private function setDevisIsPublicHolidayOrNotText($devis){
$isPublicHoliday = DateHelpers::isPublicHoliday($devis['date']);
$devis["dayType"] = DateHelpers::getPublicHolidayText($isPublicHoliday);
return $devis;
}
public function setDevisStartAndEndTime($devis){
$calendarData = $this->getCalendarDataByCalendarObjectUuid($devis["calendar_uuid"]);
$devisTimeValue = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($calendarData);
$devis["startTime"] = $devisTimeValue["startTime"];
$devis["endTime"] = $devisTimeValue["endTime"];
$devis["totalHours"] = $devisTimeValue["totalHours"];
$devis["totalWorkedHours"] = $devisTimeValue["totalWorkedHours"];
return $devis;
}
public function getRouteLinesByDevisIdList(array $devisIdList){
if(empty($devisIdList)){
return [];
}
$sqlConditionsPlaceholder = implode(',', array_fill(0, count($devisIdList), '?'));
$sql = "SELECT ligne_trajet.id, ligne_trajet.rang, ligne_trajet.id_nextcloud, ligne_trajet.date,
ligne_trajet.user_id, ligne_trajet.commentaire, ligne_trajet.source,
lieu.id as lieu_id, lieu.nom as lieu, lieu.latitude as latitude, lieu.longitude as longitude
FROM (".$this->tableprefix."ligne_trajet as ligne_trajet
LEFT JOIN ".$this->tableprefix."lieu as lieu on ligne_trajet.id_lieu = lieu.id)
WHERE ligne_trajet.id_devis IN ($sqlConditionsPlaceholder)
ORDER BY ligne_trajet.date ASC, ligne_trajet.rang ASC;";
return $this->execSQLNoJsonReturn($sql, $devisIdList);
}
private function getDevisListByThanatoIds(array $thanatoIds){
if(empty($thanatoIds)){
return [];
}
$currentYear = date('Y');
$currentMonth = date('m');
$sqlConditionsPlaceholder = implode(',', array_fill(0, count($thanatoIds), '?'));
$sql = "SELECT
devis.id,
devis.date,
devis.mentions,
devis.num as calendar_uuid,
devis.id_defunt as id_defunt,
devis.id_lieu as id_lieu,
devis.id_client as id_client,
devis.id_thanato as id_thanato,
thanato.nom as nom_thanato,
thanato.prenom as prenom_thanato,
defunt.nom as nom_defunt,
lieu.nom as nom_lieu,
lieu.latitude as lieu_latitude,
lieu.longitude as lieu_longitude,
client.nom as nom_client,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
facture.num as facture_num
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."facture as facture on devis.id = facture.id_devis
WHERE YEAR(devis.date) = ? AND
MONTH(devis.date) = ? AND
devis.id_thanato IN ($sqlConditionsPlaceholder) AND
(devis.mentions = ? OR devis.mentions = ?)
ORDER BY devis.date ASC;";
$devisList = $this->execSQLNoJsonReturn(
$sql,
array_merge([$currentYear, $currentMonth],$thanatoIds,[DevisMentionConstant::FACTURED,DevisMentionConstant::FACTURED_FORMATTED]));
return $devisList;
}
public function getCalendarDataByCalendarObjectUuid(string $calendarObjectUuid){
$sql = "SELECT * FROM ".self::DEFAULT_TABLE_PREFIX."calendarobjects WHERE uid = ?;";
$calendarObjectList = $this->execSQLNoJsonReturn($sql, [$calendarObjectUuid]);
if(!empty($calendarObjectList)){
$calendarDataBlob = $calendarObjectList[0]['calendardata'];
$calendarDataString = VCalendarHelpers::ReadVCalendarDataBlob($calendarDataBlob);
return $calendarDataString;
}
return "";
}
public function getCalendarPrincipalNameByCalendarId($calendarId){
$calendar = $this->getCalendarById($calendarId);
if($calendar != null){
$principalUri = $calendar["principaluri"];
$organizerName = str_replace('principals/users/','',$principalUri);
$organizerName = trim($organizerName);
return $organizerName;
}
return null;
}
public function getCalendarOrganizerNameByCalendarObjectUuid(string $calendarObjectUuid){
$calendarObject = $this->getCalendarObjectByUuid($calendarObjectUuid);
if($calendarObject != null){
return $this->getCalendarPrincipalNameByCalendarId($calendarObject['calendarid']);
}
return null;
}
public function getCalendarObjectByUuid(string $calendarObjectUuid){
$sql = "SELECT * FROM ".self::DEFAULT_TABLE_PREFIX."calendarobjects WHERE uid = ?;";
$calendarObjectList = $this->execSQLNoJsonReturn($sql, [$calendarObjectUuid]);
if(!empty($calendarObjectList)){
$calendarData = $calendarObjectList[0];
return $calendarData;
}
return null;
}
public function getCalendarById(int $calendarId){
$sql = "SELECT * FROM ".self::DEFAULT_TABLE_PREFIX."calendars WHERE id = ?;";
$calendarList = $this->execSQLNoJsonReturn($sql, [$calendarId]);
if(!empty($calendarList)){
$calendarData = $calendarList[0];
return $calendarData;
}
return null;
}
public function getProduitDevisByDevisId($devisId){
$sql = "SELECT *
FROM ".$this->tableprefix ."produit_devis as produit_devis
WHERE produit_devis.devis_id = ?;";
$produitDevisList = $this->execSQLNoJsonReturn(
$sql,
[$devisId]);
return $produitDevisList;
}
public function getDevisProduits($devisId){
$sql = "SELECT
produit_devis.id,
produit_devis.produit_id,
produit_devis.quantite,
produit_devis.discount,
produit_devis.devis_id,
produit.prix_unitaire as produit_price,
produit.reference as produit_reference,
produit.description as produit_description,
produit.fk_product_type_id as fk_product_type_id,
produit.vat as produit_vat,
devis.id_client as devis_client_id
FROM ".$this->tableprefix ."produit_devis as produit_devis
LEFT JOIN ".$this->tableprefix."produit as produit on produit_devis.produit_id = produit.id
LEFT JOIN ".$this->tableprefix."devis as devis on produit_devis.devis_id = devis.id
WHERE produit_devis.devis_id = ?;";
$produitList = $this->execSQLNoJsonReturn(
$sql,
[$devisId]);
if(!empty($produitList)){
$clientId = $produitList[0]["devis_client_id"];
$client = $this->getClientById($clientId);
foreach($produitList as &$produit){
$productPrice = $this->getProductPriceByClientGroupId($client['fk_client_group_id'],$produit['produit_id']);
$produit['produit_price'] = $productPrice ?? $produit['produit_price'];
}
}
return $produitList;
}
public function getProductPriceByClientGroupId($clientGroupId,$productId){
$sql = "SELECT *
FROM ".$this->tableprefix ."client_group_discount as client_group_discount
WHERE client_group_discount.fk_client_group_id = ? AND
client_group_discount.fk_produit_id = ?;
";
$clientGroupDiscount = $this->execSQLNoJsonReturn(
$sql,
[$clientGroupId,$productId]);
if(!empty($clientGroupDiscount)){
return $clientGroupDiscount[0]['ht_amount'];
}
return null;
}
private function getProductPriceByClient($productId,$clientId,$productInitialPrice){
$client = $this->getClientById($clientId);
if($client != null){
$productDiscountPrice = $this->getProductPriceByClientGroupId($client['fk_client_group_id'],$productId);
$productInitialPrice = $productDiscountPrice ?? $productInitialPrice;
}
return $productInitialPrice;
}
private function getDevisProductsQuantityByDevisListAndProductId($devisList,$productId){
if(empty($devisList)){
return 0;
}
$sqlConditionsPlaceholder = implode(',', array_fill(0, count($devisList), '?'));
$sql = "SELECT
SUM(produit_devis.quantite) as total_quantity
FROM ".$this->tableprefix ."produit_devis as produit_devis
WHERE produit_devis.devis_id IN ($sqlConditionsPlaceholder) AND
produit_devis.produit_id = ?;";
$produitList = $this->execSQLNoJsonReturn(
$sql,
array_merge($devisList,array($productId)));
if(!empty($produitList)){
return $produitList[0]['total_quantity'];
}
return 0;
}
private function getClientFactureStatisticPerMonth($clientId,array $produitList){
$currentYear = date('Y');
$monthLists = range(1,12);
$data = [] ;
foreach($monthLists as $monthValue){
if(!isset($data[$monthValue])){
$data[$monthValue] = [];
}
$sql = "SELECT
facture.id,
facture.date,
facture.date_paiement,
devis.id as devis_id,
devis.id_client as devis_client_id,
devis.date as devis_date,
devis.mentions as devis_mention
FROM ".$this->tableprefix."facture as facture
LEFT JOIN ".$this->tableprefix."devis as devis on facture.id_devis = devis.id
WHERE YEAR(facture.date_paiement) = ? AND
MONTH(facture.date_paiement) = ? AND
devis.id_client = ? AND
(devis.mentions = ? OR devis.mentions = ?)
ORDER BY facture.date_paiement ASC;";
$factureList = $this->execSQLNoJsonReturn(
$sql,
[$currentYear,$monthValue,$clientId,DevisMentionConstant::FACTURED,DevisMentionConstant::FACTURED_FORMATTED]);
$factureDevisIds = [];
foreach($factureList as $facture){
$factureDevisIds[] = $facture['devis_id'];
}
$defuntCount = count($factureList);
$produitsPrice = 0;
$statisticForeachProductPerMonth = [];
foreach($produitList as $produit){
if(!isset($statisticForeachProductPerMonth[$produit['id']])){
$statisticForeachProductPerMonth[$produit['id']] = 0;
}
$productTotalCount = $this->getDevisProductsQuantityByDevisListAndProductId($factureDevisIds,$produit['id']);
$totalWithoutVat = $productTotalCount * $produit["prix_unitaire"];
$statisticForeachProductPerMonth[$produit['id']] += $productTotalCount;
$produitsPrice += $totalWithoutVat;
}
$data[$monthValue] = [
"defunt_count" => $defuntCount,
"total_price" => $produitsPrice,
"year" => $currentYear,
"products" => $statisticForeachProductPerMonth
];
}
return $data;
}
public function getExportClientStatData(array $clientIds){
$data = [];
$produitList = $this->getProduitsListAsArray();
foreach($clientIds as $clientId){
if(!isset($data[$clientId])){
$data[$clientId] = [];
}
//get client name
$clientName = "Default client name";
$client = $this->getClientById($clientId);
if($client != null){
$clientName = trim($client["client_nom"]) . '-' .trim($client['client_entreprise']);
}
$data[$clientId]["client_name"] = $clientName;
$data[$clientId]["client_data"] = $this->getClientFactureStatisticPerMonth($clientId,$produitList);
}
return $data;
}
private function getClientById($clientId){
$sql = "SELECT
client.id,
client.nom as client_nom,
client.prenom as client_prenom,
client.entreprise as client_entreprise,
client.legal_one as client_legal_one,
client.adresse as client_address,
client.mail as client_mail,
client.fk_client_group_id as fk_client_group_id
FROM ".$this->tableprefix."client as client
WHERE client.id = ?;";
$clientList = $this->execSQLNoJsonReturn(
$sql,
[$clientId]);
if(!empty($clientList)){
return $clientList[0];
}
return null;
}
public function getClientsByClientsID(array $clientIds){
if(empty($clientIds)){
return [];
}
$sqlConditionsPlaceholder = implode(',', array_fill(0, count($clientIds), '?'));
$sql = "SELECT
client.id,
client.nom as client_nom,
client.prenom as client_prenom,
client.entreprise as client_entreprise
FROM ".$this->tableprefix."client as client
WHERE client.id IN ($sqlConditionsPlaceholder);";
$clientList = $this->execSQLNoJsonReturn(
$sql,
$clientIds);
return $clientList;
}
private function getInvoiceGroupDevisDatasByFactureId($factureId){
$sql = "SELECT
devis_facture.id as devis_facture_id,
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.order_number as order_number,
devis.case_number as case_number,
client.nom as client_nom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
client.mail as client_mail,
client.legal_one as client_legal_one,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
client_group_facturation.id as group_id,
client_group_facturation.group_facturation_name as group_name,
client_group_facturation.phone_number as group_phone_number,
client_group_facturation.address as group_address,
client_group_facturation.postal_code as group_postal_code,
client_group_facturation.city as group_city,
client_group_facturation.email as group_email,
client_group_facturation.siret_number as group_siret_number,
client_group_facturation.tva_intracommu as group_tva_intracommu
FROM ".$this->tableprefix."devis_facture as devis_facture
LEFT JOIN ".$this->tableprefix."devis as devis on devis_facture.fk_devis_id = devis.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id
WHERE devis_facture.fk_facture_id = ?
;";
$devis = $this->execSQLNoJsonReturn(
$sql,
[$factureId]);
return $devis;
}
public function getFactureByFactureId($factureId){
$sql = "SELECT * FROM ".$this->tableprefix."facture as facture
WHERE facture.id = ? LIMIT 1;
";
$result = $this->execSQLNoJsonReturn($sql,[$factureId]);
if(!empty($result)){
return $result[0];
}
return null;
}
public function getInvoiceGroupPdfData($factureId,$configuration){
$tvaValue = $configuration->tva_default;
$factureData = $this->getFactureByFactureId($factureId);
$isFactureForSingleClient = $factureData['fk_client_id'] != null && $factureData['fk_client_id'] != 0;
$devisMentionFilters = [
DevisMentionConstant::FACTURED_FORMATTED,
DevisMentionConstant::FACTURED
];
if($isFactureForSingleClient){
$factureDevisList = $this->getDevisDataByClientIdAndMonthYear(
$factureData['fk_client_id'],
$factureData['month'],
$factureData['year'],$devisMentionFilters
);
}
else{
$factureDevisList = $this->getDevisDataByClientGroupFacturationIdAndMonthYear(
$factureData['fk_client_group_facturation_id'],
$factureData['month'],
$factureData['year'],$devisMentionFilters
);
}
$factureIncrement = 0;
$productsCount = 0;
$totalHt = 0;
$totalTtc = 0;
$totalTva = 0;
$templateType = ClientTemplateTypeConstant::PRIVEES;
foreach($factureDevisList as &$devis){
if($factureIncrement == 0){
if($isFactureForSingleClient){
$clientAddresses = FileExportHelpers::GetAddressAndCityFromAddress($devis['client_adresse']);
$factureData["client_real_adress"] = $clientAddresses['address'];
$factureData["client_adress_city"] = $clientAddresses['city'];
$factureData["client_mail"] = $devis["client_mail"];
$factureData["siret"] = $devis["client_legal_one"];
$factureData["group_name"] = $devis["client_nom"] ?? "";
}
else{
$factureData["client_real_adress"] = $devis["group_address"] ?? "";
$factureData["client_adress_city"] = $devis["group_postal_code"]." ".$devis["group_city"];
$factureData["client_mail"] = $devis["group_email"];
$factureData["siret"] = $devis["group_siret_number"];
$factureData["group_name"] = $devis["group_name"] ?? "";
$templateType = $devis['fk_template_type_key'] ?? ClientTemplateTypeConstant::PRIVEES;
}
}
$products = $this->getDevisProduits($devis["devis_id"]);
if(count($products) > 1){
usort($products, function ($a, $b) {
if ($a["fk_product_type_id"] === null && $b["fk_product_type_id"] !== null) {
return -1;
}
if ($a["fk_product_type_id"] !== null && $b["fk_product_type_id"] === null) {
return 1;
}
return 0;
});
}
foreach($products as $product){
$valueHt = $product['produit_price'] * $product['quantite'];
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt,$tvaValue);
$totalHt+=$valueHt;
$totalTtc+=$valueTtc;
$tvaAmount = $valueTtc - $valueHt;
$totalTva += $tvaAmount;
}
$productsCount += count($products);
$devis['products'] = $products;
$factureIncrement++;
}
$totaPricesArray = [
"TOTAL HT" => $totalHt,
"TVA ".$tvaValue. "%" => $totalTva,
"TOTAL TTC" => $totalTtc
];
$factureData["devis"] = $factureDevisList;
$factureData["configuration"] = $configuration;
$configurationAdresses = FileExportHelpers::GetAddressAndCityFromAddress($configuration->adresse);
$factureData["configuration_adresse"] = $configurationAdresses["address"];
$factureData["configuration_adresse_city"] = $configurationAdresses["city"];
$factureData["productsCount"] = $productsCount;
$factureData["totalPrices"] = $totaPricesArray;
$factureData["template_type_key"] = $templateType;
return $factureData;
}
public function getInvoicePdfData($factureId,$configuration){
$factureData = $this->getFactureByIdWithDevis($factureId);
if($factureData == null){
return null;
}
$products = $this->getDevisProduits($factureData["devis_id"]);
$factureData = $this->setDevisStartAndEndTime($factureData);
$factureData["products"] = $products;
$factureData["configuration"] = $configuration;
$isClientInsideGroup = $factureData["group_id"] != null;
if($isClientInsideGroup){
$factureData["client_real_adress"] = $factureData["group_address"];
$factureData["client_adress_city"] = $factureData["group_postal_code"]." ".$factureData["group_city"];
$factureData["client_mail"] = $factureData["group_email"];
$factureData["siret"] = $factureData["group_siret_number"];
}
else{
$factureData["siret"] = $factureData["client_legal_one"];
$clientAdresses = FileExportHelpers::GetAddressAndCityFromAddress($factureData["client_adresse"]);
$factureData["client_real_adress"] = $clientAdresses["address"];
$factureData["client_adress_city"] = $clientAdresses["city"];
}
$configurationAdresses = FileExportHelpers::GetAddressAndCityFromAddress($configuration->adresse);
$factureData["configuration_adresse"] = $configurationAdresses["address"];
$factureData["configuration_adresse_city"] = $configurationAdresses["city"];
return $factureData;
}
private function getDevisByClientAndMonthYear($clientId,$month,$year){
$sql = "SELECT
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.id_client as devis_id_client,
client.nom as client_nom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
WHERE devis.id_client = ? AND
YEAR(devis.date) = ?";
$conditions = [$clientId,$year];
if($month != 0){
$conditions[] = $month;
$sql .= " AND MONTH(devis.date) = ?";
}
$sql .= ";";
$devisList = $this->execSQLNoJsonReturn(
$sql,
$conditions);
return $devisList;
}
public function getDevisPdfDataByClientAndMonthYear($clientId,$month,$year,$configuration){
$devisList = $this->getDevisByClientAndMonthYear($clientId,$month,$year);
return $devisList;
}
public function getInvoicePdfDataByClientAndMonthYear($filter,$month,$year,$configuration,$filterType){
$isFilterByClient = $filterType === MultipleFactureTypeConstant::CLIENT_FILTER_TYPE;
if($isFilterByClient){
$invoices = $this->getInvoiceByClientAndMonthYear(
clientId: $filter,
month: $month,
year: $year
);
}
else{
$invoices = $this->getInvoiceByClientGroupFacturationAndMonthYear(
clientGroupFacturationId: $filter,
month: $month,
year: $year
);
}
foreach($invoices as &$invoice){
$products = $this->getDevisProduits($invoice["devis_id"]);
$invoice["products"] = $products;
$invoice["configuration"] = $configuration;
$isClientInsideGroup = $invoice["group_id"] != null;
if($isClientInsideGroup){
$invoice["client_real_adress"] = $invoice["group_address"];
$invoice["client_adress_city"] = $invoice["group_postal_code"]." ".$invoice["group_city"];
$invoice["client_mail"] = $invoice["group_email"];
$invoice["siret"] = $invoice["group_siret_number"];
}
else{
$invoice["siret"] = $invoice["client_legal_one"];
$clientAdresses = FileExportHelpers::GetAddressAndCityFromAddress($invoice["client_adresse"]);
$invoice["client_real_adress"] = $clientAdresses["address"];
$invoice["client_adress_city"] = $clientAdresses["city"];
}
$configurationAdresses = FileExportHelpers::GetAddressAndCityFromAddress($configuration->adresse);
$invoice["configuration_adresse"] = $configurationAdresses["address"];
$invoice["configuration_adresse_city"] = $configurationAdresses["city"];
}
return $invoices;
}
private function getClientIdsByClientGroupFacturationId($clientGroupFacturationId){
$sql = "SELECT client.id
FROM ".$this->tableprefix."client as client
WHERE client.fk_client_group_facturation_id = ? ;";
$clientIds = [];
$clients = $this->execSQLNoJsonReturn(
$sql,
[$clientGroupFacturationId]);
if(!empty($clients)){
foreach($clients as $client){
$clientIds[] = $client["id"];
}
}
return $clientIds;
}
private function getInvoiceByClientIdsListAndMonthYear($clientIds,$month,$year){
$clientIdsSqlPlaceholder = implode(',', array_fill(0, count($clientIds), '?'));
$sql = "SELECT
facture.id,
facture.date,
facture.date_paiement,
facture.num,
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.id_client as devis_id_client,
devis.order_number as order_number,
devis.case_number as case_number,
client.nom as client_nom,
client.prenom as client_prenom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
client.mail as client_mail,
client.legal_one as client_legal_one,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
client_group_facturation.group_facturation_name as group_name,
client_group_facturation.id as group_id,
client_group_facturation.phone_number as group_phone_number,
client_group_facturation.address as group_address,
client_group_facturation.postal_code as group_postal_code,
client_group_facturation.city as group_city,
client_group_facturation.email as group_email,
client_group_facturation.siret_number as group_siret_number,
client_group_facturation.tva_intracommu as group_tva_intracommu,
'group' as facture_type
FROM ".$this->tableprefix."facture as facture
LEFT JOIN ".$this->tableprefix."devis as devis on facture.id_devis = devis.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id
WHERE client.id IN ($clientIdsSqlPlaceholder) AND
YEAR(facture.date_paiement) = ?";
$conditions = array_merge($clientIds,[$year]);
if($month != 0){
$conditions[] = $month;
$sql .= " AND MONTH(facture.date_paiement) = ?";
}
$sql .= ";";
$factures = $this->execSQLNoJsonReturn(
$sql,
$conditions);
return $factures;
}
private function getInvoiceByClientGroupFacturationAndMonthYear($clientGroupFacturationId,$month, $year){
$clientIdsInsideClientFacturationGroup = $this->getClientIdsByClientGroupFacturationId($clientGroupFacturationId);
if(empty($clientIdsInsideClientFacturationGroup)){
return [];
}
return $this->getInvoiceByClientIdsListAndMonthYear($clientIdsInsideClientFacturationGroup,$month,$year);
}
private function getInvoiceByClientAndMonthYear($clientId,$month,$year){
$sql = "SELECT
facture.id,
facture.date,
facture.date_paiement,
facture.num,
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.id_client as devis_id_client,
devis.order_number as order_number,
devis.case_number as case_number,
client.nom as client_nom,
client.prenom as client_prenom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
client.legal_one as client_legal_one,
client.mail as client_mail,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
client_group_facturation.id as group_id,
client_group_facturation.group_facturation_name as group_name,
client_group_facturation.phone_number as group_phone_number,
client_group_facturation.address as group_address,
client_group_facturation.postal_code as group_postal_code,
client_group_facturation.city as group_city,
client_group_facturation.email as group_email,
client_group_facturation.siret_number as group_siret_number,
client_group_facturation.tva_intracommu as group_tva_intracommu,
'client' as facture_type
FROM ".$this->tableprefix."facture as facture
LEFT JOIN ".$this->tableprefix."devis as devis on facture.id_devis = devis.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id
WHERE client.id = ? AND
YEAR(facture.date_paiement) = ?";
$conditions = [$clientId,$year];
if($month != 0){
$conditions[] = $month;
$sql .= " AND MONTH(facture.date_paiement) = ?";
}
$sql .= ";";
$factures = $this->execSQLNoJsonReturn(
$sql,
$conditions);
return $factures;
}
public function getDevisPdfDataByDevisId($devisId){
$sql = "SELECT
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.devis_full_number as devis_full_number,
devis.comment as devis_comment,
client.nom as client_nom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
WHERE devis.id = ?
;";
$devis = $this->execSQLNoJsonReturn(
$sql,
[$devisId]);
if(!empty($devis)){
return $devis[0];
}
return null;
}
private function getFactureByIdWithDevis($factureId){
$sql = "SELECT
facture.id,
facture.date,
facture.date_paiement,
facture.num,
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.order_number as order_number,
devis.case_number as case_number,
client.nom as client_nom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
client.mail as client_mail,
client.legal_one as client_legal_one,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
client_group_facturation.id as group_id,
client_group_facturation.group_facturation_name as group_name,
client_group_facturation.phone_number as group_phone_number,
client_group_facturation.address as group_address,
client_group_facturation.postal_code as group_postal_code,
client_group_facturation.city as group_city,
client_group_facturation.email as group_email,
client_group_facturation.siret_number as group_siret_number,
client_group_facturation.tva_intracommu as group_tva_intracommu
FROM ".$this->tableprefix."facture as facture
LEFT JOIN ".$this->tableprefix."devis as devis on facture.id_devis = devis.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id
WHERE facture.id = ?
;";
$facture = $this->execSQLNoJsonReturn(
$sql,
[$factureId]);
if(!empty($facture)){
return $facture[0];
}
return null;
}
public function getProduitsListAsArray(){
$sql = "SELECT * FROM ".$this->tableprefix."produit as produit;";
$produitList = $this->execSQLNoJsonReturn(
$sql,
[]);
return $produitList;
}
public function getArticleIdsByArticleReferences(array $articleReferences){
$articleIds = [];
foreach ($articleReferences as $reference) {
$reference = trim($reference);
$sql = "SELECT id FROM ".$this->tableprefix."produit WHERE reference = ?";
$res = $this->execSQLNoJsonReturn($sql, array($reference));
if ($res) {
$articleIds[] = $res[0]['id'];
}
}
return $articleIds;
}
public function addNumberColumnOnDevis(){
$sql = "ALTER TABLE ". $this->tableprefix."devis
ADD devis_number INT DEFAULT 1;" ;
$this->execSQLNoJsonReturn(
$sql,
[]);
$sql = "ALTER TABLE ". $this->tableprefix."devis
ADD devis_full_number VARCHAR(255);" ;
$this->execSQLNoJsonReturn(
$sql,
[]);
$sql = "UPDATE ".$this->tableprefix."devis as devis
SET devis.devis_full_number = CONCAT('DEV', YEAR(devis.date) % 100, LPAD(MONTH(devis.date), 2, '0'), LPAD(devis.devis_number, 2, '0'));";
$this->execSQLNoJsonReturn(
$sql,
[]);
return true;
}
public function addNumberColumnOnFacture(){
$sql = "ALTER TABLE ". $this->tableprefix."facture
ADD facture_number INT DEFAULT 1;" ;
$this->execSQLNoJsonReturn(
$sql,
[]);
$sql = "UPDATE ".$this->tableprefix."facture as facture
SET facture.num = CONCAT('FAC', YEAR(facture.date) % 100, LPAD(MONTH(facture.date), 2, '0'), LPAD(facture.facture_number, 2, '0'));";
$this->execSQLNoJsonReturn(
$sql,
[]);
return true;
}
private function getLastFactureNumberByMonthAndYear($month,$year){
$sql = "SELECT
max(facture.facture_number) as LAST_FACTURE_NUMBER, facture.date FROM "
. $this->tableprefix."facture as facture
WHERE YEAR(facture.date) = ? AND
MONTH(facture.date) = ?;";
$res = $this->execSQLNoJsonReturn($sql,array($year,$month));
$lastNumber = 0;
if(!empty($res)){
$lastNumber = $res[0]['LAST_FACTURE_NUMBER'];
}
return $lastNumber;
}
public function getFactureNumberByDate($datetime){
$month = $datetime->format('m');
$year = $datetime->format('Y');
$lastFactureNumber = $this->getLastFactureNumberByMonthAndYear($month,$year);
$factureNumber = $lastFactureNumber + 1;
return $factureNumber;
}
public function getFactureFullNumberByDate($datetime){
$factureNumber = $this->getFactureNumberByDate($datetime);
$factureFullNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($datetime,$factureNumber,'FAC');
return $factureFullNumber;
}
public function getDevisNumberByDate($datetime){
$month = $datetime->format('m');
$year = $datetime->format('Y');
$lastDevisNumber = $this->getLastDevisNumberByMonthAndYear($month,$year);
$devisNumber = $lastDevisNumber + 1;
return $devisNumber;
}
public function getDevisFullNumberByDate($datetime){
$devisNumber = $this->getDevisNumberByDate($datetime);
$devisFullNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($datetime,$devisNumber,'DEV');
return $devisFullNumber;
}
public function getFirstClient(){
$sql = "SELECT * FROM ".$this->tableprefix."client as client LIMIT 1;";
$client = $this->execSQLNoJsonReturn(
$sql,
[]);
if(!empty($client)){
return $client[0];
}
return null;
}
public function getClientGroupDiscounts(){
$sql = "SELECT
client_group_discount.id as id,
client_group_discount.fk_client_group_id as fk_client_group_id,
client_group_discount.fk_produit_id as fk_produit_id,
client_group_discount.ht_amount as ht_amount,
client_group.client_group_name as client_group_name,
produit.id as produit_id,
produit.reference as produit_reference,
produit.prix_unitaire as prix_unitaire
FROM ".$this->tableprefix."client_group_discount as client_group_discount
LEFT JOIN ".$this->tableprefix."client_group as client_group on client_group_discount.fk_client_group_id = client_group.id
LEFT JOIN ".$this->tableprefix."produit as produit on client_group_discount.fk_produit_id = produit.id
ORDER BY client_group_discount.id DESC
";
$clientGroupDiscounts = $this->execSQL(
$sql,
[]);
return $clientGroupDiscounts;
}
public function getClientGroups(){
$sql = "SELECT * FROM ".$this->tableprefix."client_group as client_group ORDER BY client_group.id DESC;";
$clientGroups = $this->execSQL($sql,[]);
return $clientGroups;
}
public function createDefaultClientGroup(){
$sql = "INSERT INTO `".$this->tableprefix."client_group` (`client_group_name`) VALUES (?);";
$this->execSQLNoData($sql, array(self::DEFAULT_CLIENT_GROUP_NAME));
return true;
}
public function createDefaultClientGroupDiscount(){
$sql = "INSERT INTO `".$this->tableprefix."client_group_discount` (`fk_client_group_id`,`fk_produit_id`,`ht_amount`) VALUES (0,0,0);";
$this->execSQLNoData($sql, array());
return true;
}
public function getClientGroupCount(){
$sql = "SELECT count(*) as c from ".$this->tableprefix."client_group;";
return $this->execSQL($sql, array());
}
public function getClientGroupDiscountCount(){
$sql = "SELECT count(*) as c from ".$this->tableprefix."client_group_discount;";
return $this->execSQL($sql, array());
}
public function addClientGroupDiscountFeatureTables(){
$createTableClientGroupSQL = "CREATE TABLE oc_gestion_client_group (
id INT PRIMARY KEY AUTO_INCREMENT,
client_group_name VARCHAR(255) DEFAULT ''
);";
$this->execSQLNoData($createTableClientGroupSQL,[]);
$addColumnFkClientGroupIdIntoClientTableSQL= "ALTER TABLE oc_gestion_client
ADD fk_client_group_id INT NULL;";
$this->execSQLNoData($addColumnFkClientGroupIdIntoClientTableSQL,[]);
$createTableClientGroupDiscountSQL = "CREATE TABLE oc_gestion_client_group_discount (
id INT PRIMARY KEY AUTO_INCREMENT,
fk_client_group_id INT NOT NULL,
fk_produit_id INT NOT NULL,
ht_amount FLOAT NOT NULL
);";
$this->execSQLNoData($createTableClientGroupDiscountSQL,[]);
return true;
}
public function getDevisOfDefunt($defuntId){
$sql = "SELECT
devis.id as id,
devis.date as devis_date,
devis.id_defunt as defunt_id,
devis.id_lieu as lieu_id,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
defunt.ref_pacemaker as defunt_reference_pacemaker,
defunt.product_brand as defunt_product_brand,
defunt.product_reference as defunt_product_reference,
client.nom as client_nom,
client.prenom as client_prenom,
client.mail as client_mail,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
thanato.reference as thanato_reference,
thanato.date_habilitation as thanato_date_habilitation
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
WHERE devis.id_defunt = ? ;";
$devisOfDefunt = $this->execSQLNoJsonReturn($sql, [$defuntId]);
if(!empty( $devisOfDefunt)){
return $devisOfDefunt[0];
}
return null;
}
private function getDefuntById($defuntId){
$sql = "SELECT
defunt.id as id,
defunt.nom as defunt_nom,
devis.id as devis_id
FROM ".$this->tableprefix."defunt as defunt
LEFT JOIN ".$this->tableprefix."devis as devis on defunt.id = devis.id_defunt
WHERE defunt.id = ?
LIMIT 1;";
$defunt = $this->execSQLNoJsonReturn($sql,[$defuntId]);
if(!empty($defunt)){
return $defunt[0];
}
return null;
}
private function getProductAsDefuntCoverProduct($productCoverId){
$product = $this->getProductByProductId($productCoverId);
if($product == null){
return null;
}
$productCoverType = $this->getProductTypeByKey(ProductConstant::PRODUCT_COVER_TYPE_KEY);
if($product["fk_product_type_id"] == $productCoverType["id"]){
return $product;
}
return null;
}
private function isProductAlreadyExistInDevis($productId,$devisId){
$sql = "SELECT
produit_devis.id
FROM ".$this->tableprefix."produit_devis as produit_devis
WHERE produit_devis.produit_id = ? AND
produit_devis.devis_id = ?
LIMIT 1;";
$product = $this->execSQLNoJsonReturn($sql,[$productId,$devisId]);
if(!empty($product)){
return true;
}
return false;
}
private function removeProductFromDevis($productId,$devisId){
$sql = "DELETE
FROM ".
$this->tableprefix."produit_devis
WHERE devis_id = ? AND produit_id = ?
";
$this->execSQLNoData($sql,[$devisId,$productId]);
}
private function getProductByReference($productReference){
$sql = "SELECT
produit.id,
produit.reference
FROM ".$this->tableprefix."produit as produit
WHERE produit.reference = ?
LIMIT 1;";
$product = $this->execSQLNoJsonReturn($sql,[$productReference]);
if(!empty($product)){
return $product[0];
}
return null;
}
private function removeProductFromDevisByProductReference($productReference,$devisId){
$product = $this->getProductByReference($productReference);
if($product != null){
$this->removeProductFromDevis($product["id"],$devisId);
}
}
private function createProductDevisIfNotExist($productId,$devisId){
$isProductDevisAlreadyExist = $this->isProductAlreadyExistInDevis($productId,$devisId);
if(!$isProductDevisAlreadyExist){
$idNextcloud = "admin";
$this->insertDevisArticle(devisId: $devisId, articleId: $productId,idNextcloud: $idNextcloud);
}
}
private function getProductByProductId($productId){
$sql = "SELECT
produit.id,
produit.reference,
produit.fk_product_type_id
FROM ".$this->tableprefix."produit as produit
WHERE produit.id = ?
LIMIT 1;";
$result = $this->execSQLNoJsonReturn($sql,[$productId]);
if(!empty($result)){
return $result[0];
}
return null;
}
public function setDefuntCover($defuntId, $productCoverId){
$defunt = $this->getDefuntById($defuntId);
if($defunt == null){
return null;
}
if($defunt["devis_id"] == null){
return null;
}
$product = $this->getProductAsDefuntCoverProduct($productCoverId);
if($product == null){
return null;
}
$coverProductList = $this->getProductsByProductTypeKey(ProductConstant::PRODUCT_COVER_TYPE_KEY);
$coverProductList = json_decode($coverProductList);
foreach($coverProductList as $currentCoverProduct){
if($currentCoverProduct->id == $product["id"]){
$this->createProductDevisIfNotExist($product["id"],$defunt["devis_id"]);
}
else{
$this->removeProductFromDevis($currentCoverProduct->id,$defunt["devis_id"]);
}
}
return true;
}
private function getProductsByProductTypeKey(string $productTypeKey){
$sql = "SELECT
produit.id,
produit.reference,
produit.description
FROM ".$this->tableprefix."produit as produit
LEFT JOIN ".$this->tableprefix."product_type as product_type on produit.fk_product_type_id = product_type.id
WHERE product_type.product_type_key = ?;";
$products = $this->execSQL($sql,[$productTypeKey]);
return $products;
}
public function getCoverProducts(){
return $this->getProductsByProductTypeKey(ProductConstant::PRODUCT_COVER_TYPE_KEY);
}
private function getProductTypeByKey(string $key){
$sql = "SELECT
product_type.id,
product_type.product_type_name,
product_type.product_type_key
FROM ".$this->tableprefix."product_type as product_type
WHERE product_type.product_type_key = ?;";
$productType = $this->execSQLNoJsonReturn($sql,[$key]);
if(!empty($productType)){
return $productType[0];
}
return null;
}
private function getProductCoverByDevisId($devisId){
$coverProductType = $this->getProductTypeByKey(ProductConstant::PRODUCT_COVER_TYPE_KEY);
$sql = "SELECT
produit_devis.id,
produit.id as produit_id,
produit.reference,
produit.description,
produit.fk_product_type_id
FROM ".$this->tableprefix."produit_devis as produit_devis
LEFT JOIN ".$this->tableprefix."produit as produit on produit_devis.produit_id = produit.id
WHERE produit_devis.devis_id = ? AND
produit.fk_product_type_id = ? LIMIT 1";
$productCover = $this->execSQLNoJsonReturn($sql,[$devisId,$coverProductType["id"]]);
if($productCover){
return $productCover[0];
}
return null;
}
private function getDevisByIdWithCalendarDataAndProducts($devisId,$idNextcloud){
$devis = $this->getOneDevis($devisId,$idNextcloud);
$devis= json_decode($devis);
if(empty($devis)){
return null;
}
$devis = $devis[0];
if(isset($devis->numm) && $devis->num == null){
return null;
}
$calendarData = $this->getCalendarDataByCalendarObjectUuid($devis->num);
$devisTimeValue = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($calendarData);
$devis->startTime = $devisTimeValue["startTime"];
$devis->endTime = $devisTimeValue["endTime"];
$devisProducts = $this->getDevisProduits($devisId);
$devisProducts = json_encode($devisProducts);
$devisProducts = json_decode($devisProducts);
$devis->products = $devisProducts;
return $devis;
}
private function getDevisTalkRoomProductSectionMessage($devisProducts){
if(empty($devisProducts)){
return "";
}
$productMessage = ". ACTE A FAIRE : ";
foreach($devisProducts as $product){
$productMessage.= html_entity_decode($product->produit_reference).", ";
}
$productMessage = trim( $productMessage );
$productMessage = rtrim($productMessage,",");
return $productMessage;
}
private function getDevisTalkRoomClientContent($clientPrenom){
$message = ". Pour PF: ";
$clientNameContent = "aucun";
$clientPrenomIsSet = $clientPrenom != null && $clientPrenom != "" && $clientPrenom != "-";
if($clientPrenomIsSet){
$clientNameContent = html_entity_decode($clientPrenom);
}
$message .= $clientNameContent;
return $message;
}
public function getDevisTalkRoomMessage($devisId,$idNextcloud){
$devis = $this->getDevisByIdWithCalendarDataAndProducts($devisId,$idNextcloud);
if($devis == null){
return null;
}
$devisDate = new Datetime($devis->date);
$devisDate = $devisDate->format('d/m/Y');
$message = "NOUVELLE INTERVENTION: ";
$message .= html_entity_decode($devis->nom_defunt) . ' ';
$message .= 'le '.$devisDate. ' ';
$message .= 'à '.$devis->startTime. ' ';
$message .= 'à '.html_entity_decode($devis->lieu). ' '. html_entity_decode($devis->adresse_soin);
$clientMessageContent = $this->getDevisTalkRoomClientContent($devis->prenom);
$message .= $clientMessageContent;
$productMessage = $this->getDevisTalkRoomProductSectionMessage($devis->products);
$message .= $productMessage;
$comment = "aucun";
if(strtolower($devis->comment) != "commentaire" && $devis->comment != ""){
$comment = html_entity_decode($devis->comment);
}
$message .= ". COMMENTAIRES: ".$comment.". ";
$locationCodes = [
"Code portail" => $devis->portal_code,
"Code alarme" => $devis->alarm_code,
"Code funéraire" => $devis->funeral_code
];
$locationCodeMessageContent = "";
foreach($locationCodes as $label => $code){
$value = "Aucun";
if($code != null && trim($code) != ""){
$value = $code;
}
$locationCodeMessageContent .= $label. ": ".$value.". ";
}
$locationCodeMessageContent = trim($locationCodeMessageContent);
$message .= $locationCodeMessageContent;
return $message;
}
public function getDevisByCalendarUuid($calendarUuid){
if($calendarUuid === self::DEFAULT_CALENDAR_UUID_FOR_DEVIS){
return null;
}
$sql = "SELECT
devis.id,
devis.id_thanato,
devis.id_defunt as defunt_id,
devis.num,
devis.comment,
devis.id_lieu as lieu_id,
devis.id_client as client_id,
defunt.nom as defunt_nom
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
WHERE devis.num = ? ;";
$devis = $this->execSQLNoJsonReturn($sql, array($calendarUuid));
if(empty($devis)){
return null;
}
return $devis[0];
}
public function updateDevisMentionToCanceled($devisId){
$sql= "UPDATE ".$this->tableprefix."devis as devis
SET devis.mentions = ?
WHERE devis.id = ?";
$this->execSQLNoData($sql,[DevisMentionConstant::CANCELED,$devisId]);
}
private function updateDefuntByName($defuntId,$requestedDefuntName){
$sql= "UPDATE ".$this->tableprefix."defunt as defunt
SET defunt.nom = ?
WHERE defunt.id = ?";
$this->execSQLNoData($sql,[$requestedDefuntName,$defuntId]);
}
public function createOrUpdateDefuntByNameAndReturnDefuntId($defuntId,$currentDefuntName,$requestedDefuntName){
if($defuntId != null){
$defuntNameIsUpdated = $currentDefuntName != $requestedDefuntName;
if($defuntNameIsUpdated){
$this->updateDefuntByName($defuntId,$requestedDefuntName);
}
}
else{
$this->insertDefuntByName($requestedDefuntName);
$defunt = $this->getLastDefuntIdByName($requestedDefuntName);
$defuntId = $defunt['id'];
}
return $defuntId;
}
public function updateDevisDefunt($devisId,$requestedDefuntId,$currentDefuntId = null){
$defuntIsUpdated = $currentDefuntId != $requestedDefuntId;
if($defuntIsUpdated){
$sql= "UPDATE ".$this->tableprefix."devis as devis
SET devis.id_defunt = ?
WHERE devis.id = ?";
$this->execSQLNoData($sql,[$requestedDefuntId,$devisId]);
}
}
public function updateDevisThanato($devisId,$requestedThanatoId){
$sql= "UPDATE ".$this->tableprefix."devis as devis
SET devis.id_thanato = ?
WHERE devis.id = ?";
$this->execSQLNoData($sql,[$requestedThanatoId,$devisId]);
}
public function updateDevisClient($devisId,$requestedClientId,$currentClientId = null){
$clientIsUpdated = $currentClientId != $requestedClientId;
if($clientIsUpdated){
$sql= "UPDATE ".$this->tableprefix."devis as devis
SET devis.id_client = ?
WHERE devis.id = ?";
$this->execSQLNoData($sql,[$requestedClientId,$devisId]);
}
}
public function updateDevisLieu($devisId,$requestedLieuId,$currentLieuId = null){
$lieuIsUpdated = $currentLieuId != $requestedLieuId;
if($lieuIsUpdated){
$sql= "UPDATE ".$this->tableprefix."devis as devis
SET devis.id_lieu = ?
WHERE devis.id = ?";
$this->execSQLNoData($sql,[$requestedLieuId,$devisId]);
}
}
public function updateDevisComment($devisId,$requestedComment,$currentComment = null){
$commentIsUpdated = $currentComment != $requestedComment;
if($commentIsUpdated){
$sql= "UPDATE ".$this->tableprefix."devis as devis
SET devis.comment = ?
WHERE devis.id = ?";
$this->execSQLNoData($sql,[$requestedComment,$devisId]);
}
}
public function deleteDevisProduit($devisProductId){
$sql = "DELETE FROM ".$this->tableprefix."produit_devis WHERE id = ?;";
$this->execSQLNoData($sql, array($devisProductId));
}
public function updateDevisArticles($devisId,$requestedArticlesIds){
$currentDevisProducts = $this->getDevisProduits($devisId);
$currentDevisProduitIds = [];
//delete old product
foreach($currentDevisProducts as $devisProduct){
$currentDevisProduitIds[] = $devisProduct['produit_id'];
$currentProductIsNotPartOfRequestedDevisProduct = !in_array($devisProduct['produit_id'],$requestedArticlesIds);
if($currentProductIsNotPartOfRequestedDevisProduct){
$this->deleteDevisProduit($devisProduct['id']);
}
}
//add new requested product
foreach($requestedArticlesIds as $requestedArticleId){
$currentRequestedArticleIsNewArticleForDevis = !in_array($requestedArticleId,$currentDevisProduitIds);
if($currentRequestedArticleIsNewArticleForDevis){
$this->insertDevisArticle(devisId: $devisId, articleId: $requestedArticleId,idNextcloud: BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD);
}
}
}
public function addClientGroupFacturationFeatureTables(){
$createTableClientGroupSQL = "CREATE TABLE oc_gestion_client_group_facturation (
id INT PRIMARY KEY AUTO_INCREMENT,
group_facturation_name VARCHAR(255) DEFAULT ''
);";
$this->execSQLNoData($createTableClientGroupSQL,[]);
$addColumnFkClientGroupFacturationIdIntoClientTableSQL= "ALTER TABLE oc_gestion_client
ADD fk_client_group_facturation_id INT NULL;";
$this->execSQLNoData($addColumnFkClientGroupFacturationIdIntoClientTableSQL,[]);
return true;
}
private function getClientGroupFacturationsWithType(){
$sql = "SELECT
client_group_facturation.id as id,
client_group_facturation.group_facturation_name as nom,
'group' as client_type
FROM ".$this->tableprefix."client_group_facturation as client_group_facturation ORDER BY client_group_facturation.id DESC;";
$clientGroupFacturations = $this->execSQLNoJsonReturn($sql,[]);
return $clientGroupFacturations;
}
public function getClientGroupFacturations(){
$sql = "SELECT * FROM ".$this->tableprefix."client_group_facturation as client_group_facturation ORDER BY client_group_facturation.id DESC;";
$clientGroupFacturations = $this->execSQL($sql,[]);
return $clientGroupFacturations;
}
public function createDefaultGroupFacturation(){
$sql = "INSERT INTO `".$this->tableprefix."client_group_facturation` (`group_facturation_name`) VALUES (?);";
$this->execSQLNoData($sql, array(self::DEFAULT_CLIENT_GROUP_FACTURATION_NAME));
return true;
}
public function getClientGroupFacturationById($clientGroupFacturationId){
$sql = "SELECT *
FROM ".$this->tableprefix."client_group_facturation as client_group_facturation
WHERE client_group_facturation.id = ? ;";
$clientGroupFacturation = $this->execSQLNoJsonReturn($sql, array($clientGroupFacturationId));
if(!empty($clientGroupFacturation)){
return $clientGroupFacturation[0];
}
return null;
}
public function getClientGroupFacturationCount(){
$sql = "SELECT count(*) as c from ".$this->tableprefix."client_group_facturation;";
return $this->execSQL($sql, array());
}
public function addProductTypeTables(){
$sql = "CREATE TABLE oc_gestion_product_type (
id INT PRIMARY KEY AUTO_INCREMENT,
product_type_key VARCHAR(255) DEFAULT '',
product_type_name VARCHAR(255) DEFAULT ''
);";
$this->execSQLNoData($sql,[]);
$sql = "ALTER TABLE oc_gestion_produit
ADD fk_product_type_id INT NULL;";
$this->execSQLNoData($sql,[]);
$sql = "INSERT INTO oc_gestion_product_type (product_type_key,product_type_name) VALUES (?,?);";
$this->execSQLNoData($sql,[ProductConstant::PRODUCT_COVER_TYPE_KEY,ProductConstant::PRODUCT_COVER_TYPE_NAME]);
}
public function getProductTypes(){
$sql = "SELECT * FROM ".$this->tableprefix."product_type;";
$productTypes = $this->execSQL($sql,[]);
return $productTypes;
}
public function addLocationCodesColumn(){
$sql = "ALTER TABLE oc_gestion_lieu
ADD portal_code VARCHAR(255) DEFAULT NULL;";
$this->execSQLNoData($sql,[]);
$sql = "ALTER TABLE oc_gestion_lieu
ADD alarm_code VARCHAR(255) DEFAULT NULL;";
$this->execSQLNoData($sql,[]);
$sql = "ALTER TABLE oc_gestion_lieu
ADD funeral_code VARCHAR(255) DEFAULT NULL;";
$this->execSQLNoData($sql,[]);
}
public function updateDevisMention(int $devisId,string $mention){
$sql = "UPDATE ".$this->tableprefix."devis as devis
SET devis.mentions = ?
WHERE devis.id = ?;";
$this->execSQLNoData($sql,[$mention,$devisId]);
}
public function getBijouxWithDefuntByBijouxId($bijouxId){
$sql = "SELECT
bijou.id,
bijou.defunt_id,
bijou.designation,
bijou.commentaire,
bijou.photo,
defunt.nom as defunt_nom
FROM ".$this->tableprefix."bijou_defunt as bijou
LEFT JOIN ".$this->tableprefix."defunt as defunt on bijou.defunt_id = defunt.id
WHERE bijou.id = ? ;";
$bijoux = $this->execSQLNoJsonReturn($sql,[$bijouxId,]);
if(!empty($bijoux)){
return $bijoux[0];
}
return null;
}
public function saveBijouxPhoto($bijouxId,$photo,$photoRealName){
$sql = "UPDATE ".$this->tableprefix."bijou_defunt as bijou_defunt
SET bijou_defunt.photo = ?,bijou_defunt.photo_name = ?
WHERE bijou_defunt.id = ? ;";
$this->execSQLNoData(
$sql,
[$photo,$photoRealName,$bijouxId]);
return true;
}
public function saveDefuntPacemakerPhoto($defuntId,$photo,$photoRealName){
$sql = "UPDATE ".$this->tableprefix."defunt as defunt
SET defunt.product_photo = ?,defunt.product_photo_name = ?
WHERE defunt.id = ? ;";
$this->execSQLNoData(
$sql,
[$photo,$photoRealName,$defuntId]);
return true;
}
private function getFacturePaymentTypeById($facturePaymentTypeId){
$sql = "SELECT * FROM ".$this->tableprefix."facture_payment_type as facture_payment_type
WHERE facture_payment_type.id = ? LIMIT 1
";
$facturePaymentType = $this->execSQLNoJsonReturn($sql,[$facturePaymentTypeId]);
if(!empty($facturePaymentType)){
return $facturePaymentType[0];
}
return null;
}
public function getFacturePaymentList(){
$sql = "SELECT * FROM ".$this->tableprefix."facture_payment_type";
return $this->execSQL($sql,[]);
}
public function payInvoices($factureIds,$facturePaymentTypeId,$paymentDate){
$facturePaymentType = $this->getFacturePaymentTypeById($facturePaymentTypeId);
if($facturePaymentType == null){
return null;
}
$paymentDate = Datetime::createFromFormat('Y-m-d',$paymentDate);
$paymentDate = $paymentDate->format('Y-m-d');
foreach($factureIds as $factureId){
$this->payAnInvoice($factureId,$facturePaymentTypeId,$paymentDate);
}
return true;
}
private function payAnInvoice($factureId,$facturePaymentTypeId,$paymentDate){
$sql = "UPDATE ".$this->tableprefix."facture as facture
SET facture.fk_facture_status_key = ?,
facture.payment_date = ?,
facture.fk_facture_payment_type_id = ?
WHERE facture.id = ?
";
$this->execSQLNoData($sql,[
FactureStatusConstant::PAID_KEY,
$paymentDate,
$facturePaymentTypeId,
$factureId
]);
return true;
}
public function getUsersNotLinkedToThanato(){
$sql = "SELECT
users.uid,
users.uid_lower,
users.displayname
FROM ".self::DEFAULT_TABLE_PREFIX."users as users
JOIN .".self::DEFAULT_TABLE_PREFIX."group_user group_user ON users.uid = group_user.uid
LEFT JOIN ".$this->tableprefix."thanato as thanato on users.uid = thanato.fk_user_uuid
WHERE group_user.gid = ? AND
thanato.fk_user_uuid IS NULL;
";
return $this->execSQL($sql,[BddConstant::DEFAULT_THANATOS_GROUP_NAME]);
}
public function doDevisIdsListIdsBelongsToTheSameClientFacturationGroup(array $devisIds){
if(empty($devisIds)){
return [];
}
$sqlPlacholders = implode(',', array_fill(0, count($devisIds), '?'));
$sql = "SELECT
devis.id,
client.fk_client_group_facturation_id
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
WHERE
devis.id_client IS NOT NULL AND
devis.id IN($sqlPlacholders);";
$results = $this->execSQLNoJsonReturn($sql,$devisIds);
$clientGroupFacturationsIds = [];
foreach($results as $currentResult){
if($currentResult['fk_client_group_facturation_id'] == null){
return false;
}
$clientGroupFacturationsIds[] = $currentResult['fk_client_group_facturation_id'];
}
$uniqueClientGroupFacturation = array_unique($clientGroupFacturationsIds);
return $uniqueClientGroupFacturation > 1;
}
private function doesDevisFactureGroupAlreadyExist($factureId,$devisId){
$sql = "SELECT count(*) as DEVIS_FACTURE_COUNT
FROM ".$this->tableprefix."devis_facture as devis_facture
WHERE devis_facture.fk_devis_id = ? AND devis_facture.fk_facture_id = ?";
$result = $this->execSQLNoJsonReturn($sql,[$devisId,$factureId]);
if(!empty($result)){
return $result[0]["DEVIS_FACTURE_COUNT"] > 0;
}
return false;
}
private function createFactureGroupDevis($factureId,$devisId){
$doesDevisFactureGroupAlreadyExist = $this->doesDevisFactureGroupAlreadyExist($factureId,$devisId);
if(!$doesDevisFactureGroupAlreadyExist){
$sql = "INSERT INTO `".$this->tableprefix."devis_facture` (`fk_devis_id`,`fk_facture_id`) VALUES (?,?);";
$this->execSQLNoData($sql, [$devisId,$factureId]);
$this->gestion_update('devis','mentions',DevisMentionConstant::FACTURED_FORMATTED,$devisId,BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD);
}
}
public function createFactureGroupForDevisList($factureId,$devisIds){
foreach($devisIds as $devis){
$this->createFactureGroupDevis($factureId,$devis['id']);
}
}
private function getFactureIdByFactureNumber($factureNumber){
$sql = "SELECT max(facture.id) AS FACTURE_ID
FROM ".$this->tableprefix."facture as facture
WHERE facture.num = ? ;";
$result = $this->execSQLNoJsonReturn($sql,[$factureNumber]);
if(!empty($result)){
return $result[0]['FACTURE_ID'];
}
return null;
}
public function createFactureAndReturnFactureId($facturationDate,$type,$month = null,$year = null,$fkClientId = null,$fkClientGroupFacturationId = null){
$datetimeNow = new Datetime();
$month = $month ?? $datetimeNow->format('m');
$year = $year ?? $datetimeNow->format('Y');
if($facturationDate == null || $facturationDate == ""){
$facturationDatetime = DateHelpers::GetLastDayOfTheMonthOfADate($datetimeNow);
}
else{
$facturationDatetime = Datetime::createFromFormat('Y-m-d',$facturationDate);
}
$facturationDate = $facturationDatetime->format('Y-m-d');
$factureDate = $facturationDate;
$factureNumber = $this->getFactureNumberByDate($facturationDatetime);
$fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($facturationDatetime,$factureNumber,"FAC");
$last = 0;
$last = $this->lastNumFacture(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD);
$sql = "INSERT INTO `".$this->tableprefix."facture` (`date`,`id_nextcloud`,`num`,`date_paiement`,`type_paiement`,`id_devis`,`user_id`, `version`,`facture_number`,`facture_type`,`month`,`year`,`fk_client_id`,`fk_client_group_facturation_id`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
$this->execSQLNoData($sql, array(
$factureDate,
BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD,
$fullFactureNumber,
$facturationDate,
"",
0,
$last+1,
"",
$factureNumber,
$type,
$month,
$year,
$fkClientId,
$fkClientGroupFacturationId)
);
return $this->getFactureIdByFactureNumber($fullFactureNumber);
}
public function generateGroupFactureForMultipleDevis($devisToFacture,$paymentDate){
$mentionsFilter = [
DevisMentionConstant::NEW,
DevisMentionConstant::MENTION
];
$devisIdListFiltered = $this->getDevisIdListFilteredByMentionAndDevisListId($mentionsFilter,$devisToFacture);
$factureId = $this->createFactureAndReturnFactureId($paymentDate,FactureTypeConstant::TYPE_GROUP);
$this->createFactureGroupForDevisList($factureId,$devisIdListFiltered);
return [$factureId];
}
public function getFactureTypeByFactureId($factureId): mixed{
$sql = "SELECT
facture.facture_type
FROM ".$this->tableprefix."facture as facture
WHERE facture.id = ? LIMIT 1;";
$result = $this->execSQLNoJsonReturn($sql,[$factureId]);
if(!empty($result)){
return $result[0]['facture_type'];
}
return FactureTypeConstant::TYPE_SINGLE;
}
public function getDevisIdsByClientGroupFacturationIdAndMonthYear($clientGroupFacturationId,$month,$year,$mentionFilters = []){
$sql = "SELECT devis.id
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
WHERE
client.fk_client_group_facturation_id = ? AND
YEAR(devis.date) = ? AND
MONTH(devis.date) = ?
";
$conditions = [$clientGroupFacturationId,$year,$month];
if(!empty($mentionFilters)){
$mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionFilters), '?'));
$sql .= " AND ". $this->tableprefix."devis.mentions IN ($mentionsFilterPlaceholders)";
$conditions = array_merge($conditions, $mentionFilters);
}
$sql.= ";";
$result = $this->execSQLNoJsonReturn($sql,$conditions);
$devisIds = [];
foreach($result as $currentResult){
$devisIds[] = $currentResult['id'];
}
return $devisIds;
}
public function getDevisIdsByClientIdAndMonthYear($clientId,$month,$year,$mentionFilters = []){
$sql = "SELECT devis.id
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
WHERE
client.id = ? AND
YEAR(devis.date) = ? AND
MONTH(devis.date) = ?";
$conditions = [$clientId,$year,$month];
if(!empty($mentionFilters)){
$mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionFilters), '?'));
$sql .= " AND devis.mentions IN ($mentionsFilterPlaceholders)";
$conditions = array_merge($conditions, $mentionFilters);
}
$sql.= ";";
$result = $this->execSQLNoJsonReturn($sql,$conditions);
$devisIds = [];
foreach($result as $currentResult){
$devisIds[] = $currentResult['id'];
}
return $devisIds;
}
public function getFactureIdByClientIdAndMonthYear($clientId,$month,$year){
$sql = "SELECT
facture.id as facture_id
FROM ".$this->tableprefix."facture as facture
WHERE
facture.fk_client_id = ? AND
facture.year = ? AND
facture.month = ? AND
facture.facture_type = ?";
$result = $this->execSQLNoJsonReturn($sql,[
$clientId,
$year,
$month,
FactureTypeConstant::TYPE_GROUP
]);
if(!empty($result)){
return $result[0]['facture_id'];
}
return null;
}
public function getFactureIdByClientGroupFacturationIdAndMonthYear($clientId,$month,$year){
$sql = "SELECT
facture.id as facture_id
FROM ".$this->tableprefix."facture as facture
WHERE
facture.fk_client_group_facturation_id = ? AND
facture.year = ? AND
facture.month = ? AND
facture.facture_type = ?";
$result = $this->execSQLNoJsonReturn($sql,[
$clientId,
$year,
$month,
FactureTypeConstant::TYPE_GROUP
]);
if(!empty($result)){
return $result[0]['facture_id'];
}
return null;
}
public function invoiceListOfDevisIds($devisIds){
$sqlConditionsPlaceholder = implode(',', array_fill(0, count($devisIds), '?'));
$sql = "UPDATE ".$this->tableprefix."devis as devis
SET devis.mentions = ?
WHERE devis.id IN ($sqlConditionsPlaceholder);";
$conditions = array_merge(
[DevisMentionConstant::FACTURED_FORMATTED],
$devisIds
);
$this->execSQLNoData($sql,$conditions);
}
private function getDevisDataByClientGroupFacturationIdAndMonthYear($clientGroupFacturationId,$month,$year,$mentionFilters = []){
$sql = "SELECT
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.order_number as order_number,
devis.case_number as case_number,
devis.devis_full_number as devis_full_number,
client.nom as client_nom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
client.mail as client_mail,
client.legal_one as client_legal_one,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
client_group_facturation.id as group_id,
client_group_facturation.group_facturation_name as group_name,
client_group_facturation.phone_number as group_phone_number,
client_group_facturation.address as group_address,
client_group_facturation.postal_code as group_postal_code,
client_group_facturation.city as group_city,
client_group_facturation.email as group_email,
client_group_facturation.siret_number as group_siret_number,
client_group_facturation.tva_intracommu as group_tva_intracommu,
client_group_facturation.fk_template_type_key as fk_template_type_key
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id
WHERE
client.fk_client_group_facturation_id = ? AND
YEAR(devis.date) = ? AND
MONTH(devis.date) = ?";
$conditions = [$clientGroupFacturationId,$year,$month];
if(!empty($mentionFilters)){
$mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionFilters), '?'));
$sql .= " AND devis.mentions IN ($mentionsFilterPlaceholders)";
$conditions = array_merge($conditions, $mentionFilters);
}
$sql.= " ORDER BY devis.date ASC;";
$devisList = $this->execSQLNoJsonReturn($sql,$conditions);
return $devisList;
}
private function getDevisDataByClientIdAndMonthYear($clientId,$month,$year,$mentionFilters = []){
$sql = "SELECT
devis.id as devis_id,
devis.date as devis_date,
devis.num as calendar_uuid,
devis.comment as devis_comment,
devis.order_number as order_number,
devis.case_number as case_number,
devis.devis_full_number as devis_full_number,
client.nom as client_nom,
client.entreprise as client_entreprise,
client.adresse as client_adresse,
client.mail as client_mail,
client.legal_one as client_legal_one,
defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
client_group_facturation.id as group_id,
client_group_facturation.group_facturation_name as group_name,
client_group_facturation.phone_number as group_phone_number,
client_group_facturation.address as group_address,
client_group_facturation.postal_code as group_postal_code,
client_group_facturation.city as group_city,
client_group_facturation.email as group_email,
client_group_facturation.siret_number as group_siret_number,
client_group_facturation.tva_intracommu as group_tva_intracommu,
client_group_facturation.fk_template_type_key as fk_template_type_key
FROM ".$this->tableprefix."devis as devis
LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->tableprefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->tableprefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id
WHERE
client.id = ? AND
YEAR(devis.date) = ? AND
MONTH(devis.date) = ?";
$conditions = [$clientId,$year,$month];
if(!empty($mentionFilters)){
$mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionFilters), '?'));
$sql .= " AND devis.mentions IN ($mentionsFilterPlaceholders)";
$conditions = array_merge($conditions, $mentionFilters);
}
$sql.= " ORDER BY devis.date ASC;";
$devisList = $this->execSQLNoJsonReturn($sql,$conditions);
return $devisList;
}
public function getClientTemplateTypes(){
$sql = "SELECT * FROM ".$this->tableprefix."client_template_type as client_template_type";
return $this->execSQL($sql,[]);
}
public function getFactureGroupById($factureId){
$sql = "SELECT
facture.id,
facture.date,
facture.date_paiement,
facture.num,
facture.fk_client_id,
facture.fk_client_group_facturation_id,
facture.month,
facture.year
FROM ".$this->tableprefix."facture as facture
WHERE facture.id = ? AND
facture.facture_type = ?
;";
$result = $this->execSQLNoJsonReturn($sql,[$factureId,FactureTypeConstant::TYPE_GROUP]);
if(!empty($result)){
return $result[0];
}
return null;
}
public function getFactureGroupByFactureIdWithDetails($factureId){
$facture = $this->getFactureGroupById($factureId);
$configuration = $this->getConfiguration(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD);
$configuration = json_decode($configuration);
$currentConfig = $configuration[0];
$tvaValue = $currentConfig->tva_default;
$isFactureSingleClient = $facture['fk_client_id'] != null
&& $facture['fk_client_id'] != 0;
$devisMentionFilters = [
DevisMentionConstant::FACTURED,
DevisMentionConstant::FACTURED_FORMATTED
];
if($isFactureSingleClient){
$client = $this->getClientById($facture['fk_client_id']);
$facture['group_name'] = $client["client_nom"];
$facture['client_name'] = $client["client_prenom"];
$facture['client_address'] = $client["client_address"];
$facture['siret'] = $client["client_legal_one"];
$facture['mail'] = $client["client_mail"];
$devisList = $this->getDevisDataByClientIdAndMonthYear(
$facture['fk_client_id'],
$facture['month'],
$facture['year'],
$devisMentionFilters
);
}
else{
$clientGroupFacturation = $this->getClientGroupFacturationById($facture['fk_client_group_facturation_id']);
$facture['group_name'] = $clientGroupFacturation["group_facturation_name"];
$facture['client_name'] = $clientGroupFacturation["group_facturation_name"];
$facture['client_address'] = $clientGroupFacturation["address"] . ' - ' .$clientGroupFacturation["postal_code"] . ' ' . $clientGroupFacturation['city'];
$facture['siret'] = $clientGroupFacturation["siret_number"];
$facture['mail'] = $clientGroupFacturation["email"];
$devisList = $this->getDevisDataByClientGroupFacturationIdAndMonthYear(
$facture['fk_client_group_facturation_id'],
$facture['month'],
$facture['year'],
$devisMentionFilters
);
}
$factureTotalHt= 0;
$factureTotalTva = 0;
$factureTotalTtc = 0;
foreach($devisList as &$currentDevis){
$totalHt = 0;
$totalTva = 0;
$totalTtc = 0;
$devisProducts = $this->getDevisProduits($currentDevis['devis_id']);
foreach($devisProducts as $currentProduct){
$valueHt = $currentProduct['produit_price'] * $currentProduct['quantite'];
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt,$tvaValue);
$totalHt+=$valueHt;
$totalTtc+=$valueTtc;
$tvaAmount = $valueTtc - $valueHt;
$totalTva += $tvaAmount;
}
$currentDevis["totalHt"] = $totalHt;
$currentDevis["totalTtc"] = $totalTtc;
$currentDevis["totalTva"] = $totalTva;
$factureTotalHt += $totalHt;
$factureTotalTtc += $totalTtc;
$factureTotalTva += $totalTva;
$facture["devisList"][] = $currentDevis;
}
$facture["totalHt"] = $factureTotalHt;
$facture["totalTtc"] = $factureTotalTtc;
$facture["totalTva"] = $factureTotalTva;
$facture["isFactureClientGroup"] = !$isFactureSingleClient;
return $facture;
}
}