src/Service/ContractOrderService.php line 240

  1. <?php
  2. namespace App\Service;
  3. use App\Entity\Accommodation;
  4. use App\Entity\Client;
  5. use App\Entity\Contract;
  6. use App\Entity\ContractClient;
  7. use App\Entity\ContractDiscount;
  8. use App\Entity\ContractOrder;
  9. use App\Entity\ContractPrice;
  10. use App\Entity\Destination;
  11. use App\Entity\Term;
  12. use App\Entity\TermPrice;
  13. use App\Repository\ClientRepository;
  14. use phpDocumentor\Reflection\Utils;
  15. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  18. use Symfony\Component\Mailer\MailerInterface;
  19. use Symfony\Component\Mime\Email;
  20. class ContractOrderService
  21. {
  22.     public function __construct(
  23.         private ContractService $contractService,
  24.         private RequestStack $requestStack
  25.     )
  26.     {
  27.     }
  28.     public function saveContractOrder(ContractOrder $contractOrder)
  29.     {
  30.         $client $contractOrder->getClient();
  31.         $term $contractOrder->getTerm();
  32.         $contract = new Contract();
  33.         $contract->setTerm($term);
  34.         $contract->setClient($client);
  35.         $contract->setContractOrder($contractOrder);
  36.         $contract->setNote($contractOrder->getNote());
  37.         $contract->setWithPet($contractOrder->isWithPet());
  38.         $contract->setWithDiet($contractOrder->getWithDiet());
  39.         $contract->setFirstMinute($contractOrder->getFirstMinute());
  40.         $contract->setReturningClient($contractOrder->isReturningClient());
  41.         $contract->setTransferType($contractOrder->getTransferType());
  42.         $contract->setBoardingPlace($contractOrder->getBoardingPlace());
  43.         $contract->setAccommodation($contractOrder->getAccommodation());
  44.         $this->fillContractClients($contractOrder$contract);
  45.         if (in_array($term->getDestination()->getId(), [1223], true)) {
  46.             $this->fillMainDestinationData($contract$contractOrder);
  47.         } else {
  48.             $this->fillOtherDestinationData($contract$contractOrder);
  49.         }
  50.         $this->contractService->saveContract($contract);
  51.         $this->contractService->sendEmail($contract);
  52.         return true;
  53.     }
  54.     private function fillMainDestinationData(Contract $contractContractOrder $contractOrder)
  55.     {
  56.         $contract->setIsRead(false);
  57.         $contract->setAutoInit(false);
  58.         $this->fillContractData($contract$contractOrder);
  59.     }
  60.     private function fillOtherDestinationData(Contract $contractContractOrder $contractOrder)
  61.     {
  62.         $term $contractOrder->getTerm();
  63.         if (!$contract->getAccommodation() instanceof Accommodation) {
  64.             $contract->setAccommodation($term->getDestination()->getAccommodations()->first());
  65.         }
  66.         if (in_array($term->getDestination()->getId(), [
  67.                 34
  68.             ]) && $contractOrder->getTransferType() == 'car') {
  69.             $this->initNewDiscount($contract'Sleva za vlastní dopravu'500 count($contract->getClientsList()));
  70.         }
  71.         return $contract;
  72.     }
  73.     private function fillContractData(Contract $contractContractOrder $contractOrder)
  74.     {
  75.         $contractPrice $this->initNewPrice($contractContractPrice::TYPE_TERM$contractOrder->getAccommodationPrice(), 'Ubytování'false1'ks'true);
  76.         $contract->addContractPrice($contractPrice);
  77.         if ($contractOrder->getTransferType() == 'bus') {
  78.             $price $this->initNewPrice($contractContractPrice::TYPE_PERSON$contractOrder->getDestination()->getBusPrice(), 'Doprava'false$contract->getNumberOfPersons(), 'Osob');
  79.             $contract->addContractPrice($price);
  80.         }
  81.         if ($contractOrder->getTransferType() == 'car') {
  82.             $contractPrice $this->initNewPrice($contractContractPrice::TYPE_TERM150 $contract->getNumberOfNights(), 'Parkovné'true1'ks'false);
  83.             $contract->addContractPrice($contractPrice);
  84.         }
  85.         if ($contractOrder->isWithPet()) {
  86.             $contractPrice $this->initNewPrice($contractContractPrice::TYPE_TERM$contractOrder->getDestination()->getPetPrice() * $contract->getNumberOfNights(), 'Mazlíček'true1'ks'false);
  87.             $contract->addContractPrice($contractPrice);
  88.         }
  89.         if ($contractOrder->getWithDiet()) {
  90.             $contractPrice $this->initNewPrice($contractContractPrice::TYPE_PERSON$contractOrder->getDestination()->getDietPrice(), 'Strava'true1'ks'false);
  91.             $contract->addContractPrice($contractPrice);
  92.         }
  93.         if (!empty($contract->getAdultsCount())) {
  94.             $type ContractPrice::TYPE_ADULT;
  95.             $contractPrice $this->initNewPrice($contract$type$contractOrder->getTerm()->getTouristTax() * $contract->getNumberOfNights(), 'Pobytová taxa'false1'ks'false);
  96.             $contract->addContractPrice($contractPrice);
  97.         }
  98.         if (!empty($contract->getTeenagersCount())) {
  99.             $type ContractPrice::TYPE_TEENAGER;
  100.             $contractPrice $this->initNewPrice($contract$type$contractOrder->getDestination()->getChildrenTouristTax() * $contract->getNumberOfNights(), 'Pobytová taxa'false1'ks'false);
  101.             $contract->addContractPrice($contractPrice);
  102.         }
  103.         if (!empty($contract->getChildCount())) {
  104.             $type ContractPrice::TYPE_CHILD;
  105.             $contractPrice $this->initNewPrice($contract$type0'Pobytová taxa'false1'ks'false);
  106.             $contract->addContractPrice($contractPrice);
  107.         }
  108.         // Registrační poplatek pro děti do 12 let
  109.         $childrenRegistrationFee $contractOrder->getDestination()->getChildrenRegistrationFee();
  110.         if ($childrenRegistrationFee && $childrenRegistrationFee 0) {
  111.             $childrenCount $contract->getChildCount();
  112.             if ($childrenCount 0) {
  113.                 $contractPrice $this->initNewPrice($contractContractPrice::TYPE_CHILD$childrenRegistrationFee'Registrační poplatek děti do 12 let'false$childrenCount'Dětí');
  114.                 $contract->addContractPrice($contractPrice);
  115.             }
  116.         }
  117.         $accommodationPrice $contractOrder->getAccommodationPrice();
  118.         if ($contractOrder->isReturningClient()) {
  119.             $returningDiscountValue $accommodationPrice 0.05;
  120.             $this->initNewDiscount($contract'Věrnostní sleva 5%'round($returningDiscountValue));
  121.             $accommodationPrice $accommodationPrice $returningDiscountValue;
  122.         }
  123.         if ($contractOrder->getFirstMinute()) {
  124.             $this->initNewDiscount($contract'Sleva za včasné uhrazení 4%'round($accommodationPrice 0.04));
  125.         }
  126.         if ($contractOrder->getTransferType() == 'bus' && $contract->getAdultsCount() >= && $contract->getChildCount() > 0) {
  127.             $this->initNewDiscount($contract'Sleva z dopravy na dítě'300);
  128.         }
  129.     }
  130.     private function initNewPrice(Contract $contract$type$amount$description$isSurcharge$qty 1$unit 'ks'$isSaleAllowed false)
  131.     {
  132.         $contractPrice = new ContractPrice();
  133.         $contractPrice->setContract($contract);
  134.         $contractPrice->setAmount($amount);
  135.         $contractPrice->setDescription($description);
  136.         $contractPrice->setUnit($unit);
  137.         $contractPrice->setIsSurcharge($isSurcharge);
  138.         $contractPrice->setQty($qty);
  139.         $contractPrice->setType($type);
  140.         $contractPrice->setIsSaleAllowed($isSaleAllowed);
  141.         return $contractPrice;
  142.     }
  143.     private function initNewDiscount(Contract $contract$description$amount)
  144.     {
  145.         $contractDiscount = new ContractDiscount();
  146.         $contractDiscount->setDescription($description);
  147.         $contractDiscount->setAmount($amount);
  148.         $contract->addContractDiscount($contractDiscount);
  149.         return $contractDiscount;
  150.     }
  151.     /**
  152.      * @param ContractOrder $contractOrder
  153.      * @param Contract $contract
  154.      * @return void
  155.      */
  156.     protected function fillContractClients(ContractOrder $contractOrderContract $contract): void
  157.     {
  158.         if ($contractOrder->getContractClient1() instanceof Client) {
  159.             $contractClient = new ContractClient();
  160.             $contractClient->setClient($contractOrder->getContractClient1());
  161.             $contract->addContractClient($contractClient);
  162.         }
  163.         if ($contractOrder->getContractClient2() instanceof Client) {
  164.             $contractClient = new ContractClient();
  165.             $contractClient->setClient($contractOrder->getContractClient2());
  166.             $contract->addContractClient($contractClient);
  167.         }
  168.         if ($contractOrder->getContractClient3() instanceof Client) {
  169.             $contractClient = new ContractClient();
  170.             $contractClient->setClient($contractOrder->getContractClient3());
  171.             $contract->addContractClient($contractClient);
  172.         }
  173.         if ($contractOrder->getContractClient4() instanceof Client) {
  174.             $contractClient = new ContractClient();
  175.             $contractClient->setClient($contractOrder->getContractClient4());
  176.             $contract->addContractClient($contractClient);
  177.         }
  178.         if ($contractOrder->getContractClient5() instanceof Client) {
  179.             $contractClient = new ContractClient();
  180.             $contractClient->setClient($contractOrder->getContractClient5());
  181.             $contract->addContractClient($contractClient);
  182.         }
  183.         if ($contractOrder->getContractClient6() instanceof Client) {
  184.             $contractClient = new ContractClient();
  185.             $contractClient->setClient($contractOrder->getContractClient6());
  186.             $contract->addContractClient($contractClient);
  187.         }
  188.     }
  189.     public function canOrderFullDestination(Destination $destination)
  190.     {
  191.         // V CLI kontextu (např. watchdog command) není request ani session dostupná
  192.         $request $this->requestStack->getMainRequest();
  193.         if (!$request || !$request->hasSession()) {
  194.             return false;
  195.         }
  196.         
  197.         $session $request->getSession();
  198.         return $destination->getId() === $session->get('openDestinationId'0);
  199.     }
  200.     public function getTermPricesForAccommodation(Accommodation $accommodation)
  201.     {
  202.         if ($this->canOrderFullDestination($accommodation->getDestination())) {
  203.             return $accommodation->getTermPrices()->filter(fn(TermPrice $termPrice) => $termPrice->getTerm()->getSeason()->isCurrent());
  204.         }
  205.         return $accommodation->getTermPrices()->filter(fn(TermPrice $termPrice) => $termPrice->canOrder() && $termPrice->getTerm()->getSeason()->isCurrent());
  206.     }
  207.     public function getTermPricesForTerm(Term $term)
  208.     {
  209.         if ($this->canOrderFullDestination($term->getDestination())) {
  210.             return $term->getTermPrices()->filter(fn(TermPrice $termPrice) => 
  211.                 $termPrice->getTerm()->getSeason()->isCurrent() && 
  212.                 $termPrice->getAccommodation()->getIsActive()
  213.             );
  214.         } else {
  215.             return $term->getTermPrices()->filter(fn(TermPrice $termPrice) => 
  216.                 $termPrice->canOrder() && 
  217.                 $termPrice->getTerm()->getSeason()->isCurrent() && 
  218.                 $termPrice->getAccommodation()->getIsActive()
  219.             );
  220.         }
  221.     }
  222.     public function canOrderTerm(Term $term)
  223.     {
  224.         if ($this->canOrderFullDestination($term->getDestination())) {
  225.             return true;
  226.         } else {
  227.             return $term->canOrder();
  228.         }
  229.     }
  230.     public function canOrderTermPrice(TermPrice $termPrice)
  231.     {
  232.         $destination $termPrice->getTerm()->getDestination();
  233.         if(in_array($destination->getId(), [
  234.             1,2
  235.         ]) && !empty($termPrice ->getCapacity()) && $termPrice->canOrder()) {
  236.             $contracts $this->contractService->getContractsForTermPrice($termPrice);
  237.             return count($contracts) < $termPrice->getCapacity();
  238.         }
  239.         if ($this->canOrderFullDestination($termPrice->getTerm()->getDestination())) {
  240.             return true;
  241.         } else {
  242.             return $termPrice->canOrder();
  243.         }
  244.     }
  245. }