From 54f80a72f4ae52e2e2d81f41e55e2faec1e15178 Mon Sep 17 00:00:00 2001 From: Tolotsoa Date: Fri, 19 Sep 2025 16:17:59 +0300 Subject: [PATCH] fix correction fonction fec --- gestion/lib/Controller/PageController.php | 410 +++++++++++----------- gestion/lib/Db/Bdd.php | 53 +-- 2 files changed, 236 insertions(+), 227 deletions(-) diff --git a/gestion/lib/Controller/PageController.php b/gestion/lib/Controller/PageController.php index 4712966..a3f4c76 100644 --- a/gestion/lib/Controller/PageController.php +++ b/gestion/lib/Controller/PageController.php @@ -2277,26 +2277,33 @@ class PageController extends Controller // //$file = $userFolder->get('myfile2.txt'); } /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function apiReloadFec() { - $this->reloadFec(); - return new DataResponse("", 200, ['Content-Type' => 'application/json']); - } + * @NoAdminRequired + * @NoCSRFRequired + */ + public function apiReloadFec() + { + $this->reloadFec(); + return new DataResponse("", 200, ['Content-Type' => 'application/json']); + } - private function reloadFec(){ - $current_config = json_decode($this->myDb->getConfiguration($this->idNextcloud)); - $clean_folder = html_entity_decode($current_config[0]->path).'/'; + private function reloadFec() + { + $current_config = json_decode($this->myDb->getConfiguration($this->idNextcloud)); + $clean_folder = html_entity_decode($current_config[0]->path).'/'; - try { - try { + try { + try { $data_factures = array(); $factures = json_decode($this->myDb->getFacturesListWithDependencies()); foreach ($factures as $key => $facture) { $factureIsSingle = $facture->facture_type == FactureTypeConstant::TYPE_SINGLE; + // Logique TVA : si tva = 0 alors 0%, si tva = 1 alors taux par défaut + $tva_rate = 0; // Par défaut + if (isset($facture->tva) && $facture->tva == 1) { + $tva_rate = isset($current_config[0]->tva_default) ? floatval($current_config[0]->tva_default) : 0; + } $facture_temp = array( 'num' => $facture->num, @@ -2306,41 +2313,29 @@ class PageController extends Controller 'date_facture' => $facture->date_paiement, 'defunt' => $facture->nom_defunt, 'montant_htc' => 0, - 'tva' => $current_config[0]->tva_default, + 'tva' => $tva_rate, // Utiliser le taux calculé 'montant_tva' => 0, 'montant_ttc' => 0, ); 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; + if ($produits) { + foreach ($produits as $key => $produit) { + $htPrice = isset($produit->prix_unitaire) ? floatval($produit->prix_unitaire) : 0; + 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 = floatval($price); + } } + $quantite = isset($produit->quantite) ? floatval($produit->quantite) : 0; + $facture_temp['montant_htc'] += $htPrice * $quantite; } - $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 { - - - $devis = $this->myDb->getDevisByFkFactureId($facture->id); $factureGroupIsRelatedToAnyDevis = $devis != null; $mentionFilters = [ @@ -2348,7 +2343,6 @@ class PageController extends Controller DevisMentionConstant::FACTURED_FORMATTED ]; - $isFactureGroupForSingleClient = $facture->facture_client_id != null && $facture->facture_client_id != 0; if($isFactureGroupForSingleClient) { $facture_temp["client"] = $facture->facture_client_entreprise; @@ -2383,190 +2377,194 @@ class PageController extends Controller $devisList = $this->myDb->getDevisByClientIdByFactureId($facture->id, $mentionFilters); } - 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; + if (isset($devisList)) { + foreach($devisList as $currentDevis) { + $produits = json_decode($this->getProduitsById($currentDevis['id'])); + if ($produits) { + foreach ($produits as $key => $produit) { + $htPrice = isset($produit->prix_unitaire) ? floatval($produit->prix_unitaire) : 0; + 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 = floatval($price); + } + } + $quantite = isset($produit->quantite) ? floatval($produit->quantite) : 0; + $facture_temp['montant_htc'] += $htPrice * $quantite; } } - $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); - }; + } + $data_temp = array(); foreach ($data_factures as $key => $facture) { - $datesplit = explode('-', $facture['date_facture']); - if($data_temp[strval($datesplit[0])] == null) { - $data_temp[strval($datesplit[0])][strval($datesplit[1])] = array(0 => $facture); - } else { - if($data_temp[strval($datesplit[0])][strval($datesplit[1])] == null) { - $data_temp[strval($datesplit[0])][strval($datesplit[1])] = array(0 => $facture); - } else { - array_push($data_temp[strval($datesplit[0])][strval($datesplit[1])], $facture); + if (isset($facture['date_facture']) && !empty($facture['date_facture'])) { + $datesplit = explode('-', $facture['date_facture']); + if (count($datesplit) >= 2) { + $annee = strval($datesplit[0]); + $mois = strval($datesplit[1]); + + if($data_temp[$annee] == null) { + $data_temp[$annee][$mois] = array(0 => $facture); + } else { + if($data_temp[$annee][$mois] == null) { + $data_temp[$annee][$mois] = array(0 => $facture); + } else { + array_push($data_temp[$annee][$mois], $facture); + } + } } } } - $fec_headers_txt = [ - utf8_decode('JOURNALCODE'), - utf8_decode('JOURNALLIB'), - utf8_decode('ECRITURENUM'), - utf8_decode('ECRITUREDATE'), - utf8_decode('COMPTENUM'), - utf8_decode('COMPTELIB'), - utf8_decode('COMPAUXLIB'), - utf8_decode('COMPAUXNUM'), - utf8_decode('PIECEREF'), - utf8_decode('PIECEDATE'), - utf8_decode('ECRITURELIB'), - utf8_decode('DEBIT'), - utf8_decode('CREDIT'), - utf8_decode('ECRITURELET'), - utf8_decode('DATELET'), - utf8_decode('VALIDDATE'), - utf8_decode('MONTANTDEVISE'), - utf8_decode('IDEVISE'), - ]; - //parcours annee - foreach ($data_temp as $key_annee => $annee) { - //parcours annee - $_clean_folder = $clean_folder.'FEC/'.$key_annee.'/'; - try { - $this->storage->newFolder($_clean_folder); - } catch(\OCP\Files\NotPermittedException $e) { } - foreach ($annee as $key_mois => $mois) { - // Initialize FEC headers - - $fec_temp_txt = implode(TAB1, $fec_headers_txt) . PHP_EOL . PHP_EOL; - $fec_temp = implode(';', $fec_headers_txt) . "\n\n"; - - foreach ($mois as $key => $facture) { - // Define FEC entry data - $fec_entries = [ - [ - 'journal' => 'VT', - 'journal_lib' => 'VENTES', - 'ecriturenum' => '', - 'date' => $facture['date_facture'], - 'compte' => $facture['client'], - 'libelle_compte' => $facture['client'], - 'compauxlib' => '', - 'compauxnum' => '', - 'piece' => $facture['num'], - 'piece_date' => '', - 'libelle_ecriture' => $facture['nom_client'], - 'debit' => $facture['montant_ttc'], - 'credit' => '0', - 'ecriture_lettrage' => '', - 'date_lettrage' => '', - 'valid_date' => '', - 'montant_devise' => '', - 'devise' => 'EUR', - ], - [ - 'journal' => 'VT', - 'journal_lib' => 'VENTES', - 'ecriturenum' => '', - 'date' => $facture['date_facture'], - 'compte' => '706000', - 'libelle_compte' => 'VENTES DE MARCHANDISES', - 'compauxlib' => '', - 'compauxnum' => '', - 'piece' => $facture['num'], - 'piece_date' => '', - 'libelle_ecriture' => $facture['client'], - 'debit' => '0', - 'credit' => $facture['montant_htc'], - 'ecriture_lettrage' => '', - 'date_lettrage' => '', - 'valid_date' => '', - 'montant_devise' => '', - 'devise' => 'EUR', - ], - [ - 'journal' => 'VT', - 'journal_lib' => 'VENTES', - 'ecriturenum' => '', - 'date' => $facture['date_facture'], - 'compte' => '445710', - 'compauxlib' => '', - 'compauxnum' => '', - 'libelle_compte' => '', - 'piece' => $facture['num'], - 'piece_date' => '', - 'libelle_ecriture' => $facture['client'], - 'debit' => '', - 'credit' => $facture['montant_tva'], - 'ecriture_lettrage' => '', - 'date_lettrage' => '', - 'valid_date' => '', - 'montant_devise' => '', - 'devise' => 'EUR', - ] - ]; - - // Generate FEC entries - foreach ($fec_entries as $entry) { - $fec_line_txt = [ - $entry['journal'], $entry['journal_lib'], $entry['ecriturenum'], $entry['date'], - $entry['compte'], $entry['libelle_compte'], - $entry['compauxlib'], $entry['compauxnum'], - $entry['piece'], $entry['piece_date'], - $entry['libelle_ecriture'], $entry['debit'],$entry['credit'],$entry['ecriture_lettrage'], - $entry['date_lettrage'], $entry['valid_date'], $entry['montant_devise'], $entry['devise'] - ]; - - $fec_line_csv = [ - $entry['journal'], $entry['journal_lib'], $entry['ecriturenum'], $entry['date'], - $entry['compte'], $entry['libelle_compte'], - $entry['compauxlib'], $entry['compauxnum'], - $entry['piece'], $entry['piece_date'], - $entry['libelle_ecriture'], $entry['debit'],$entry['credit'],$entry['ecriture_lettrage'], - $entry['date_lettrage'], $entry['valid_date'], $entry['montant_devise'], $entry['devise'] - ]; - - $fec_temp_txt .= implode(TAB1, $fec_line_txt) . PHP_EOL . PHP_EOL; - $fec_temp .= implode(';', $fec_line_csv) . "\n\n"; - } - } - $ff = $_clean_folder.'FEC_'.$key_mois.'_'.$key_annee.'.csv'; - $this->storage->newFile($ff); - $file = $this->storage->get($ff); - $file->putContent($fec_temp); - $ff_txt = $_clean_folder.'FEC_'.$key_mois.'_'.$key_annee.'.txt'; - $this->storage->newFile($ff_txt); - $file_txt = $this->storage->get($ff_txt); - $file_txt->putContent($fec_temp_txt); - // $file->putContent(implode(';', array('Jane Smith', 'janesmith@example.com', '555-5678')) . "\n"); - } - } - - } catch(\OCP\Files\NotFoundException $e) { } + $fec_headers_txt = [ + utf8_decode('JOURNALCODE'), + utf8_decode('JOURNALLIB'), + utf8_decode('ECRITURENUM'), + utf8_decode('ECRITUREDATE'), + utf8_decode('COMPTENUM'), + utf8_decode('COMPTELIB'), + utf8_decode('COMPAUXLIB'), + utf8_decode('COMPAUXNUM'), + utf8_decode('PIECEREF'), + utf8_decode('PIECEDATE'), + utf8_decode('ECRITURELIB'), + utf8_decode('DEBIT'), + utf8_decode('CREDIT'), + utf8_decode('ECRITURELET'), + utf8_decode('DATELET'), + utf8_decode('VALIDDATE'), + utf8_decode('MONTANTDEVISE'), + utf8_decode('IDEVISE'), + ]; - } catch(\OCP\Files\NotPermittedException $e) { } - } + //parcours annee + foreach ($data_temp as $key_annee => $annee) { + //parcours annee + $_clean_folder = $clean_folder.'FEC/'.$key_annee.'/'; + try { + $this->storage->newFolder($_clean_folder); + } catch(\OCP\Files\NotPermittedException $e) { + } + + foreach ($annee as $key_mois => $mois) { + // Initialize FEC headers + $fec_temp_txt = implode(TAB1, $fec_headers_txt) . PHP_EOL . PHP_EOL; + $fec_temp = implode(';', $fec_headers_txt) . "\n\n"; + + foreach ($mois as $key => $facture) { + // Define FEC entry data + $fec_entries = [ + [ + 'journal' => 'VT', + 'journal_lib' => 'VENTES', + 'ecriturenum' => '', + 'date' => $facture['date_facture'], + 'compte' => $facture['client'], + 'libelle_compte' => $facture['client'], + 'compauxlib' => '', + 'compauxnum' => '', + 'piece' => $facture['num'], + 'piece_date' => '', + 'libelle_ecriture' => $facture['nom_client'], + 'debit' => $facture['montant_ttc'], + 'credit' => '0', + 'ecriture_lettrage' => '', + 'date_lettrage' => '', + 'valid_date' => '', + 'montant_devise' => '', + 'devise' => 'EUR', + ], + [ + 'journal' => 'VT', + 'journal_lib' => 'VENTES', + 'ecriturenum' => '', + 'date' => $facture['date_facture'], + 'compte' => '706000', + 'libelle_compte' => 'VENTES DE MARCHANDISES', + 'compauxlib' => '', + 'compauxnum' => '', + 'piece' => $facture['num'], + 'piece_date' => '', + 'libelle_ecriture' => $facture['client'], + 'debit' => '0', + 'credit' => $facture['montant_htc'], + 'ecriture_lettrage' => '', + 'date_lettrage' => '', + 'valid_date' => '', + 'montant_devise' => '', + 'devise' => 'EUR', + ], + [ + 'journal' => 'VT', + 'journal_lib' => 'VENTES', + 'ecriturenum' => '', + 'date' => $facture['date_facture'], + 'compte' => '445710', + 'compauxlib' => '', + 'compauxnum' => '', + 'libelle_compte' => '', + 'piece' => $facture['num'], + 'piece_date' => '', + 'libelle_ecriture' => $facture['client'], + 'debit' => '', + 'credit' => $facture['montant_tva'], + 'ecriture_lettrage' => '', + 'date_lettrage' => '', + 'valid_date' => '', + 'montant_devise' => '', + 'devise' => 'EUR', + ] + ]; + + // Generate FEC entries + foreach ($fec_entries as $entry) { + $fec_line_txt = [ + $entry['journal'], $entry['journal_lib'], $entry['ecriturenum'], $entry['date'], + $entry['compte'], $entry['libelle_compte'], + $entry['compauxlib'], $entry['compauxnum'], + $entry['piece'], $entry['piece_date'], + $entry['libelle_ecriture'], $entry['debit'],$entry['credit'],$entry['ecriture_lettrage'], + $entry['date_lettrage'], $entry['valid_date'], $entry['montant_devise'], $entry['devise'] + ]; + + $fec_line_csv = [ + $entry['journal'], $entry['journal_lib'], $entry['ecriturenum'], $entry['date'], + $entry['compte'], $entry['libelle_compte'], + $entry['compauxlib'], $entry['compauxnum'], + $entry['piece'], $entry['piece_date'], + $entry['libelle_ecriture'], $entry['debit'],$entry['credit'],$entry['ecriture_lettrage'], + $entry['date_lettrage'], $entry['valid_date'], $entry['montant_devise'], $entry['devise'] + ]; + + $fec_temp_txt .= implode(TAB1, $fec_line_txt) . PHP_EOL . PHP_EOL; + $fec_temp .= implode(';', $fec_line_csv) . "\n\n"; + } + } + $ff = $_clean_folder.'FEC_'.$key_mois.'_'.$key_annee.'.csv'; + $this->storage->newFile($ff); + $file = $this->storage->get($ff); + $file->putContent($fec_temp); + + $ff_txt = $_clean_folder.'FEC_'.$key_mois.'_'.$key_annee.'.txt'; + $this->storage->newFile($ff_txt); + $file_txt = $this->storage->get($ff_txt); + $file_txt->putContent($fec_temp_txt); + } + } + + } catch(\OCP\Files\NotFoundException $e) { + } + + } catch(\OCP\Files\NotPermittedException $e) { + } + } private function refreshFEC() { diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index 2cf2c1c..6452440 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -488,6 +488,13 @@ class Bdd 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, + COALESCE( + client.is_tva, + CASE + WHEN facture.fk_client_group_facturation_id IS NOT NULL THEN client_group_tva.is_tva + ELSE facture_client.is_tva + END + ) as tva, defunt.id as id_defunt, defunt.nom as nom_defunt, lieu.id as lid, @@ -501,7 +508,8 @@ class Bdd 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 + LEFT JOIN ".$this->tableprefix."client_group_facturation as facture_client_group_facturation on facture.fk_client_group_facturation_id = facture_client_group_facturation.id + LEFT JOIN ".$this->tableprefix."client as client_group_tva ON facture.fk_client_group_facturation_id = client_group_tva.fk_client_group_facturation_id ORDER BY facture.id DESC, facture.date_paiement DESC"; $result = $this->execSQL($sql, array()); return $result; @@ -5510,21 +5518,22 @@ COMMENTAIRES: ".$comment; return $devisList; } - public function getDevisIdsGroupByFactureId($factureId,$mentionFilters = []){ + 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)){ + 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); + $sql .= ";"; + $devisList = $this->execSQLNoJsonReturn($sql, $conditions); $devisIds = []; - foreach($devisList as $devis){ + foreach($devisList as $devis) { $devisIds[] = $devis['id']; } return $devisIds; @@ -6093,7 +6102,7 @@ COMMENTAIRES: ".$comment; private function getProductsTotalPrices($products) { $configs = json_decode($this->getConfiguration(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD)); - $currentConfig = $configs[0]; + $currentConfig = $configs[0]; $totalHt = 0; $totalTtc = 0; foreach ($products as $product) { @@ -6109,11 +6118,12 @@ COMMENTAIRES: ".$comment; ]; } - private function getDevisIdsListByFactureId($factureId){ + private function getDevisIdsListByFactureId($factureId) + { $factureData = $this->getFactureByFactureId(factureId: $factureId); $isFactureGroupOfDevis = $factureData["facture_type"] == FactureTypeConstant::TYPE_GROUP; $factureDevisIdsList = []; - if($isFactureGroupOfDevis){ + if($isFactureGroupOfDevis) { $isFactureForSingleClient = $factureData['fk_client_id'] != null && $factureData['fk_client_id'] != 0; $devisMentionFilters = [ DevisMentionConstant::FACTURED_FORMATTED, @@ -6122,24 +6132,25 @@ COMMENTAIRES: ".$comment; $devis = $this->getDevisByFkFactureId($factureId); $factureGroupIsRelatedToAnyDevis = $devis != null; if (!$factureGroupIsRelatedToAnyDevis) { - if($isFactureForSingleClient){ + if($isFactureForSingleClient) { $factureDevisIdsList = $this->getDevisIdsByClientIdAndMonthYear( $factureData['fk_client_id'], $factureData['month'], - $factureData['year'],$devisMentionFilters + $factureData['year'], + $devisMentionFilters ); - }else{ + } else { $factureDevisIdsList = $this->getDevisIdsByClientGroupFacturationIdAndMonthYear( $factureData['fk_client_group_facturation_id'], - $factureData['month'], - $factureData['year'],$devisMentionFilters - ); + $factureData['month'], + $factureData['year'], + $devisMentionFilters + ); } - }else{ - $factureDevisIdsList = $this->getDevisIdsGroupByFactureId($factureId, $devisMentionFilters ); + } else { + $factureDevisIdsList = $this->getDevisIdsGroupByFactureId($factureId, $devisMentionFilters); } - } - else{ + } else { $factureDevisIdsList = $factureData['id_devis'] ? [$factureData['id_devis']] : []; } return $factureDevisIdsList; @@ -6151,8 +6162,8 @@ COMMENTAIRES: ".$comment; $totalHt = 0; $totalTtc = 0; $tva = 0; - foreach($factureDevisIds as $devisId){ - $clientTvaStatus = $this->getClientTvaStatus($devisId,BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD); + 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"];