192 lines
6.5 KiB
PHP
192 lines
6.5 KiB
PHP
<?php
|
|
|
|
namespace OCA\Gestion\Service\Devis;
|
|
|
|
use OCA\Gestion\Db\Bdd;
|
|
use OCA\Gestion\Constants\MultipleFactureTypeConstant;
|
|
|
|
/**
|
|
* Classe responsable du traitement et de la préparation des données de devis
|
|
*/
|
|
class DevisDataProcessor
|
|
{
|
|
/** @var Bdd */
|
|
private $gestionBdd;
|
|
|
|
public function __construct(Bdd $gestionBdd)
|
|
{
|
|
$this->gestionBdd = $gestionBdd;
|
|
}
|
|
|
|
public function prepareDevisData($devisData, $currentConfig, $filter, $idNextCloud)
|
|
{
|
|
$data_devis = [];
|
|
|
|
foreach ($devisData as $devis) {
|
|
$devis_temp = $this->createDevisStructure($devis, $currentConfig);
|
|
$devis_temp = $this->calculateDevisAmounts($devis_temp, $devis, $filter, $idNextCloud);
|
|
$data_devis[] = $devis_temp;
|
|
}
|
|
|
|
return $data_devis;
|
|
}
|
|
|
|
public function createDevisStructure($devis, $currentConfig)
|
|
{
|
|
return array(
|
|
'devis_id' => $devis['devis_id'],
|
|
'devis_full_number' => $devis['devis_full_number'],
|
|
'case_number' => $devis['case_number'], // NOUVEAU : remplace calendar_uuid
|
|
'order_number' => $devis['order_number'], // NOUVEAU : remplace num_commande vide
|
|
'devis_date' => $devis['devis_date'],
|
|
'lieu_nom' => $devis['lieu_nom'],
|
|
'lieu_adresse' => $devis['lieu_adresse'],
|
|
'defunt_nom' => $devis['defunt_nom'],
|
|
'defunt_sexe' => $devis['defunt_sexe'],
|
|
'client_nom' => $devis['client_nom'],
|
|
'client_entreprise' => $devis['client_entreprise'],
|
|
'client_adresse' => $devis['client_adresse'],
|
|
'group_name' => $devis['group_name'],
|
|
'group_address' => $devis['group_address'],
|
|
'group_postal_code' => $devis['group_postal_code'],
|
|
'group_city' => $devis['group_city'],
|
|
'group_email' => $devis['group_email'],
|
|
'group_siret_number' => $devis['group_siret_number'],
|
|
'article' => 'SOINS',
|
|
'montant_htc' => 0,
|
|
'tva' => $currentConfig->tva_default,
|
|
'montant_tva' => 0,
|
|
'montant_ttc' => 0
|
|
);
|
|
}
|
|
|
|
public function calculateDevisAmounts($devis_temp, $devis, $filter, $idNextCloud)
|
|
{
|
|
$produits = json_decode($this->gestionBdd->getListProduit($devis['devis_id'], $idNextCloud));
|
|
|
|
// Variables pour gérer les articles comme dans les factures
|
|
$produitsReferenceArray = [];
|
|
|
|
foreach ($produits as $produit) {
|
|
$htPrice = $this->getProductPrice($produit, $devis, $filter);
|
|
$devis_temp['montant_htc'] += $htPrice * $produit->quantite;
|
|
|
|
// Collecter les références comme dans les factures
|
|
if (isset($produit->reference) && !empty($produit->reference)) {
|
|
$produitsReferenceArray[] = $produit->reference;
|
|
}
|
|
}
|
|
|
|
// Traitement identique aux factures
|
|
$produitsReferenceArray = array_unique($produitsReferenceArray);
|
|
$produitsReferenceAsString = implode("-", $produitsReferenceArray);
|
|
$devis_temp['article'] = !empty($produitsReferenceAsString) ? $produitsReferenceAsString : 'SOINS';
|
|
|
|
$devis_temp['montant_tva'] = ($devis_temp['montant_htc'] * $devis_temp['tva']) / 100;
|
|
$devis_temp['montant_ttc'] = $devis_temp['montant_tva'] + $devis_temp['montant_htc'];
|
|
|
|
return $devis_temp;
|
|
}
|
|
|
|
public function getProductPrice($produit, $devis, $filter)
|
|
{
|
|
$htPrice = $produit->prix_unitaire;
|
|
|
|
if ($devis['group_name'] != null && isset($produit->id)) {
|
|
$price = $this->gestionBdd->getProductPriceByClientGroupId($filter, $produit->id);
|
|
if ($price != null) {
|
|
$htPrice = $price;
|
|
}
|
|
}
|
|
|
|
return $htPrice;
|
|
}
|
|
|
|
public function getClientInfoForDevis($devis, $filterType)
|
|
{
|
|
if ($filterType === 'group' && !empty($devis['group_name'])) {
|
|
return [
|
|
'name' => 'Groupe ' . $devis['group_name'],
|
|
'address' => $devis['group_address'],
|
|
'city' => $devis['group_postal_code'] . ' ' . $devis['group_city'],
|
|
'siret' => $devis['group_siret_number'],
|
|
'email' => $devis['group_email']
|
|
];
|
|
} else {
|
|
$clientAddresses = \OCA\Gestion\Helpers\FileExportHelpers::GetAddressAndCityFromAddress($devis['client_adresse']);
|
|
return [
|
|
'name' => $devis['client_nom'],
|
|
'address' => $clientAddresses['address'],
|
|
'city' => $clientAddresses['city'],
|
|
'siret' => '',
|
|
'email' => ''
|
|
];
|
|
}
|
|
}
|
|
|
|
public function generateCsvContent($devisData)
|
|
{
|
|
$headers = [
|
|
'Numéro Devis',
|
|
'Date',
|
|
'Client Nom',
|
|
'Client Entreprise',
|
|
'Défunt',
|
|
'Lieu',
|
|
'Article',
|
|
'Thanatopracteur',
|
|
'Commentaire',
|
|
'N° Dossier', // case_number
|
|
'N° Commande' // order_number
|
|
];
|
|
|
|
$csvContent = $this->arrayToCsv($headers);
|
|
|
|
foreach ($devisData as $devis) {
|
|
$row = [
|
|
$devis['devis_full_number'] ?? '',
|
|
$devis['devis_date'] ?? '',
|
|
$devis['client_nom'] ?? '',
|
|
$devis['client_entreprise'] ?? '',
|
|
$devis['defunt_nom'] ?? '',
|
|
$devis['lieu_nom'] ?? '',
|
|
$devis['article'] ?? 'SOINS',
|
|
trim(($devis['thanato_nom'] ?? '') . ' ' . ($devis['thanato_prenom'] ?? '')),
|
|
$devis['devis_comment'] ?? '',
|
|
$devis['case_number'] ?? '', // NOUVEAU
|
|
$devis['order_number'] ?? '' // NOUVEAU
|
|
];
|
|
|
|
$csvContent .= $this->arrayToCsv($row);
|
|
}
|
|
|
|
return $csvContent;
|
|
}
|
|
|
|
public function getClientNameForFolder($firstDevis, $filterType)
|
|
{
|
|
if ($filterType === MultipleFactureTypeConstant::GROUP_FILTER_TYPE && !empty($firstDevis["group_name"])) {
|
|
return $firstDevis["group_name"];
|
|
}
|
|
|
|
return $firstDevis["client_nom"] ?? 'CLIENT_INCONNU';
|
|
}
|
|
|
|
public function getRecapFilename($month, $year)
|
|
{
|
|
$monthStr = str_pad($month, 2, '0', STR_PAD_LEFT);
|
|
return $year . $monthStr;
|
|
}
|
|
|
|
private function arrayToCsv($array)
|
|
{
|
|
$output = fopen('php://temp', 'r+');
|
|
fputcsv($output, $array, ';');
|
|
rewind($output);
|
|
$csvLine = fgets($output);
|
|
fclose($output);
|
|
|
|
return $csvLine;
|
|
}
|
|
}
|