src/Entity/Document.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Repository\DocumentRepository;
  4. use App\Tools\Fnc;
  5. use Doctrine\Common\Collections\ArrayCollection;
  6. use Doctrine\Common\Collections\Collection;
  7. use Doctrine\ORM\Mapping as ORM;
  8. /**
  9.  * @ORM\Entity(repositoryClass=DocumentRepository::class)
  10.  */
  11. class Document
  12. {
  13.     /**
  14.      * @ORM\Id
  15.      * @ORM\GeneratedValue
  16.      * @ORM\Column(type="integer")
  17.      */
  18.     private $id;
  19.     /**
  20.      * @ORM\Column(type="string", length=255)
  21.      */
  22.     private $type_document;
  23.     /**
  24.      * @ORM\ManyToOne(targetEntity=Projet::class, inversedBy="documents")
  25.      * @ORM\JoinColumn(nullable=false)
  26.      */
  27.     private $projet;
  28.     /**
  29.      * @ORM\ManyToOne(targetEntity=Societe::class, inversedBy="documents")
  30.      * @ORM\JoinColumn(nullable=false)
  31.      */
  32.     private $tiers;
  33.     /**
  34.      * @ORM\Column(type="string", length=255, nullable=true)
  35.      */
  36.     private $statut;
  37.     /**
  38.      * @ORM\Column(type="string", length=255, nullable=true)
  39.      */
  40.     private $reference;
  41.     /**
  42.      * @ORM\Column(type="string", length=255, nullable=true)
  43.      */
  44.     private $num_piece;
  45.     /**
  46.      * @ORM\Column(type="datetime")
  47.      */
  48.     private $date_crea;
  49.     /**
  50.      * @ORM\Column(type="integer")
  51.      */
  52.     private $user_crea;
  53.     /**
  54.      * @ORM\Column(type="datetime", nullable=true)
  55.      */
  56.     private $date_modif;
  57.     /**
  58.      * @ORM\Column(type="integer", nullable=true)
  59.      */
  60.     private $user_modif;
  61.     /**
  62.      * @ORM\ManyToOne(targetEntity=Adresse::class)
  63.      */
  64.     private $adresse;
  65.     /**
  66.      * @ORM\Column(type="float")
  67.      */
  68.     private $montant_ht;
  69.     /**
  70.      * @ORM\Column(type="float")
  71.      */
  72.     private $montant_tva;
  73.     /**
  74.      * @ORM\Column(type="datetime", nullable=true)
  75.      */
  76.     private $date_envoi;
  77.     /**
  78.      * @ORM\OneToMany(targetEntity=DocumentLigne::class, mappedBy="document", cascade={"persist"})
  79.      */
  80.     private $documentLignes;
  81.     /**
  82.      * @ORM\Column(type="datetime", nullable=true)
  83.      */
  84.     private $date_paiement;
  85.     /**
  86.      * @ORM\Column(type="string", length=255, nullable=true)
  87.      */
  88.     private $contact;
  89.     /**
  90.      * @ORM\Column(type="integer", nullable=true)
  91.      */
  92.     private $id_doc_origine;
  93.     /**
  94.      * @ORM\Column(type="text", nullable=true)
  95.      */
  96.     private $commentaire;
  97.     /**
  98.      * @ORM\Column(type="date", nullable=true)
  99.      */
  100.     private $date_bdc;
  101.     /**
  102.      * @ORM\Column(type="string", length=255, nullable=true)
  103.      */
  104.     private $lib_projet;
  105.     /**
  106.      * @ORM\ManyToOne(targetEntity=Tiers::class, inversedBy="ndf")
  107.      */
  108.     private $salarie;
  109.     /**
  110.      * @ORM\Column(type="date", nullable=true)
  111.      */
  112.     private $date_ndf;
  113.     /**
  114.      * @ORM\Column(type="string", length=255, nullable=true)
  115.      */
  116.     private $libelle;
  117.     public function __construct()
  118.     {
  119.         $this->documentLignes = new ArrayCollection();
  120.     }
  121.     public function getId(): ?int
  122.     {
  123.         return $this->id;
  124.     }
  125.     public function getTypeDocument(): ?string
  126.     {
  127.         return $this->type_document;
  128.     }
  129.     public function setTypeDocument(string $type_document): self
  130.     {
  131.         $this->type_document $type_document;
  132.         return $this;
  133.     }
  134.     public function getProjet(): ?Projet
  135.     {
  136.         return $this->projet;
  137.     }
  138.     public function setProjet(?Projet $projet): self
  139.     {
  140.         $this->projet $projet;
  141.         return $this;
  142.     }
  143.     public function getTiers(): ?Societe
  144.     {
  145.         return $this->tiers;
  146.     }
  147.     public function setTiers(?Societe $tiers): self
  148.     {
  149.         $this->tiers $tiers;
  150.         return $this;
  151.     }
  152.     public function getStatut(): ?string
  153.     {
  154.         return $this->statut;
  155.     }
  156.     public function setStatut(?string $statut): self
  157.     {
  158.         $this->statut $statut;
  159.         return $this;
  160.     }
  161.     public function getReference(): ?string
  162.     {
  163.         return $this->reference;
  164.     }
  165.     public function setReference(?string $reference): self
  166.     {
  167.         $this->reference $reference;
  168.         return $this;
  169.     }
  170.     public function getNumPiece(): ?string
  171.     {
  172.         return $this->num_piece;
  173.     }
  174.     public function setNumPiece(?string $num_piece): self
  175.     {
  176.         $this->num_piece $num_piece;
  177.         return $this;
  178.     }
  179.     public function getDateCrea(): ?\DateTimeInterface
  180.     {
  181.         return $this->date_crea;
  182.     }
  183.     public function setDateCrea(\DateTimeInterface $date_crea): self
  184.     {
  185.         $this->date_crea $date_crea;
  186.         return $this;
  187.     }
  188.     public function getUserCrea(): ?int
  189.     {
  190.         return $this->user_crea;
  191.     }
  192.     public function setUserCrea(int $user_crea): self
  193.     {
  194.         $this->user_crea $user_crea;
  195.         return $this;
  196.     }
  197.     public function getDateModif(): ?\DateTimeInterface
  198.     {
  199.         return $this->date_modif;
  200.     }
  201.     public function setDateModif(?\DateTimeInterface $date_modif): self
  202.     {
  203.         $this->date_modif $date_modif;
  204.         return $this;
  205.     }
  206.     public function getUserModif(): ?int
  207.     {
  208.         return $this->user_modif;
  209.     }
  210.     public function setUserModif(?int $user_modif): self
  211.     {
  212.         $this->user_modif $user_modif;
  213.         return $this;
  214.     }
  215.     public function getAdresse(): ?Adresse
  216.     {
  217.         return $this->adresse;
  218.     }
  219.     public function setAdresse(?Adresse $adresse): self
  220.     {
  221.         $this->adresse $adresse;
  222.         return $this;
  223.     }
  224.     public function getMontantHt(): ?float
  225.     {
  226.         return $this->montant_ht;
  227.     }
  228.     public function setMontantHt(float $montant_ht): self
  229.     {
  230.         $this->montant_ht $montant_ht;
  231.         return $this;
  232.     }
  233.     public function getMontantTva(): ?float
  234.     {
  235.         return $this->montant_tva;
  236.     }
  237.     public function setMontantTva(float $montant_tva): self
  238.     {
  239.         $this->montant_tva $montant_tva;
  240.         return $this;
  241.     }
  242.     public function getDateEnvoi(): ?\DateTimeInterface
  243.     {
  244.         return $this->date_envoi;
  245.     }
  246.     public function setDateEnvoi(?\DateTimeInterface $date_envoi): self
  247.     {
  248.         $this->date_envoi $date_envoi;
  249.         return $this;
  250.     }
  251.     /**
  252.      * @return Collection<int, DocumentLigne>
  253.      */
  254.     public function getDocumentLignes(): Collection
  255.     {
  256.         return $this->documentLignes;
  257.     }
  258.     public function addDocumentLigne(DocumentLigne $documentLigne): self
  259.     {
  260.         if (!$this->documentLignes->contains($documentLigne)) {
  261.             $this->documentLignes[] = $documentLigne;
  262.             $documentLigne->setDocument($this);
  263.         }
  264.         return $this;
  265.     }
  266.     public function removeDocumentLigne(DocumentLigne $documentLigne): self
  267.     {
  268.         if ($this->documentLignes->removeElement($documentLigne)) {
  269.             // set the owning side to null (unless already changed)
  270.             if ($documentLigne->getDocument() === $this) {
  271.                 $documentLigne->setDocument(null);
  272.             }
  273.         }
  274.         return $this;
  275.     }
  276.     public function orderDocLigneByTauxTva()
  277.     {
  278.         $this->documentLignes = new ArrayCollection(
  279.             Fnc::array_orderby($this->getDocumentLignes()->toArray(), 'getTauxTva()'SORT_ASC)
  280.         );
  281.     }
  282.     public function getLibelleFirstLigne(): string
  283.     {
  284.         if(0===$this->getDocumentLignes()->count()) return 'Aucune ligne dans le document';
  285.         return array_reduce(
  286.             $this->getDocumentLignes()->toArray(),
  287.             function ($lib$ligne){
  288.                 $libelle $ligne->getLibelle();
  289.                 if('Avance'!==$libelle) {
  290.                     $libelle .= ' - ';
  291.                     $libelle .= $ligne->getTauxTva() * 100;
  292.                     $libelle .= '%';
  293.                 } else {
  294.                     $libelle .= ' : ';
  295.                     $libelle .= $ligne->getPuht();
  296.                     $libelle .= '€';
  297.                 }
  298.                 if(empty($lib)) return $libelle;
  299.                 else return $lib'<br>' $libelle;
  300.             }
  301.         );
  302.     }
  303.     public function getDatePaiement(): ?\DateTimeInterface
  304.     {
  305.         return $this->date_paiement;
  306.     }
  307.     public function setDatePaiement(?\DateTimeInterface $date_paiement): self
  308.     {
  309.         $this->date_paiement $date_paiement;
  310.         return $this;
  311.     }
  312.     public function getContact(): ?string
  313.     {
  314.         return $this->contact;
  315.     }
  316.     public function setContact(?string $contact): self
  317.     {
  318.         $this->contact $contact;
  319.         return $this;
  320.     }
  321.     public function getVentilationTVA(): array
  322.     {
  323.         $ventilation = array();
  324.         $ligneList $this->getDocumentLignes()->toArray();
  325.         foreach ($ligneList as $ligne){
  326.             if('Avance'===$ligne->getLibelle()) continue;
  327.             $txTva $ligne->getTauxTva();
  328.             if(!isset($ventilation[$txTva])) $ventilation[$txTva] = (object) array(
  329.                 'taux_tva' => $txTva*100,
  330.                 'montant_tva' => 0,
  331.             );
  332.             $ventilation[$txTva]->montant_tva+= $ligne->getMontantTva();
  333.         }
  334.         ksort($ventilation);
  335.         return $ventilation;
  336.     }
  337.     public function performMontant(): self
  338.     {
  339.         $montantHT 0;
  340.         $montantTVA 0;
  341.         $ligneList $this->getDocumentLignes()->toArray();
  342.         foreach ($ligneList as $ligne){
  343.             $montantHT+= $ligne->getMontantHt();
  344.             $montantTVA+= $ligne->getMontantTva();
  345.         }
  346.         $this->setMontantHt($montantHT);
  347.         $this->setMontantTva($montantTVA);
  348.         return $this;
  349.     }
  350.     public function initDocVierge(Projet $projetstring $typeDoc): self
  351.     {
  352.         switch ($typeDoc){
  353.             case 'FACTURE PROFORMA':
  354.                 $adresseClient $projet->getSociete()->getAdresses()->last();
  355.                 $this->setNumPiece($projet->getNumProd() .'-xxxxxxx')
  356.                     ->setTiers$projet->getSociete() )
  357.                     ->setAdresse($adresseClient)
  358.                     ->setDateBdc($projet->getDateCrea())
  359.                 ;
  360.                 break;
  361.             case 'COMMANDE PRESTATAIRE':
  362.                 $societe = new Societe();
  363.                 $societe->setLibSociete('Nouvelle commande prestataire');
  364.                 $tiers = new Tiers();
  365.                 $tiers->addSociete($societe)
  366.                     ->setPrenomTiers('-')
  367.                     ->setEmailTiers('-')
  368.                     ->setTelFixeTiers('-')
  369.                     ->setTelPortableTiers('-')
  370.                 ;
  371.                 $this->setTiers($societe)
  372.                     ->setStatut('Non Payée')
  373.                 ;
  374.                 $ligne = new DocumentLigne();
  375.                 $ligne->setTauxTva(0.2);
  376.                 $this->addDocumentLigne($ligne);
  377.                 break;
  378.             case 'NDF':
  379.                 break;
  380.             default:
  381.                 break;
  382.         }
  383.         $this->setProjet($projet)
  384.             ->setDateCrea(new \DateTime())
  385.             ->setTypeDocument($typeDoc)
  386.             ->setMontantHt(0)
  387.         ;
  388.         return $this;
  389.     }
  390.     public function getIdDocOrigine(): ?int
  391.     {
  392.         return $this->id_doc_origine;
  393.     }
  394.     public function setIdDocOrigine(?int $id_doc_origine): self
  395.     {
  396.         $this->id_doc_origine $id_doc_origine;
  397.         return $this;
  398.     }
  399.     public function getCommentaire(): ?string
  400.     {
  401.         return $this->commentaire;
  402.     }
  403.     public function setCommentaire(?string $commentaire): self
  404.     {
  405.         $this->commentaire $commentaire;
  406.         return $this;
  407.     }
  408.     public function getDateBdc(): ?\DateTimeInterface
  409.     {
  410.         return $this->date_bdc;
  411.     }
  412.     public function setDateBdc(?\DateTimeInterface $date_bdc): self
  413.     {
  414.         $this->date_bdc $date_bdc;
  415.         return $this;
  416.     }
  417.     public function getLibProjet(): ?string
  418.     {
  419.         return $this->lib_projet;
  420.     }
  421.     public function setLibProjet(?string $lib_projet): self
  422.     {
  423.         $this->lib_projet $lib_projet;
  424.         return $this;
  425.     }
  426.     public function getSalarie(): ?Tiers
  427.     {
  428.         return $this->salarie;
  429.     }
  430.     public function setSalarie(?Tiers $salarie): self
  431.     {
  432.         $this->salarie $salarie;
  433.         return $this;
  434.     }
  435.     public function getDateNdf(): ?\DateTimeInterface
  436.     {
  437.         return $this->date_ndf;
  438.     }
  439.     public function setDateNdf(?\DateTimeInterface $date_ndf): self
  440.     {
  441.         $this->date_ndf $date_ndf;
  442.         return $this;
  443.     }
  444.     public function getLibelle(): ?string
  445.     {
  446.         return $this->libelle;
  447.     }
  448.     public function setLibelle(?string $libelle): self
  449.     {
  450.         $this->libelle $libelle;
  451.         return $this;
  452.     }
  453.     public function groupNdfBySalarie($ndfList): array
  454.     {
  455.         $salarieList = [];
  456.         /** @var Document $ndf */
  457.         foreach ($ndfList as $ndf){
  458.             $idSalarie $ndf->getSalarie()->getId();
  459.             if(!isset($salarieList[$idSalarie])){
  460.                 $salarieList[$idSalarie] = (object)[
  461.                     'id_projet' => $ndf->getProjet()->getId(),
  462.                     'id_salarie' => $idSalarie,
  463.                     'salarie' => $ndf->getSalarie(),
  464.                     'total_ht' => 0,
  465.                     'total_ttc' => 0,
  466.                     'select_option' => [],
  467.                     'ndf_list' => [],
  468.                 ];
  469.             }
  470.             $salarieList[$idSalarie]->total_ht+= $ndf->getMontantHt();
  471.             $salarieList[$idSalarie]->total_ttc+= $ndf->getMontantHt() + $ndf->getMontantTva();
  472.             $salarieList[$idSalarie]->ndf_list[]= $ndf;
  473.             $mois $ndf->getDateNdf()->format('Y-m');
  474.             if(!isset($salarieList[$idSalarie]->select_option[$mois])){
  475.                 $annee $ndf->getDateNdf()->format('Y');
  476.                 $libMois Fnc::getLibMois(
  477.                     $ndf->getDateNdf()->format('m')
  478.                 );
  479.                 $salarieList[$idSalarie]->select_option[$mois] = '<option value="'$mois .'">'$libMois .' '$annee.'</option>';
  480.                 $salarieList[$idSalarie]->select_option[$mois.'-en_GB'] = '<option value="'$mois .'&lang=en_GB">'$libMois .' '$annee.' en 🇬🇧</option>';
  481.             }
  482.             ksort($salarieList[$idSalarie]->select_option);
  483.         }
  484.         return $salarieList;
  485.     }
  486. }