src/Service/ContractOrderService.php line 240
<?phpnamespace App\Service;use App\Entity\Accommodation;use App\Entity\Client;use App\Entity\Contract;use App\Entity\ContractClient;use App\Entity\ContractDiscount;use App\Entity\ContractOrder;use App\Entity\ContractPrice;use App\Entity\Destination;use App\Entity\Term;use App\Entity\TermPrice;use App\Repository\ClientRepository;use phpDocumentor\Reflection\Utils;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\HttpFoundation\Session\SessionInterface;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Mime\Email;class ContractOrderService{public function __construct(private ContractService $contractService,private RequestStack $requestStack){}public function saveContractOrder(ContractOrder $contractOrder){$client = $contractOrder->getClient();$term = $contractOrder->getTerm();$contract = new Contract();$contract->setTerm($term);$contract->setClient($client);$contract->setContractOrder($contractOrder);$contract->setNote($contractOrder->getNote());$contract->setWithPet($contractOrder->isWithPet());$contract->setWithDiet($contractOrder->getWithDiet());$contract->setFirstMinute($contractOrder->getFirstMinute());$contract->setReturningClient($contractOrder->isReturningClient());$contract->setTransferType($contractOrder->getTransferType());$contract->setBoardingPlace($contractOrder->getBoardingPlace());$contract->setAccommodation($contractOrder->getAccommodation());$this->fillContractClients($contractOrder, $contract);if (in_array($term->getDestination()->getId(), [1, 2, 23], true)) {$this->fillMainDestinationData($contract, $contractOrder);} else {$this->fillOtherDestinationData($contract, $contractOrder);}$this->contractService->saveContract($contract);$this->contractService->sendEmail($contract);return true;}private function fillMainDestinationData(Contract $contract, ContractOrder $contractOrder){$contract->setIsRead(false);$contract->setAutoInit(false);$this->fillContractData($contract, $contractOrder);}private function fillOtherDestinationData(Contract $contract, ContractOrder $contractOrder){$term = $contractOrder->getTerm();if (!$contract->getAccommodation() instanceof Accommodation) {$contract->setAccommodation($term->getDestination()->getAccommodations()->first());}if (in_array($term->getDestination()->getId(), [3, 4]) && $contractOrder->getTransferType() == 'car') {$this->initNewDiscount($contract, 'Sleva za vlastní dopravu', 500 * count($contract->getClientsList()));}return $contract;}private function fillContractData(Contract $contract, ContractOrder $contractOrder){$contractPrice = $this->initNewPrice($contract, ContractPrice::TYPE_TERM, $contractOrder->getAccommodationPrice(), 'Ubytování', false, 1, 'ks', true);$contract->addContractPrice($contractPrice);if ($contractOrder->getTransferType() == 'bus') {$price = $this->initNewPrice($contract, ContractPrice::TYPE_PERSON, $contractOrder->getDestination()->getBusPrice(), 'Doprava', false, $contract->getNumberOfPersons(), 'Osob');$contract->addContractPrice($price);}if ($contractOrder->getTransferType() == 'car') {$contractPrice = $this->initNewPrice($contract, ContractPrice::TYPE_TERM, 150 * $contract->getNumberOfNights(), 'Parkovné', true, 1, 'ks', false);$contract->addContractPrice($contractPrice);}if ($contractOrder->isWithPet()) {$contractPrice = $this->initNewPrice($contract, ContractPrice::TYPE_TERM, $contractOrder->getDestination()->getPetPrice() * $contract->getNumberOfNights(), 'Mazlíček', true, 1, 'ks', false);$contract->addContractPrice($contractPrice);}if ($contractOrder->getWithDiet()) {$contractPrice = $this->initNewPrice($contract, ContractPrice::TYPE_PERSON, $contractOrder->getDestination()->getDietPrice(), 'Strava', true, 1, 'ks', false);$contract->addContractPrice($contractPrice);}if (!empty($contract->getAdultsCount())) {$type = ContractPrice::TYPE_ADULT;$contractPrice = $this->initNewPrice($contract, $type, $contractOrder->getTerm()->getTouristTax() * $contract->getNumberOfNights(), 'Pobytová taxa', false, 1, 'ks', false);$contract->addContractPrice($contractPrice);}if (!empty($contract->getTeenagersCount())) {$type = ContractPrice::TYPE_TEENAGER;$contractPrice = $this->initNewPrice($contract, $type, $contractOrder->getDestination()->getChildrenTouristTax() * $contract->getNumberOfNights(), 'Pobytová taxa', false, 1, 'ks', false);$contract->addContractPrice($contractPrice);}if (!empty($contract->getChildCount())) {$type = ContractPrice::TYPE_CHILD;$contractPrice = $this->initNewPrice($contract, $type, 0, 'Pobytová taxa', false, 1, 'ks', false);$contract->addContractPrice($contractPrice);}// Registrační poplatek pro děti do 12 let$childrenRegistrationFee = $contractOrder->getDestination()->getChildrenRegistrationFee();if ($childrenRegistrationFee && $childrenRegistrationFee > 0) {$childrenCount = $contract->getChildCount();if ($childrenCount > 0) {$contractPrice = $this->initNewPrice($contract, ContractPrice::TYPE_CHILD, $childrenRegistrationFee, 'Registrační poplatek děti do 12 let', false, $childrenCount, 'Dětí');$contract->addContractPrice($contractPrice);}}$accommodationPrice = $contractOrder->getAccommodationPrice();if ($contractOrder->isReturningClient()) {$returningDiscountValue = $accommodationPrice * 0.05;$this->initNewDiscount($contract, 'Věrnostní sleva 5%', round($returningDiscountValue));$accommodationPrice = $accommodationPrice - $returningDiscountValue;}if ($contractOrder->getFirstMinute()) {$this->initNewDiscount($contract, 'Sleva za včasné uhrazení 4%', round($accommodationPrice * 0.04));}if ($contractOrder->getTransferType() == 'bus' && $contract->getAdultsCount() >= 2 && $contract->getChildCount() > 0) {$this->initNewDiscount($contract, 'Sleva z dopravy na dítě', 300);}}private function initNewPrice(Contract $contract, $type, $amount, $description, $isSurcharge, $qty = 1, $unit = 'ks', $isSaleAllowed = false){$contractPrice = new ContractPrice();$contractPrice->setContract($contract);$contractPrice->setAmount($amount);$contractPrice->setDescription($description);$contractPrice->setUnit($unit);$contractPrice->setIsSurcharge($isSurcharge);$contractPrice->setQty($qty);$contractPrice->setType($type);$contractPrice->setIsSaleAllowed($isSaleAllowed);return $contractPrice;}private function initNewDiscount(Contract $contract, $description, $amount){$contractDiscount = new ContractDiscount();$contractDiscount->setDescription($description);$contractDiscount->setAmount($amount);$contract->addContractDiscount($contractDiscount);return $contractDiscount;}/*** @param ContractOrder $contractOrder* @param Contract $contract* @return void*/protected function fillContractClients(ContractOrder $contractOrder, Contract $contract): void{if ($contractOrder->getContractClient1() instanceof Client) {$contractClient = new ContractClient();$contractClient->setClient($contractOrder->getContractClient1());$contract->addContractClient($contractClient);}if ($contractOrder->getContractClient2() instanceof Client) {$contractClient = new ContractClient();$contractClient->setClient($contractOrder->getContractClient2());$contract->addContractClient($contractClient);}if ($contractOrder->getContractClient3() instanceof Client) {$contractClient = new ContractClient();$contractClient->setClient($contractOrder->getContractClient3());$contract->addContractClient($contractClient);}if ($contractOrder->getContractClient4() instanceof Client) {$contractClient = new ContractClient();$contractClient->setClient($contractOrder->getContractClient4());$contract->addContractClient($contractClient);}if ($contractOrder->getContractClient5() instanceof Client) {$contractClient = new ContractClient();$contractClient->setClient($contractOrder->getContractClient5());$contract->addContractClient($contractClient);}if ($contractOrder->getContractClient6() instanceof Client) {$contractClient = new ContractClient();$contractClient->setClient($contractOrder->getContractClient6());$contract->addContractClient($contractClient);}}public function canOrderFullDestination(Destination $destination){// V CLI kontextu (např. watchdog command) není request ani session dostupná$request = $this->requestStack->getMainRequest();if (!$request || !$request->hasSession()) {return false;}$session = $request->getSession();return $destination->getId() === $session->get('openDestinationId', 0);}public function getTermPricesForAccommodation(Accommodation $accommodation){if ($this->canOrderFullDestination($accommodation->getDestination())) {return $accommodation->getTermPrices()->filter(fn(TermPrice $termPrice) => $termPrice->getTerm()->getSeason()->isCurrent());}return $accommodation->getTermPrices()->filter(fn(TermPrice $termPrice) => $termPrice->canOrder() && $termPrice->getTerm()->getSeason()->isCurrent());}public function getTermPricesForTerm(Term $term){if ($this->canOrderFullDestination($term->getDestination())) {return $term->getTermPrices()->filter(fn(TermPrice $termPrice) =>$termPrice->getTerm()->getSeason()->isCurrent() &&$termPrice->getAccommodation()->getIsActive());} else {return $term->getTermPrices()->filter(fn(TermPrice $termPrice) =>$termPrice->canOrder() &&$termPrice->getTerm()->getSeason()->isCurrent() &&$termPrice->getAccommodation()->getIsActive());}}public function canOrderTerm(Term $term){if ($this->canOrderFullDestination($term->getDestination())) {return true;} else {return $term->canOrder();}}public function canOrderTermPrice(TermPrice $termPrice){$destination = $termPrice->getTerm()->getDestination();if(in_array($destination->getId(), [1,2]) && !empty($termPrice ->getCapacity()) && $termPrice->canOrder()) {$contracts = $this->contractService->getContractsForTermPrice($termPrice);return count($contracts) < $termPrice->getCapacity();}if ($this->canOrderFullDestination($termPrice->getTerm()->getDestination())) {return true;} else {return $termPrice->canOrder();}}}