src/Entity/BCCompany.php line 11
<?php
namespace App\Entity;
use App\Repository\BCCompanyRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: BCCompanyRepository::class)]
class BCCompany
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\ManyToOne(inversedBy: 'BCCompanies')]
#[ORM\JoinColumn(nullable: false)]
private ?Company $company = null;
#[ORM\Column(length: 255)]
private ?string $name = null;
#[ORM\Column]
private ?\DateTimeImmutable $createdAt = null;
#[ORM\Column]
private ?bool $type = null;
#[ORM\OneToMany(mappedBy: 'BCCompany', targetEntity: BCData::class, orphanRemoval: true, fetch: 'EAGER')]
private Collection $BCData;
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'bilans')]
private ?self $base = null;
#[ORM\OneToMany(mappedBy: 'base', targetEntity: self::class)]
private Collection $bilans;
private $families = []; // Associez les BCFamille à l'entreprise
// Ajout des attributs pour les totaux globaux
private $totalFabrication = null;
private $totalFabricationMin = null;
private $totalFabricationMax = null;
private $totalFabricationNew = null;
private $totalFabricationOccasion = null;
private $totalUsage = null;
private $totalUsageMin = null;
private $totalUsageMax = null;
private $total = null;
private $totalMin = null;
private $totalMax = null;
public function __construct()
{
$this->BCData = new ArrayCollection();
$this->createdAt = new \DateTimeImmutable();
$this->bilans = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeImmutable $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function isType(): ?bool
{
return $this->type;
}
public function setType(bool $type): self
{
$this->type = $type;
return $this;
}
/**
* @return Collection<int, BCData>
*/
public function getBCData(): Collection
{
return $this->BCData;
}
public function addBCData(BCData $bCData): self
{
if (!$this->BCData->contains($bCData)) {
$this->BCData->add($bCData);
$bCData->setBCCompany($this);
}
return $this;
}
public function removeBCData(BCData $bCData): self
{
if ($this->BCData->removeElement($bCData)) {
// set the owning side to null (unless already changed)
if ($bCData->getBCCompany() === $this) {
$bCData->setBCCompany(null);
}
}
return $this;
}
public function getBase(): ?self
{
return $this->base;
}
public function setBase(?self $base): self
{
$this->base = $base;
return $this;
}
/**
* @return Collection<int, self>
*/
public function getBilans(): Collection
{
return $this->bilans;
}
public function addBilan(self $bilan): self
{
if (!$this->bilans->contains($bilan)) {
$this->bilans->add($bilan);
$bilan->setBase($this);
}
return $this;
}
public function removeBilan(self $bilan): self
{
if ($this->bilans->removeElement($bilan)) {
// set the owning side to null (unless already changed)
if ($bilan->getBase() === $this) {
$bilan->setBase(null);
}
}
return $this;
}
// Getter pour récupérer les informations globales du bilan
public function getBilanData($families): array
{
$this->generateFamilies($this->getBCData()->toArray(), $families);
$this->calculateTotals();
$bilanData = [
"id" => $this->getId(),
"name" => $this->getName(),
"date" => $this->getCreatedAt()->format('d/m/Y'),
"type" => $this->isType() ? "Simulation" : "Bilan",
"base" => $this->getBase() ? [
"id" => $this->getBase()->getId(),
"name" => $this->getBase()->getName(),
"type" => $this->getBase()->isType() ? "Simulation" : "Bilan",
] : null,
"families" => $this->families,
"totalFabrication" => $this->totalFabrication,
"totalFabricationMin" => $this->totalFabricationMin,
"totalFabricationMax" => $this->totalFabricationMax,
"totalFabricationNew" => $this->totalFabricationNew,
"totalFabricationOccasion" => $this->totalFabricationOccasion,
"totalUsage" => $this->totalUsage,
"totalUsageMin" => $this->totalUsageMin,
"totalUsageMax" => $this->totalUsageMax,
"total" => $this->total,
"totalMin" => $this->totalMin,
"totalMax" => $this->totalMax,
"incertitudeGlobal" => $this->total ? round(($this->total - $this->totalMin) / $this->total * 100) : null,
"percentageFabricationNew" => $this->totalFabrication ? round($this->totalFabricationNew / $this->totalFabrication * 100) : null,
"percentageFabricationOccasion" => $this->totalFabrication ? round($this->totalFabricationOccasion / $this->totalFabrication * 100) : null,
"percentageUsage" => $this->total ? round($this->totalUsage / $this->total * 100) : null,
];
$formattedBilan = $this->roundTotals($bilanData);
return $formattedBilan;
}
// Calcul des totaux pour les familles et global
public function calculateTotals()
{
// dd($this->families);
foreach ($this->families as $family) {
// dd($family);
$familyImpact = $family['total'];
// dd($familyImpact);
if ($familyImpact !== null) {
$this->total = $this->total === null ? $familyImpact : $this->total + $familyImpact;
$this->totalMin = $this->totalMin === null ? $family['totalMin'] : $this->totalMin + $family['totalMin'];
$this->totalMax = $this->totalMax === null ? $family['totalMax'] : $this->totalMax + $family['totalMax'];
$this->totalFabricationNew = $this->totalFabricationNew === null ? $family['totalFabricationNew'] : $this->totalFabricationNew + $family['totalFabricationNew'];
$this->totalFabricationOccasion = $this->totalFabricationOccasion === null ? $family['totalFabricationOccasion'] : $this->totalFabricationOccasion + $family['totalFabricationOccasion'];
$this->totalFabrication = $this->totalFabrication === null ? $family['totalFabrication'] : $this->totalFabrication + $family['totalFabrication'];
$this->totalFabricationMin = $this->totalFabricationMin === null ? $family['totalFabricationMin'] : $this->totalFabricationMin + $family['totalFabricationMin'];
$this->totalFabricationMax = $this->totalFabricationMax === null ? $family['totalFabricationMax'] : $this->totalFabricationMax + $family['totalFabricationMax'];
$this->totalUsage = $this->totalUsage === null ? $family['totalUsage'] : $this->totalUsage + $family['totalUsage'];
$this->totalUsageMin = $this->totalUsageMin === null ? $family['totalUsageMin'] : $this->totalUsageMin + $family['totalUsageMin'];
$this->totalUsageMax = $this->totalUsageMax === null ? $family['totalUsageMax'] : $this->totalUsageMax + $family['totalUsageMax'];
}
}
}
public function roundTotals($bilanData)
{
// Arrondir les totaux des familles
foreach ($bilanData['families'] as $key => $family) {
// Arrondir les totaux des data
foreach ($family['data'] as $keyData => $data) {
$bilanData['families'][$key]['data'][$keyData]['impactFabricationNew'] = $data['impactFabricationNew'] ? round($data['impactFabricationNew']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactFabricationOccasion'] = $data['impactFabricationOccasion'] ? round($data['impactFabricationOccasion']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactUsage'] = $data['impactUsage'] ? round($data['impactUsage']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactTotal'] = $data['impactTotal'] ? round($data['impactTotal']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactFabricationMin'] = $data['impactFabricationMin'] ? round($data['impactFabricationMin']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactFabricationMax'] = $data['impactFabricationMax'] ? round($data['impactFabricationMax']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactUsageMin'] = $data['impactUsageMin'] ? round($data['impactUsageMin']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactUsageMax'] = $data['impactUsageMax'] ? round($data['impactUsageMax']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactTotalMin'] = $data['impactTotalMin'] ? round($data['impactTotalMin']) : null;
$bilanData['families'][$key]['data'][$keyData]['impactTotalMax'] = $data['impactTotalMax'] ? round($data['impactTotalMax']) : null;
}
$bilanData['families'][$key]['totalFabrication'] = $family['totalFabrication'] ? round($family['totalFabrication']) : null;
$bilanData['families'][$key]['totalFabricationMin'] = $family['totalFabricationMin'] ? round($family['totalFabricationMin']) : null;
$bilanData['families'][$key]['totalFabricationMax'] = $family['totalFabricationMax'] ? round($family['totalFabricationMax']) : null;
$bilanData['families'][$key]['totalFabricationNew'] = $family['totalFabricationNew'] ? round($family['totalFabricationNew']) : null;
$bilanData['families'][$key]['totalFabricationOccasion'] = $family['totalFabricationOccasion'] ? round($family['totalFabricationOccasion']) : null;
$bilanData['families'][$key]['totalUsage'] = $family['totalUsage'] ? round($family['totalUsage']) : null;
$bilanData['families'][$key]['totalUsageMin'] = $family['totalUsageMin'] ? round($family['totalUsageMin']) : null;
$bilanData['families'][$key]['totalUsageMax'] = $family['totalUsageMax'] ? round($family['totalUsageMax']) : null;
$bilanData['families'][$key]['total'] = $family['total'] ? round($family['total']) : null;
$bilanData['families'][$key]['totalMin'] = $family['totalMin'] ? round($family['totalMin']) : null;
$bilanData['families'][$key]['totalMax'] = $family['totalMax'] ? round($family['totalMax']) : null;
$bilanData['families'][$key]['labelChartFamilyImpact'] = $bilanData['families'][$key]['pluralName'] . " - " . ($family['total'] ? round($family['total'] / $bilanData['total'] * 100) : 0) . "%";
}
// Arrondir les totaux globaux
$bilanData['totalFabrication'] = $bilanData['totalFabrication'] ? round($bilanData['totalFabrication']) : null;
$bilanData['totalFabricationMin'] = $bilanData['totalFabricationMin'] ? round($bilanData['totalFabricationMin']) : null;
$bilanData['totalFabricationMax'] = $bilanData['totalFabricationMax'] ? round($bilanData['totalFabricationMax']) : null;
$bilanData['totalFabricationNew'] = $bilanData['totalFabricationNew'] ? round($bilanData['totalFabricationNew']) : null;
$bilanData['totalFabricationOccasion'] = $bilanData['totalFabricationOccasion'] ? round($bilanData['totalFabricationOccasion']) : null;
$bilanData['totalUsage'] = $bilanData['totalUsage'] ? round($bilanData['totalUsage']) : null;
$bilanData['totalUsageMin'] = $bilanData['totalUsageMin'] ? round($bilanData['totalUsageMin']) : null;
$bilanData['totalUsageMax'] = $bilanData['totalUsageMax'] ? round($bilanData['totalUsageMax']) : null;
$bilanData['total'] = $bilanData['total'] ? round($bilanData['total']) : null;
$bilanData['totalMin'] = $bilanData['totalMin'] ? round($bilanData['totalMin']) : null;
$bilanData['totalMax'] = $bilanData['totalMax'] ? round($bilanData['totalMax']) : null;
$bilanData['percentageFabricationNew'] = $bilanData['percentageFabricationNew'] ? round($bilanData['percentageFabricationNew']) : 0;
$bilanData['percentageFabricationOccasion'] = $bilanData['percentageFabricationOccasion'] ? round($bilanData['percentageFabricationOccasion']) : 0;
$bilanData['percentageUsage'] = $bilanData['percentageUsage'] ? round($bilanData['percentageUsage']) : 0;
return $bilanData;
}
// Méthode pour générer la propriété $families avec tous les calculs.
public function generateFamilies(array $bcDataList, array $allFamilies)
{
$this->families = [];
foreach ($allFamilies as $family) {
$this->families[$family->getId()] = [
'entity' => $family,
'pluralName' => $family->getPluralName(),
'totalFabrication' => null,
'totalFabricationMin' => null,
'totalFabricationMax' => null,
'totalFabricationNew' => null,
'totalFabricationOccasion' => null,
'totalUsage' => null,
'totalUsageMin' => null,
'totalUsageMax' => null,
'total' => null,
'totalMin' => null,
'totalMax' => null,
'data' => []
];
}
foreach ($bcDataList as $data) {
$familyId = $data->getFacteur()->getBCModele()->getBCType()->getBCFamille()->getId();
$this->processBCData($data, $this->families[$familyId]);
}
}
// Méthode pour traiter une ligne BCData et mettre à jour les totaux dans une famille
private function processBCData($data, &$family)
{
// Utilisation des méthodes ajoutées à BCData pour les calculs
$impactFabrication = $data->getImpactFabricationNeuf() + $data->getImpactFabricationOccasion();
$impactUsage = $data->getUsageImpact();
$impactTotal = $data->getTotalImpact();
// Calcul des incertitudes (min et max) en utilisant les nouvelles méthodes
$impactFabricationNew = $data->getImpactFabricationNeuf();
$impactFabricationOccasion = $data->getImpactFabricationOccasion();
$impactFabricationMin = $data->getImpactFabricationMin();
$impactFabricationMax = $data->getImpactFabricationMax();
$impactUsageMin = $data->getImpactUsageMin();
$impactUsageMax = $data->getImpactUsageMax();
$impactTotalMin = $data->getTotalImpactMin();
$impactTotalMax = $data->getTotalImpactMax();
// Mise à jour des totaux dans la famille
$this->updateFamilyTotals(
$family,
$impactFabricationNew,
$impactFabricationOccasion,
$impactFabrication,
$impactFabricationMin,
$impactFabricationMax,
$impactUsage,
$impactUsageMin,
$impactUsageMax,
$impactTotal,
$impactTotalMin,
$impactTotalMax
);
$facteur = $data->getFacteur();
$date = $facteur->getDate() ? $facteur->getDate()->format('Y') : 'Date inconnue';
// Ajouter les données à la famille
$family['data'][] = [
"id" => $data->getId(),
"comment" => $data->getComment(),
"type" => $data->getFacteur()->getBCModele()->getBCType()->getName(),
"facteur" => $facteur->getBCModele()->getName() . " - " . $facteur->getSource() . " (" . $date . ")",
"depreciation" => $data->getDepreciation(),
"quantityNew" => $data->getQuantityNew(),
"quantityOccasion" => $data->getQuantityOccasion(),
"consommation" => $data->getConsommation(),
"mix" => $data->getMix() ? $data->getMix()->getCountry() : null,
"impactFabricationNew" => $data->getImpactFabricationNeuf(),
"impactFabricationOccasion" => $data->getImpactFabricationOccasion(),
"impactUsage" => $impactUsage,
"impactTotal" => $impactTotal,
"impactFabricationMin" => $impactFabricationMin,
"impactFabricationMax" => $impactFabricationMax,
"impactUsageMin" => $impactUsageMin,
"impactUsageMax" => $impactUsageMax,
"impactTotalMin" => $impactTotalMin,
"impactTotalMax" => $impactTotalMax
];
}
private function updateFamilyTotals(&$family, $fabricationNew, $fabricationOccasion, $fabrication, $fabricationMin, $fabricationMax, $usage, $usageMin, $usageMax, $total, $totalMin, $totalMax)
{
// Mise à jour des totaux fabrication
if ($fabrication !== null) {
$family['totalFabricationNew'] = $family['totalFabricationNew'] === null ? $fabricationNew : $family['totalFabricationNew'] + $fabricationNew;
$family['totalFabricationOccasion'] = $family['totalFabricationOccasion'] === null ? $fabricationOccasion : $family['totalFabricationOccasion'] + $fabricationOccasion;
$family['totalFabrication'] = $family['totalFabrication'] === null ? $fabrication : $family['totalFabrication'] + $fabrication;
$family['totalFabricationMin'] = $family['totalFabricationMin'] === null ? $fabricationMin : $family['totalFabricationMin'] + $fabricationMin;
$family['totalFabricationMax'] = $family['totalFabricationMax'] === null ? $fabricationMax : $family['totalFabricationMax'] + $fabricationMax;
}
// Mise à jour des totaux usage
if ($usage !== null) {
$family['totalUsage'] = $family['totalUsage'] === null ? $usage : $family['totalUsage'] + $usage;
$family['totalUsageMin'] = $family['totalUsageMin'] === null ? $usageMin : $family['totalUsageMin'] + $usageMin;
$family['totalUsageMax'] = $family['totalUsageMax'] === null ? $usageMax : $family['totalUsageMax'] + $usageMax;
}
// Mise à jour des totaux globaux
if ($total !== null) {
$family['total'] = $family['total'] === null ? $total : $family['total'] + $total;
$family['totalMin'] = $family['totalMin'] === null ? $totalMin : $family['totalMin'] + $totalMin;
$family['totalMax'] = $family['totalMax'] === null ? $totalMax : $family['totalMax'] + $totalMax;
}
}
// Méthode pour obtenir les totaux globaux (fabrication, usage, etc.)
public function getTotalFabrication()
{
$total = null;
foreach ($this->families as $family) {
$total = $total === null ? $family['totalFabrication'] : $total + $family['totalFabrication'];
}
return $total;
}
public function getTotalUsage()
{
$total = null;
foreach ($this->families as $family) {
$total = $total === null ? $family['totalUsage'] : $total + $family['totalUsage'];
}
return $total;
}
public function getTotalGlobal()
{
$total = null;
foreach ($this->families as $family) {
$total = $total === null ? $family['total'] : $total + $family['total'];
}
return $total;
}
public function getTotalMin()
{
$totalMin = null;
foreach ($this->families as $family) {
$totalMin = $totalMin === null ? $family['totalMin'] : $totalMin + $family['totalMin'];
}
return $totalMin;
}
public function getTotalMax()
{
$totalMax = null;
foreach ($this->families as $family) {
$totalMax = $totalMax === null ? $family['totalMax'] : $totalMax + $family['totalMax'];
}
return $totalMax;
}
public function getFamilies()
{
return $this->families;
}
}