diff --git a/gestion/lib/Controller/PageController.php b/gestion/lib/Controller/PageController.php index a9f011e..5f22398 100644 --- a/gestion/lib/Controller/PageController.php +++ b/gestion/lib/Controller/PageController.php @@ -1760,8 +1760,9 @@ class PageController extends Controller { try { try { $data_factures = array(); - $factures = json_decode($this->myDb->getFactures($this->idNextcloud)); + $factures = json_decode($this->myDb->getFacturesListWithDependencies()); foreach ($factures as $key => $facture) { + $factureIsSingle = $facture->facture_type == FactureTypeConstant::TYPE_SINGLE; $facture_temp = array( 'num' => $facture->num, 'client' => $facture->entreprise, @@ -1774,19 +1775,65 @@ class PageController extends Controller { 'montant_tva' => 0, 'montant_ttc' => 0, ); - $produits = json_decode($this->getProduitsById($facture->id_devis)); - foreach ($produits as $key => $produit) { - $htPrice = $produit->prix_unitaire; - if($facture->fk_client_group_id != null || $facture->fk_client_group_id != 0){ - $price = $this->myDb->getProductPriceByClientGroupId($facture->fk_client_group_id,$produit->id); - if($price != null){ - $htPrice = $price; + if($factureIsSingle){ + $produits = json_decode($this->getProduitsById($facture->id_devis)); + foreach ($produits as $key => $produit) { + $htPrice = $produit->prix_unitaire; + if($facture->fk_client_group_id != null || $facture->fk_client_group_id != 0){ + $price = $this->myDb->getProductPriceByClientGroupId($facture->fk_client_group_id,$produit->id); + if($price != null){ + $htPrice = $price; + } } + $facture_temp['montant_htc'] += $htPrice * $produit->quantite; + }; + $facture_temp['montant_tva'] = ($facture_temp['montant_htc'] * $facture_temp['tva'])/100; + $facture_temp['montant_ttc'] = $facture_temp['montant_tva'] + $facture_temp['montant_htc']; + } + else{ + $isFactureGroupForSingleClient = $facture->facture_client_id != null && $facture->facture_client_id != 0; + if($isFactureGroupForSingleClient){ + $facture_temp["client"] = $facture->facture_client_entreprise; + $facture_temp["nom_client"] = $facture->facture_client_name; + $devisList = $this->myDb->getDevisByClientIdAndMonthYear( + $facture->facture_client_id, + $facture->facture_month, + $facture->facture_year, + [ + DevisMentionConstant::FACTURED, + DevisMentionConstant::FACTURED_FORMATTED + ] + ); } - $facture_temp['montant_htc'] += $htPrice * $produit->quantite; - }; - $facture_temp['montant_tva'] = ($facture_temp['montant_htc'] * $facture_temp['tva'])/100; - $facture_temp['montant_ttc'] = $facture_temp['montant_tva'] + $facture_temp['montant_htc']; + else{ + $facture_temp["client"] = $facture->facture_group_name; + $facture_temp["nom_client"] = $facture->facture_group_name; + $devisList = $this->myDb->getDevisByClientGroupFacturationIdAndMonthYear( + $facture->facture_client_group_facturation_id, + $facture->facture_month, + $facture->facture_year, + [ + DevisMentionConstant::FACTURED, + DevisMentionConstant::FACTURED_FORMATTED + ] + ); + } + foreach($devisList as $currentDevis){ + $produits = json_decode($this->getProduitsById($currentDevis['id'])); + foreach ($produits as $key => $produit) { + $htPrice = $produit->prix_unitaire; + if($currentDevis["fk_client_group_id"] != null || $currentDevis["fk_client_group_id"] != 0){ + $price = $this->myDb->getProductPriceByClientGroupId($currentDevis["fk_client_group_id"],$produit->id); + if($price != null){ + $htPrice = $price; + } + } + $facture_temp['montant_htc'] += $htPrice * $produit->quantite; + }; + } + $facture_temp['montant_tva'] = ($facture_temp['montant_htc'] * $facture_temp['tva'])/100; + $facture_temp['montant_ttc'] = $facture_temp['montant_tva'] + $facture_temp['montant_htc']; + } array_push($data_factures, $facture_temp); }; diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index 6d607ff..5dce10e 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -365,13 +365,17 @@ class Bdd { facture.fk_client_group_facturation_id as facture_client_group_facturation_id, facture.date_paiement, facture.type_paiement, - facture.id_devis, + 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.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, @@ -2064,41 +2068,39 @@ class Bdd { public function retrieveTotalInvoicesForTheYear(){ $sql = "SELECT - EXTRACT(YEAR FROM facture.date_paiement) AS y, - EXTRACT(MONTH FROM facture.date_paiement) AS m, + 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 ".$this->tableprefix."facture AS facture - JOIN ".$this->tableprefix."devis AS devis - ON MONTH(facture.date_paiement) = MONTH(devis.date) AND - YEAR(facture.date_paiement) = YEAR(devis.date) - JOIN ".$this->tableprefix."produit_devis AS produit_devis + from oc_gestion_devis as devis + JOIN oc_gestion_produit_devis AS produit_devis ON devis.id = produit_devis.devis_id - JOIN ".$this->tableprefix."produit AS produit + JOIN oc_gestion_produit AS produit ON produit_devis.produit_id = produit.id - JOIN ".$this->tableprefix."client AS client + JOIN oc_gestion_client AS client ON devis.id_client = client.id - LEFT JOIN ".$this->tableprefix."client_group AS client_group + JOIN oc_gestion_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 + 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 facture.date_paiement), - EXTRACT(MONTH FROM facture.date_paiement) + EXTRACT(YEAR FROM devis.`date`), + EXTRACT(MONTH FROM devis.`date`) ORDER BY - EXTRACT(YEAR FROM facture.date_paiement) DESC, - EXTRACT(MONTH FROM facture.date_paiement);"; + 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 */ @@ -2135,25 +2137,22 @@ class Bdd { public function getStatArticleAnnuel($idNextcloud, $annee) { $sql = "SELECT p.id, p.reference, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 1 THEN pd.quantite ELSE 0 END), 0) AS janvier, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 2 THEN pd.quantite ELSE 0 END), 0) AS fevrier, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 3 THEN pd.quantite ELSE 0 END), 0) AS mars, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 4 THEN pd.quantite ELSE 0 END), 0) AS avril, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 5 THEN pd.quantite ELSE 0 END), 0) AS mai, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 6 THEN pd.quantite ELSE 0 END), 0) AS juin, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 7 THEN pd.quantite ELSE 0 END), 0) AS juillet, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 8 THEN pd.quantite ELSE 0 END), 0) AS aout, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 9 THEN pd.quantite ELSE 0 END), 0) AS septembre, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 10 THEN pd.quantite ELSE 0 END), 0) AS octobre, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 11 THEN pd.quantite ELSE 0 END), 0) AS novembre, - COALESCE(SUM(CASE WHEN MONTH(f.date_paiement) = 12 THEN pd.quantite ELSE 0 END), 0) AS decembre + 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 - LEFT JOIN ".$this->tableprefix."facture f - ON MONTH(f.date_paiement) = MONTH(d.date) AND - YEAR(f.date_paiement) = YEAR(f.date) - WHERE YEAR(f.date_paiement) = ".$annee." AND pd.devis_id IS NOT NULL AND + 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, [ @@ -2179,9 +2178,6 @@ class Bdd { COALESCE(SUM(CASE WHEN MONTH(d.date) = 11 THEN 1 ELSE 0 END), 0) AS novembre, COALESCE(SUM(CASE WHEN MONTH(d.date) = 12 THEN 1 ELSE 0 END), 0) AS decembre FROM ".$this->tableprefix."devis d - LEFT JOIN ".$this->tableprefix."facture f - ON MONTH(f.date_paiement) = MONTH(d.date) AND - YEAR(f.date_paiement) = YEAR(f.date) 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 = ?) @@ -4320,6 +4316,28 @@ COMMENTAIRES: ".$comment; 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 getDevisIdsByClientGroupFacturationIdAndMonthYear($clientGroupFacturationId,$month,$year,$mentionFilters = []){ $sql = "SELECT devis.id FROM ".$this->tableprefix."devis as devis @@ -4346,8 +4364,29 @@ COMMENTAIRES: ".$comment; 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 getDevisIdsByClientIdAndMonthYear($clientId,$month,$year,$mentionFilters = []){ - $sql = "SELECT devis.id + $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