whiteColumn = array("date", "num", "id_client", "id_thanato", "entreprise", "nom", "prenom", "legal_one", "telephone", "mail", "adresse", "produit_id", "quantite", "is_tva", "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',"code_comptable", '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)); } /** * Modifie getTotalDevis pour retourner aussi le statut TVA client * @param int $iddevis ID du devis * @param string $idNextcloud ID Nextcloud * @return string JSON avec total et statut TVA client */ public function getTotalDevis($iddevis, $idNextcloud) { try { $articles = json_decode($this->getListArticle($iddevis, $idNextcloud)); $produits = json_decode($this->getListProduit($iddevis, $idNextcloud)); $total = 0; if (is_array($articles)) { foreach($articles as $key => $article) { if (isset($article->prix_unitaire) && isset($article->quantite)) { $total += $article->prix_unitaire * $article->quantite; } } } if (is_array($produits)) { foreach($produits as $key => $produit) { if (isset($produit->prix_unitaire) && isset($produit->quantite)) { $total += $produit->prix_unitaire * $produit->quantite; } } } $clientTvaStatus = $this->getClientTvaStatus($iddevis, $idNextcloud); return array( 'total' => $total, 'client_tva_status' => $clientTvaStatus ); } catch (\Exception $e) { error_log("Error in getTotalDevis database: " . $e->getMessage()); return array( 'total' => 0, 'client_tva_status' => 1 ); } } 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.is_tva as tva, " .$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 getFacturesListWithDependencies() { $sql = "SELECT facture.id, facture.user_id, facture.num, facture.date, facture.fk_facture_status_key, facture.fk_facture_payment_type_id, facture.payment_date, facture_payment_type.facture_payment_type_label, facture_status.facture_status_label, facture.facture_type, facture.fk_client_id as facture_client_id, facture.fk_client_group_facturation_id as facture_client_group_facturation_id, facture.date_paiement, facture.type_paiement, facture.id_devis, facture.version, facture.status_paiement, facture_client.nom as facture_client_name, facture_client.entreprise as facture_client_entreprise, facture_client.fk_client_group_id as facture_client_group_id, facture_client_group_facturation.group_facturation_name as facture_group_name, facture_client_group_facturation.code_comptable as group_code_comptable, facture.document_generated_date as facture_document_generated_date, facture.document_sent_date as facture_document_sent_date, facture.month as facture_month, facture.year as facture_year, devis.num as dnum, devis.comment as dcomment, client.entreprise, client.nom, client.prenom, client.id as id_cli, client.entreprise as client_entreprise, client.fk_client_group_facturation_id as fk_client_group_facturation_id, client.adresse as adresse_cli,client.mail as mail_cli, client.telephone as telephone_cli,client.legal_one as legalone_cli, client.fk_client_group_id as fk_client_group_id, defunt.id as id_defunt, defunt.nom as nom_defunt, lieu.id as lid, lieu.nom as lieu, lieu.adresse as adresse_soin,devis.id_lieu FROM ".$this->tableprefix."facture as facture LEFT JOIN ".$this->tableprefix."devis as devis on facture.id_devis = devis.id LEFT JOIN ".$this->tableprefix."lieu as lieu on devis.id_lieu = lieu.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."facture_payment_type as facture_payment_type on facture.fk_facture_payment_type_id = facture_payment_type.id LEFT JOIN ".$this->tableprefix."facture_status as facture_status on facture.fk_facture_status_key = facture_status.facture_status_key LEFT JOIN ".$this->tableprefix."client as facture_client on facture.fk_client_id = facture_client.id LEFT JOIN ".$this->tableprefix."client_group_facturation as facture_client_group_facturation on facture.fk_client_group_facturation_id = facture_client_group_facturation.id ORDER BY facture.id DESC, facture.date_paiement DESC"; $result = $this->execSQL($sql, array()); return $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."facture.document_generated_date as facture_document_generated_date, " .$this->tableprefix."facture.document_sent_date as facture_document_sent_date, " .$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.is_tva as tva_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() { $factures = $this->getFacturesListWithDependencies(); $facturesList = json_decode($factures); foreach($facturesList as $currentFacture) { $produits = $this->getProduitsDevisByDevisId($currentFacture->id_devis); $currentFacture->produits = $produits; $currentFacture->totalPrices = $this->getFactureTotalPrices($currentFacture->id); } 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.is_tva as tva, " .$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."client.is_tva as tva, " .$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.facture_number, " .$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."client.id as client_id, " .$this->tableprefix."client.mail as client_mail, " .$this->tableprefix."client_group_facturation.id as group_client_id, " .$this->tableprefix."client_group_facturation.email as group_client_mail, " .$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."client_group_facturation on ".$this->tableprefix."client.fk_client_group_facturation_id = ".$this->tableprefix."client_group_facturation.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."defunt.product_brand," .$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."client.mail as client_mail, " .$this->tableprefix."client_group_facturation.email as client_group_mail, " .$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."client_group_facturation on ".$this->tableprefix."client.fk_client_group_facturation_id = ".$this->tableprefix."client_group_facturation.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)); } /** * Récupère le statut TVA du client associé au devis * @param int $numdevis ID du devis * @param string $idNextcloud ID Nextcloud * @return int Statut TVA du client (0 ou 1) */ public function getClientTvaStatus($numdevis, $idNextcloud) { $sql = "SELECT c.is_tva FROM " . $this->tableprefix . "client c INNER JOIN " . $this->tableprefix . "devis d ON c.id = d.id_client WHERE d.id = ?"; $result = $this->execSQL($sql, array($numdevis)); $clientData = json_decode($result); return isset($clientData[0]->is_tva) ? (int)$clientData[0]->is_tva : 1; // Par défaut TVA = 1 si non trouvé } 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); $facturePrefix = "FAC"; $devis = json_decode($this->getOneDevis($devisId, $idNextcloud))[0]; $isDevisNegative = $this->isDevisNegative($devisId, clientId: $devis->clientid); if($isDevisNegative) { $facturePrefix = "AVO"; } $fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($devisDatetime, $factureNumber, $facturePrefix); $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; } private function isDevisNegative($devisId, $clientId) { $sql = "SELECT produit_devis.quantite,produit.prix_unitaire,produit.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 = ?;"; $devisProduits = $this->execSQLNoJsonReturn($sql, array($devisId)); $total = 0; if(!empty($devisProduits)) { foreach($devisProduits as $currentProduit) { if($currentProduit['id'] != null) { $produitPrice = $this->getProductPriceByClient($currentProduit['id'], $clientId, $currentProduit['prix_unitaire']); $total += $produitPrice * $currentProduit['quantite']; } } } return $total < 0; } private function getProduitDevisById($produitDevisId) { $sql = "SELECT * FROM ".$this->tableprefix."produit_devis as produit_devis WHERE produit_devis.id = ?;"; $result = $this->execSQLNoJsonReturn($sql, [$produitDevisId]); ; if(!empty($result)) { return $result[0]; } return null; } private function getFactureByDevisId($devisId) { $sql = "SELECT * FROM ".$this->tableprefix."facture as facture WHERE facture.id_devis = ?"; $result = $this->execSQLNoJsonReturn($sql, [$devisId]); if(!empty($result)) { return $result[0]; } return null; } /** * 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); $facturePrefix = "FAC"; if($facture['id_devis']) { $devis = json_decode($this->getOneDevis($facture['id_devis'], $idNextcloud))[0]; $isDevisNegative = $this->isDevisNegative($facture['id_devis'], $devis->clientid); if($isDevisNegative) { $facturePrefix = "AVO"; } } $fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($facturationDatetime, $factureNumber, $facturePrefix); $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)); } } elseif(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)); $facturePrefix = "FAC"; $factureNumber = $facture->facture_number; $isDevisNegative = $this->isDevisNegative($devis->devisid, $devis->clientid); if($isDevisNegative) { $facturePrefix = "AVO"; } $facturationDatetime = new Datetime($facture->date); $fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($facturationDatetime, $factureNumber, $facturePrefix); $sql = "UPDATE ".$this->tableprefix.$table." SET `num`= ? WHERE `id` = ?"; $this->execSQLNoData($sql, array($fullFactureNumber, $id)); } elseif(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)); } } } elseif(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); } elseif(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); } elseif(strcmp($table, "produit_devis") == 0 && (strcmp($column, "quantite") == 0)) { $sql = "UPDATE ".$this->tableprefix.$table." SET $column = ? WHERE `id` = ?"; $this->execSQLNoData($sql, array(trim(string: $data), $id)); $produitDevis = $this->getProduitDevisById($id); if($produitDevis) { $devisId = $produitDevis['devis_id']; $devis = json_decode($this->getOneDevis($devisId, $idNextcloud))[0]; if($devis) { $facture = $this->getFactureByDevisId($devisId); $isDevisNegative = $this->isDevisNegative($devisId, $devis->clientid); if($isDevisNegative) { $factureNumber = $facture["facture_number"]; $facturePrefix = "AVO"; $facturationDatetime = new Datetime($facture["date"]); $fullFactureNumber = DateHelpers::GetFullFactureOrDevisNumberByDate($facturationDatetime, $factureNumber, $facturePrefix); $sql = "UPDATE ".$this->tableprefix."facture SET `num`= ? WHERE `id` = ?"; $this->execSQLNoData($sql, array($fullFactureNumber, $facture['id'])); } } } } 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é';"; // $sql = "SELECT count(*) as c from ".$this->tableprefix."devis WHERE `mentions` NOT LIKE 'facturé';"; $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()); } public function retrieveTotalInvoicesForTheYear() { $sql = "SELECT EXTRACT(YEAR FROM devis.date) AS y, EXTRACT(MONTH FROM devis.date) AS m, SUM( COALESCE(client_group_discount.ht_amount,produit.prix_unitaire) * produit_devis.quantite ) AS total from oc_gestion_devis as devis JOIN oc_gestion_produit_devis AS produit_devis ON devis.id = produit_devis.devis_id JOIN oc_gestion_produit AS produit ON produit_devis.produit_id = produit.id JOIN oc_gestion_client AS client ON devis.id_client = client.id JOIN oc_gestion_client_group AS client_group ON client.fk_client_group_id = client_group.id JOIN oc_gestion_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 WHERE (devis.mentions = ? OR devis.mentions = ?) GROUP BY EXTRACT(YEAR FROM devis.`date`), EXTRACT(MONTH FROM devis.`date`) ORDER BY EXTRACT(YEAR FROM devis.`date`) DESC, EXTRACT(MONTH FROM devis.`date`);"; return $this->execSQL($sql, [ DevisMentionConstant::FACTURED, DevisMentionConstant::FACTURED_FORMATTED ]); } /** * 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->execSQLNoJsonReturn($sql, array()); } public function getStatArticleAnnuel($idNextcloud, $annee) { $sql = "SELECT p.id, p.reference, COALESCE(SUM(CASE WHEN MONTH(d.date) = 1 THEN pd.quantite ELSE 0 END), 0) AS janvier, COALESCE(SUM(CASE WHEN MONTH(d.date) = 2 THEN pd.quantite ELSE 0 END), 0) AS fevrier, COALESCE(SUM(CASE WHEN MONTH(d.date) = 3 THEN pd.quantite ELSE 0 END), 0) AS mars, COALESCE(SUM(CASE WHEN MONTH(d.date) = 4 THEN pd.quantite ELSE 0 END), 0) AS avril, COALESCE(SUM(CASE WHEN MONTH(d.date) = 5 THEN pd.quantite ELSE 0 END), 0) AS mai, COALESCE(SUM(CASE WHEN MONTH(d.date) = 6 THEN pd.quantite ELSE 0 END), 0) AS juin, COALESCE(SUM(CASE WHEN MONTH(d.date) = 7 THEN pd.quantite ELSE 0 END), 0) AS juillet, COALESCE(SUM(CASE WHEN MONTH(d.date) = 8 THEN pd.quantite ELSE 0 END), 0) AS aout, COALESCE(SUM(CASE WHEN MONTH(d.date) = 9 THEN pd.quantite ELSE 0 END), 0) AS septembre, COALESCE(SUM(CASE WHEN MONTH(d.date) = 10 THEN pd.quantite ELSE 0 END), 0) AS octobre, COALESCE(SUM(CASE WHEN MONTH(d.date) = 11 THEN pd.quantite ELSE 0 END), 0) AS novembre, COALESCE(SUM(CASE WHEN MONTH(d.date) = 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 WHERE YEAR(d.date) = ".$annee." AND pd.devis_id IS NOT NULL AND (d.mentions = ? or d.mentions = ?) GROUP BY p.id, p.reference;"; return $this->execSQL($sql, [ DevisMentionConstant::FACTURED, DevisMentionConstant::FACTURED_FORMATTED ]); } 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."thanato thanato ON d.id_thanato = thanato.id WHERE YEAR(d.date) = ".$annee." AND d.id_thanato IS NOT NULL AND (d.mentions = ? or d.mentions = ?) AND thanato.id IS NOT NULL GROUP BY nom_thanato, prenom_thanato ORDER BY nom_thanato;"; return $this->execSQL($sql, [ DevisMentionConstant::FACTURED, DevisMentionConstant::FACTURED_FORMATTED ]); } 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) AND (devis.mentions = ? or devis.mentions = ?) GROUP BY thanato.id, nom_thanato, prenom_thanato;"; return $this->execSQL($sql, [ DevisMentionConstant::FACTURED, DevisMentionConstant::FACTURED_FORMATTED ]); } /** * 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, facture_on_group.num as facture_on_group_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 LEFT JOIN ".$this->tableprefix."facture as facture_on_group on devis.fk_facture_id = facture_on_group.id 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) { $isLeaveConditionAsString = "ABSENCETYPE:"; $datetimeFormatted = $date->format('Ymd'); $dateCondition = "%DTSTART%".$datetimeFormatted."%"; $conditions = []; $params = [ $calendarId, $dateCondition ]; // First parameters for placeholders $absenceTypes = VCalendarPropertyConstant::ABSENCE_TYPES; foreach ($absenceTypes as $type) { $conditions[] = "calendarobject.calendardata LIKE ?"; $params[] = "%$isLeaveConditionAsString$type%"; // Add corresponding values } $conditions[] = "calendarobject.calendardata LIKE ?"; $params[] = "%".BddConstant::ISLEAVEPROPERTYONVCALENDAR.":1%"; $sql = "SELECT * FROM ".self::DEFAULT_TABLE_PREFIX."calendarobjects as calendarobject WHERE calendarobject.calendarid = ? AND calendarobject.calendardata LIKE ? AND calendarobject.deleted_at IS NULL AND (" . implode(" OR ", $conditions) . ");"; $leaves = $this->execSQLNoJsonReturn($sql, $params); 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']); $absenceType = VCalendarHelpers::GetValueFromKeyInVCalendarString(VCalendarPropertyConstant::ABSENCE_TYPE, $currentLeave['calendardata']); $absenceTypeKey = null; $absenceTypeLabel = null; if($absenceType) { $absenceTypeKey = $absenceType; $absenceTypeLabel = FileExportHelpers::GetAbsenceTypeLabelFromKey($absenceType); } else { //get is leave $isLeave = VCalendarHelpers::GetValueFromKeyInVCalendarString(BddConstant::ISLEAVEPROPERTYONVCALENDAR, $currentLeave['calendardata']); if ($isLeave) { $absenceTypeKey = AbsenceTypeConstant::LEAVE; $absenceTypeLabel = VCalendarPropertyConstant::ABSENCE_TYPES_KEYS_VALUES[$absenceTypeKey]; ; } } $startTimeValueWithMinutes = ""; $endTimeValueWithMinutes = ""; if($leaveTime["datetimeStart"]) { $startTimeValueWithMinutes = $leaveTime["datetimeStart"]->format('H\hi'); } if($leaveTime["datetimeEnd"]) { $endTimeValueWithMinutes = $leaveTime["datetimeEnd"]->format('H\hi'); } $devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [ "onLeave" => true, "startTime" => $startTimeValueWithMinutes, "endTime" => $endTimeValueWithMinutes, "thanatoName" => $thanatoName, "date" => $currentDateFormatted, "totalHours" => $leaveTime["totalHours"], "totalWorkedHours" => $leaveTime["totalWorkedHours"], "isPublicHoliday" => $isPublicHoliday, "absenceTypeKey" => $absenceTypeKey, "absenceTypeLabel" => $absenceTypeLabel ]; } } } 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']); $startTimeValueWithMinutes = ""; $endTimeValueWithMinutes = ""; if($leaveTime["datetimeStart"]) { $startTimeValueWithMinutes = $leaveTime["datetimeStart"]->format('H\hi'); } if($leaveTime["datetimeEnd"]) { $endTimeValueWithMinutes = $leaveTime["datetimeEnd"]->format('H\hi'); } $absenceType = VCalendarHelpers::GetValueFromKeyInVCalendarString(VCalendarPropertyConstant::ABSENCE_TYPE, $currentLeave['calendardata']); $absenceTypeKey = null; $absenceTypeLabel = null; if($absenceType) { $absenceTypeKey = $absenceType; $absenceTypeLabel = FileExportHelpers::GetAbsenceTypeLabelFromKey($absenceType); } else { //get is leave $isLeave = VCalendarHelpers::GetValueFromKeyInVCalendarString(BddConstant::ISLEAVEPROPERTYONVCALENDAR, $currentLeave['calendardata']); if ($isLeave) { $absenceTypeKey = AbsenceTypeConstant::LEAVE; $absenceTypeLabel = VCalendarPropertyConstant::ABSENCE_TYPES_KEYS_VALUES[$absenceTypeKey]; ; } } $devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [ "onLeave" => true, "startTime" => $startTimeValueWithMinutes, "endTime" => $endTimeValueWithMinutes, "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); $startTimeValueWithMinutes = ""; $endTimeValueWithMinutes = ""; if($devisTimeValue["datetimeStart"]) { $startTimeValueWithMinutes = $devisTimeValue["datetimeStart"]->format('H\hi'); } if($devisTimeValue["datetimeEnd"]) { $endTimeValueWithMinutes = $devisTimeValue["datetimeEnd"]->format('H\hi'); } $devis["startTime"] = $startTimeValueWithMinutes; $devis["endTime"] = $endTimeValueWithMinutes; $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; } public 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.is_tva as tva, 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, client_group_facturation.code_comptable as group_code_comptable 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 getInvoicePdfData($factureId, $configuration) { $factureData = $this->getFactureByIdWithDevis($factureId); if($factureData == null) { return null; } $products = $this->getDevisProduits($factureData["devis_id"]); $isDevisNegative = $this->isDevisNegative($factureData['devis_id'], $factureData['client_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"]; } $factureData['is_negative'] = $isDevisNegative; $configurationAdresses = FileExportHelpers::GetAddressAndCityFromAddress($configuration->adresse); $factureData["configuration_adresse"] = $configurationAdresses["address"]; $factureData["configuration_adresse_city"] = $configurationAdresses["city"]; return $factureData; } private function getDevisByClientIdsListAndMonthYear($clientIds, $month, $year) { if(empty($clientIds)) { return []; } $clientSqlPlaceholders = implode(',', array_fill(0, count($clientIds), '?')); $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, devis.devis_full_number, client.nom as client_nom, client.entreprise as client_entreprise, client.adresse as client_adresse, client.is_tva as tva, 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.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 as devis LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.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 IN ($clientSqlPlaceholders) AND YEAR(devis.date) = ?"; $conditions = array_merge( $clientIds, [$year] ); if($month != 0) { $conditions[] = $month; $sql .= " AND MONTH(devis.date) = ?"; } $sql .= ";"; $devisList = $this->execSQLNoJsonReturn( $sql, $conditions ); return $devisList; } 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, devis.devis_full_number, client.nom as client_nom, client.entreprise as client_entreprise, client.adresse as client_adresse, client.is_tva as tva, 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.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 as devis LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id LEFT JOIN ".$this->tableprefix."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.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 = ?"; $conditions = [$clientId]; if($year != -1) { $conditions[] = $year; $sql .= " AND YEAR(devis.date) = ?"; } if($month != 0) { $conditions[] = $month; $sql .= " AND MONTH(devis.date) = ?"; } $sql .= ";"; $devisList = $this->execSQLNoJsonReturn( $sql, $conditions ); return $devisList; } public function getDevisPdfDataByClientGroupFacturationAndMonthYear($clientGroupFacturationId, $month, $year, $configuration) { $clientIds = $this->getClientIdsByClientGroupFacturationId($clientGroupFacturationId); $devisList = $this->getDevisByClientIdsListAndMonthYear($clientIds, $month, $year); 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; // Déterminer la TVA pour cette facture $hasTva = true; // Valeur par défaut if(isset($invoice['client_id']) && $invoice['client_id']) { $client = $this->getClientById($invoice['client_id']); $hasTva = ($client && isset($client['tva'])) ? ($client['tva'] == 1) : true; } $invoice["is_tva"] = $hasTva; $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.is_tva as tva, 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.is_tva as tva, 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 = ?"; $conditions = [$clientId]; if ($year != -1) { $conditions[] = $year; $sql .= " AND YEAR(facture.date_paiement) = ?"; } 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, client.is_tva as tva, 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.id as client_id, client.nom as client_nom, client.entreprise as client_entreprise, client.adresse as client_adresse, client.is_tva as tva, 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_group_facturation.email as client_group_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."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.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; } private function deleteProductsInDevisByProductType($devisId, $productTypeId) { $sql = "DELETE produit_devis 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 = ?;"; $this->execSQLNoData($sql, [$devisId,$productTypeId]); } public function setDefuntCover($defuntId, $productCoverId) { $defunt = $this->getDefuntById($defuntId); if($defunt == null) { return null; } if($defunt["devis_id"] == null) { return null; } if($productCoverId == null) { $productTypeCover = $this->getProductTypeByKey(ProductConstant::PRODUCT_COVER_TYPE_KEY); $this->deleteProductsInDevisByProductType($defunt["devis_id"], $productTypeCover['id']); return true; } $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); $startTimeValueWithMinutes = ""; $endTimeValueWithMinutes = ""; if($devisTimeValue["datetimeStart"]) { $startTimeValueWithMinutes = $devisTimeValue["datetimeStart"]->format('H\hi'); } if($devisTimeValue["datetimeEnd"]) { $endTimeValueWithMinutes = $devisTimeValue["datetimeEnd"]->format('H\hi'); } $devis->startTime = $startTimeValueWithMinutes; $devis->endTime = $endTimeValueWithMinutes; $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.mentions, devis.date, 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 updateDevisDate($devisId, $requestedDate) { $sql = "UPDATE ".$this->tableprefix."devis as devis SET devis.date = ? WHERE devis.id = ?"; $this->execSQLNoData($sql, [$requestedDate,$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 getDevisByClientGroupFacturationIdAndMonthYear($clientGroupFacturationId, $month, $year, $mentionsFilters = []) { $sql = "SELECT devis.id ,devis.id_client,client.fk_client_group_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); return $result; } public function getDevisIdsByClientGroupFacturationIdAnDate($clientGroupFacturationId, $facturationDate, $mentionFilters = []) { $dateTime = Datetime::createFromFormat('Y-m-d', $facturationDate); $month = $dateTime->format('m'); $year = $dateTime->format('Y'); $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) = ? AND devis.date <= ? " ; $conditions = [$clientGroupFacturationId,$year,$month ,$facturationDate]; 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; } //OLD concept 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 "."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 getDevisByClientIdAndMonthYear($clientId, $month, $year, $mentionFilters = []) { $sql = "SELECT devis.id,devis.id_client,client.fk_client_group_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); return $result; } public function getDevisByClientIdByFactureId($factureId, $mentionFilters = []) { $sql = "SELECT devis.id,devis.id_client,client.fk_client_group_id FROM ".$this->tableprefix."devis as devis LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id WHERE devis.fk_facture_id = ? "; $conditions = [$factureId]; 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); return $result; } public function getDevisIdsByClientIdAndDate($clientId, $date, $mentionFilters = []) { $dateTime = Datetime::createFromFormat('Y-m-d', $date); $month = $dateTime->format('m'); $year = $dateTime->format('Y'); $sql = "SELECT devis.id,devis.id_client,client.fk_client_group_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) = ? AND devis.date <= ? "; $conditions = [$clientId,$year,$month ,$date]; 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 getDevisIdsByClientIdAndMonthYear($clientId, $month, $year, $mentionFilters = []) { $sql = "SELECT devis.id,devis.id_client,client.fk_client_group_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 getFactureIdByClientIdAndDate($clientId, $facturationDate) { $sql = "SELECT facture.id as facture_id FROM ".$this->tableprefix."facture as facture WHERE facture.fk_client_id = ? AND facture.facture_type = ? AND facture.date_paiement = ? "; $result = $this->execSQLNoJsonReturn($sql, [ $clientId, FactureTypeConstant::TYPE_GROUP, $facturationDate, ]); if(!empty($result)) { return $result[0]['facture_id']; } return null; } public function getFactureIdByClientGroupFacturationIdAndDate($clientId, $facturationDate) { $sql = "SELECT facture.id as facture_id FROM ".$this->tableprefix."facture as facture WHERE facture.fk_client_group_facturation_id = ? AND facture.facture_type = ? AND facture.date_paiement = ? "; $result = $this->execSQLNoJsonReturn($sql, [ $clientId, FactureTypeConstant::TYPE_GROUP, $facturationDate ]); if(!empty($result)) { return $result[0]['facture_id']; } return null; } public function invoiceListOfDevisIds($devisIds, $factureId) { $sqlConditionsPlaceholder = implode(',', array_fill(0, count($devisIds), '?')); $sql = "UPDATE ".$this->tableprefix."devis as devis SET devis.mentions = ? , devis.fk_facture_id = ? WHERE devis.id IN ($sqlConditionsPlaceholder);"; $conditions = array_merge( [DevisMentionConstant::FACTURED_FORMATTED ,$factureId ], $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, client_group_facturation.code_comptable as code_comptable 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; } public function getDevisIdsGroupByFactureId($factureId,$mentionFilters = []){ $sql = "SELECT devis.id FROM ".$this->tableprefix."devis as devis WHERE devis.fk_facture_id = ? "; $conditions = [$factureId]; if(!empty($mentionFilters)){ $mentionsFilterPlaceholders = implode(',', array_fill(0, count($mentionFilters), '?')); $sql .= " AND devis.mentions IN ($mentionsFilterPlaceholders)"; $conditions = array_merge($conditions, $mentionFilters); } $sql.= ";"; $devisList = $this->execSQLNoJsonReturn($sql,$conditions); $devisIds = []; foreach($devisList as $devis){ $devisIds[] = $devis['id']; } return $devisIds; } public function getDevisDataGroupByFactureId($factureId, $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, devis.id_client as client_id, 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, client_group_facturation.code_comptable as code_comptable 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 devis.fk_facture_id = ? "; $conditions = [$factureId]; 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, client_group_facturation.code_comptable as code_comptable 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 getDevisByFkFactureId($factureId) { $sql = "SELECT * FROM ".$this->tableprefix."devis as devis WHERE devis.fk_facture_id = ? LIMIT 1;"; $result = $this->execSQLNoJsonReturn($sql, [$factureId]); if(!empty($result)) { return $result[0]; } return null; } 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, facture.facture_case_number, facture.facture_order_number 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]; $isFactureSingleClient = $facture['fk_client_id'] != null && $facture['fk_client_id'] != 0; $devisMentionFilters = [ DevisMentionConstant::FACTURED, DevisMentionConstant::FACTURED_FORMATTED ]; $devis = $this->getDevisByFkFactureId($factureId); $factureGroupIsRelatedToAnyDevis = $devis != null; // LOGIQUE TVA SIMPLIFIÉE $tvaValue = (float)$currentConfig->tva_default; $isTvaApplicable = true; // Récupérer le statut TVA du client de cette facture $clientId = $facture['fk_client_id']; if ($clientId != null && $clientId != 0) { $client = $this->getClientById($clientId); if (isset($client['tva']) && $client['tva'] == 0) { $isTvaApplicable = false; $tvaValue = 0; } } else { $clientId = $devis['id_client']; $client = $this->getClientById($clientId); if (isset($client['tva']) && $client['tva'] == 0) { $isTvaApplicable = false; $tvaValue = 0; } } 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"]; if (!$factureGroupIsRelatedToAnyDevis) { $devisList = $this->getDevisDataByClientIdAndMonthYear( $facture['fk_client_id'], $facture['month'], $facture['year'], $devisMentionFilters ); } else { $devisList = $this->getDevisDataGroupByFactureId($factureId, $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"]; if (!$factureGroupIsRelatedToAnyDevis) { $devisList = $this->getDevisDataByClientGroupFacturationIdAndMonthYear( $facture['fk_client_group_facturation_id'], $facture['month'], $facture['year'], $devisMentionFilters ); } else { $devisList = $this->getDevisDataGroupByFactureId($factureId, $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']; // CALCUL SIMPLE : TVA OU PAS TVA if ($isTvaApplicable) { // Client soumis à TVA : utiliser le taux par défaut $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue); $tvaAmount = $valueTtc - $valueHt; } else { // Client exonéré : TTC = HT $valueTtc = $valueHt; $tvaAmount = 0; } $totalHt += $valueHt; $totalTtc += $valueTtc; $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; // INFOS TVA POUR LE TEMPLATE $facture["tvaInfo"] = [ 'is_applicable' => $isTvaApplicable, 'rate' => $tvaValue, 'is_exempt' => !$isTvaApplicable ]; return $facture; } public function getInvoiceGroupPdfData($factureId, $configuration) { $defaultTvaValue = $configuration->tva_default; $factureData = $this->getFactureByFactureId($factureId); $isFactureForSingleClient = $factureData['fk_client_id'] != null && $factureData['fk_client_id'] != 0; $devisMentionFilters = [ DevisMentionConstant::FACTURED_FORMATTED, DevisMentionConstant::FACTURED ]; $devis = $this->getDevisByFkFactureId($factureId); $factureGroupIsRelatedToAnyDevis = $devis != null; $hasTva = true; // Valeur par défaut if($isFactureForSingleClient) { $client = $this->getClientById($factureData['fk_client_id']); $hasTva = ($client && isset($client['tva'])) ? ($client['tva'] == 1) : true; $groupClient = $this->getTvaItracomuIdClient($factureData['fk_client_id']); } else { $client = $this->getClientById($devis['id_client']); $hasTva = ($client && isset($client['tva'])) ? ($client['tva'] == 1) : true; $groupClient = $this->getTvaItracomuIdClient($devis['id_client']); } // Déterminer le taux de TVA global pour l'affichage $globalTvaValue = $defaultTvaValue; if (!$factureGroupIsRelatedToAnyDevis) { if($isFactureForSingleClient) { $factureDevisList = $this->getDevisDataByClientIdAndMonthYear( $factureData['fk_client_id'], $factureData['month'], $factureData['year'], $devisMentionFilters ); // Vérifier la TVA du client unique $client = $this->getClientById($factureData['fk_client_id']); if(isset($client['tva']) && $client['tva'] == 0) { $globalTvaValue = 0; } } else { $factureDevisList = $this->getDevisDataByClientGroupFacturationIdAndMonthYear( $factureData['fk_client_group_facturation_id'], $factureData['month'], $factureData['year'], $devisMentionFilters ); } } else { $factureDevisList = $this->getDevisDataGroupByFactureId($factureId, $devisMentionFilters); } $factureIncrement = 0; $productsCount = 0; $totalHt = 0; $totalTtc = 0; $totalTva = 0; $templateType = ClientTemplateTypeConstant::PRIVEES; $hasMultipleTvaRates = false; // Pour détecter si on a des taux TVA mixtes 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"] ?? ""; $factureData["group_type"] = "single"; } 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; $factureData["group_type"] = "group"; } } $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; }); } // Déterminer la TVA pour ce devis spécifique $currentTvaValue = $defaultTvaValue; if(isset($devis['client_id'])) { $devisClient = $this->getClientById($devis['client_id']); if(isset($devisClient['tva']) && $devisClient['tva'] == 0) { $currentTvaValue = 0; } } elseif($isFactureForSingleClient) { $currentTvaValue = $globalTvaValue; } // Vérifier si on a des taux mixtes pour ajuster l'affichage global if($factureIncrement == 0) { $globalTvaValue = $currentTvaValue; } elseif($globalTvaValue != $currentTvaValue) { $hasMultipleTvaRates = true; } foreach($products as $product) { $valueHt = $product['produit_price'] * $product['quantite']; if($currentTvaValue > 0) { $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $currentTvaValue); $tvaAmount = $valueTtc - $valueHt; } else { $valueTtc = $valueHt; // Pas de TVA $tvaAmount = 0; } $totalHt += $valueHt; $totalTtc += $valueTtc; $totalTva += $tvaAmount; } $productsCount += count($products); $devis['products'] = $products; $factureIncrement++; } // Gestion de l'affichage de la TVA dans le récapitulatif $tvaLabel = "TVA"; if($hasMultipleTvaRates) { $tvaLabel = "TVA (taux mixtes)"; } elseif($globalTvaValue > 0) { $tvaLabel = "TVA ".$globalTvaValue. "%"; } else { $tvaLabel = "TVA 0 %"; } if($hasTva) { $totaPricesArray = [ "TOTAL HT" => $totalHt, $tvaLabel => $totalTva, "TOTAL TTC" => $totalTtc ]; } else { $totaPricesArray = [ "TOTAL HT" => $totalHt ]; } $factureData["is_tva"] = $hasTva; $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; $factureData["client_tva_intracommu"] = $groupClient["tva_intracommu"]; return $factureData; } public function setFactureGeneratedDate($factureId) { $datetimeNow = new Datetime(); $dateNow = $datetimeNow->format("Y-m-d"); $sql = "UPDATE ".$this->tableprefix."facture set document_generated_date = ? WHERE id = ?"; $this->execSQLNoData($sql, [ $dateNow, $factureId ]); } public function setFactureSentDate($factureId) { $datetimeNow = new Datetime(); $dateNow = $datetimeNow->format("Y-m-d"); $sql = "UPDATE ".$this->tableprefix."facture set document_sent_date = ? WHERE id = ?"; $this->execSQLNoData($sql, [ $dateNow, $factureId ]); } public function getFactureClientMailByFactureId($factureId) { $sql = "SELECT facture.id, facture.facture_type, facture_client.mail as facture_client_mail, facture_client_group_facturation.email as facture_client_group_mail, facture.fk_client_id as facture_client_id, facture.fk_client_group_facturation_id as facture_client_group_facturation_id, client.id as client_id, client.fk_client_group_facturation_id as devis_client_group_facturation_id, client.mail as devis_client_mail, client_group_facturation.email as devis_client_group_mail 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."client_group_facturation as client_group_facturation on client.fk_client_group_facturation_id = client_group_facturation.id LEFT JOIN ".$this->tableprefix."client as facture_client on facture.fk_client_id = facture_client.id LEFT JOIN ".$this->tableprefix."client_group_facturation as facture_client_group_facturation on facture.fk_client_group_facturation_id = facture_client_group_facturation.id WHERE facture.id = ? LIMIT 1;"; $mail = null; $result = $this->execSQLNoJsonReturn($sql, [$factureId]); if(!empty($result)) { $facture = $result[0]; $factureIsSingle = $facture["facture_type"] == FactureTypeConstant::TYPE_SINGLE; if($factureIsSingle) { $mail = $facture["fk_client_group_facturation_id"] != null ? $facture["devis_client_group_mail"] : $facture["devis_client_mail"]; } else { $factureIsClientWithoutGroup = $facture["facture_client_id"] != null && $facture["facture_client_id"] != 0; $mail = $factureIsClientWithoutGroup ? $facture["facture_client_mail"] : $facture["facture_client_group_mail"]; } } return $mail; } private function getUserAccountDataByNextcloudId($nextcloudId) { $sql = "SELECT * FROM " . self::DEFAULT_TABLE_PREFIX . "accounts as user_account WHERE user_account.uid = ? LIMIT 1;"; $result = $this->execSQLNoJsonReturn($sql, [$nextcloudId]); if (!empty($result)) { return $result[0]; } return null; } public function getUserEmailByNextcloudId($nextcloudId) { $userAccount = $this->getUserAccountDataByNextcloudId($nextcloudId); if ($userAccount != null) { $userEmail = MailHelpers::getUserMailFromUserAccountData($userAccount['data']); return $userEmail; } return null; } public function getTvaItracomuIdClient($clientId) { $sql = "SELECT gf.tva_intracommu FROM ".$this->tableprefix."client_group_facturation AS gf LEFT JOIN ".$this->tableprefix."client AS gc ON gc.fk_client_group_facturation_id = gf.id WHERE gc.id = ?;"; $data = $this->execSQLNoJsonReturn( $sql, [$clientId] ); if(!empty($data)) { return $data[0]; } return null; } private function getProductsTotalPrices($products) { $configs = json_decode($this->getConfiguration(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD)); $currentConfig = $configs[0]; $totalHt = 0; $totalTtc = 0; foreach ($products as $product) { $valueHt = $product['produit_price'] * $product['quantite']; $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $currentConfig->tva_default); $totalHt += $valueHt; $totalTtc += $valueTtc; } return [ "total_ht" => $totalHt, "total_ttc" => $totalTtc, "tva" => $currentConfig->tva_default ]; } private function getDevisIdsListByFactureId($factureId){ $factureData = $this->getFactureByFactureId(factureId: $factureId); $isFactureGroupOfDevis = $factureData["facture_type"] == FactureTypeConstant::TYPE_GROUP; $factureDevisIdsList = []; if($isFactureGroupOfDevis){ $isFactureForSingleClient = $factureData['fk_client_id'] != null && $factureData['fk_client_id'] != 0; $devisMentionFilters = [ DevisMentionConstant::FACTURED_FORMATTED, DevisMentionConstant::FACTURED ]; $devis = $this->getDevisByFkFactureId($factureId); $factureGroupIsRelatedToAnyDevis = $devis != null; if (!$factureGroupIsRelatedToAnyDevis) { if($isFactureForSingleClient){ $factureDevisIdsList = $this->getDevisIdsByClientIdAndMonthYear( $factureData['fk_client_id'], $factureData['month'], $factureData['year'],$devisMentionFilters ); }else{ $factureDevisIdsList = $this->getDevisIdsByClientGroupFacturationIdAndMonthYear( $factureData['fk_client_group_facturation_id'], $factureData['month'], $factureData['year'],$devisMentionFilters ); } }else{ $factureDevisIdsList = $this->getDevisIdsGroupByFactureId($factureId, $devisMentionFilters ); } } else{ $factureDevisIdsList = $factureData['id_devis'] ? [$factureData['id_devis']] : []; } return $factureDevisIdsList; } private function getFactureTotalPrices($factureId) { $factureDevisIds = $this->getDevisIdsListByFactureId($factureId); $totalHt = 0; $totalTtc = 0; $tva = 0; foreach($factureDevisIds as $devisId){ $clientTvaStatus = $this->getClientTvaStatus($devisId,BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD); $products = $this->getDevisProduits($devisId); $totalPrices = $this->getProductsTotalPrices($products); $totalHt += $totalPrices["total_ht"]; $totalTtc += $clientTvaStatus == 1 ? $totalPrices["total_ttc"] : $totalPrices["total_ht"]; $tva = $totalPrices["tva"]; } return [ "total_ht" => PriceHelpers::formatDecimalPriceWithCurrency($totalHt), "total_ttc" => PriceHelpers::formatDecimalPriceWithCurrency($totalTtc), "tva" => PriceHelpers::formatDecimalPriceWithCurrency($tva) ]; } }