src/Entity/Transaction.php line 80

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use ApiPlatform\Core\Annotation\ApiFilter;
  4. use ApiPlatform\Core\Annotation\ApiResource;
  5. use App\Controller\Manager\Transaction\RefuseTransactionController;
  6. use App\Controller\Manager\Transaction\ValidateTransactionController;
  7. use App\Entity\Reference\ReferenceTransactionRentalType;
  8. use App\Repository\TransactionRepository;
  9. use DateTimeInterface;
  10. use Doctrine\ORM\Mapping as ORM;
  11. use Symfony\Component\Serializer\Annotation\Groups;
  12. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
  13. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
  14. /**
  15.  * @ApiResource(
  16.  *     normalizationContext={"groups"={"transaction:collection:read","transaction-item:read"}},
  17.  *     denormalizationContext={"groups"={"transaction:write"},"skip_null_values" = true},
  18.  *     attributes={
  19.  *         "pagination_items_per_page"=10,
  20.  *         "formats"={"jsonld", "json"},
  21.  *         "order"={"id":"DESC"}
  22.  *     },
  23.  *     itemOperations={
  24.  *          "get" = {
  25.  *                  "normalization_context"={"groups"={"transaction-item:read"}},
  26.  *                  "access_control"="is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')"
  27.  *              },
  28.  *          "put" = {
  29.  *                  "access_control" = "is_granted('PUT', object)",
  30.  *                  "denormalization_context"={"groups"={"transaction:put"}},
  31.  *              },
  32.  *          "validate_transaction"={
  33.  *              "denormalization_context"={"groups"={"transaction:validate"}},
  34.  *              "security"="is_granted('ROLE_MANAGER')",
  35.  *              "method"="PATCH",
  36.  *              "path"="/transactions/{id}/validate",
  37.  *              "controller"=ValidateTransactionController::class,
  38.  *              "read"=true,
  39.  *              "write"=false,
  40.  *          },
  41.  *         "refuse_transaction"={
  42.  *              "denormalization_context"={"groups"={"transaction:refuse"}},
  43.  *              "security"="is_granted('ROLE_MANAGER')",
  44.  *              "method"="PATCH",
  45.  *              "path"="/transactions/{id}/refuse",
  46.  *              "controller"=RefuseTransactionController::class,
  47.  *              "read"=true,
  48.  *              "write"=true,
  49.  *          },
  50.  *     },
  51.  *
  52.  *     collectionOperations={
  53.  *      "get" =  {
  54.  *                  "normalization_context"={"groups"={"transaction:collection:read"}},
  55.  *                  "access_control"="is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')"
  56.  *          },
  57.  *       "post"={
  58.  *               "security" = "is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')",
  59.  *         }
  60.  *
  61.  *       },
  62.  * )
  63.  * @ApiFilter(OrderFilter::class, properties={"id"} , arguments= {"orderParameterName" : "order"})
  64.  * @ApiFilter(SearchFilter::class, properties={
  65.  *          "id": "exact",
  66.  *          "inputAgent.id": "exact",
  67.  *          "outputAgent.id": "exact",
  68.  *          "mandate.id" : "exact",
  69.  *          "mandate.property.propertyAddress.zipCode": "ipartial",
  70.  *          "referenceTransactionStatus.id": "exact",
  71.  *          "mandate.key": "ipartial"
  72.  *  })
  73.  * @ORM\Entity(repositoryClass=TransactionRepository::class)
  74.  * @ORM\HasLifecycleCallbacks()
  75.  * @ORM\EntityListeners({"App\EventListener\TransactionStatusListener"})
  76.  */
  77. class Transaction extends AbstractTransaction implements Loggable
  78. {
  79.     /**
  80.      * @ORM\Column(type="float", nullable=true)
  81.      *
  82.      * @Groups({
  83.      *     "transaction-item:read","transaction:write",
  84.      *     "siege:put","siege:write",
  85.      *     "transaction:collection:read"
  86.      * })
  87.      */
  88.     private ?float $sellerCommission 0;
  89.     /**
  90.      * @ORM\ManyToOne(targetEntity=Prescriber::class)
  91.      * @Groups({"transaction-item:read"})
  92.      */
  93.     private ?Prescriber $inputPrescriber;
  94.     /**
  95.      * @ORM\ManyToOne(targetEntity=Prescriber::class)
  96.      * @Groups({"transaction-item:read","transaction:write","transaction:put"})
  97.      */
  98.     private ?Prescriber $outputPrescriber;
  99.     /**
  100.      * @ORM\ManyToOne(targetEntity=Agent::class)
  101.      * @Groups({"transaction-item:read","transaction:write","transaction:put"})
  102.      */
  103.     private ?Agent $outputRecommendation;
  104.     /**
  105.      * @ORM\ManyToOne(targetEntity=Agent::class)
  106.      * @Groups({"transaction-item:read","siege:put"})
  107.      */
  108.     private ?Agent $inputRecommendation null;
  109.     /**
  110.      * @ORM\ManyToOne(targetEntity=ReferenceTransactionRentalType::class)
  111.      * @ORM\JoinColumn(nullable=true)
  112.      *
  113.      * @Groups({"transaction-item:read","transaction:write","transaction:put"})
  114.      */
  115.     private ?ReferenceTransactionRentalType $referenceRentalType null;
  116.     /**
  117.      * @ORM\Column(type="date", nullable=true)
  118.      * @Groups({"transaction-item:read", "transaction:write", "transaction:put"})
  119.      */
  120.     private ?DateTimeInterface $rentalStartDate;
  121.     /**
  122.      * @ORM\Column(type="date", nullable=true)
  123.      * @Groups({"transaction-item:read", "siege:write", "siege:put", "transaction:collection:read"})
  124.      */
  125.     private ?DateTimeInterface $signatureActDate;
  126.     /**
  127.      * @ORM\Column(type="date", nullable=true)
  128.      * @Groups({"transaction-item:read", "siege:write", "siege:put"})
  129.      */
  130.     private ?DateTimeInterface $paymentDate;
  131.     /**
  132.      * @ORM\Column(type="date", nullable=true)
  133.      * @Groups({"transaction-item:read", "siege:write", "siege:put"})
  134.      */
  135.     private ?DateTimeInterface $disbursementDate;
  136.     /**
  137.      * @ORM\Column(type="date", nullable=true)
  138.      * @Groups({"transaction-item:read", "siege:write", "siege:put"})
  139.      */
  140.     private ?DateTimeInterface $cancellationDate;
  141.     /**
  142.      * @ORM\Column(type="date", nullable=true)
  143.      * @Groups({"transaction-item:read", "siege:write", "siege:put"})
  144.      */
  145.     private ?DateTimeInterface $editRentalContractDate;
  146.     /**
  147.      * @ORM\Column(type="date", nullable=true)
  148.      * @Groups({"transaction-item:read", "siege:write", "siege:put"})
  149.      */
  150.     private ?DateTimeInterface $signatureRentalContractDate;
  151.     /**
  152.      * @ORM\Column(type="date", nullable=true)
  153.      * @Groups({"transaction-item:read", "siege:write", "siege:put"})
  154.      */
  155.     private ?DateTimeInterface $refusalDate;
  156.     /**
  157.      * @ORM\Column(type="date", nullable=true)
  158.      * @Groups({"transaction-item:read", "transaction:write", "transaction:put"})
  159.      */
  160.     private ?DateTimeInterface $rentalEndDate;
  161.     /**
  162.      * @ORM\Column(type="float",nullable=true)
  163.      *
  164.      * @Groups({"transaction:collection:read","transaction-item:read", "transaction:write", "transaction:put"})
  165.      */
  166.     private ?float $rentalPrice;
  167.     public function getSellerCommission(): ?float
  168.     {
  169.         return $this->sellerCommission;
  170.     }
  171.     public function setSellerCommission(?float $sellerCommission): self
  172.     {
  173.         $this->sellerCommission $sellerCommission;
  174.         return $this;
  175.     }
  176.     public function setInputPrescriber(?Prescriber $inputPrescriber): self
  177.     {
  178.         $this->inputPrescriber $inputPrescriber;
  179.         return $this;
  180.     }
  181.     public function getInputPrescriber(): ?Prescriber
  182.     {
  183.         return $this->inputPrescriber;
  184.     }
  185.     public function getOutputPrescriber(): ?Prescriber
  186.     {
  187.         return $this->outputPrescriber;
  188.     }
  189.     public function setOutputRecommendation(?Agent $outputRecommendation): self
  190.     {
  191.         $this->outputRecommendation $outputRecommendation;
  192.         return $this;
  193.     }
  194.     public function setOutputPrescriber(?Prescriber $outputPrescriber): self
  195.     {
  196.         $this->outputPrescriber $outputPrescriber;
  197.         return $this;
  198.     }
  199.     public function getInputRecommendation(): ?Agent
  200.     {
  201.         return $this->inputRecommendation;
  202.     }
  203.     public function setInputRecommendation(?Agent $inputRecommendation): self
  204.     {
  205.         $this->inputRecommendation $inputRecommendation;
  206.         return $this;
  207.     }
  208.     public function getOutputRecommendation(): ?Agent
  209.     {
  210.         return $this->outputRecommendation;
  211.     }
  212.     public function getRentalStartDate(): ?DateTimeInterface
  213.     {
  214.         return $this->rentalStartDate;
  215.     }
  216.     public function setRentalStartDate(?DateTimeInterface $rentalStartDate): void
  217.     {
  218.         $this->rentalStartDate $rentalStartDate;
  219.     }
  220.     public function getRentalEndDate(): ?DateTimeInterface
  221.     {
  222.         return $this->rentalEndDate;
  223.     }
  224.     public function setRentalEndDate(?DateTimeInterface $rentalEndDate): void
  225.     {
  226.         $this->rentalEndDate $rentalEndDate;
  227.     }
  228.     public function getSignatureActDate(): ?DateTimeInterface
  229.     {
  230.         return $this->signatureActDate;
  231.     }
  232.     public function setSignatureActDate(?DateTimeInterface $signatureActDate): self
  233.     {
  234.         $this->signatureActDate $signatureActDate;
  235.         return $this;
  236.     }
  237.     public function getPaymentDate(): ?DateTimeInterface
  238.     {
  239.         return $this->paymentDate;
  240.     }
  241.     public function setPaymentDate(?DateTimeInterface $paymentDate): self
  242.     {
  243.         $this->paymentDate =  $paymentDate;
  244.         return $this;
  245.     }
  246.     public function getDisbursementDate(): ?DateTimeInterface
  247.     {
  248.         return $this->disbursementDate;
  249.     }
  250.     public function setDisbursementDate(?DateTimeInterface $disbursementDate): self
  251.     {
  252.         $this->disbursementDate =  $disbursementDate;
  253.         return $this;
  254.     }
  255.     public function getCancellationDate(): ?DateTimeInterface
  256.     {
  257.         return $this->cancellationDate;
  258.     }
  259.     public function setCancellationDate(?DateTimeInterface $cancellationDate): self
  260.     {
  261.         $this->cancellationDate $cancellationDate;
  262.         return $this;
  263.     }
  264.     public function getRefusalDate(): ?DateTimeInterface
  265.     {
  266.         return $this->refusalDate;
  267.     }
  268.     public function setRefusalDate(?DateTimeInterface $refusalDate): self
  269.     {
  270.         $this->refusalDate $refusalDate;
  271.         return $this;
  272.     }
  273.     public function getEditRentalContractDate(): ?DateTimeInterface
  274.     {
  275.         return $this->editRentalContractDate;
  276.     }
  277.     public function setEditRentalContractDate(?DateTimeInterface $editRentalContractDate): self
  278.     {
  279.         $this->editRentalContractDate $editRentalContractDate;
  280.         return $this;
  281.     }
  282.     public function getSignatureRentalContractDate(): ?DateTimeInterface
  283.     {
  284.         return $this->signatureRentalContractDate;
  285.     }
  286.     public function setSignatureRentalContractDate(?DateTimeInterface $signatureRentalContractDate): self
  287.     {
  288.         $this->signatureRentalContractDate $signatureRentalContractDate;
  289.         return $this;
  290.     }
  291.     public function getReferenceRentalType(): ?ReferenceTransactionRentalType
  292.     {
  293.         return $this->referenceRentalType;
  294.     }
  295.     public function setReferenceRentalType(?ReferenceTransactionRentalType $referenceRentalType): self
  296.     {
  297.         $this->referenceRentalType $referenceRentalType;
  298.         return $this;
  299.     }
  300.     public function getRentalPrice(): ?float
  301.     {
  302.         return $this->rentalPrice;
  303.     }
  304.     public function setRentalPrice(?float $rentalPrice): void
  305.     {
  306.         $this->rentalPrice $rentalPrice;
  307.     }
  308.     public function calculateFees(Transaction $transaction): void
  309.     {
  310.         $this->calculateSellerCommission($transaction);
  311.         $this->calculateFeesWithTax();
  312.         $this->calculateFeesWithoutTax();
  313.     }
  314.     private function calculateSellerCommission(Transaction $transaction): void
  315.     {
  316.         $mandate $this->getMandate();
  317.         $transaction->getSellerCommission() !== $mandate->getCommission()
  318.             ? $this->setSellerCommission((float) $transaction->sellerCommission)
  319.             : $this->setSellerCommission((float) $mandate->getCommission());
  320.     }
  321.     private function calculateFeesWithoutTax(): void
  322.     {
  323.         $feesWithoutTax = (100 $this->getFeesWithTax()) / (100 + ($this->getVat()->getTax() * 100));
  324.         $this->setFeesWithoutTax($feesWithoutTax);
  325.     }
  326.     private function calculateFeesWithTax(): void
  327.     {
  328.         $sellerCommission $this->getSellerCommission();
  329.         $buyerCommission $this->getBuyerCommission();
  330.         $feesWithTax = (float) $sellerCommission + (float) $buyerCommission;
  331.         $this->setFeesWithTax($feesWithTax);
  332.     }
  333.     /**
  334.      * @return array
  335.      */
  336.     public function getFields(): array
  337.     {
  338.         return [
  339.             'referenceTransactionStatus' => 'referenceTransactionStatus',
  340.             'contact' => 'contact',
  341.             'sellerCommission' => 'sellerCommission',
  342.             'rentalPrice' => 'rentalPrice',
  343.             'invoiceDate' => 'invoiceDate',
  344.             'advance' => 'advance'
  345.         ];
  346.     }
  347. }