src/Entity/BCCompany.php line 11

  1. <?php
  2. namespace App\Entity;
  3. use App\Repository\BCCompanyRepository;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5. use Doctrine\Common\Collections\Collection;
  6. use Doctrine\ORM\Mapping as ORM;
  7. #[ORM\Entity(repositoryClassBCCompanyRepository::class)]
  8. class BCCompany
  9. {
  10.     #[ORM\Id]
  11.     #[ORM\GeneratedValue]
  12.     #[ORM\Column]
  13.     private ?int $id null;
  14.     #[ORM\ManyToOne(inversedBy'BCCompanies')]
  15.     #[ORM\JoinColumn(nullablefalse)]
  16.     private ?Company $company null;
  17.     #[ORM\Column(length255)]
  18.     private ?string $name null;
  19.     #[ORM\Column]
  20.     private ?\DateTimeImmutable $createdAt null;
  21.     #[ORM\Column]
  22.     private ?bool $type null;
  23.     #[ORM\OneToMany(mappedBy'BCCompany'targetEntityBCData::class, orphanRemovaltruefetch'EAGER')]
  24.     private Collection $BCData;
  25.     #[ORM\ManyToOne(targetEntityself::class, inversedBy'bilans')]
  26.     private ?self $base null;
  27.     #[ORM\OneToMany(mappedBy'base'targetEntityself::class)]
  28.     private Collection $bilans;
  29.     private $families = []; // Associez les BCFamille à l'entreprise
  30.     // Ajout des attributs pour les totaux globaux
  31.     private $totalFabrication null;
  32.     private $totalFabricationMin null;
  33.     private $totalFabricationMax null;
  34.     private $totalFabricationNew null;
  35.     private $totalFabricationOccasion null;
  36.     private $totalUsage null;
  37.     private $totalUsageMin null;
  38.     private $totalUsageMax null;
  39.     private $total null;
  40.     private $totalMin null;
  41.     private $totalMax null;
  42.     public function __construct()
  43.     {
  44.         $this->BCData = new ArrayCollection();
  45.         $this->createdAt = new \DateTimeImmutable();
  46.         $this->bilans = new ArrayCollection();
  47.     }
  48.     public function getId(): ?int
  49.     {
  50.         return $this->id;
  51.     }
  52.     public function getCompany(): ?Company
  53.     {
  54.         return $this->company;
  55.     }
  56.     public function setCompany(?Company $company): self
  57.     {
  58.         $this->company $company;
  59.         return $this;
  60.     }
  61.     public function getName(): ?string
  62.     {
  63.         return $this->name;
  64.     }
  65.     public function setName(string $name): self
  66.     {
  67.         $this->name $name;
  68.         return $this;
  69.     }
  70.     public function getCreatedAt(): ?\DateTimeImmutable
  71.     {
  72.         return $this->createdAt;
  73.     }
  74.     public function setCreatedAt(\DateTimeImmutable $createdAt): self
  75.     {
  76.         $this->createdAt $createdAt;
  77.         return $this;
  78.     }
  79.     public function isType(): ?bool
  80.     {
  81.         return $this->type;
  82.     }
  83.     public function setType(bool $type): self
  84.     {
  85.         $this->type $type;
  86.         return $this;
  87.     }
  88.     /**
  89.      * @return Collection<int, BCData>
  90.      */
  91.     public function getBCData(): Collection
  92.     {
  93.         return $this->BCData;
  94.     }
  95.     public function addBCData(BCData $bCData): self
  96.     {
  97.         if (!$this->BCData->contains($bCData)) {
  98.             $this->BCData->add($bCData);
  99.             $bCData->setBCCompany($this);
  100.         }
  101.         return $this;
  102.     }
  103.     public function removeBCData(BCData $bCData): self
  104.     {
  105.         if ($this->BCData->removeElement($bCData)) {
  106.             // set the owning side to null (unless already changed)
  107.             if ($bCData->getBCCompany() === $this) {
  108.                 $bCData->setBCCompany(null);
  109.             }
  110.         }
  111.         return $this;
  112.     }
  113.     public function getBase(): ?self
  114.     {
  115.         return $this->base;
  116.     }
  117.     public function setBase(?self $base): self
  118.     {
  119.         $this->base $base;
  120.         return $this;
  121.     }
  122.     /**
  123.      * @return Collection<int, self>
  124.      */
  125.     public function getBilans(): Collection
  126.     {
  127.         return $this->bilans;
  128.     }
  129.     public function addBilan(self $bilan): self
  130.     {
  131.         if (!$this->bilans->contains($bilan)) {
  132.             $this->bilans->add($bilan);
  133.             $bilan->setBase($this);
  134.         }
  135.         return $this;
  136.     }
  137.     public function removeBilan(self $bilan): self
  138.     {
  139.         if ($this->bilans->removeElement($bilan)) {
  140.             // set the owning side to null (unless already changed)
  141.             if ($bilan->getBase() === $this) {
  142.                 $bilan->setBase(null);
  143.             }
  144.         }
  145.         return $this;
  146.     }
  147.     // Getter pour récupérer les informations globales du bilan
  148.     public function getBilanData($families): array
  149.     {
  150.         $this->generateFamilies($this->getBCData()->toArray(), $families);
  151.         $this->calculateTotals();
  152.         $bilanData = [
  153.             "id" => $this->getId(),
  154.             "name" => $this->getName(),
  155.             "date" => $this->getCreatedAt()->format('d/m/Y'),
  156.             "type" => $this->isType() ? "Simulation" "Bilan",
  157.             "base" => $this->getBase() ? [
  158.                 "id" => $this->getBase()->getId(),
  159.                 "name" => $this->getBase()->getName(),
  160.                 "type" => $this->getBase()->isType() ? "Simulation" "Bilan",
  161.             ] : null,
  162.             "families" => $this->families,
  163.             "totalFabrication" => $this->totalFabrication,
  164.             "totalFabricationMin" => $this->totalFabricationMin,
  165.             "totalFabricationMax" => $this->totalFabricationMax,
  166.             "totalFabricationNew" => $this->totalFabricationNew,
  167.             "totalFabricationOccasion" => $this->totalFabricationOccasion,
  168.             "totalUsage" => $this->totalUsage,
  169.             "totalUsageMin" => $this->totalUsageMin,
  170.             "totalUsageMax" => $this->totalUsageMax,
  171.             "total" => $this->total,
  172.             "totalMin" => $this->totalMin,
  173.             "totalMax" => $this->totalMax,
  174.             "incertitudeGlobal" => $this->total round(($this->total $this->totalMin) / $this->total 100) : null,
  175.             "percentageFabricationNew" => $this->totalFabrication round($this->totalFabricationNew $this->totalFabrication 100) : null,
  176.             "percentageFabricationOccasion" => $this->totalFabrication round($this->totalFabricationOccasion $this->totalFabrication 100) : null,
  177.             "percentageUsage" => $this->total round($this->totalUsage $this->total 100) : null,
  178.         ];
  179.         $formattedBilan =  $this->roundTotals($bilanData);
  180.         return $formattedBilan;
  181.     }
  182.     // Calcul des totaux pour les familles et global
  183.     public function calculateTotals()
  184.     {
  185.         // dd($this->families);
  186.         foreach ($this->families as $family) {
  187.             // dd($family);
  188.             $familyImpact $family['total'];
  189.             // dd($familyImpact);
  190.             if ($familyImpact !== null) {
  191.                 $this->total $this->total === null $familyImpact $this->total $familyImpact;
  192.                 $this->totalMin $this->totalMin === null $family['totalMin'] : $this->totalMin $family['totalMin'];
  193.                 $this->totalMax $this->totalMax === null $family['totalMax'] : $this->totalMax $family['totalMax'];
  194.                 $this->totalFabricationNew $this->totalFabricationNew === null $family['totalFabricationNew'] : $this->totalFabricationNew $family['totalFabricationNew'];
  195.                 $this->totalFabricationOccasion $this->totalFabricationOccasion === null $family['totalFabricationOccasion'] : $this->totalFabricationOccasion $family['totalFabricationOccasion'];
  196.                 $this->totalFabrication $this->totalFabrication === null $family['totalFabrication'] : $this->totalFabrication $family['totalFabrication'];
  197.                 $this->totalFabricationMin $this->totalFabricationMin === null $family['totalFabricationMin'] : $this->totalFabricationMin $family['totalFabricationMin'];
  198.                 $this->totalFabricationMax $this->totalFabricationMax === null $family['totalFabricationMax'] : $this->totalFabricationMax $family['totalFabricationMax'];
  199.                 $this->totalUsage $this->totalUsage === null $family['totalUsage'] : $this->totalUsage $family['totalUsage'];
  200.                 $this->totalUsageMin $this->totalUsageMin === null $family['totalUsageMin'] : $this->totalUsageMin $family['totalUsageMin'];
  201.                 $this->totalUsageMax $this->totalUsageMax === null $family['totalUsageMax'] : $this->totalUsageMax $family['totalUsageMax'];
  202.             }
  203.         }
  204.     }
  205.     public function roundTotals($bilanData)
  206.     {
  207.         // Arrondir les totaux des familles
  208.         foreach ($bilanData['families'] as $key => $family) {
  209.             // Arrondir les totaux des data
  210.             foreach ($family['data'] as $keyData => $data) {
  211.                 $bilanData['families'][$key]['data'][$keyData]['impactFabricationNew'] = $data['impactFabricationNew'] ? round($data['impactFabricationNew']) : null;
  212.                 $bilanData['families'][$key]['data'][$keyData]['impactFabricationOccasion'] = $data['impactFabricationOccasion'] ? round($data['impactFabricationOccasion']) : null;
  213.                 $bilanData['families'][$key]['data'][$keyData]['impactUsage'] = $data['impactUsage'] ? round($data['impactUsage']) : null;
  214.                 $bilanData['families'][$key]['data'][$keyData]['impactTotal'] = $data['impactTotal'] ? round($data['impactTotal']) : null;
  215.                 $bilanData['families'][$key]['data'][$keyData]['impactFabricationMin'] = $data['impactFabricationMin'] ? round($data['impactFabricationMin']) : null;
  216.                 $bilanData['families'][$key]['data'][$keyData]['impactFabricationMax'] = $data['impactFabricationMax'] ? round($data['impactFabricationMax']) : null;
  217.                 $bilanData['families'][$key]['data'][$keyData]['impactUsageMin'] = $data['impactUsageMin'] ? round($data['impactUsageMin']) : null;
  218.                 $bilanData['families'][$key]['data'][$keyData]['impactUsageMax'] = $data['impactUsageMax'] ? round($data['impactUsageMax']) : null;
  219.                 $bilanData['families'][$key]['data'][$keyData]['impactTotalMin'] = $data['impactTotalMin'] ? round($data['impactTotalMin']) : null;
  220.                 $bilanData['families'][$key]['data'][$keyData]['impactTotalMax'] = $data['impactTotalMax'] ? round($data['impactTotalMax']) : null;
  221.             }
  222.             $bilanData['families'][$key]['totalFabrication'] = $family['totalFabrication'] ? round($family['totalFabrication']) : null;
  223.             $bilanData['families'][$key]['totalFabricationMin'] = $family['totalFabricationMin'] ? round($family['totalFabricationMin']) : null;
  224.             $bilanData['families'][$key]['totalFabricationMax'] = $family['totalFabricationMax'] ? round($family['totalFabricationMax']) : null;
  225.             $bilanData['families'][$key]['totalFabricationNew'] = $family['totalFabricationNew'] ? round($family['totalFabricationNew']) : null;
  226.             $bilanData['families'][$key]['totalFabricationOccasion'] = $family['totalFabricationOccasion'] ? round($family['totalFabricationOccasion']) : null;
  227.             $bilanData['families'][$key]['totalUsage'] = $family['totalUsage'] ? round($family['totalUsage']) : null;
  228.             $bilanData['families'][$key]['totalUsageMin'] = $family['totalUsageMin'] ? round($family['totalUsageMin']) : null;
  229.             $bilanData['families'][$key]['totalUsageMax'] = $family['totalUsageMax'] ? round($family['totalUsageMax']) : null;
  230.             $bilanData['families'][$key]['total'] = $family['total'] ? round($family['total']) : null;
  231.             $bilanData['families'][$key]['totalMin'] = $family['totalMin'] ? round($family['totalMin']) : null;
  232.             $bilanData['families'][$key]['totalMax'] = $family['totalMax'] ? round($family['totalMax']) : null;
  233.             $bilanData['families'][$key]['labelChartFamilyImpact'] = $bilanData['families'][$key]['pluralName'] . " - " . ($family['total'] ?  round($family['total'] / $bilanData['total'] * 100) : 0) . "%";
  234.         }
  235.         // Arrondir les totaux globaux
  236.         $bilanData['totalFabrication'] = $bilanData['totalFabrication'] ? round($bilanData['totalFabrication']) : null;
  237.         $bilanData['totalFabricationMin'] = $bilanData['totalFabricationMin'] ? round($bilanData['totalFabricationMin']) : null;
  238.         $bilanData['totalFabricationMax'] = $bilanData['totalFabricationMax'] ? round($bilanData['totalFabricationMax']) : null;
  239.         $bilanData['totalFabricationNew'] = $bilanData['totalFabricationNew'] ? round($bilanData['totalFabricationNew']) : null;
  240.         $bilanData['totalFabricationOccasion'] = $bilanData['totalFabricationOccasion'] ? round($bilanData['totalFabricationOccasion']) : null;
  241.         $bilanData['totalUsage'] = $bilanData['totalUsage'] ? round($bilanData['totalUsage']) : null;
  242.         $bilanData['totalUsageMin'] = $bilanData['totalUsageMin'] ? round($bilanData['totalUsageMin']) : null;
  243.         $bilanData['totalUsageMax'] = $bilanData['totalUsageMax'] ? round($bilanData['totalUsageMax']) : null;
  244.         $bilanData['total'] = $bilanData['total'] ? round($bilanData['total']) : null;
  245.         $bilanData['totalMin'] = $bilanData['totalMin'] ? round($bilanData['totalMin']) : null;
  246.         $bilanData['totalMax'] = $bilanData['totalMax'] ? round($bilanData['totalMax']) : null;
  247.         $bilanData['percentageFabricationNew'] = $bilanData['percentageFabricationNew'] ? round($bilanData['percentageFabricationNew']) : 0;
  248.         $bilanData['percentageFabricationOccasion'] = $bilanData['percentageFabricationOccasion'] ? round($bilanData['percentageFabricationOccasion']) : 0;
  249.         $bilanData['percentageUsage'] = $bilanData['percentageUsage'] ? round($bilanData['percentageUsage']) : 0;
  250.         return $bilanData;
  251.     }
  252.     // Méthode pour générer la propriété $families avec tous les calculs.
  253.     public function generateFamilies(array $bcDataList, array $allFamilies)
  254.     {
  255.         $this->families = [];
  256.         foreach ($allFamilies as $family) {
  257.             $this->families[$family->getId()] = [
  258.                 'entity' => $family,
  259.                 'pluralName' => $family->getPluralName(),
  260.                 'totalFabrication' => null,
  261.                 'totalFabricationMin' => null,
  262.                 'totalFabricationMax' => null,
  263.                 'totalFabricationNew' => null,
  264.                 'totalFabricationOccasion' => null,
  265.                 'totalUsage' => null,
  266.                 'totalUsageMin' => null,
  267.                 'totalUsageMax' => null,
  268.                 'total' => null,
  269.                 'totalMin' => null,
  270.                 'totalMax' => null,
  271.                 'data' => []
  272.             ];
  273.         }
  274.         foreach ($bcDataList as $data) {
  275.             $familyId $data->getFacteur()->getBCModele()->getBCType()->getBCFamille()->getId();
  276.             $this->processBCData($data$this->families[$familyId]);
  277.         }
  278.     }
  279.     // Méthode pour traiter une ligne BCData et mettre à jour les totaux dans une famille
  280.     private function processBCData($data, &$family)
  281.     {
  282.         // Utilisation des méthodes ajoutées à BCData pour les calculs
  283.         $impactFabrication $data->getImpactFabricationNeuf() + $data->getImpactFabricationOccasion();
  284.         $impactUsage $data->getUsageImpact();
  285.         $impactTotal $data->getTotalImpact();
  286.         // Calcul des incertitudes (min et max) en utilisant les nouvelles méthodes
  287.         $impactFabricationNew $data->getImpactFabricationNeuf();
  288.         $impactFabricationOccasion $data->getImpactFabricationOccasion();
  289.         $impactFabricationMin $data->getImpactFabricationMin();
  290.         $impactFabricationMax $data->getImpactFabricationMax();
  291.         $impactUsageMin $data->getImpactUsageMin();
  292.         $impactUsageMax $data->getImpactUsageMax();
  293.         $impactTotalMin $data->getTotalImpactMin();
  294.         $impactTotalMax $data->getTotalImpactMax();
  295.         // Mise à jour des totaux dans la famille
  296.         $this->updateFamilyTotals(
  297.             $family,
  298.             $impactFabricationNew,
  299.             $impactFabricationOccasion,
  300.             $impactFabrication,
  301.             $impactFabricationMin,
  302.             $impactFabricationMax,
  303.             $impactUsage,
  304.             $impactUsageMin,
  305.             $impactUsageMax,
  306.             $impactTotal,
  307.             $impactTotalMin,
  308.             $impactTotalMax
  309.         );
  310. $facteur $data->getFacteur();
  311. $date $facteur->getDate() ? $facteur->getDate()->format('Y') : 'Date inconnue';
  312.         // Ajouter les données à la famille
  313.         $family['data'][] = [
  314.             "id" => $data->getId(),
  315.             "comment" => $data->getComment(),
  316.             "type" => $data->getFacteur()->getBCModele()->getBCType()->getName(),
  317.           
  318. "facteur" => $facteur->getBCModele()->getName() . " - " $facteur->getSource() . " (" $date ")",
  319.   "depreciation" => $data->getDepreciation(),
  320.             "quantityNew" => $data->getQuantityNew(),
  321.             "quantityOccasion" => $data->getQuantityOccasion(),
  322.             "consommation" => $data->getConsommation(),
  323.             "mix" => $data->getMix() ? $data->getMix()->getCountry() : null,
  324.             "impactFabricationNew" => $data->getImpactFabricationNeuf(),
  325.             "impactFabricationOccasion" => $data->getImpactFabricationOccasion(),
  326.             "impactUsage" => $impactUsage,
  327.             "impactTotal" => $impactTotal,
  328.             "impactFabricationMin" => $impactFabricationMin,
  329.             "impactFabricationMax" => $impactFabricationMax,
  330.             "impactUsageMin" => $impactUsageMin,
  331.             "impactUsageMax" => $impactUsageMax,
  332.             "impactTotalMin" => $impactTotalMin,
  333.             "impactTotalMax" => $impactTotalMax
  334.         ];
  335.     }
  336.     private function updateFamilyTotals(&$family$fabricationNew$fabricationOccasion$fabrication$fabricationMin$fabricationMax$usage$usageMin$usageMax$total$totalMin$totalMax)
  337.     {
  338.         // Mise à jour des totaux fabrication
  339.         if ($fabrication !== null) {
  340.             $family['totalFabricationNew'] = $family['totalFabricationNew'] === null $fabricationNew $family['totalFabricationNew'] + $fabricationNew;
  341.             $family['totalFabricationOccasion'] = $family['totalFabricationOccasion'] === null $fabricationOccasion $family['totalFabricationOccasion'] + $fabricationOccasion;
  342.             $family['totalFabrication'] = $family['totalFabrication'] === null $fabrication $family['totalFabrication'] + $fabrication;
  343.             $family['totalFabricationMin'] = $family['totalFabricationMin'] === null $fabricationMin $family['totalFabricationMin'] + $fabricationMin;
  344.             $family['totalFabricationMax'] = $family['totalFabricationMax'] === null $fabricationMax $family['totalFabricationMax'] + $fabricationMax;
  345.         }
  346.         // Mise à jour des totaux usage
  347.         if ($usage !== null) {
  348.             $family['totalUsage'] = $family['totalUsage'] === null $usage $family['totalUsage'] + $usage;
  349.             $family['totalUsageMin'] = $family['totalUsageMin'] === null $usageMin $family['totalUsageMin'] + $usageMin;
  350.             $family['totalUsageMax'] = $family['totalUsageMax'] === null $usageMax $family['totalUsageMax'] + $usageMax;
  351.         }
  352.         // Mise à jour des totaux globaux
  353.         if ($total !== null) {
  354.             $family['total'] = $family['total'] === null $total $family['total'] + $total;
  355.             $family['totalMin'] = $family['totalMin'] === null $totalMin $family['totalMin'] + $totalMin;
  356.             $family['totalMax'] = $family['totalMax'] === null $totalMax $family['totalMax'] + $totalMax;
  357.         }
  358.     }
  359.     // Méthode pour obtenir les totaux globaux (fabrication, usage, etc.)
  360.     public function getTotalFabrication()
  361.     {
  362.         $total null;
  363.         foreach ($this->families as $family) {
  364.             $total $total === null $family['totalFabrication'] : $total $family['totalFabrication'];
  365.         }
  366.         return $total;
  367.     }
  368.     public function getTotalUsage()
  369.     {
  370.         $total null;
  371.         foreach ($this->families as $family) {
  372.             $total $total === null $family['totalUsage'] : $total $family['totalUsage'];
  373.         }
  374.         return $total;
  375.     }
  376.     public function getTotalGlobal()
  377.     {
  378.         $total null;
  379.         foreach ($this->families as $family) {
  380.             $total $total === null $family['total'] : $total $family['total'];
  381.         }
  382.         return $total;
  383.     }
  384.     public function getTotalMin()
  385.     {
  386.         $totalMin null;
  387.         foreach ($this->families as $family) {
  388.             $totalMin $totalMin === null $family['totalMin'] : $totalMin $family['totalMin'];
  389.         }
  390.         return $totalMin;
  391.     }
  392.     public function getTotalMax()
  393.     {
  394.         $totalMax null;
  395.         foreach ($this->families as $family) {
  396.             $totalMax $totalMax === null $family['totalMax'] : $totalMax $family['totalMax'];
  397.         }
  398.         return $totalMax;
  399.     }
  400.     public function getFamilies()
  401.     {
  402.         return $this->families;
  403.     }
  404. }