src/Aviatur/FlightBundle/Services/AvailabilityFunctions.php line 987

Open in your IDE?
  1. <?php
  2. /*
  3.  * To change this license header, choose License Headers in Project Properties.
  4.  * To change this template file, choose Tools | Templates
  5.  * and open the template in the editor.
  6.  */
  7. namespace Aviatur\FlightBundle\Services;
  8. use Aviatur\FlightBundle\Models\FlightModel;
  9. use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
  10. use Aviatur\GeneralBundle\Services\AviaturLogSave;
  11. use Aviatur\GeneralBundle\Services\AviaturWebService;
  12. use Doctrine\Persistence\ManagerRegistry;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  16. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  17. /**
  18.  * Description of AviaturAvailability.
  19.  */
  20. class AvailabilityFunctions
  21. {
  22.     private \Symfony\Component\HttpFoundation\RequestStack $requestStack;
  23.     private \Doctrine\Persistence\ManagerRegistry $managerRegistry;
  24.     private \Symfony\Component\HttpFoundation\Session\SessionInterface $session;
  25.     private \Aviatur\GeneralBundle\Services\AviaturLogSave $logSave;
  26.     private \Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface $authorizationChecker;
  27.     private \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface $tokenStorage;
  28.     private \Aviatur\GeneralBundle\Services\AviaturWebService $webService;
  29.     private \Aviatur\GeneralBundle\Services\AviaturErrorHandler $errorHandler;
  30.     private $em;
  31.     public function __construct(RequestStack $requestStackManagerRegistry $managerRegistrySessionInterface $sessionAviaturLogSave $logSaveAuthorizationCheckerInterface $authorizationCheckerTokenStorageInterface $tokenStorageAviaturWebService $webServiceAviaturErrorHandler $errorHandler)
  32.     {
  33.         $this->requestStack $requestStack;
  34.         $this->managerRegistry $managerRegistry;
  35.         $this->session $session;
  36.         $this->logSave $logSave;
  37.         $this->authorizationChecker $authorizationChecker;
  38.         $this->tokenStorage $tokenStorage;
  39.         $this->webService $webService;
  40.         $this->errorHandler $errorHandler;
  41.         $this->em $this->managerRegistry->getManager();
  42.     }
  43.     public function assembleRoundTrip($agency$OneWay1$OneWay2$response$flights$variable$method$isNational)
  44.     {
  45.         $domain $this->requestStack->getCurrentRequest()->getHost();
  46.         $parametersJson $this->session->get($domain.'[parameters]''');
  47.         $parameters json_decode($parametersJson);
  48.         $isFront $this->session->has('operatorId');
  49.         $flightModel = new FlightModel();
  50.         $xmlFinalCombination '';
  51.         $xmlCombinationTemplate $flightModel->getXmlCombinations();
  52.         $combinationCounter 0;
  53.         $optionsLimit 20;
  54.         $optionsCount1 0;
  55.         /* For indicating if specialDiscountAviatur is appplied (at least in one road) */
  56.         $isApplyingSpecialDiscountAviatur false;
  57.         foreach ($OneWay1->Message->$method->PricedItineraries->PricedItinerary as $originalPricedItinerary) {
  58.             /* Se debe crear una copia necesariamente por posibles modificaciones con el tema del descuento en un solo trayecto en roundtrip */
  59.             $pricedItinerary = clone $originalPricedItinerary;
  60.             $originDestinationSegment1 str_replace(['<OriginDestinationOptions>''</OriginDestinationOptions>'], [''], $pricedItinerary->AirItinerary->OriginDestinationOptions->asXml());
  61.             $priceType1 = (string) isset($pricedItinerary['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary['PriceType'])) : "{$pricedItinerary->TicketingInfo->TicketingVendor['Code']}-NA";
  62.             $quoteId1 = (string) $pricedItinerary->AirItineraryPricingInfo['QuoteID'];
  63.             $baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  64.             $taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  65.             $totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  66.             $equivFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
  67.             $ptcFareBreakdown $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns;
  68.             $providerSegment1 = isset($pricedItinerary->Notes['ProviderId']) ? (string) $pricedItinerary->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/''$1', (string) $pricedItinerary->Notes1);
  69.             $correlationSegment1 = isset($pricedItinerary->Notes['CorrelationId']) ? (string) $pricedItinerary->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/''$1', (string) $pricedItinerary->Notes1);
  70.             $ticketingVendor1 $pricedItinerary->TicketingInfo->TicketingVendor->asXML();
  71.             $validatingAirline1 = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
  72.             $specialDiscountValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true false;
  73.             $specialDiscountAviaturValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true false;
  74.             $optionsCount2 0;
  75.             foreach ($OneWay2->Message->$method->PricedItineraries->PricedItinerary as $originalPricedItinerary2) {
  76.                 /* Se debe crear una copia necesariamente por posibles modificaciones con el tema del descuento en un solo trayecto en roundtrip */
  77.                 $pricedItinerary1 = clone $pricedItinerary/* De nuevo por que dependiendo del escenario de combinación, se afecta IDA o VUELTA con OR exclusivo en descuento de campaƱa roundtrip */
  78.                 $pricedItinerary2 = clone $originalPricedItinerary2;
  79.                 $priceType2 = (string) isset($pricedItinerary2['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary2['PriceType'])) : "{$pricedItinerary2->TicketingInfo->TicketingVendor['Code']}-NA";
  80.                 $validatingAirline2 = (string) $pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
  81.                 $baseFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  82.                 $taxes2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  83.                 $providerSegment2 = isset($pricedItinerary2->Notes['ProviderId']) ? (string) $pricedItinerary2->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/''$1', (string) $pricedItinerary2->Notes1);
  84.                 $markup 0;
  85.                 if ('122' == $providerSegment2 || '82' == $providerSegment2) {
  86.                     $markup = ((int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] * $parameters->kiwi_markup) / 100;
  87.                 }
  88.                 $totalFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] + $markup;
  89.                 $specialDiscountValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true false;
  90.                 $specialDiscountAviaturValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true false;
  91.                 if (null != $response && ((== sizeof($pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment)) && ($isNational) && ($validatingAirline1 == $validatingAirline2) && 'LA' == $validatingAirline1) && (!$specialDiscountValidation1) && (!$specialDiscountValidation2) && (!$specialDiscountAviaturValidation1) && (!$specialDiscountAviaturValidation2)) {
  92.                     break;
  93.                 }
  94.                 if ($isFront && (('4O' == $validatingAirline1) || ('4O' == $validatingAirline2))) {
  95.                     break;
  96.                 }
  97.                 /* Here is applying a validation for adjusting the entire discount if there is a route with a discount; and in the other one, there's no discount */
  98.                 if($specialDiscountAviaturValidation1 xor $specialDiscountAviaturValidation2){
  99.                     $indexRoute = (($specialDiscountAviaturValidation1 && !$specialDiscountAviaturValidation2) ? "" : ((!$specialDiscountAviaturValidation1 && $specialDiscountAviaturValidation2) ? "2" null));
  100.                     $indexNumberRoute = (($specialDiscountAviaturValidation1 && !$specialDiscountAviaturValidation2) ? "1" : ((!$specialDiscountAviaturValidation1 && $specialDiscountAviaturValidation2) ? "2" null));
  101.                     if(!is_null($indexRoute)){
  102.                         $routeHasDivideDiscount = isset(${"pricedItinerary".$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->BaseFare['DivideDiscount']) ? true false;
  103.                         if($routeHasDivideDiscount){
  104.                             $this->recalculateRouteBranchToApplyAllDiscount(${"pricedItinerary".$indexNumberRoute});
  105.                             ${'baseFare'.$indexRoute} = (int) ${'pricedItinerary'.$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  106.                             ${'taxes'.$indexRoute} = (int) ${'pricedItinerary'.$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  107.                             ${'totalFare'.$indexRoute} = (int) ${'pricedItinerary'.$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  108.                             if($indexRoute == "2"){
  109.                                 /* Debemos reestablecer los valores originales que corresponde a la IDA */
  110.                                 $baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  111.                                 $taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  112.                                 $totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  113.                             }
  114.                         }
  115.                     } else {
  116.                         /* Debemos reestablecer los valores originales que corresponde a la IDA */
  117.                         $baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  118.                         $taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  119.                         $totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  120.                     }
  121.                 } else {
  122.                     /* Debemos reestablecer los valores originales que corresponde a la IDA */
  123.                     $baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  124.                     $taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  125.                     $totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  126.                 }
  127.                 $priceTypeCombination $priceType1.'|'.$priceType2;
  128.                 $totalFareCombination $totalFare $totalFare2;
  129.                 $baseFareCombination $baseFare $baseFare2;
  130.                 $taxesCombination $taxes $taxes2;
  131.                 $originDestinationSegment2 str_replace(['<OriginDestinationOptions>''</OriginDestinationOptions>''RefNumber="0"'], ['''''RefNumber="1"'], $pricedItinerary2->AirItinerary->OriginDestinationOptions->asXml());
  132.                 $quoteIdCombination $quoteId1.'|'.(string) $pricedItinerary2->AirItineraryPricingInfo['QuoteID'];
  133.                 $equivFareCombination $equivFare + (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
  134.                 $ptcFareBreakdown2 $pricedItinerary2->AirItineraryPricingInfo->PTC_FareBreakdowns;
  135.                 $correlationSegment2 = isset($pricedItinerary2->Notes['CorrelationId']) ? (string) $pricedItinerary2->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/''$1', (string) $pricedItinerary2->Notes1);
  136.                 $ptcFareBreakdownCombination = clone $ptcFareBreakdown;
  137.                 $i 0;
  138.                 foreach ($ptcFareBreakdown->PTC_FareBreakdown as $fareBreakDownSegment1) {
  139.                     $fareBreakDownSegment2 $ptcFareBreakdown2->PTC_FareBreakdown[$i];
  140.                     if (!is_object($fareBreakDownSegment2)) {
  141.                         break 2;
  142.                     } else {
  143.                         if (!isset($fareBreakDownSegment1->FareBasisCodes)) {
  144.                             $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->addChild('FareBasisCodes');
  145.                         }
  146.                         if (isset($fareBreakDownSegment2->FareBasisCodes) && isset($fareBreakDownSegment2->FareBasisCodes->FareBasisCode) && ('' != (string) $fareBreakDownSegment2->FareBasisCodes->FareBasisCode)) {
  147.                             foreach ($fareBreakDownSegment2->FareBasisCodes->FareBasisCode as $farebasisCode2) {
  148.                                 $farebasisCode $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->FareBasisCodes->addChild('FareBasisCode', (string) $farebasisCode2);
  149.                                 $farebasisCode->addAttribute('FlightSegmentRPH''2');
  150.                             }
  151.                         }
  152.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->BaseFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->BaseFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->BaseFare['Amount'];
  153.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->EquivFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->EquivFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->EquivFare['Amount'];
  154.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->Taxes['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->Taxes['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->Taxes['Amount'];
  155.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->TotalFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->TotalFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->TotalFare['Amount'];
  156.                         ++$i;
  157.                     }
  158.                 }
  159.                 $ticketingVendor $ticketingVendor1.$pricedItinerary2->TicketingInfo->TicketingVendor->asXML();
  160.                 $searches = [
  161.                     '{PriceType}',
  162.                     '{OriginDestinationOptionSegment1}',
  163.                     '{OriginDestinationOptionSegment2}',
  164.                     '{QuoteID}',
  165.                     '{BaseFare}',
  166.                     '{EquivFare}',
  167.                     '{Taxes}',
  168.                     '{TotalFare}',
  169.                     '{TPA_Extensions}',
  170.                     '{PTC_FareBreakdowns}',
  171.                     '{Notes}',
  172.                     '{TicketingVendor}',
  173.                     '<?xml version="1.0"?>',
  174.                 ];
  175.                 $TPA_Extensions '';
  176.                 if ($markup 0) {
  177.                     $TRM_Kiwi $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM;
  178.                     $TPA_Extensions '<TPA_Extensions>
  179.                                            <Markup_Kiwi>'.$markup.'</Markup_Kiwi>
  180.                                        </TPA_Extensions>';
  181.                 }
  182.                 $replaces = [
  183.                     $priceTypeCombination,
  184.                     $originDestinationSegment1,
  185.                     $originDestinationSegment2,
  186.                     $quoteIdCombination,
  187.                     $baseFareCombination,
  188.                     $equivFareCombination,
  189.                     $taxesCombination,
  190.                     $totalFareCombination,
  191.                     $TPA_Extensions,
  192.                     str_replace('<?xml version="1.0"?>'''$ptcFareBreakdownCombination->asXml()),
  193.                     'CorrelationID='.$correlationSegment1.'||'.$correlationSegment2.';SequenceNmbr=0;ProviderId='.$providerSegment1.'|'.$providerSegment2.';',
  194.                     $ticketingVendor,
  195.                     '',
  196.                 ];
  197.                 $xmlCombination str_replace($searches$replaces$xmlCombinationTemplate);
  198.                 if ($specialDiscountValidation1 || $specialDiscountAviaturValidation1 || $specialDiscountValidation2 || $specialDiscountAviaturValidation2) {
  199.                     $tempCombination = \simplexml_load_string($xmlCombination);
  200.                     if ($specialDiscountValidation1 || $specialDiscountValidation2) {
  201.                         $tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount'] = true;
  202.                     }
  203.                     if ($specialDiscountAviaturValidation1 || $specialDiscountAviaturValidation2) {
  204.                         $tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur'] = true;
  205.                         $isApplyingSpecialDiscountAviatur true;
  206.                     }
  207.                     $xmlCombination str_replace('<?xml version="1.0"?>'''$tempCombination->asXml());
  208.                 }
  209.                 $xmlFinalCombination .= str_replace('<?xml version="1.0"?>'''$xmlCombination);
  210.                 ++$combinationCounter;
  211.                 ++$optionsCount2;
  212.                 if ($combinationCounter >= 100 && null != $response) {
  213.                     break 2;
  214.                 } elseif ($optionsCount2 >= $optionsLimit) {
  215.                     break;
  216.                 }
  217.                 unset($pricedItinerary2);
  218.                 unset($pricedItinerary1);
  219.             }
  220.             ++$optionsCount1;
  221.             if ($optionsCount1 >= $optionsLimit) {
  222.                 break;
  223.             }
  224.         }
  225.         if (null != $response && !isset($response['error']) && !$isApplyingSpecialDiscountAviatur) {
  226.             $xmlResponseTotal = \simplexml_load_string(\preg_replace('/<PricedItinerary>/'$xmlFinalCombination.'<PricedItinerary>'$response->asXml(), 1));
  227.         } else {
  228.             $providerResults $OneWay1->ProviderResults->asXml().$OneWay2->ProviderResults->asXml();
  229.             $OTA_attributes '';
  230.             foreach ($OneWay1->Message->$method->attributes() as $a => $b) {
  231.                 $OTA_attributes .= ' '.$a.'="'.$b.'"'// assuming same attributes between OneWay1 and OneWay2
  232.             }
  233.             $xmlResponseTotal = \simplexml_load_string('<Envelope>'.((string) $providerResults).'<Message><'.((string) $method).((string) $OTA_attributes).'><PricedItineraries>'.((string) $xmlFinalCombination).'</PricedItineraries></'.((string) $method).'></Message></Envelope>');
  234.         }
  235.         return $xmlResponseTotal;
  236.     }
  237.     public function assembleCombineRoundTrip($agency$OneWay1$OneWay2$response$flights$variable$method$isNational$changeRPH null)
  238.     {
  239.         $isFront $this->session->has('operatorId');
  240.         $flightModel = new FlightModel();
  241.         $xmlFinalCombination '';
  242.         $xmlCombinationTemplate $flightModel->getXmlCombinations();
  243.         $combinationCounter 0;
  244.         $optionsLimit 20;
  245.         $optionsCount1 0;
  246.         foreach ($OneWay1->Message->$method->PricedItineraries->PricedItinerary as $pricedItinerary) {
  247.             $originDestinationSegment1 $pricedItinerary->AirItinerary->OriginDestinationOptions;
  248.             $priceType1 = (string) isset($pricedItinerary['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary['PriceType'])) : "{$pricedItinerary->TicketingInfo->TicketingVendor['Code']}-NA";
  249.             $quoteId1 = (string) $pricedItinerary->AirItineraryPricingInfo['QuoteID'];
  250.             $baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  251.             $taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  252.             $totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  253.             $equivFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
  254.             $ptcFareBreakdown $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns;
  255.             $providerSegment1 = isset($pricedItinerary->Notes['ProviderId']) ? (string) $pricedItinerary->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/''$1', (string) $pricedItinerary->Notes1);
  256.             $correlationSegment1 = isset($pricedItinerary->Notes['CorrelationId']) ? (string) $pricedItinerary->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/''$1', (string) $pricedItinerary->Notes1);
  257.             $ticketingVendor1 $pricedItinerary->TicketingInfo->TicketingVendor->asXML();
  258.             $validatingAirline1 = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
  259.             $specialDiscountValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true false;
  260.             $specialDiscountAviaturValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true false;
  261.             $optionsCount2 0;
  262.             foreach ($OneWay2->Message->$method->PricedItineraries->PricedItinerary as $pricedItinerary2) {
  263.                 $priceType2 = (string) isset($pricedItinerary2['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary2['PriceType'])) : "{$pricedItinerary2->TicketingInfo->TicketingVendor['Code']}-NA";
  264.                 $validatingAirline2 = (string) $pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
  265.                 $baseFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  266.                 $taxes2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  267.                 $providerSegment2 = isset($pricedItinerary2->Notes['ProviderId']) ? (string) $pricedItinerary2->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/''$1', (string) $pricedItinerary2->Notes1);
  268.                 $markup 0;
  269.                 if ('122' == $providerSegment2 || '82' == $providerSegment2) {
  270.                     $markup round((int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] * 12 100);
  271.                 }
  272.                 $totalFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] + $markup;
  273.                 $specialDiscountValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true false;
  274.                 $specialDiscountAviaturValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true false;
  275.                 if (null != $response && ((== sizeof($pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment)) && ($isNational) && ($validatingAirline1 == $validatingAirline2) && 'LA' == $validatingAirline1) && (!$specialDiscountValidation1) && (!$specialDiscountValidation2) && (!$specialDiscountAviaturValidation1) && (!$specialDiscountAviaturValidation2)) {
  276.                     break;
  277.                 }
  278.                 if ($isFront && (('4O' == $validatingAirline1) || ('4O' == $validatingAirline2))) {
  279.                     break;
  280.                 }
  281.                 $priceTypeCombination $priceType1.'|'.$priceType2;
  282.                 $totalFareCombination $totalFare $totalFare2;
  283.                 $baseFareCombination $baseFare $baseFare2;
  284.                 $taxesCombination $taxes $taxes2;
  285.                 $originDestinationSegment2 $pricedItinerary2->AirItinerary->OriginDestinationOptions;
  286.                 $originsDestinations1 = [];
  287.                 $originsDestinations2 = [];
  288.                 $originsDestinationsCombined '';
  289.                 $index 0;
  290.                 foreach ($originDestinationSegment1->OriginDestinationOption as $originDestinationOption1) {
  291.                     $refNumberBase = (string) $originDestinationOption1['RefNumber'];
  292.                     $originsDestinations1[$refNumberBase][$index]['text'] = $originDestinationOption1->asXML();
  293.                     $originsDestinations1[$refNumberBase][$index]['rph'] = $originDestinationOption1->FlightSegment['RPH'];
  294.                     ++$index;
  295.                 }
  296.                 $index 0;
  297.                 foreach ($originDestinationSegment2->OriginDestinationOption as $originDestinationOption1) {
  298.                     $refNumberBase = (string) $originDestinationOption1['RefNumber'];
  299.                     $originsDestinations2[$refNumberBase][$index]['text'] = $originDestinationOption1->asXML();
  300.                     $originsDestinations2[$refNumberBase][$index]['rph'] = $originDestinationOption1->FlightSegment['RPH'];
  301.                     ++$index;
  302.                 }
  303.                 foreach ($originsDestinations1 as $key => $segments1) {
  304.                     foreach ($segments1 as $item1) {
  305.                         $composeRPH '';
  306.                         $composeRPH .= $item1['rph'];
  307.                         foreach ($originsDestinations2[$key] as $segments2) {
  308.                             $composeRPH .= '-'.$segments2['rph'];
  309.                             $item1['text'] = str_replace(['<OriginDestinationOption RefNumber="0">''<OriginDestinationOption RefNumber="1">''</OriginDestinationOption>'], [''], preg_replace('/RPH\=\"[0-9]\"/''RPH="'.$composeRPH.'"'$item1['text']));
  310.                             $segments2['text'] = str_replace(['<OriginDestinationOption RefNumber="0">''<OriginDestinationOption RefNumber="1">''</OriginDestinationOption>'], [''], preg_replace('/RPH\=\"[0-9]\"/''RPH="'.$composeRPH.'"'$segments2['text']));
  311.                             if (== $key) {
  312.                                 $originsDestinationsCombined .= '<OriginDestinationOption RefNumber="'.$key.'">'.$item1['text'].$segments2['text'].'</OriginDestinationOption>';
  313.                             } else {
  314.                                 $originsDestinationsCombined .= '<OriginDestinationOption RefNumber="'.$key.'">'.$segments2['text'].$item1['text'].'</OriginDestinationOption>';
  315.                             }
  316.                         }
  317.                     }
  318.                 }
  319.                 $quoteIdCombination $quoteId1.'|'.(string) $pricedItinerary2->AirItineraryPricingInfo['QuoteID'];
  320.                 $equivFareCombination $equivFare + (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
  321.                 $ptcFareBreakdown2 $pricedItinerary2->AirItineraryPricingInfo->PTC_FareBreakdowns;
  322.                 $correlationSegment2 = isset($pricedItinerary2->Notes['CorrelationId']) ? (string) $pricedItinerary2->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/''$1', (string) $pricedItinerary2->Notes1);
  323.                 $ptcFareBreakdownCombination = clone $ptcFareBreakdown;
  324.                 $i 0;
  325.                 foreach ($ptcFareBreakdown->PTC_FareBreakdown as $fareBreakDownSegment1) {
  326.                     $fareBreakDownSegment2 $ptcFareBreakdown2->PTC_FareBreakdown[$i];
  327.                     if (!is_object($fareBreakDownSegment2)) {
  328.                         break 2;
  329.                     } else {
  330.                         if (!isset($fareBreakDownSegment1->FareBasisCodes)) {
  331.                             $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->addChild('FareBasisCodes');
  332.                         }
  333.                         if (isset($fareBreakDownSegment2->FareBasisCodes) && isset($fareBreakDownSegment2->FareBasisCodes->FareBasisCode) && ('' != (string) $fareBreakDownSegment2->FareBasisCodes->FareBasisCode)) {
  334.                             foreach ($fareBreakDownSegment2->FareBasisCodes->FareBasisCode as $farebasisCode2) {
  335.                                 $farebasisCode $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->FareBasisCodes->addChild('FareBasisCode', (string) $farebasisCode2);
  336.                                 $farebasisCode->addAttribute('FlightSegmentRPH''2');
  337.                             }
  338.                         }
  339.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->BaseFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->BaseFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->BaseFare['Amount'];
  340.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->EquivFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->EquivFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->EquivFare['Amount'];
  341.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->Taxes['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->Taxes['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->Taxes['Amount'];
  342.                         $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->TotalFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->TotalFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->TotalFare['Amount'];
  343.                         ++$i;
  344.                     }
  345.                 }
  346.                 $ticketingVendor $ticketingVendor1.$pricedItinerary2->TicketingInfo->TicketingVendor->asXML();
  347.                 $searches = [
  348.                     '{PriceType}',
  349.                     '{OriginDestinationOptionSegment1}',
  350.                     '{OriginDestinationOptionSegment2}',
  351.                     '{QuoteID}',
  352.                     '{BaseFare}',
  353.                     '{EquivFare}',
  354.                     '{Taxes}',
  355.                     '{TotalFare}',
  356.                     '{TPA_Extensions}',
  357.                     '{PTC_FareBreakdowns}',
  358.                     '{Notes}',
  359.                     '{TicketingVendor}',
  360.                     '<?xml version="1.0"?>',
  361.                 ];
  362.                 $TPA_Extensions '';
  363.                 if ($markup 0) {
  364.                     $TRM_Kiwi $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM;
  365.                     $TPA_Extensions '<TPA_Extensions>
  366.                                            <Markup_Kiwi>'.$markup.'</Markup_Kiwi>
  367.                                        </TPA_Extensions>';
  368.                 }
  369.                 $replaces = [
  370.                     $priceTypeCombination,
  371.                     $originsDestinationsCombined,
  372.                     '',
  373.                     $quoteIdCombination,
  374.                     $baseFareCombination,
  375.                     $equivFareCombination,
  376.                     $taxesCombination,
  377.                     $totalFareCombination,
  378.                     $TPA_Extensions,
  379.                     str_replace('<?xml version="1.0"?>'''$ptcFareBreakdownCombination->asXml()),
  380.                     'CorrelationID='.$correlationSegment1.'||'.$correlationSegment2.';SequenceNmbr=0;ProviderId='.$providerSegment1.'|'.$providerSegment2.';',
  381.                     $ticketingVendor,
  382.                     '',
  383.                 ];
  384.                 $xmlCombination str_replace($searches$replaces$xmlCombinationTemplate);
  385.                 if ($specialDiscountValidation1 || $specialDiscountAviaturValidation1 || $specialDiscountValidation2 || $specialDiscountAviaturValidation2) {
  386.                     $tempCombination = \simplexml_load_string($xmlCombination);
  387.                     if ($specialDiscountValidation1 || $specialDiscountValidation2) {
  388.                         $tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount'] = true;
  389.                     }
  390.                     if ($specialDiscountAviaturValidation1 || $specialDiscountAviaturValidation2) {
  391.                         $tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur'] = true;
  392.                     }
  393.                     $xmlCombination str_replace('<?xml version="1.0"?>'''$tempCombination->asXml());
  394.                 }
  395.                 $xmlFinalCombination .= str_replace('<?xml version="1.0"?>'''$xmlCombination);
  396.                 ++$combinationCounter;
  397.                 ++$optionsCount2;
  398.                 if ($combinationCounter >= 100 && null != $response) {
  399.                     break 2;
  400.                 } elseif ($optionsCount2 >= $optionsLimit) {
  401.                     break;
  402.                 }
  403.             }
  404.             ++$optionsCount1;
  405.             if ($optionsCount1 >= $optionsLimit) {
  406.                 break;
  407.             }
  408.         }
  409.         if (null != $response) {
  410.             $xmlResponseTotal = \simplexml_load_string(\preg_replace('/<PricedItinerary>/'$xmlFinalCombination.'<PricedItinerary>'$response->asXml(), 1));
  411.         } else {
  412.             $providerResults $OneWay1->ProviderResults->asXml().$OneWay2->ProviderResults->asXml();
  413.             $OTA_attributes '';
  414.             foreach ($OneWay1->Message->$method->attributes() as $a => $b) {
  415.                 $OTA_attributes .= ' '.$a.'="'.$b.'"'// assuming same attributes between OneWay1 and OneWay2
  416.             }
  417.             $xmlResponseTotal = \simplexml_load_string('<Envelope>'.((string) $providerResults).'<Message><'.((string) $method).((string) $OTA_attributes).'><PricedItineraries>'.((string) $xmlFinalCombination).'</PricedItineraries></'.((string) $method).'></Message></Envelope>');
  418.         }
  419.         return $xmlResponseTotal;
  420.     }
  421.     public function assembleRoundTripDirect($xmlResponseSegment1$xmlSecondaryResponse)
  422.     {
  423.         foreach ($xmlSecondaryResponse->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
  424.             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  425.         }
  426.         $stringSegment1 $xmlResponseSegment1->asXML();
  427.         $segment1Structure explode('<PricedItineraries>'$stringSegment1);
  428.         $segment1Structure2 explode('</PricedItineraries>'$segment1Structure[1]);
  429.         $segment1Itineraries $segment1Structure2[0];
  430.         $secondaryComb $xmlSecondaryResponse->asXML();
  431.         $secondaryCombStructure explode('<PricedItineraries>'$secondaryComb);
  432.         $secondaryCombStructure2 explode('</PricedItineraries>'$secondaryCombStructure[1]);
  433.         $secondaryCombItineraries $secondaryCombStructure2[0];
  434.         $providerResults '';
  435.         foreach ($xmlResponseSegment1->ProviderResults as $provideobject) {
  436.             $providerResults .= $provideobject->asXml();
  437.         }
  438.         foreach ($xmlSecondaryResponse->ProviderResults as $provideobject) {
  439.             $providerResults .= $provideobject->asXml();
  440.         }
  441.         $transactionId $xmlResponseSegment1->Message->OTA_AirLowFareSearchRS['TransactionIdentifier'];
  442.         $text_OTA '<OTA_AirLowFareSearchRS Version="0" TransactionIdentifier="'.$transactionId.'">';
  443.         $openTag '';
  444.         if (false !== strpos($segment1Structure2[1], 'Envelope')) {
  445.             $openTag '<Envelope>';
  446.         } elseif (false !== strpos($segment1Structure2[1], 'Response')) {
  447.             $openTag '<Response>';
  448.         }
  449.         $segment1ProviderResultsStr /* $cant . ' - ' . $indexCant . ' - ' . */ $openTag.$providerResults.'<Message>'.$text_OTA;
  450.         $itinerariesAssembled $segment1ProviderResultsStr.'<PricedItineraries>'.$secondaryCombItineraries.$segment1Itineraries.'</PricedItineraries>'.$segment1Structure2[1];
  451.         //        $this->logSave->logSave($itinerariesAssembled, 'new_assembled', 'RS');
  452.         $newSegment1xml = \simplexml_load_string($itinerariesAssembled);
  453.         //        $this->logSave->logSave($newSegment1xml->asXML(), 'new_assembled_total', 'RS');
  454.         return $newSegment1xml;
  455.     }
  456.     public function combineRoutes($agency$xmlResponses$variable$method$isNational)
  457.     {
  458.         $providerResults '';
  459.         $xmlFinalCombination '';
  460.         for ($i 0$count is_countable($xmlResponses) ? \count($xmlResponses) : 0$i $count; ++$i) {
  461.             $providerResults .= $xmlResponses[$i]->ProviderResults->asXml();
  462.             $xmlFinalCombination .= $xmlResponses[$i]->Message->$method->PricedItineraries->asXml();
  463.         }
  464.         $OTA_attributes '';
  465.         foreach ($xmlResponses[0]->Message->$method->attributes() as $a => $b) {
  466.             $OTA_attributes .= ' '.$a.'="'.$b.'"'// assuming same attributes between xmlResponses
  467.         }
  468.         $xmlResponseTotal = \simplexml_load_string('<Envelope>'.((string) $providerResults).'<Message><'.((string) $method).((string) $OTA_attributes).'>'.((string) $xmlFinalCombination).'</'.((string) $method).'></Message></Envelope>');
  469.         return $xmlResponseTotal;
  470.     }
  471.     public function admin_fee($agency$response$flights$variable$method)
  472.     {
  473.         $current_agency $agency->getId();
  474.         $iatas = [];
  475.         $adminFees = [];
  476.         $qseFees = [];
  477.         $domain $this->requestStack->getCurrentRequest()->getHost();
  478.         $parametersJson $this->session->get($domain.'[parameters]''');
  479.         if (isset($response->Message->$method) && isset($response->Message->$method->PricedItineraries->PricedItinerary)) {
  480.             $parameters json_decode($parametersJson);
  481.             $responseMethod $response->Message->$method;
  482.             $transactionId = (string) $responseMethod['TransactionIdentifier'];
  483.             $timerLog $this->session->has($transactionId.'[flight][adminFeeTimerLog]') ? $this->session->get($transactionId.'[flight][adminFeeTimerLog]') : null;
  484.             $responseMethod['TransactionID'] = $transactionId;
  485.             for ($i 1$i <= $flights; ++$i) {
  486.                 $iatas[] = $variable['origin'.$i];
  487.                 $iatas[] = $variable['destination'.$i];
  488.             }
  489.             $cityCountries $this->em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findCountryCodes($iatas);
  490.             $airportCountries $this->em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findCountryCodes($iatas);
  491.             $countries array_unique(array_merge($cityCountries$airportCountries), SORT_REGULAR);
  492.             $type '';
  493.             if (sizeof($countries) > || (sizeof($countries) > && !in_array('CO'$countries))) {
  494.                 $international true;
  495.                 $isINNS 1;
  496.                 $fromCurrency $this->em->getRepository(\Aviatur\TrmBundle\Entity\Currency::class)->findOneByIata('USD');
  497.                 $toCurrency $this->em->getRepository(\Aviatur\TrmBundle\Entity\Currency::class)->findOneByIata('COP');
  498.                 $TRM $this->em->getRepository(\Aviatur\TrmBundle\Entity\Trm::class)->findOneBy(['fromCurrency' => $fromCurrency'toCurrency' => $toCurrency], ['id' => 'DESC']);
  499.             } else {
  500.                 $international false;
  501.                 $isINNS 0;
  502.             }
  503.             if (!in_array('CO'$countries)) {
  504.                 $type 'NNS';
  505.                 ++$isINNS;
  506.             }
  507.             $isAgent false;
  508.             $agentQseAmount $adminFeePercentage $agentQseAmountMax 0;
  509.             $assetsFolder $agency->getAssetsFolder();
  510.             $this->session->set($transactionId.'_isActiveQse'false);
  511.             if (!$this->session->has('operatorId')) {
  512.                 //TEMPORAL, SE DEBE HACER EL CAMBIO A SEARCH_CITIES
  513.                 $destinationCity $this->em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneByIatacode($variable['destination1']);
  514.                 $marcasblancas '';
  515.                 // if (!$this->session->has('whitemark')) {
  516.                 $adminFees $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFee::class)->getAdminFeebyAgency($agency$destinationCity);
  517.                 // } else {
  518.                 //     $whitemark = $this->em->getRepository(\Aviatur\GeneralBundle\Entity\Whitemark::class)->findOneBy(['referer' => $this->session->get('whitemark')]);
  519.                 //     $adminFeeswhitemark = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFeeWhitemark::class)->findBy(['whitemark' => $whitemark, 'isactive' => '1']);
  520.                 //     $adminFeeswhitemark += $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFeeWhitemark::class)->findBy(['whitemark' => null, 'isactive' => '1']);
  521.                 //     $adminFees = [];
  522.                 //     foreach ($adminFeeswhitemark as $key => $adminFeesW) {
  523.                 //         $cityID = null;
  524.                 //         $countryName = null;
  525.                 //         $countryCode = null;
  526.                 //         $airline_id = null;
  527.                 //         $iata = null;
  528.                 //         $name = null;
  529.                 //         $agency_id = null;
  530.                 //         if (null != $adminFeesW->getCity()) {
  531.                 //             $cityID = $adminFeesW->getCity()->getId();
  532.                 //             $countryName = $adminFeesW->getCity()->getCountry()->getDescription();
  533.                 //             $countryCode = $adminFeesW->getCity()->getCountry()->getCode();
  534.                 //         }
  535.                 //         if (null != $adminFeesW->getAirline()) {
  536.                 //             $airline_id = $adminFeesW->getAirline()->getId();
  537.                 //             $iata = $adminFeesW->getAirline()->getIata();
  538.                 //             $name = $adminFeesW->getAirline()->getName();
  539.                 //         }
  540.                 //         if (null != $adminFeesW->getWhitemark()) {
  541.                 //             $agency_id = $adminFeesW->getWhitemark()->getId();
  542.                 //         } else {
  543.                 //             $agency_id = $whitemark->getId();
  544.                 //         }
  545.                 //         $adminFees[$key]['id'] = (string) $adminFeesW->getId();
  546.                 //         $adminFees[$key]['agency_id'] = (string) $agency_id;
  547.                 //         $adminFees[$key]['airline_id'] = (string) $airline_id;
  548.                 //         $adminFees[$key]['city_id'] = (string) $cityID;
  549.                 //         $adminFees[$key]['valueType'] = (string) $adminFeesW->getValuetype();
  550.                 //         $adminFees[$key]['rangeType'] = (string) $adminFeesW->getRangetype();
  551.                 //         $adminFees[$key]['isActive'] = (string) $adminFeesW->getIsactive();
  552.                 //         $adminFees[$key]['noNationalStop'] = (string) $adminFeesW->getNonationalstop();
  553.                 //         $adminFees[$key]['isItFare'] = (string) $adminFeesW->getIsitfare();
  554.                 //         $adminFees[$key]['nationalFixed'] = (string) $adminFeesW->getNationalfixed();
  555.                 //         $adminFees[$key]['internationalFixed'] = (string) $adminFeesW->getInternationalfixed();
  556.                 //         $adminFees[$key]['roundtripNational'] = (string) $adminFeesW->getRoundtripnational();
  557.                 //         $adminFees[$key]['onewayNational'] = (string) $adminFeesW->getOnewaynational();
  558.                 //         $adminFees[$key]['rangeInternational1Start'] = (string) $adminFeesW->getRangeinternational1start();
  559.                 //         $adminFees[$key]['rangeInternational1End'] = (string) $adminFeesW->getRangeinternational1end();
  560.                 //         $adminFees[$key]['rangeInternational2Start'] = (string) $adminFeesW->getRangeinternational2start();
  561.                 //         $adminFees[$key]['rangeInternational2End'] = (string) $adminFeesW->getRangeinternational2end();
  562.                 //         $adminFees[$key]['rangeInternational3Start'] = (string) $adminFeesW->getRangeinternational3start();
  563.                 //         $adminFees[$key]['rangeInternational3End'] = (string) $adminFeesW->getRangeinternational3end();
  564.                 //         $adminFees[$key]['rangeInternational4Start'] = (string) $adminFeesW->getRangeinternational4start();
  565.                 //         $adminFees[$key]['rangeInternational4End'] = (string) $adminFeesW->getRangeinternational4end();
  566.                 //         $adminFees[$key]['valueInternational1'] = (string) $adminFeesW->getValueinternational1();
  567.                 //         $adminFees[$key]['valueInternational2'] = (string) $adminFeesW->getValueinternational2();
  568.                 //         $adminFees[$key]['valueInternational3'] = (string) $adminFeesW->getValueinternational3();
  569.                 //         $adminFees[$key]['valueInternational4'] = (string) $adminFeesW->getValueinternational4();
  570.                 //         $adminFees[$key]['iata'] = (string) $iata;
  571.                 //         $adminFees[$key]['name'] = (string) $name;
  572.                 //         $adminFees[$key]['countryName'] = (string) $countryName;
  573.                 //         $adminFees[$key]['countryCode'] = (string) $countryCode;
  574.                 //         $adminFees[$key]['admin_fee_id'] = (string) $adminFeesW->getId();
  575.                 //     }
  576.                 // }
  577.                 $nameProduct 'flight';
  578.                 $productFlightCommission $this->em->getRepository(\Aviatur\AgentBundle\Entity\AgentQseProductCommission::class)->findOneByProductname($nameProduct);
  579.                 $productFlightCommission2 = (array) $productFlightCommission;
  580.                 $this->session->set($transactionId.'_isActiveQse', ((is_countable($productFlightCommission2) ? count($productFlightCommission2) : 0) > 0) ? true false);
  581.                 if (($this->authorizationChecker->isGranted('ROLE_AVIATUR_ADMIN_ADMIN_AGENT_OPERATOR') || $this->authorizationChecker->isGranted('ROLE_AVIATUR_ADMIN_ADMIN_AGENT_WAITING')) && $this->session->get($transactionId.'_isActiveQse')) {
  582.                     $agent $this->em->getRepository(\Aviatur\AgentBundle\Entity\Agent::class)->findOneByCustomer($this->tokenStorage->getToken()->getUser());
  583.                     // if (!empty($agent) && $agent->getAgency()->getId() == $agency->getId()) { sentencia anterior
  584.                     if (!empty($agent)) {
  585.                         //$airline = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AirlineOver::class)->findByagency($agency->getId());
  586.                         $airline $this->em->getRepository(\Aviatur\FlightBundle\Entity\AirlineOver::class)->findBy(['agency' => $agency->getId(), 'isActive' => '1']);
  587.                         $airlinesArray = [];
  588.                         foreach ($airline as $airlines) {
  589.                             $airlinesArray[] = json_decode($airlines->getoverData());
  590.                         }
  591.                         // $agency = $this->em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->findOneByDomain('octopus.agents'); //anterior variable a usar
  592.                         $adminFees $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFee::class)->getAdminFeebyAgency($agency$destinationCity);
  593.                         $agentCommission $this->em->getRepository(\Aviatur\AgentBundle\Entity\AgentCommission::class)->findOneByAgent($agent);
  594.                         $infoQse json_decode($agentCommission->getQseproduct());
  595.                         $activeDetail $agentCommission->getActivedetail();
  596.                         $agentQseAmount = (empty($infoQse)) ? : (int) $infoQse->$nameProduct->commission_money;
  597.                         $agentQseAmountMax $productFlightCommission->getQsecommissionmax();
  598.                         $flightpercentage = (empty($infoQse)) ? : (float) $infoQse->$nameProduct->commission_percentage;
  599.                         $flightpercentagemax $productFlightCommission->getPercentageCommissionMax();
  600.                         $flightActive = (empty($infoQse)) ? : (int) $infoQse->$nameProduct->active;
  601.                         $productCommissionPercentage $productFlightCommission->getQsecommissionpercentage();
  602.                         $taCommissionPercentage $productFlightCommission->getTacommissionpercentage();
  603.                         $isAgent true;
  604.                     }
  605.                 }
  606.                 $timerLog .= 'admin fee step 10 '.microtime().'';
  607.                 foreach ($adminFees as $key => $adminFee) {
  608.                     $airline $adminFee['airline_id'];
  609.                     $agency $adminFee['agency_id'];
  610.                     $nnsFare = (== $adminFee['noNationalStop']) ? 'NNS' '';
  611.                     $itFare = (== $adminFee['isItFare']) ? 'IT' '';
  612.                     if (null != $airline) {
  613.                         $agencyFee = (null != $agency) ? 'Agency' '';
  614.                         ${'airlines'.$agencyFee.'Iata'.$nnsFare.$itFare}[] = $adminFee['iata'];
  615.                         ${'airlines'.$agencyFee.'Key'.$nnsFare.$itFare}[] = $key;
  616.                     } elseif (null != $agency) {
  617.                         ${'agencyKey'.$nnsFare.$itFare} = $key;
  618.                     } else {
  619.                         ${'generalKey'.$nnsFare.$itFare} = $key;
  620.                     }
  621.                 }
  622.                 $timerLog .= 'admin fee step 11 '.microtime().'';
  623.             } else {
  624.                 $flightModel = new FlightModel();
  625.                 $responseAdmin $this->webService->busWebServiceAmadeus('GENERALLAVE''dummy|http://www.aviatur.com.co/dummy/'$flightModel->getPresentialValues('VALORES_TA_PRESENCIAL'));
  626.                 if (!isset($responseAdmin['error'])) {
  627.                     $TRM = (float) $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TASA_CAMBIO;
  628.                     if (false == $international) {
  629.                         $adminFeesObj $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TA_NACIONAL;
  630.                         $adminFees[0]['currency'] = 'COP';
  631.                         foreach ($adminFeesObj->ELEMENTO_TA_NACIONAL as $adminFee) {
  632.                             $adminFees[0][(string) $adminFee->TIPO_RUTA] = (float) $adminFee->VALOR_TA;
  633.                         }
  634.                     } else {
  635.                         $adminFeesObj $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TA_INTERNACIONAL;
  636.                         $i 1;
  637.                         $adminFees[0]['currency'] = 'USD';
  638.                         foreach ($adminFeesObj->ELEMENTO_TA_INTERNACIONAL as $adminFee) {
  639.                             $adminFees[0]['rangeInternational'.$i.'Start'] = (float) $adminFee->VALOR_INICIAL;
  640.                             $adminFees[0]['rangeInternational'.$i.'End'] = (float) $adminFee->VALOR_FINAL;
  641.                             $adminFees[0]['valueInternational'.$i] = (float) $adminFee->VALOR_TA;
  642.                             ++$i;
  643.                         }
  644.                     }
  645.                     $this->session->set($transactionId.'[flight][ta_front]'json_encode([$adminFees$TRM]));
  646.                 } else {
  647.                     return $responseAdmin;
  648.                 }
  649.                 $airline null;
  650.                 $agency null;
  651.                 $generalKey 0;
  652.                 $generalKeyNNS 0;
  653.                 $responseQSE $this->webService->busWebServiceAmadeus('GENERALLAVE''dummy|http://www.aviatur.com.co/dummy/'$flightModel->getPresentialValues('VALORES_QSE_PRESENCIAL'));
  654.                 if (!isset($responseQSE['error'])) {
  655.                     $qseTRM = (float) $responseQSE->MENSAJE->VALORES_QSE->TASA_CAMBIO;
  656.                     if (false == $international) {
  657.                         $qseObj $responseQSE->MENSAJE->VALORES_QSE->QSE_NACIONAL;
  658.                         $qseFees[0]['currency'] = 'COP';
  659.                         $qseFees[0]['value'] = (float) $qseObj->ELEMENTO_QSE_NACIONAL->VALOR_QSE;
  660.                     } else {
  661.                         $qseObj $responseQSE->MENSAJE->VALORES_QSE->QSE_INTERNACIONAL;
  662.                         $i 1;
  663.                         $qseFees[0]['currency'] = 'USD';
  664.                         foreach ($qseObj->ELEMENTO_QSE_INTERNACIONAL as $qseFee) {
  665.                             $qseFees[0]['rangeInternational'.$i.'Start'] = (float) $qseFee->VALOR_INICIAL;
  666.                             $qseFees[0]['rangeInternational'.$i.'End'] = (float) $qseFee->VALOR_FINAL;
  667.                             $qseFees[0]['valueInternational'.$i] = (float) $qseFee->VALOR_QSE;
  668.                             $qseFees[0]['currencyInternational'.$i] = (float) $qseFee->MONEDA_QSE;
  669.                             ++$i;
  670.                         }
  671.                     }
  672.                 } else {
  673.                     return $responseQSE;
  674.                 }
  675.             }
  676.             $timerLog .= 'admin fee step 12 '.microtime().'';
  677.             $airlineCodes $this->em->getRepository(\Aviatur\FlightBundle\Entity\AirlineValidation::class)->findAirlineCodes();
  678.             $timerLog .= 'admin fee step 13 '.microtime().'';
  679.             $options = [];
  680.             $key 0;
  681.             $timerLog .= 'admin fee step 14 '.microtime().'';
  682.             $blockedCompositeAirlines = [
  683.                 'AA''AC''AD''AF''AM',
  684.                 'AR''AV''AZ''BA''B6',
  685.                 'CM''CU''CZ''DL''DT',
  686.                 'EK''ER''ET''G3''EY',
  687.                 'IB''KE''KL''LA''LH',
  688.                 'LY''OZ''O6''P5''QF',
  689.                 'R7''TP''UA''UX''V0',
  690.                 'W2''XB''Z8''2I''4C',
  691.                 '7I''8I''TK',
  692.             ];
  693.             $blockedOperatingAirlines = [
  694.                 '4U''CL''E2''EN''EW',
  695.                 'LH''LX''LZ''OS''WK',
  696.                 '2C''EY',
  697.             ];
  698.             $server $this->requestStack->getCurrentRequest()->server;
  699.             $url strtok($server->get('REQUEST_URI'), '?');
  700.             $blockedFares $this->em->getRepository(\Aviatur\FlightBundle\Entity\BlockedFare::class)->findRestrictionsForUrl($url);
  701.             $blockedFares['validatingAirline'] += [sizeof($blockedFares['validatingAirline']) => 'EQ'sizeof($blockedFares['validatingAirline']) + => 'HR'];
  702.             $blockedFares['validatingAirline'] = array_unique($blockedFares['validatingAirline']);
  703.             $composedFaresEntities $this->em->getRepository(\Aviatur\FlightBundle\Entity\SpecialCompositeFare::class)->findByIsactive(1);
  704.             $blockedCompositeFares = [];
  705.             $airlineForBlockedCompositeFares = [];
  706.             foreach ($composedFaresEntities as $composedFaresEntity) {
  707.                 $blockedCompositeFares[] = $composedFaresEntity->getFarebasis();
  708.                 $airlineForBlockedCompositeFares[] = $composedFaresEntity->getAirlinecode();
  709.             }
  710.             $timerLog .= 'admin fee step 15 '.microtime().'';
  711.             $pi 0;
  712.             $pricedCounter 1;
  713.             $OTA_AirLowFareSearchRS $response->Message->$method;
  714.             foreach ($response->Message->$method->PricedItineraries as $pricedItineraries) {
  715.                 $i 0;
  716.                 foreach ($pricedItineraries->PricedItinerary as $pricedItinerary) {
  717.                     $timerLog .= 'admin fee step 16 pricedItinerary Start '.$pricedCounter.' '.microtime().'';
  718.                     $paymentValidation true;
  719.                     $vendorCodes = [];
  720.                     foreach ($pricedItinerary->TicketingInfo->TicketingVendor as $ticketingVendor) {
  721.                         $vendorCodes[] = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
  722.                     }
  723.                     if (!array_diff($vendorCodes$airlineCodes)) {
  724.                         if ((bool) array_intersect($blockedFares['validatingAirline'], $vendorCodes)) {
  725.                             $expectedSegments $availableSegments = [];
  726.                             $operatingAirlines = [];
  727.                             $marketingAirlines = [];
  728.                             foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestinationOption) {
  729.                                 $blockedCombinedFare '';
  730.                                 $removedOriginDestinationOption false;
  731.                                 $isAvailable true;
  732.                                 foreach ($originDestinationOption->FlightSegment as $flightSegment) {
  733.                                     $expectedSegments[] = (string) $originDestinationOption['RefNumber'];
  734.                                     $blockedCombinedFare .= (string) $flightSegment->MarketingAirline['Code'].(string) $flightSegment['FlightNumber'].(string) $flightSegment->BookingClassAvails->BookingClassAvail['ResBookDesigCode'];
  735.                                     $operatingAirlines[] = (string) $flightSegment->OperatingAirline['Code'];
  736.                                     $marketingAirlines[] = (string) $flightSegment->MarketingAirline['Code'];
  737.                                     if ((bool) array_intersect($vendorCodes, ['EQ''HR'])) {
  738.                                         $paymentValidation = ((in_array((string) $flightSegment->MarketingAirline['Code'], $blockedCompositeAirlines)) || (in_array((string) $flightSegment->OperatingAirline['Code'], $blockedOperatingAirlines))) ? false $paymentValidation;
  739.                                     } elseif (in_array((string) $flightSegment->MarketingAirline['Code'].(string) $flightSegment['FlightNumber'].(string) $flightSegment->BookingClassAvails->BookingClassAvail['ResBookDesigCode'], $blockedFares['flightCombination'])) {
  740.                                         $dom dom_import_simplexml($originDestinationOption);
  741.                                         $dom->parentNode->removeChild($dom);
  742.                                         $removedOriginDestinationOption true;
  743.                                         $isAvailable false;
  744.                                         break;
  745.                                     }
  746.                                 }
  747.                                 if (!$removedOriginDestinationOption && in_array($blockedCombinedFare$blockedFares['flightCombination'])) {
  748.                                     $dom dom_import_simplexml($originDestinationOption);
  749.                                     $dom->parentNode->removeChild($dom);
  750.                                     $isAvailable false;
  751.                                 }
  752.                                 if ($isAvailable) {
  753.                                     $availableSegments[] = (string) $originDestinationOption['RefNumber'];
  754.                                 }
  755.                             }
  756.                             $paymentValidation = (sizeof(array_unique($expectedSegments)) != sizeof(array_unique($availableSegments))) ? false $paymentValidation;
  757.                             if ($paymentValidation) {
  758.                                 foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
  759.                                     if (isset($fareBreakdown->FareBasisCodes) && isset($fareBreakdown->FareBasisCodes->FareBasisCode)) {
  760.                                         foreach ($fareBreakdown->FareBasisCodes->FareBasisCode as $fareBasisCode) {
  761.                                             if (in_array((string) $fareBasisCode$blockedCompositeFares)) {
  762.                                                 $paymentValidation = (in_array((string) $fareBasisCode$blockedCompositeFares) && (in_array($airlineForBlockedCompositeFares[array_search((string) $fareBasisCode$blockedCompositeFares)], $operatingAirlines) || in_array($airlineForBlockedCompositeFares[array_search((string) $fareBasisCode$blockedCompositeFares)], $marketingAirlines))) ? false $paymentValidation;
  763.                                             }
  764.                                         }
  765.                                     }
  766.                                 }
  767.                             }
  768.                         }
  769.                     } else {
  770.                         $paymentValidation false;
  771.                     }
  772.                     if ($paymentValidation) {
  773.                         $correlationID str_replace('CorrelationID='''current(explode(';', (string) $pricedItinerary->Notes)));
  774.                         $baseAmount = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  775.                         $taxADT 0;
  776.                         $taxCHD 0;
  777.                         $taxINF 0;
  778.                         $resetingValues false;
  779.                         $newTotalBase 0;
  780.                         $passengerIndex 0;
  781.                         $diffIva 0;
  782.                         $diffBase 0;
  783.                         if (isset($parameters->aviatur_special_markup_airline)) {
  784.                             $special_markup_params json_decode($parameters->aviatur_special_markup_airlinetrue);
  785.                         }
  786.                         /* Si es Air Europa, y la agencia de aviatur.com (dev, vaslid, prod, aviaturmeta), no aplicar breakdowns */
  787.                         $airline_code = ($pricedItinerary->TicketingInfo->TicketingVendor['Code'][0] ?? $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->OperatingAirline['Code'][0]);
  788.                         $validar_breakdowns = ($airline_code != 'UX' || ($airline_code == 'UX' && !in_array($current_agency, [2345])));
  789.                         if($validar_breakdowns){
  790.                             foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
  791.                                 foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
  792.                                     if ('YR' == substr($tax['TaxCode'], 02) || 'YQ' == substr($tax['TaxCode'], 02)) {
  793.                                         ${'tax'.$fareBreakDown->PassengerTypeQuantity['Code']} += $tax['Amount'];
  794.                                     }
  795.                                 }
  796.                             }
  797.                             //Markup Airline
  798.                             foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
  799.                                 $taxIndex 0;
  800.                                 $originalTaxesPassegner = (string) $fareBreakDown->PassengerFare->Taxes['Amount'];
  801.                                 $newTaxesPassenger 0;
  802.                                 if (!isset($fareBreakDown->FareBasisCodes)) {
  803.                                     continue;
  804.                                 }
  805.                                 foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
  806.                                     $newBase 0;
  807.                                     if ('YS' == substr($tax['TaxCode'], 02)) {
  808.                                         if (isset($special_markup_params) && == $special_markup_params['parameters']['activation']['general']) {
  809.                                             if (isset($special_markup_params['parameters']['activation']['campaign']) && $special_markup_params['parameters']['activation']['campaign'] == 1) {
  810.                                                 $campaignDates $special_markup_params['campaignDates'];
  811.                                                 $today date('Y-m-d H:i:s');
  812.                                                 if ($today >= $campaignDates['start'] && $today <= $campaignDates['end']) {
  813.                                                     continue;
  814.                                                 }
  815.                                             }
  816.                                             $markupByAirlines $special_markup_params['parameters']['airlines'];
  817.                                             $ticketingVendor $pricedItinerary->TicketingInfo->TicketingVendor;
  818.                                             $validatingAirline = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
  819.                                             if (array_key_exists($validatingAirline$markupByAirlines)) {
  820.                                                 $validFare true;
  821.                                                 $indexFareBasis 0;
  822.                                                 foreach ($fareBreakDown->FareBasisCodes->FareBasisCode as $FareBasisCode) {
  823.                                                     $fareBasisSegment substr((string) $FareBasisCode, -2);
  824.                                                     if (isset($markupByAirlines[$validatingAirline][$fareBasisSegment])) {
  825.                                                         break;
  826.                                                     } else if ($indexFareBasis == (count($fareBreakDown->FareBasisCodes->FareBasisCode) - 1)) {
  827.                                                         $validFare false;
  828.                                                     }
  829.                                                     $indexFareBasis++;
  830.                                                 }
  831.                                                 if (!$validFare) {
  832.                                                     continue;
  833.                                                 }
  834.                                                 $change_trm = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM) ? (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM 1;
  835.                                                 $resetingValues true;
  836.                                                 $baseAmount = (string) $fareBreakDown->PassengerFare->BaseFare['Amount'];
  837.                                                 $usdBase = (float) ($baseAmount $change_trm);
  838.                                                 $newBaseUsd round((float) $usdBase * ( + ( $markupByAirlines[$validatingAirline][$fareBasisSegment] / 100)));
  839.                                                 $newBase ceil(round((float) ($newBaseUsd $change_trm)) / 100) * 100;
  840.                                                 $ivaPercentage = (float) (((string) $tax['Amount'] * 100) / ($baseAmount + ${'tax' $fareBreakDown->PassengerTypeQuantity['Code']}));
  841.                                                 $newIva round((float) ((($newBase + ${'tax' $fareBreakDown->PassengerTypeQuantity['Code']}) * $ivaPercentage) / 100));
  842.                                                 if ($newIva 10 != 0) {
  843.                                                     $newIva += (10 - ($newIva 10));
  844.                                                 }
  845.                                                 $diffIva += ($newIva - (string) $tax['Amount']) * $fareBreakDown->PassengerTypeQuantity['Quantity'];
  846.                                                 $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->BaseFare['Amount'] = $newBase;
  847.                                                 $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->Taxes->Tax[$taxIndex]['Amount'] = $newIva;
  848.                                                 $newTaxesPassenger $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->Taxes['Amount'] = $originalTaxesPassegner $diffIva;
  849.                                                 $diffBase += ($newBase $baseAmount) * $fareBreakDown->PassengerTypeQuantity['Quantity'];
  850.                                                 $newTotalBase += $newBase $fareBreakDown->PassengerTypeQuantity['Quantity'];
  851.                                             }
  852.                                         }
  853.                                     }
  854.                                     if ($resetingValues) {
  855.                                         $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->TotalFare['Amount'] = $newBase $newTaxesPassenger;
  856.                                         ++$taxIndex;
  857.                                     }
  858.                                 }
  859.                                 ++$passengerIndex;
  860.                             }
  861.                         }
  862.                         if ($resetingValues) {
  863.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] = $newTotalBase;
  864.                             $newTotalTaxes $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] + $diffIva;
  865.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] = $newTotalBase $newTotalTaxes;
  866.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->SpecialMarkup['BaseDiff'] = $diffBase;
  867.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->SpecialMarkup['TaxDiff'] = $diffIva;
  868.                         }
  869.                         $baseAmount += $taxADT $taxCHD $taxINF;
  870.                         $itFare = (isset($pricedItinerary->AirItineraryPricingInfo->PriceRequestInformation->AirItineraryPricingInfo->PriceRequestInformation->NegotiatedFareCode['TicketDesignatorCode']) && 'IT' == $pricedItinerary->AirItineraryPricingInfo->PriceRequestInformation->AirItineraryPricingInfo->PriceRequestInformation->NegotiatedFareCode['TicketDesignatorCode']) ? 'IT' '';
  871.                         $passangerCount 0;
  872.                         $taxes_by_person = [];
  873.                         foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
  874.                             if ('0' != (string) $passangers->PassengerFare->TotalFare['Amount']) {
  875.                                 $passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
  876.                             }
  877.                             /* Con esta instrucción, iremos guardando los valores que corresponden a impuestos (sobreescribe en caso de ser necesario) */
  878.                             $passengersType = (string) $passangers->PassengerTypeQuantity['Code'];
  879.                             $taxes_by_person['tax'.$passengersType] = ${'tax'.$passengersType};
  880.                         }
  881.                         $fee null;
  882.                         if ((isset(${'airlinesAgencyIata'.$type.$itFare}) && ((bool) array_intersect(${'airlinesAgencyIata'.$type.$itFare}, $vendorCodes))) || (isset(${'airlinesIata'.$type.$itFare}) && ((bool) array_intersect(${'airlinesIata'.$type.$itFare}, $vendorCodes)))) {
  883.                             $agencyFee = (isset(${'airlinesAgencyIata'.$type.$itFare}) && ((bool) array_intersect(${'airlinesAgencyIata'.$type.$itFare}, $vendorCodes))) ? 'Agency' '';
  884.                             $purgeAirlinesIata array_unique(array_intersect(${'airlines'.$agencyFee.'Iata'.$type.$itFare}, $vendorCodes));
  885.                             /* Se manejarĆ”n variables auxiliares para garantizar una toma correcta del FEE definitivo que aplique la tarifa mĆ”s alta */
  886.                             $previousFeeValue 0;
  887.                             $fee null;
  888.                             $feePrevious null;
  889.                             $feeNormal null;
  890.                             foreach ($purgeAirlinesIata as $airlineIata) {
  891.                                 $airlineIatasToFee array_keys(${'airlines'.$agencyFee.'Iata'.$type.$itFare}, $airlineIata);
  892.                                 $feeCycle null;
  893.                                 foreach ($airlineIatasToFee as $indexFee) {
  894.                                     $optionalFee $adminFees[${'airlines'.$agencyFee.'Key'.$type.$itFare}[$indexFee]];
  895.                                     if (null != $optionalFee['city_id'] && $optionalFee['city_id'] == (string) $destinationCity->getId()) {
  896.                                         $currentFeeValue $this->obtainCorrectFeeRegister($optionalFee$pricedItinerary$passangerCount$international$flights$baseAmount, ($TRM ?? null), ($responseAdmin ?? null), $taxes_by_person);
  897.                                         if($currentFeeValue $previousFeeValue){
  898.                                             $previousFeeValue $currentFeeValue;
  899.                                             $feeCycle $optionalFee;
  900.                                             $feePrevious $optionalFee;
  901.                                         } else if($currentFeeValue == $previousFeeValue){
  902.                                             /* Si se tienen 2 calculos con valor igual, se debe priorizar el que tenga feeType GV113 */
  903.                                             if($optionalFee['feeType'] == "GV113"){
  904.                                                 $previousFeeValue $currentFeeValue;
  905.                                                 $feeCycle $optionalFee;
  906.                                                 $feePrevious $optionalFee;
  907.                                             }
  908.                                         }
  909.                                     }
  910.                                 }
  911.                                 if (null == $feeCycle) {
  912.                                     $feeNormal $adminFees[${'airlines'.$agencyFee.'Key'.$type.$itFare}[array_search($airlineIata, ${'airlines'.$agencyFee.'Iata'.$type.$itFare})]];
  913.                                     $currentFeeValue $this->obtainCorrectFeeRegister($feeNormal$pricedItinerary$passangerCount$international$flights$baseAmount, ($TRM ?? null), ($responseAdmin ?? null), $taxes_by_person);
  914.                                     if($currentFeeValue $previousFeeValue){
  915.                                         $previousFeeValue $currentFeeValue;
  916.                                         $feeCycle $feeNormal;
  917.                                         $feePrevious $feeNormal;
  918.                                     } else if($currentFeeValue == $previousFeeValue){
  919.                                         /* Si se tienen 2 calculos con valor igual, se debe priorizar el que tenga feeType GV113 */
  920.                                         if($feeNormal['feeType'] == "GV113"){
  921.                                             $previousFeeValue $currentFeeValue;
  922.                                             $feeCycle $feeNormal;
  923.                                             $feePrevious $feeNormal;
  924.                                         }
  925.                                     }
  926.                                 }
  927.                             }
  928.                             $fee $feePrevious;
  929.                             /* Solo lo deja con el Ćŗltimo fee, si despuĆ©s de la validación cĆ­clica, no se llega a tener un registro concreto de fee */
  930.                             if(is_null($fee)){
  931.                                 $fee $feeNormal;
  932.                             }
  933.                         } elseif (isset(${'agencyKey'.$type.$itFare})) {
  934.                             $fee $adminFees[${'agencyKey'.$type.$itFare}];
  935.                         } elseif (isset(${'generalKey'.$type.$itFare})) {
  936.                             $fee $adminFees[${'generalKey'.$type.$itFare}];
  937.                         } else {
  938.                             $fee null;
  939.                             //echo "ERROR: tarifa " . $type . " no encontrada para la aerolinea: " . $airlineIata . " y la agencia con id: " . $agency;
  940.                             $administrativeCost 0;
  941.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] = '*';
  942.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'//'.$transactionId'OneFlewOvertheCuckoosNest');
  943.                         }
  944.                         if (!$this->session->has('operatorId')) {
  945.                             $administrativeCost 0;
  946.                             if (isset($fee['rangeType']) && == (int) $fee['rangeType']) {
  947.                                 if ($international) {
  948.                                     foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
  949.                                         $passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
  950.                                         $compareValue = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $TRM->getRate()->getFinantialrate();
  951.                                         if (($fee['rangeInternational1Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational1End'])) {
  952.                                             $administrativeCostRange $fee['valueInternational1'];
  953.                                         } elseif (($fee['rangeInternational2Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational2End'])) {
  954.                                             $administrativeCostRange $fee['valueInternational2'];
  955.                                         } elseif (($fee['rangeInternational3Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational3End'])) {
  956.                                             $administrativeCostRange $fee['valueInternational3'];
  957.                                         } elseif (($fee['rangeInternational4Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational4End'])) {
  958.                                             $administrativeCostRange $fee['valueInternational4'];
  959.                                         } elseif (($fee['rangeInternational4Start'] <= $compareValue) && == $fee['rangeInternational4End']) {
  960.                                             $administrativeCostRange $fee['valueInternational4'];
  961.                                         } else {
  962.                                             $administrativeCostRange 0;
  963.                                         }
  964.                                         if (== $fee['valueType']) {
  965.                                             $administrativeCost += round($administrativeCostRange $TRM->getRate()->getFinantialrate() * $fareBreakdown->PassengerTypeQuantity['Quantity']);
  966.                                         } else {
  967.                                             $administrativeCost += round(($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) * $fareBreakdown->PassengerTypeQuantity['Quantity'] * $administrativeCostRange);
  968.                                         }
  969.                                     }
  970.                                 } else {
  971.                                     if (== $fee['valueType']) {
  972.                                         if ($flights 1) {
  973.                                             $administrativeCost $fee['roundtripNational'];
  974.                                         } else {
  975.                                             $administrativeCost $fee['onewayNational'];
  976.                                         }
  977.                                         $administrativeCost $administrativeCost $passangerCount;
  978.                                     } else {
  979.                                         /*
  980.                                         if ($flights > 1) {
  981.                                             $administrativeCost = $fee['roundtripNational'];
  982.                                         } else {
  983.                                             $administrativeCost = $fee['onewayNational'];
  984.                                         }
  985.                                         */
  986.                                         //$administrativeCost = $baseAmount * $administrativeCost;
  987.                                         $administrativeCost $baseAmount * ($fee['nationalFixed'] ?? 0);
  988.                                     }
  989.                                 }
  990.                             } else {
  991.                                 if ($international) {
  992.                                     $administrativeCost $fee['internationalFixed'];
  993.                                     if (== $fee['valueType']) {
  994.                                         $administrativeCost round($administrativeCost $TRM->getRate()->getFinantialrate());
  995.                                     }
  996.                                 } else {
  997.                                     $administrativeCost = ($fee['nationalFixed'] ?? 0);
  998.                                 }
  999.                                 if (isset($fee['rangeType']) && $fee['valueType']) {
  1000.                                     $administrativeCost $baseAmount $administrativeCost;
  1001.                                 } else {
  1002.                                     $administrativeCost $administrativeCost $passangerCount;
  1003.                                 }
  1004.                             }
  1005.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] = '*'.$fee['admin_fee_id'];
  1006.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'/'.$fee['admin_fee_id'].'/'.$transactionId'OneFlewOvertheCuckoosNest');
  1007.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $administrativeCost;
  1008.                         }
  1009.                         else {
  1010.                             if ($international) {
  1011.                                 $administrativeCost 0;
  1012.                                 foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
  1013.                                     $passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
  1014.                                     $baseAmountCompare = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $TRM;
  1015.                                     if (($fee['rangeInternational1Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational1End'])) {
  1016.                                         $administrativeCostRange $fee['valueInternational1'];
  1017.                                     } elseif (($fee['rangeInternational2Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational2End'])) {
  1018.                                         $administrativeCostRange $fee['valueInternational2'];
  1019.                                     } elseif (($fee['rangeInternational3Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational3End'])) {
  1020.                                         $administrativeCostRange $fee['valueInternational3'];
  1021.                                     } elseif (($fee['rangeInternational4Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational4End'])) {
  1022.                                         $administrativeCostRange $fee['valueInternational4'];
  1023.                                     } else {
  1024.                                         $administrativeCostRange 0;
  1025.                                     }
  1026.                                     $fareBreakdown->PassengerFare->AdministrativeCost['Amount'] = $administrativeCostRange $TRM;
  1027.                                     $administrativeCost += $administrativeCostRange $TRM $fareBreakdown->PassengerTypeQuantity['Quantity'];
  1028.                                 }
  1029.                                 if (($qseFees[0]['rangeInternational1Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational1End'])) {
  1030.                                     $qseValue $qseFees[0]['valueInternational1'];
  1031.                                     $qseCurrency $qseFees[0]['currencyInternational1'];
  1032.                                 } elseif (($qseFees[0]['rangeInternational2Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational2End'])) {
  1033.                                     $qseValue $qseFees[0]['valueInternational2'];
  1034.                                     $qseCurrency $qseFees[0]['currencyInternational2'];
  1035.                                 } elseif (($qseFees[0]['rangeInternational3Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational3End'])) {
  1036.                                     $qseValue $qseFees[0]['valueInternational3'];
  1037.                                     $qseCurrency $qseFees[0]['currencyInternational3'];
  1038.                                 } elseif (($qseFees[0]['rangeInternational4Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational4End'])) {
  1039.                                     $qseValue $qseFees[0]['valueInternational4'];
  1040.                                     $qseCurrency $qseFees[0]['currencyInternational4'];
  1041.                                 } elseif (($qseFees[0]['rangeInternational5Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational5End'])) {
  1042.                                     $qseValue $qseFees[0]['valueInternational5'];
  1043.                                     $qseCurrency $qseFees[0]['currencyInternational5'];
  1044.                                 } else {
  1045.                                     $qseValue 0;
  1046.                                     $qseCurrency 'COP';
  1047.                                 }
  1048.                                 if ('COP' != $qseCurrency) {
  1049.                                     $qseValue $qseValue $qseTRM;
  1050.                                 }
  1051.                             } else {
  1052.                                 if ($flights 1) {
  1053.                                     $administrativeCost $fee['R'];
  1054.                                 } else {
  1055.                                     $administrativeCost $fee['O'];
  1056.                                 }
  1057.                                 $administrativeCost $administrativeCost $passangerCount;
  1058.                                 $qseValue $qseFees[0]['value'];
  1059.                                 if ('COP' != $qseFees[0]['currency']) {
  1060.                                     $qseValue $qseValue $qseTRM;
  1061.                                 }
  1062.                             }
  1063.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] = '*+'.$administrativeCost;
  1064.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'/+'.$administrativeCost.'/'.$transactionId'OneFlewOvertheCuckoosNest');
  1065.                             // $administrativeCost = $administrativeCost * $passangerCount;
  1066.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += round($administrativeCost);
  1067.                             $qseValue $qseValue $passangerCount;
  1068.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->QSE['Amount'] = $qseValue;
  1069.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->QSE['TotalAmount'] = $qseValue + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1070.                             $insurance = ($international 2975 1975) * $passangerCount;
  1071.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Insurance['Amount'] = $insurance;
  1072.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Insurance['TotalAmount'] = $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1073.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals['TotalAmount'] = $qseValue $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1074.                             if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'])) {
  1075.                                 $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'] += round($administrativeCost);
  1076.                                 $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->QSE['TotalAmountNoDiscount'] = $qseValue + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'];
  1077.                                 $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Insurance['TotalAmountNoDiscount'] = $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'];
  1078.                                 $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals['TotalAmountNoDiscount'] = $qseValue $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'];
  1079.                                 //agregado
  1080.                                 //mas
  1081.                             }
  1082.                         }
  1083.                         if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->MinTotalFare['Amount'])) {
  1084.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] .= '//'.$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->MinTotalFare['Amount'];
  1085.                         }
  1086.                         // $acumulado_tarifa = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1087.                         $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'] = round($administrativeCost);
  1088.                         $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountWithoutCommissions'] = $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1089.                         if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions) && isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Markup_Kiwi)) {
  1090.                             $markup_Kiwi $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Markup_Kiwi;
  1091.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'] += $markup_Kiwi;
  1092.                         }
  1093.                         $qse $qsemax 0;
  1094.                         if ($isAgent) {
  1095.                             // Valores de dispersión octopus
  1096.                             $TPA $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions;
  1097.                             $totalValue $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  1098.                             $totalAdminCostBeforeTaxes round(($administrativeCost 1.19) * (float) $taCommissionPercentage); //Ganancia (TA)
  1099.                             // $totalAdminCostBeforeTaxes = round(($taCommissionPercentage / 1) * $administrativeCost);//Ganancia (TA)
  1100.                             $TPA->QSEACTIVE['Value'] = $flightActive;
  1101.                             $TPA->CommissionTA['Value'] = base64_encode($totalAdminCostBeforeTaxes);
  1102.                             $TPA->QSE['Amount'] = (== $flightActive) ? $agentQseAmount $totalValue $flightpercentage;
  1103.                             // $TPA->CommissionAgent['Value'] = base64_encode((0 == $flightActive) ? round((($agentQseAmount / 1.19) * $productCommissionPercentage)) : round(((($totalValue * $flightpercentage) / 1.19) * $productCommissionPercentage))); // formula anterior
  1104.                             $TPA->CommissionAgent['Value'] = base64_encode((== $flightActive) ? round((($agentQseAmount * (0.19)) * $productCommissionPercentage)) : round(((($totalValue $flightpercentage) / 1.19) * $productCommissionPercentage))); // Ganancia QSE ($)
  1105.                             $TPA->QSEMAX['Amount'] = (== $flightActive) ? $agentQseAmountMax $totalValue $flightpercentagemax;
  1106.                             $TPA->AdministrativeCost['AgentCommission'] = round($TPA->AdministrativeCost['Amount']);
  1107.                             $TPA->AgentBussiness['active'] = true;
  1108.                             $qse = (== $flightActive) ? $agentQseAmount $totalValue $flightpercentage;
  1109.                             $qsemax = (== $flightActive) ? $agentQseAmountMax $totalValue $flightpercentagemax;
  1110.                             $TPA->QSE['CommissionPay'] = round(base64_decode($TPA->CommissionAgent['Value']) + $totalAdminCostBeforeTaxes);
  1111.                             $TPA->ActiveDetail['Active'] = $activeDetail;
  1112.                             /*                             * **  OVER AIRLINE  **** */
  1113.                             if (isset($airlinesArray)) {
  1114.                                 foreach ($airlinesArray as $airlineData) {
  1115.                                     $iata $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
  1116.                                     if ($iata == $airlineData->iata) {
  1117.                                         $f 1;
  1118.                                         $validAirline false;
  1119.                                         //Valida si es la misma aerolinea en ambos trayectos
  1120.                                         foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $rutas) {
  1121.                                             if (== $f) {
  1122.                                             } else {
  1123.                                                 $iataTemp $iata;
  1124.                                                 $iata $rutas->FlightSegment->MarketingAirline['Code'];
  1125.                                                 //Compara si la aerlonia es diferente
  1126.                                                 if (trim($iataTemp) != trim($iata)) {
  1127.                                                     $validAirline true;
  1128.                                                     break;
  1129.                                                 }
  1130.                                             }
  1131.                                             ++$f;
  1132.                                         }
  1133.                                         if ($validAirline) {
  1134.                                             break;
  1135.                                         } else {
  1136.                                             $f 1;
  1137.                                             $validAirline false;
  1138.                                             $countFlight is_countable($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment) ? count($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment) : 0;
  1139.                                             foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment as $destinos) {
  1140.                                                 if (== $f) {
  1141.                                                     $origenPais explode(':'$destinos->Comment[3]);
  1142.                                                     $origenCiudad explode(':'$destinos->Comment[1]);
  1143.                                                 } else {
  1144.                                                     $iataTemp $iata;
  1145.                                                     $iata $destinos->MarketingAirline['Code'];
  1146.                                                     //Compara si la aerlonia es diferente
  1147.                                                     if (trim($iataTemp) != trim($iata)) {
  1148.                                                         $validAirline true;
  1149.                                                         break;
  1150.                                                     }
  1151.                                                 }
  1152.                                                 if ($f == $countFlight) {
  1153.                                                     $destinoPais explode(':'$destinos->Comment[10]);
  1154.                                                     $destinoCiudad explode(':'$destinos->Comment[8]);
  1155.                                                 }
  1156.                                                 ++$f;
  1157.                                             }
  1158.                                             if ($validAirline) {
  1159.                                                 break;
  1160.                                             } elseif ('1' == $airlineData->overGlobal) {
  1161.                                                 if ('CO' == trim($origenPais[1]) && 'CO' == trim($destinoPais[1])) {
  1162.                                                     $TPA->Over['Active'] = true;
  1163.                                                     $TPA->Over['Name'] = 'Complemento aerolĆ­nea';
  1164.                                                     $TPA->Over['Terminos'] = '* Complemento aerolĆ­nea sujeto a verificación BSP  y condiciones de tarifa';
  1165.                                                     $TPA->Over['Description'] = 'Ganancia total';
  1166.                                                     $over $airlineData->overNational;
  1167.                                                     $overAmount $totalValue $over;
  1168.                                                     $TPA->Over['Amount'] = $overAmount;
  1169.                                                     $TPA->Over['AmountTotal'] = round($TPA->QSE['CommissionPay'] + $overAmount);
  1170.                                                 } else {
  1171.                                                     $TPA->Over['Active'] = true;
  1172.                                                     $TPA->Over['Name'] = 'Complento aerolĆ­nea';
  1173.                                                     $TPA->Over['Terminos'] = '* Complemento aerolĆ­nea sujeto a verificación BSP  y condiciones de tarifa';
  1174.                                                     $TPA->Over['Description'] = 'Ganancia total';
  1175.                                                     $over $airlineData->overInternational;
  1176.                                                     $overAmount $totalValue $over;
  1177.                                                     $TPA->Over['Amount'] = $overAmount;
  1178.                                                     $TPA->Over['AmountTotal'] = round($TPA->QSE['CommissionPay'] + $overAmount);
  1179.                                                 }
  1180.                                             } else {
  1181.                                                 foreach ($airlineData->overGeneral as $airlineDataGeneral) {
  1182.                                                     $existOverOrigin false;
  1183.                                                     $existOverDestino false;
  1184.                                                     foreach ($airlineDataGeneral->origin as $origin) {
  1185.                                                         $origenInfo explode('-'$origin);
  1186.                                                         if ('Global' == $origenInfo[1]) {
  1187.                                                             if (trim($origenInfo[0]) == trim($origenPais[1])) {
  1188.                                                                 $existOverOrigin true;
  1189.                                                                 break;
  1190.                                                             }
  1191.                                                         } else {
  1192.                                                             if (trim($origenInfo[0]) == trim($origenPais[1]) && trim($origenInfo[1]) == trim($origenCiudad[1])) {
  1193.                                                                 $existOverOrigin true;
  1194.                                                                 break;
  1195.                                                             }
  1196.                                                         }
  1197.                                                     }
  1198.                                                     foreach ($airlineDataGeneral->destination as $destination) {
  1199.                                                         $destinationInfo explode('-'$destination);
  1200.                                                         if ('Global' == $destinationInfo[1]) {
  1201.                                                             if (trim($destinationInfo[0]) == trim($destinoPais[1])) {
  1202.                                                                 $existOverDestino true;
  1203.                                                                 break;
  1204.                                                             }
  1205.                                                         } else {
  1206.                                                             if (trim($destinationInfo[0]) == trim($destinoPais[1]) && trim($destinationInfo[1]) == trim($destinoCiudad[1])) {
  1207.                                                                 $existOverDestino true;
  1208.                                                                 break;
  1209.                                                             }
  1210.                                                         }
  1211.                                                     }
  1212.                                                     if (true == $existOverOrigin && true == $existOverDestino) {
  1213.                                                         $TPA->Over['Active'] = true;
  1214.                                                         $TPA->Over['Name'] = 'Complento aerolĆ­nea';
  1215.                                                         $TPA->Over['Terminos'] = '* Complemento aerolĆ­nea sujeto a verificación BSP  y condiciones de tarifa';
  1216.                                                         $TPA->Over['Description'] = 'Ganancia total';
  1217.                                                         $over $airlineDataGeneral->commission;
  1218.                                                         $overAmount $totalValue $over;
  1219.                                                         $TPA->Over['Amount'] = $overAmount;
  1220.                                                         $TPA->Over['AmountTotal'] = round($TPA->QSE['CommissionPay'] + $overAmount);
  1221.                                                         break;
  1222.                                                     }
  1223.                                                 }
  1224.                                             }
  1225.                                         }
  1226.                                     }
  1227.                                 }
  1228.                             }
  1229.                         }
  1230.                         $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline;
  1231.                         $this->scanFareConditions($pricedItinerary);
  1232.                         $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $qse;
  1233.                         if (isset($OTA_AirLowFareSearchRS['specialDiscountPayoutExtra'])) {
  1234.                             $pricedItinerary->AirItineraryPricingInfo['specialDiscountPayoutExtra'] = (string) $OTA_AirLowFareSearchRS['specialDiscountPayoutExtra'];
  1235.                         }
  1236.                         if (isset($OTA_AirLowFareSearchRS['specialDiscountPayoutExtraId'])) {
  1237.                             $pricedItinerary->AirItineraryPricingInfo['specialDiscountPayoutExtraId'] = (string) $OTA_AirLowFareSearchRS['specialDiscountPayoutExtraId'];
  1238.                         }
  1239.                         $ticketingVendor $pricedItinerary->TicketingInfo->TicketingVendor;
  1240.                         $validatingAirline = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
  1241.                         $options[$pi][$key]['airline'] = $validatingAirline;
  1242.                         $options[$pi][$key]['amount'] = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1243.                         $options[$pi][$key]['xml'] = $pricedItinerary->asXml();
  1244.                         $key++;
  1245.                     }
  1246.                     $timerLog .= 'admin fee step 16 pricedItinerary End '.$pricedCounter.' '.microtime().'';
  1247.                     ++$pricedCounter;
  1248.                 }
  1249.                 ++$pi;
  1250.             }
  1251.             $timerLog .= 'admin fee step 16 '.microtime().'';
  1252.             if (== sizeof($options)) {
  1253.                 return 'no-filtered-options';
  1254.             }
  1255.             for ($i 0$count = \count($options); $i $count; ++$i) {
  1256.                 usort($options[$i], function ($a$b) {
  1257.                     if ($a['amount'] - $b['amount'] == 0) {
  1258.                         $airlineSpecialOrder = ['CM''UX'];
  1259.                         if (!in_array($a['airline'], $airlineSpecialOrder)) {
  1260.                             return 1;
  1261.                         } else {
  1262.                             return 0;
  1263.                         }
  1264.                     } else {
  1265.                         return $a['amount'] - $b['amount'];
  1266.                     }
  1267.                 });
  1268.             }
  1269.             $timerLog .= 'admin fee step 17 '.microtime().'';
  1270.             $responseXml explode('<PricedItineraries>'str_replace('</PricedItineraries>''<PricedItineraries>'$response->asXml()));
  1271.             $orderedResponse $responseXml[0];
  1272.             $timerLog .= 'admin fee step 18 '.microtime().'';
  1273.             foreach ($options as $optionPi) {
  1274.                 $orderedResponse .= '<PricedItineraries>';
  1275.                 foreach ($optionPi as $option) {
  1276.                     $orderedResponse .= $option['xml'];
  1277.                 }
  1278.                 $orderedResponse .= '</PricedItineraries>';
  1279.             }
  1280.             $timerLog .= 'admin fee step 19 '.microtime().'';
  1281.             $orderedResponse .= $responseXml[sizeof($responseXml) - 1];
  1282.             $return simplexml_load_string($orderedResponse);
  1283.             $timerLog .= 'admin fee step 20 '.microtime().'';
  1284.             $this->session->set($transactionId.'[flight][adminFeeTimerLog]'$timerLog);
  1285.             return $return;
  1286.         } else {
  1287.             $this->errorHandler->errorRedirectNoEmail('''Error TA. The PriceItinerary was not found in this response:'print_r($responsetrue));
  1288.             return ['error' => 'invalid response'];
  1289.         }
  1290.     }
  1291.     public function multiRequest(array $requests$method null$transactionId null)
  1292.     {
  1293.         $domain $this->requestStack->getCurrentRequest()->getHost();
  1294.         $parametersJson $this->session->get($domain.'[parameters]''');
  1295.         $parameters json_decode($parametersJson);
  1296.         if ('MPA' == $parameters->aviatur_service_web_request_type) {
  1297.             $url $parameters->aviatur_service_web_url_mpa;
  1298.         } elseif ('MPB' == $parameters->aviatur_service_web_request_type) {
  1299.             $url $parameters->aviatur_service_web_url_air_mpb;
  1300.         } else {
  1301.             return 'Mala configuración de webservice para combinaciones';
  1302.         }
  1303.         $handles = [];
  1304.         $timeout 100;
  1305.         $defaultOptions = [
  1306.             CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
  1307.             CURLOPT_URL => $url,
  1308.             CURLOPT_RETURNTRANSFER => true,
  1309.             CURLOPT_SSL_VERIFYHOST => false,
  1310.             CURLOPT_SSL_VERIFYPEER => false,
  1311.             CURLOPT_MAXREDIRS => 10,
  1312.             CURLOPT_FOLLOWLOCATION => true,
  1313.             CURLOPT_CONNECTTIMEOUT => $timeout,
  1314.             CURLOPT_POST => true,
  1315.         ];
  1316.         // add curl options to each handle
  1317.         foreach ($requests as $k => $request) {
  1318.             $headers = [
  1319.                 'POST /AmadeusLATAM.Aviatur.Services/services/mpaservice.asmx HTTP/1.1',
  1320.                 'Content-Type: text/xml; charset=utf-8',
  1321.                 'Content-Length: '.strlen($request),
  1322.                 'SOAPAction: "http://tempuri.org/Execute"',
  1323.             ];
  1324.             $options $defaultOptions;
  1325.             $options += [
  1326.                 CURLOPT_HTTPHEADER => $headers,
  1327.                 CURLOPT_POSTFIELDS => $request,
  1328.             ];
  1329.             $ch[$k] = curl_init();
  1330.             $opt curl_setopt_array($ch[$k], $options);
  1331.             $handles[$k] = $ch[$k];
  1332.             $this->logSave->logSave($request$method'RQ'$transactionId);
  1333.         }
  1334.         $mh curl_multi_init();
  1335.         // add handles
  1336.         foreach ($handles as $k => $handle) {
  1337.             $err curl_multi_add_handle($mh$handle);
  1338.         }
  1339.         $running_handles null;
  1340.         do {
  1341.             curl_multi_exec($mh$running_handles);
  1342.             curl_multi_select($mh);
  1343.         } while ($running_handles 0);
  1344.         $response = [];
  1345.         foreach ($requests as $k => $request) {
  1346.             if ('AirAvail' != $method) {
  1347.                 $response[$k]['error'] = curl_error($handles[$k]);
  1348.             }
  1349.             if (!empty($response[$k]['error'])) {
  1350.                 $response[$k]['data'] = '';
  1351.                 $this->logSave->logSave($response[$k]['error'], $method'RS'$transactionId);
  1352.             } else {
  1353.                 $response[$k]['data'] = curl_multi_getcontent($handles[$k]);  // get results
  1354.                 $this->logSave->logSave($response[$k]['data'], $method'RS'$transactionId);
  1355.             }
  1356.             // close current handler
  1357.             curl_multi_remove_handle($mh$handles[$k]);
  1358.         }
  1359.         curl_multi_close($mh);
  1360.         return $response;
  1361.     }
  1362.     public function orderCombinationResponse($xmlResponseSegment1$method$optionsLimit INF)
  1363.     {
  1364.         $key 0;
  1365.         $options = [];
  1366.         foreach ($xmlResponseSegment1->Message->$method->PricedItineraries->PricedItinerary as $pricedItinerary) {
  1367.             $options[$key]['amount'] = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  1368.             $options[$key]['xml'] = $pricedItinerary->asXml();
  1369.             ++$key;
  1370.         }
  1371.         usort($options, fn($a$b) => $a['amount'] - $b['amount']);
  1372.         $responseXml explode('<PricedItineraries>'str_replace('</PricedItineraries>''<PricedItineraries>'$xmlResponseSegment1->asXml()));
  1373.         $orderedResponse $responseXml[0].'<PricedItineraries>';
  1374.         $key 0;
  1375.         foreach ($options as $option) {
  1376.             $orderedResponse .= $option['xml'];
  1377.             if ($key == $optionsLimit) {
  1378.                 break;
  1379.             }
  1380.             ++$key;
  1381.         }
  1382.         $orderedResponse .= '</PricedItineraries>'.$responseXml[sizeof($responseXml) - 1];
  1383.         return \simplexml_load_string($orderedResponse);
  1384.     }
  1385.     public function scanFareConditions($pricedItinerary)
  1386.     {
  1387.         foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestinationOption) {
  1388.             foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
  1389.                 if (!isset($fareBreakDown->FareBasisCodes->FareBasisCode)) {
  1390.                     break;
  1391.                 }
  1392.                 $fareBasisCount 0;
  1393.                 foreach ($fareBreakDown->FareBasisCodes->FareBasisCode as $fareBasisCode) {
  1394.                     if (!isset($originDestinationOption->FlightSegment[$fareBasisCount])) {
  1395.                         break;
  1396.                     }
  1397.                     if ((int) $originDestinationOption['RefNumber'] == (int) $fareBasisCode['FlightSegmentRPH'] - 1) {
  1398.                         $marketingAirline $originDestinationOption->FlightSegment[$fareBasisCount]->MarketingAirline['Code'];
  1399.                         $conditions = [];
  1400.                         // PENDING: Dynamic data Branded Fares
  1401.                         if ('LA' == $marketingAirline || '4C' == $marketingAirline) { // Latam
  1402.                             // check for branded fare (SN: 'Promo', SL: 'Light', SE: 'Plus', SF: 'Top')
  1403.                             $brandedFare substr((string) $fareBasisCode32);
  1404.                             if (in_array($brandedFare, ['SN''SL''SE''SF'])) {
  1405.                                 switch ($brandedFare) {
  1406.                                     // 0 -> not allowed
  1407.                                     // 1 -> charged
  1408.                                     // 2 -> allowed
  1409.                                     case 'SN':
  1410.                                         $conditions = ['Refund' => 0'Reschedule' => 0'Luggage' => 1'SeatSelection' => 0'SeatFavorite' => 0'Ffp' => 0];
  1411.                                         break;
  1412.                                     case 'SL':
  1413.                                         $conditions = ['Refund' => 0'Reschedule' => 0'Luggage' => 1'SeatSelection' => 1'SeatFavorite' => 1'Ffp' => 2];
  1414.                                         break;
  1415.                                     case 'SE':
  1416.                                         $conditions = ['Refund' => 1'Reschedule' => 1'Luggage' => 2'SeatSelection' => 2'SeatFavorite' => 1'Ffp' => 2];
  1417.                                         break;
  1418.                                     case 'SF':
  1419.                                         $conditions = ['Refund' => 2'Reschedule' => 2'Luggage' => 2'SeatSelection' => 2'SeatFavorite' => 2'Ffp' => 2];
  1420.                                         break;
  1421.                                 }
  1422.                             }
  1423.                         } elseif ('FC' == $marketingAirline || 'V1' == $marketingAirline) { // VivaAir
  1424.                             // check for branded fare (SN: 'Promo', SL: 'Light', SE: 'Plus', SF: 'Top')
  1425.                             $brandedFare substr((string) $fareBasisCode02);
  1426.                             if (in_array($brandedFare, ['VI''FB''FS''FF'])) {
  1427.                                 switch ($brandedFare) {
  1428.                                     // 0 -> not allowed
  1429.                                     // 1 -> charged
  1430.                                     // 2 -> allowed
  1431.                                     case 'VI':
  1432.                                         $conditions = ['Refund' => 0'Reschedule' => 1'Luggage' => 1'SeatSelection' => 0'SeatFavorite' => 1'Ffp' => 0'CounterCheckin' => 1];
  1433.                                         break;
  1434.                                     case 'FB':
  1435.                                         $conditions = ['Refund' => 0'Reschedule' => 1'Luggage' => 1'SeatSelection' => 0'SeatFavorite' => 1'Ffp' => 0'CounterCheckin' => 1];
  1436.                                         break;
  1437.                                     case 'FS':
  1438.                                         $conditions = ['Refund' => 0'Reschedule' => 1'Luggage' => 2'SeatSelection' => 0'SeatFavorite' => 1'Ffp' => 0'CounterCheckin' => 1];
  1439.                                         break;
  1440.                                     case 'FF':
  1441.                                         $conditions = ['Refund' => 0'Reschedule' => 2'Luggage' => 2'SeatSelection' => 2'SeatFavorite' => 2'Ffp' => 0'CounterCheckin' => 2];
  1442.                                         break;
  1443.                                 }
  1444.                             }
  1445.                         }
  1446.                         if (!empty($conditions)) {
  1447.                             $originDestinationOption->FlightSegment[$fareBasisCount]->FareConditions $this->objectDecrementalFill($conditions$originDestinationOption->FlightSegment[$fareBasisCount]->FareConditions);
  1448.                             $originDestinationOption->FareConditions $this->objectDecrementalFill($conditions$originDestinationOption->FareConditions); // store most restrictive fare conditions in OriginDestinationOption
  1449.                         }
  1450.                         ++$fareBasisCount;
  1451.                     }
  1452.                 }
  1453.             }
  1454.         }
  1455.     }
  1456.     public function objectDecrementalFill($conditions$object)
  1457.     {
  1458.         foreach ($conditions as $condition => $requirement) {
  1459.             $object[$condition] = (isset($object[$condition]) && (((int) $object[$condition]) < $requirement)) ? $object[$condition] : $requirement;
  1460.         }
  1461.         return $object;
  1462.     }
  1463.     private function obtainCorrectFeeRegister($fee$pricedItinerary$passangerCount$international$flights$baseAmount$TRM null$responseAdmin null$taxes_by_person = []){
  1464.         $administrativeCostTemp 0;
  1465.         if (is_null($fee)) {
  1466.             return 0;
  1467.         }
  1468.         if (!$this->session->has('operatorId')) {
  1469.             $administrativeCostTemp 0;
  1470.             if (isset($fee['rangeType']) && == (int) $fee['rangeType']) {
  1471.                 if ($international) {
  1472.                     foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
  1473.                         $passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
  1474.                         //$compareValue = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $TRM->getRate()->getFinantialrate();
  1475.                         $compareValue = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + (isset($taxes_by_person['tax'.$passengersType]) ? $taxes_by_person['tax'.$passengersType] : 0)) / $TRM->getRate()->getFinantialrate();
  1476.                         if (($fee['rangeInternational1Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational1End'])) {
  1477.                             $administrativeCostRange $fee['valueInternational1'];
  1478.                         } elseif (($fee['rangeInternational2Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational2End'])) {
  1479.                             $administrativeCostRange $fee['valueInternational2'];
  1480.                         } elseif (($fee['rangeInternational3Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational3End'])) {
  1481.                             $administrativeCostRange $fee['valueInternational3'];
  1482.                         } elseif (($fee['rangeInternational4Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational4End'])) {
  1483.                             $administrativeCostRange $fee['valueInternational4'];
  1484.                         } elseif (($fee['rangeInternational4Start'] <= $compareValue) && == $fee['rangeInternational4End']) {
  1485.                             $administrativeCostRange $fee['valueInternational4'];
  1486.                         } else {
  1487.                             $administrativeCostRange 0;
  1488.                         }
  1489.                         if (== $fee['valueType']) {
  1490.                             $administrativeCostTemp += round($administrativeCostRange $TRM->getRate()->getFinantialrate() * $fareBreakdown->PassengerTypeQuantity['Quantity']);
  1491.                         } else {
  1492.                             //$administrativeCostTemp += round(($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) * $fareBreakdown->PassengerTypeQuantity['Quantity'] * $administrativeCostRange);
  1493.                             $administrativeCostTemp += round(($fareBreakdown->PassengerFare->BaseFare['Amount'] + (isset($taxes_by_person['tax'.$passengersType]) ? $taxes_by_person['tax'.$passengersType] : 0)) * $fareBreakdown->PassengerTypeQuantity['Quantity'] * $administrativeCostRange);
  1494.                         }
  1495.                     }
  1496.                 } else {
  1497.                     if (== $fee['valueType']) {
  1498.                         if ($flights 1) {
  1499.                             $administrativeCostTemp $fee['roundtripNational'];
  1500.                         } else {
  1501.                             $administrativeCostTemp $fee['onewayNational'];
  1502.                         }
  1503.                         $administrativeCostTemp $administrativeCostTemp $passangerCount;
  1504.                     } else {
  1505.                         $administrativeCostTemp $baseAmount $fee['nationalFixed'];
  1506.                     }
  1507.                 }
  1508.             } else {
  1509.                 if ($international) {
  1510.                     $administrativeCostTemp $fee['internationalFixed'];
  1511.                     if (== $fee['valueType']) {
  1512.                         $administrativeCostTemp round($administrativeCostTemp $TRM->getRate()->getFinantialrate());
  1513.                     }
  1514.                 } else {
  1515.                     $administrativeCostTemp $fee['nationalFixed'];
  1516.                 }
  1517.                 if (isset($fee['rangeType']) && $fee['valueType']) {
  1518.                     $administrativeCostTemp $baseAmount $administrativeCostTemp;
  1519.                 } else {
  1520.                     $administrativeCostTemp $administrativeCostTemp $passangerCount;
  1521.                 }
  1522.             }
  1523.         }
  1524.         else {
  1525.             if ($international) {
  1526.                 $administrativeCostTemp 0;
  1527.                 $tasaRepMercado = (float) $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TASA_CAMBIO;;
  1528.                 foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
  1529.                     $passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
  1530.                     $baseAmountCompare = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $tasaRepMercado;
  1531.                     if (($fee['rangeInternational1Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational1End'])) {
  1532.                         $administrativeCostRange $fee['valueInternational1'];
  1533.                     } elseif (($fee['rangeInternational2Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational2End'])) {
  1534.                         $administrativeCostRange $fee['valueInternational2'];
  1535.                     } elseif (($fee['rangeInternational3Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational3End'])) {
  1536.                         $administrativeCostRange $fee['valueInternational3'];
  1537.                     } elseif (($fee['rangeInternational4Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational4End'])) {
  1538.                         $administrativeCostRange $fee['valueInternational4'];
  1539.                     } else {
  1540.                         $administrativeCostRange 0;
  1541.                     }
  1542.                     $administrativeCostTemp += $administrativeCostRange $tasaRepMercado $fareBreakdown->PassengerTypeQuantity['Quantity'];
  1543.                 }
  1544.             } else {
  1545.                 if ($flights 1) {
  1546.                     $administrativeCostTemp $fee['R'];
  1547.                 } else {
  1548.                     $administrativeCostTemp $fee['O'];
  1549.                 }
  1550.                 $administrativeCostTemp $administrativeCostTemp $passangerCount;
  1551.             }
  1552.         }
  1553.         return $administrativeCostTemp;
  1554.     }
  1555.     /**
  1556.      * recalculateRouteBranchToApplyAllDiscount()
  1557.      * In roundtrip, when there is only one route of the two ones, with discount, the main idea is this route can apply all the discount (also taxes)
  1558.      * Author: Ing. David Rincon
  1559.      * Email: david.rincon@aviatur.com
  1560.      * Date: 2024/11/14
  1561.      * @param $pricedItinerary (Direct Object).
  1562.      * @return void
  1563.      */
  1564.     public function recalculateRouteBranchToApplyAllDiscount($pricedItinerary){
  1565.         $airItineraryPricingInfo = isset($pricedItinerary->AirItineraryPricingInfo) ? 'AirItineraryPricingInfo' 'PriceInfo';
  1566.         $totalBaseFare 0;
  1567.         $totalTaxes 0;
  1568.         $totalTotalFare 0;
  1569.         $discountAviatur 0;
  1570.         foreach ($pricedItinerary->$airItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
  1571.             $trm $fareBreakDown->PassengerFare->BaseFare['AuxTRM'];
  1572.             $baseFare = (int) $fareBreakDown->PassengerFare->BaseFare['AuxAmount'];
  1573.             $taxes = (int) $fareBreakDown->PassengerFare->Taxes['AuxAmount'];
  1574.             $totalFare = (int) $fareBreakDown->PassengerFare->TotalFare['AuxAmount'];
  1575.             if (!= $baseFare) {
  1576.                 $ivaTaxBefore $fareBreakDown->PassengerFare->BaseFare['AuxIvaTaxBefore'];
  1577.                 foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
  1578.                     if (isset($tax['Amount']) && ('YS' == substr($tax['TaxCode'], 02))) {
  1579.                         $ivaTaxBefore = (int) $tax['Amount'];
  1580.                     }
  1581.                 }
  1582.                 $ivaPercentage round(($ivaTaxBefore $baseFare), 3);
  1583.                 $ivaDiscount 0;
  1584.                 $ivaTaxAfter $ivaTaxBefore;
  1585.                 $discountValue $fareBreakDown->PassengerFare->BaseFare['AuxDiscountValue'];
  1586.                 // if (0 != $ivaPercentage) {
  1587.                 //     $discountValue = round($discountValue / (1 + $ivaPercentage));
  1588.                 // }
  1589.                 // //$newBaseFare = ceil($baseFare / $trm) - $discountValue;
  1590.                 // $newBaseFare = ($baseFare / $trm) - $discountValue;
  1591.                 // if (0 != $ivaPercentage) {
  1592.                 //     //$ivaTaxAfter = ceil(($newBaseFare * $ivaPercentage * $trm) / 10) * 10;
  1593.                 //     $ivaTaxAfter = ($newBaseFare * $ivaPercentage * $trm);
  1594.                 //     $ivaDiscount = $ivaTaxBefore - $ivaTaxAfter;
  1595.                 //     $taxes = $taxes - $ivaDiscount;
  1596.                 // }
  1597.                 // foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
  1598.                 //     if (isset($tax['Amount']) && ('YS' == substr($tax['TaxCode'], 0, 2))) {
  1599.                 //         $tax['DiscountAviatur'] = $ivaDiscount;
  1600.                 //     }
  1601.                 // }
  1602.                 // //$fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = $baseFare - (ceil($newBaseFare * $trm / 100) * 100);
  1603.                 // $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = $baseFare - ($newBaseFare * $trm);
  1604.                 // $baseFare = $newBaseFare;
  1605.                 $baseFare $baseFare $trm;
  1606.                 //$baseFare = ceil($baseFare / 100) * 100;
  1607.                 $paxTypeQuantity = (isset($fareBreakDown->PassengerTypeQuantity)) ? (int) $fareBreakDown->PassengerTypeQuantity['Quantity'] : (int) $fareBreakDown->PassengerTypeQuantityType['Quantity'];
  1608.                 $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = $discountValue;
  1609.                 $totalFare $baseFare $taxes $discountValue;
  1610.                 $tempDiscountAviatur 0;
  1611.                 // if (isset($fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'])) {
  1612.                 //     if ((float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] != (float) ($fareBreakDown->PassengerFare->BaseFare['AuxAmount'] - $baseFare)) {
  1613.                 //         $fareBreakDown->PassengerFare->BaseFare['DiscountAviaturDifference'] = (float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'].'=!'.(float) ($fareBreakDown->PassengerFare->BaseFare['AuxAmount'] - $baseFare);
  1614.                 //         $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = (float) $fareBreakDown->PassengerFare->BaseFare['AuxAmount'] - $baseFare;
  1615.                 //     }
  1616.                 //     $tempDiscountAviatur += (float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'];
  1617.                 // }
  1618.                 $tempDiscountAviatur += (float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'];
  1619.                 $fareBreakDown->PassengerFare->BaseFare['Amount'] = $baseFare;
  1620.                 $fareBreakDown->PassengerFare->Taxes['Amount'] = $taxes;
  1621.                 $fareBreakDown->PassengerFare->TotalFare['Amount'] = $totalFare;
  1622.                 foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
  1623.                     if (isset($tax['Amount']) && ('YS' == substr($tax['TaxCode'], 02))) {
  1624.                         $tax['Amount'] = $ivaTaxBefore $ivaDiscount;
  1625.                         $tempDiscountAviatur += $ivaDiscount;
  1626.                     }
  1627.                 }
  1628.                 $discountAviatur += $tempDiscountAviatur $paxTypeQuantity;
  1629.                 $totalBaseFare += ((int) $baseFare $paxTypeQuantity);
  1630.                 $totalTaxes += ((int) $taxes $paxTypeQuantity);
  1631.                 $totalTotalFare += ((int) $totalFare $paxTypeQuantity);
  1632.             }
  1633.             if (!= $totalTotalFare) {
  1634.                 $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->DiscountInformationAviatur['TrmAmountAviatur'] = ceil((int) $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] / $trm);
  1635.                 $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] = (int) $totalBaseFare;
  1636.                 $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur'] = true;
  1637.                 $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] = (int) $totalTaxes;
  1638.                 $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] = (int) $totalTotalFare;
  1639.                 if (isset($discountAviatur) && (!= $discountAviatur)) {
  1640.                     $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->DiscountInformationAviatur['Discount'] = (int)$discountAviatur;
  1641.                     $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->DispersionOverride 'true';
  1642.                 }
  1643.             }
  1644.         }
  1645.     }
  1646. }