<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace Aviatur\FlightBundle\Services;
use Aviatur\FlightBundle\Models\FlightModel;
use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
use Aviatur\GeneralBundle\Services\AviaturLogSave;
use Aviatur\GeneralBundle\Services\AviaturWebService;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
/**
* Description of AviaturAvailability.
*/
class AvailabilityFunctions
{
private \Symfony\Component\HttpFoundation\RequestStack $requestStack;
private \Doctrine\Persistence\ManagerRegistry $managerRegistry;
private \Symfony\Component\HttpFoundation\Session\SessionInterface $session;
private \Aviatur\GeneralBundle\Services\AviaturLogSave $logSave;
private \Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface $authorizationChecker;
private \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface $tokenStorage;
private \Aviatur\GeneralBundle\Services\AviaturWebService $webService;
private \Aviatur\GeneralBundle\Services\AviaturErrorHandler $errorHandler;
private $em;
public function __construct(RequestStack $requestStack, ManagerRegistry $managerRegistry, SessionInterface $session, AviaturLogSave $logSave, AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage, AviaturWebService $webService, AviaturErrorHandler $errorHandler)
{
$this->requestStack = $requestStack;
$this->managerRegistry = $managerRegistry;
$this->session = $session;
$this->logSave = $logSave;
$this->authorizationChecker = $authorizationChecker;
$this->tokenStorage = $tokenStorage;
$this->webService = $webService;
$this->errorHandler = $errorHandler;
$this->em = $this->managerRegistry->getManager();
}
public function assembleRoundTrip($agency, $OneWay1, $OneWay2, $response, $flights, $variable, $method, $isNational)
{
$domain = $this->requestStack->getCurrentRequest()->getHost();
$parametersJson = $this->session->get($domain.'[parameters]', '');
$parameters = json_decode($parametersJson);
$isFront = $this->session->has('operatorId');
$flightModel = new FlightModel();
$xmlFinalCombination = '';
$xmlCombinationTemplate = $flightModel->getXmlCombinations();
$combinationCounter = 0;
$optionsLimit = 20;
$optionsCount1 = 0;
/* For indicating if specialDiscountAviatur is appplied (at least in one road) */
$isApplyingSpecialDiscountAviatur = false;
foreach ($OneWay1->Message->$method->PricedItineraries->PricedItinerary as $originalPricedItinerary) {
/* Se debe crear una copia necesariamente por posibles modificaciones con el tema del descuento en un solo trayecto en roundtrip */
$pricedItinerary = clone $originalPricedItinerary;
$originDestinationSegment1 = str_replace(['<OriginDestinationOptions>', '</OriginDestinationOptions>'], [''], $pricedItinerary->AirItinerary->OriginDestinationOptions->asXml());
$priceType1 = (string) isset($pricedItinerary['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary['PriceType'])) : "{$pricedItinerary->TicketingInfo->TicketingVendor['Code']}-NA";
$quoteId1 = (string) $pricedItinerary->AirItineraryPricingInfo['QuoteID'];
$baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$equivFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
$ptcFareBreakdown = $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns;
$providerSegment1 = isset($pricedItinerary->Notes['ProviderId']) ? (string) $pricedItinerary->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/', '$1', (string) $pricedItinerary->Notes, 1);
$correlationSegment1 = isset($pricedItinerary->Notes['CorrelationId']) ? (string) $pricedItinerary->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/', '$1', (string) $pricedItinerary->Notes, 1);
$ticketingVendor1 = $pricedItinerary->TicketingInfo->TicketingVendor->asXML();
$validatingAirline1 = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
$specialDiscountValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true : false;
$specialDiscountAviaturValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true : false;
$optionsCount2 = 0;
foreach ($OneWay2->Message->$method->PricedItineraries->PricedItinerary as $originalPricedItinerary2) {
/* Se debe crear una copia necesariamente por posibles modificaciones con el tema del descuento en un solo trayecto en roundtrip */
$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 */
$pricedItinerary2 = clone $originalPricedItinerary2;
$priceType2 = (string) isset($pricedItinerary2['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary2['PriceType'])) : "{$pricedItinerary2->TicketingInfo->TicketingVendor['Code']}-NA";
$validatingAirline2 = (string) $pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
$baseFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$providerSegment2 = isset($pricedItinerary2->Notes['ProviderId']) ? (string) $pricedItinerary2->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/', '$1', (string) $pricedItinerary2->Notes, 1);
$markup = 0;
if ('122' == $providerSegment2 || '82' == $providerSegment2) {
$markup = ((int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] * $parameters->kiwi_markup) / 100;
}
$totalFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] + $markup;
$specialDiscountValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true : false;
$specialDiscountAviaturValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true : false;
if (null != $response && ((1 == sizeof($pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment)) && ($isNational) && ($validatingAirline1 == $validatingAirline2) && 'LA' == $validatingAirline1) && (!$specialDiscountValidation1) && (!$specialDiscountValidation2) && (!$specialDiscountAviaturValidation1) && (!$specialDiscountAviaturValidation2)) {
break;
}
if ($isFront && (('4O' == $validatingAirline1) || ('4O' == $validatingAirline2))) {
break;
}
/* 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 */
if($specialDiscountAviaturValidation1 xor $specialDiscountAviaturValidation2){
$indexRoute = (($specialDiscountAviaturValidation1 && !$specialDiscountAviaturValidation2) ? "" : ((!$specialDiscountAviaturValidation1 && $specialDiscountAviaturValidation2) ? "2" : null));
$indexNumberRoute = (($specialDiscountAviaturValidation1 && !$specialDiscountAviaturValidation2) ? "1" : ((!$specialDiscountAviaturValidation1 && $specialDiscountAviaturValidation2) ? "2" : null));
if(!is_null($indexRoute)){
$routeHasDivideDiscount = isset(${"pricedItinerary".$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->BaseFare['DivideDiscount']) ? true : false;
if($routeHasDivideDiscount){
$this->recalculateRouteBranchToApplyAllDiscount(${"pricedItinerary".$indexNumberRoute});
${'baseFare'.$indexRoute} = (int) ${'pricedItinerary'.$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
${'taxes'.$indexRoute} = (int) ${'pricedItinerary'.$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
${'totalFare'.$indexRoute} = (int) ${'pricedItinerary'.$indexNumberRoute}->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
if($indexRoute == "2"){
/* Debemos reestablecer los valores originales que corresponde a la IDA */
$baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
}
}
} else {
/* Debemos reestablecer los valores originales que corresponde a la IDA */
$baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
}
} else {
/* Debemos reestablecer los valores originales que corresponde a la IDA */
$baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
}
$priceTypeCombination = $priceType1.'|'.$priceType2;
$totalFareCombination = $totalFare + $totalFare2;
$baseFareCombination = $baseFare + $baseFare2;
$taxesCombination = $taxes + $taxes2;
$originDestinationSegment2 = str_replace(['<OriginDestinationOptions>', '</OriginDestinationOptions>', 'RefNumber="0"'], ['', '', 'RefNumber="1"'], $pricedItinerary2->AirItinerary->OriginDestinationOptions->asXml());
$quoteIdCombination = $quoteId1.'|'.(string) $pricedItinerary2->AirItineraryPricingInfo['QuoteID'];
$equivFareCombination = $equivFare + (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
$ptcFareBreakdown2 = $pricedItinerary2->AirItineraryPricingInfo->PTC_FareBreakdowns;
$correlationSegment2 = isset($pricedItinerary2->Notes['CorrelationId']) ? (string) $pricedItinerary2->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/', '$1', (string) $pricedItinerary2->Notes, 1);
$ptcFareBreakdownCombination = clone $ptcFareBreakdown;
$i = 0;
foreach ($ptcFareBreakdown->PTC_FareBreakdown as $fareBreakDownSegment1) {
$fareBreakDownSegment2 = $ptcFareBreakdown2->PTC_FareBreakdown[$i];
if (!is_object($fareBreakDownSegment2)) {
break 2;
} else {
if (!isset($fareBreakDownSegment1->FareBasisCodes)) {
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->addChild('FareBasisCodes');
}
if (isset($fareBreakDownSegment2->FareBasisCodes) && isset($fareBreakDownSegment2->FareBasisCodes->FareBasisCode) && ('' != (string) $fareBreakDownSegment2->FareBasisCodes->FareBasisCode)) {
foreach ($fareBreakDownSegment2->FareBasisCodes->FareBasisCode as $farebasisCode2) {
$farebasisCode = $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->FareBasisCodes->addChild('FareBasisCode', (string) $farebasisCode2);
$farebasisCode->addAttribute('FlightSegmentRPH', '2');
}
}
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->BaseFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->BaseFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->BaseFare['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->EquivFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->EquivFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->EquivFare['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->Taxes['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->Taxes['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->Taxes['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->TotalFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->TotalFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->TotalFare['Amount'];
++$i;
}
}
$ticketingVendor = $ticketingVendor1.$pricedItinerary2->TicketingInfo->TicketingVendor->asXML();
$searches = [
'{PriceType}',
'{OriginDestinationOptionSegment1}',
'{OriginDestinationOptionSegment2}',
'{QuoteID}',
'{BaseFare}',
'{EquivFare}',
'{Taxes}',
'{TotalFare}',
'{TPA_Extensions}',
'{PTC_FareBreakdowns}',
'{Notes}',
'{TicketingVendor}',
'<?xml version="1.0"?>',
];
$TPA_Extensions = '';
if ($markup > 0) {
$TRM_Kiwi = $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM;
$TPA_Extensions = '<TPA_Extensions>
<Markup_Kiwi>'.$markup.'</Markup_Kiwi>
</TPA_Extensions>';
}
$replaces = [
$priceTypeCombination,
$originDestinationSegment1,
$originDestinationSegment2,
$quoteIdCombination,
$baseFareCombination,
$equivFareCombination,
$taxesCombination,
$totalFareCombination,
$TPA_Extensions,
str_replace('<?xml version="1.0"?>', '', $ptcFareBreakdownCombination->asXml()),
'CorrelationID='.$correlationSegment1.'||'.$correlationSegment2.';SequenceNmbr=0;ProviderId='.$providerSegment1.'|'.$providerSegment2.';',
$ticketingVendor,
'',
];
$xmlCombination = str_replace($searches, $replaces, $xmlCombinationTemplate);
if ($specialDiscountValidation1 || $specialDiscountAviaturValidation1 || $specialDiscountValidation2 || $specialDiscountAviaturValidation2) {
$tempCombination = \simplexml_load_string($xmlCombination);
if ($specialDiscountValidation1 || $specialDiscountValidation2) {
$tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount'] = true;
}
if ($specialDiscountAviaturValidation1 || $specialDiscountAviaturValidation2) {
$tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur'] = true;
$isApplyingSpecialDiscountAviatur = true;
}
$xmlCombination = str_replace('<?xml version="1.0"?>', '', $tempCombination->asXml());
}
$xmlFinalCombination .= str_replace('<?xml version="1.0"?>', '', $xmlCombination);
++$combinationCounter;
++$optionsCount2;
if ($combinationCounter >= 100 && null != $response) {
break 2;
} elseif ($optionsCount2 >= $optionsLimit) {
break;
}
unset($pricedItinerary2);
unset($pricedItinerary1);
}
++$optionsCount1;
if ($optionsCount1 >= $optionsLimit) {
break;
}
}
if (null != $response && !isset($response['error']) && !$isApplyingSpecialDiscountAviatur) {
$xmlResponseTotal = \simplexml_load_string(\preg_replace('/<PricedItinerary>/', $xmlFinalCombination.'<PricedItinerary>', $response->asXml(), 1));
} else {
$providerResults = $OneWay1->ProviderResults->asXml().$OneWay2->ProviderResults->asXml();
$OTA_attributes = '';
foreach ($OneWay1->Message->$method->attributes() as $a => $b) {
$OTA_attributes .= ' '.$a.'="'.$b.'"'; // assuming same attributes between OneWay1 and OneWay2
}
$xmlResponseTotal = \simplexml_load_string('<Envelope>'.((string) $providerResults).'<Message><'.((string) $method).((string) $OTA_attributes).'><PricedItineraries>'.((string) $xmlFinalCombination).'</PricedItineraries></'.((string) $method).'></Message></Envelope>');
}
return $xmlResponseTotal;
}
public function assembleCombineRoundTrip($agency, $OneWay1, $OneWay2, $response, $flights, $variable, $method, $isNational, $changeRPH = null)
{
$isFront = $this->session->has('operatorId');
$flightModel = new FlightModel();
$xmlFinalCombination = '';
$xmlCombinationTemplate = $flightModel->getXmlCombinations();
$combinationCounter = 0;
$optionsLimit = 20;
$optionsCount1 = 0;
foreach ($OneWay1->Message->$method->PricedItineraries->PricedItinerary as $pricedItinerary) {
$originDestinationSegment1 = $pricedItinerary->AirItinerary->OriginDestinationOptions;
$priceType1 = (string) isset($pricedItinerary['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary['PriceType'])) : "{$pricedItinerary->TicketingInfo->TicketingVendor['Code']}-NA";
$quoteId1 = (string) $pricedItinerary->AirItineraryPricingInfo['QuoteID'];
$baseFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$totalFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$equivFare = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
$ptcFareBreakdown = $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns;
$providerSegment1 = isset($pricedItinerary->Notes['ProviderId']) ? (string) $pricedItinerary->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/', '$1', (string) $pricedItinerary->Notes, 1);
$correlationSegment1 = isset($pricedItinerary->Notes['CorrelationId']) ? (string) $pricedItinerary->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/', '$1', (string) $pricedItinerary->Notes, 1);
$ticketingVendor1 = $pricedItinerary->TicketingInfo->TicketingVendor->asXML();
$validatingAirline1 = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
$specialDiscountValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true : false;
$specialDiscountAviaturValidation1 = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true : false;
$optionsCount2 = 0;
foreach ($OneWay2->Message->$method->PricedItineraries->PricedItinerary as $pricedItinerary2) {
$priceType2 = (string) isset($pricedItinerary2['PriceType']) ? \mb_strtoupper(\trim((string) $pricedItinerary2['PriceType'])) : "{$pricedItinerary2->TicketingInfo->TicketingVendor['Code']}-NA";
$validatingAirline2 = (string) $pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
$baseFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxes2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$providerSegment2 = isset($pricedItinerary2->Notes['ProviderId']) ? (string) $pricedItinerary2->Notes['ProviderId'] : \preg_replace('/^.*ProviderId=([^;]*).*$/', '$1', (string) $pricedItinerary2->Notes, 1);
$markup = 0;
if ('122' == $providerSegment2 || '82' == $providerSegment2) {
$markup = round((int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] * 12 / 100);
}
$totalFare2 = (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] + $markup;
$specialDiscountValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount']) ? true : false;
$specialDiscountAviaturValidation2 = isset($pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur']) ? true : false;
if (null != $response && ((1 == sizeof($pricedItinerary2->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment)) && ($isNational) && ($validatingAirline1 == $validatingAirline2) && 'LA' == $validatingAirline1) && (!$specialDiscountValidation1) && (!$specialDiscountValidation2) && (!$specialDiscountAviaturValidation1) && (!$specialDiscountAviaturValidation2)) {
break;
}
if ($isFront && (('4O' == $validatingAirline1) || ('4O' == $validatingAirline2))) {
break;
}
$priceTypeCombination = $priceType1.'|'.$priceType2;
$totalFareCombination = $totalFare + $totalFare2;
$baseFareCombination = $baseFare + $baseFare2;
$taxesCombination = $taxes + $taxes2;
$originDestinationSegment2 = $pricedItinerary2->AirItinerary->OriginDestinationOptions;
$originsDestinations1 = [];
$originsDestinations2 = [];
$originsDestinationsCombined = '';
$index = 0;
foreach ($originDestinationSegment1->OriginDestinationOption as $originDestinationOption1) {
$refNumberBase = (string) $originDestinationOption1['RefNumber'];
$originsDestinations1[$refNumberBase][$index]['text'] = $originDestinationOption1->asXML();
$originsDestinations1[$refNumberBase][$index]['rph'] = $originDestinationOption1->FlightSegment['RPH'];
++$index;
}
$index = 0;
foreach ($originDestinationSegment2->OriginDestinationOption as $originDestinationOption1) {
$refNumberBase = (string) $originDestinationOption1['RefNumber'];
$originsDestinations2[$refNumberBase][$index]['text'] = $originDestinationOption1->asXML();
$originsDestinations2[$refNumberBase][$index]['rph'] = $originDestinationOption1->FlightSegment['RPH'];
++$index;
}
foreach ($originsDestinations1 as $key => $segments1) {
foreach ($segments1 as $item1) {
$composeRPH = '';
$composeRPH .= $item1['rph'];
foreach ($originsDestinations2[$key] as $segments2) {
$composeRPH .= '-'.$segments2['rph'];
$item1['text'] = str_replace(['<OriginDestinationOption RefNumber="0">', '<OriginDestinationOption RefNumber="1">', '</OriginDestinationOption>'], [''], preg_replace('/RPH\=\"[0-9]\"/', 'RPH="'.$composeRPH.'"', $item1['text']));
$segments2['text'] = str_replace(['<OriginDestinationOption RefNumber="0">', '<OriginDestinationOption RefNumber="1">', '</OriginDestinationOption>'], [''], preg_replace('/RPH\=\"[0-9]\"/', 'RPH="'.$composeRPH.'"', $segments2['text']));
if (0 == $key) {
$originsDestinationsCombined .= '<OriginDestinationOption RefNumber="'.$key.'">'.$item1['text'].$segments2['text'].'</OriginDestinationOption>';
} else {
$originsDestinationsCombined .= '<OriginDestinationOption RefNumber="'.$key.'">'.$segments2['text'].$item1['text'].'</OriginDestinationOption>';
}
}
}
}
$quoteIdCombination = $quoteId1.'|'.(string) $pricedItinerary2->AirItineraryPricingInfo['QuoteID'];
$equivFareCombination = $equivFare + (int) $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
$ptcFareBreakdown2 = $pricedItinerary2->AirItineraryPricingInfo->PTC_FareBreakdowns;
$correlationSegment2 = isset($pricedItinerary2->Notes['CorrelationId']) ? (string) $pricedItinerary2->Notes['CorrelationId'] : \preg_replace('/^.*CorrelationID=([^;]*).*$/', '$1', (string) $pricedItinerary2->Notes, 1);
$ptcFareBreakdownCombination = clone $ptcFareBreakdown;
$i = 0;
foreach ($ptcFareBreakdown->PTC_FareBreakdown as $fareBreakDownSegment1) {
$fareBreakDownSegment2 = $ptcFareBreakdown2->PTC_FareBreakdown[$i];
if (!is_object($fareBreakDownSegment2)) {
break 2;
} else {
if (!isset($fareBreakDownSegment1->FareBasisCodes)) {
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->addChild('FareBasisCodes');
}
if (isset($fareBreakDownSegment2->FareBasisCodes) && isset($fareBreakDownSegment2->FareBasisCodes->FareBasisCode) && ('' != (string) $fareBreakDownSegment2->FareBasisCodes->FareBasisCode)) {
foreach ($fareBreakDownSegment2->FareBasisCodes->FareBasisCode as $farebasisCode2) {
$farebasisCode = $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->FareBasisCodes->addChild('FareBasisCode', (string) $farebasisCode2);
$farebasisCode->addAttribute('FlightSegmentRPH', '2');
}
}
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->BaseFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->BaseFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->BaseFare['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->EquivFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->EquivFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->EquivFare['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->Taxes['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->Taxes['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->Taxes['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->TotalFare['Amount'] = (int) $fareBreakDownSegment1->PassengerFare->TotalFare['Amount'] + (int) $fareBreakDownSegment2->PassengerFare->TotalFare['Amount'];
++$i;
}
}
$ticketingVendor = $ticketingVendor1.$pricedItinerary2->TicketingInfo->TicketingVendor->asXML();
$searches = [
'{PriceType}',
'{OriginDestinationOptionSegment1}',
'{OriginDestinationOptionSegment2}',
'{QuoteID}',
'{BaseFare}',
'{EquivFare}',
'{Taxes}',
'{TotalFare}',
'{TPA_Extensions}',
'{PTC_FareBreakdowns}',
'{Notes}',
'{TicketingVendor}',
'<?xml version="1.0"?>',
];
$TPA_Extensions = '';
if ($markup > 0) {
$TRM_Kiwi = $pricedItinerary2->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM;
$TPA_Extensions = '<TPA_Extensions>
<Markup_Kiwi>'.$markup.'</Markup_Kiwi>
</TPA_Extensions>';
}
$replaces = [
$priceTypeCombination,
$originsDestinationsCombined,
'',
$quoteIdCombination,
$baseFareCombination,
$equivFareCombination,
$taxesCombination,
$totalFareCombination,
$TPA_Extensions,
str_replace('<?xml version="1.0"?>', '', $ptcFareBreakdownCombination->asXml()),
'CorrelationID='.$correlationSegment1.'||'.$correlationSegment2.';SequenceNmbr=0;ProviderId='.$providerSegment1.'|'.$providerSegment2.';',
$ticketingVendor,
'',
];
$xmlCombination = str_replace($searches, $replaces, $xmlCombinationTemplate);
if ($specialDiscountValidation1 || $specialDiscountAviaturValidation1 || $specialDiscountValidation2 || $specialDiscountAviaturValidation2) {
$tempCombination = \simplexml_load_string($xmlCombination);
if ($specialDiscountValidation1 || $specialDiscountValidation2) {
$tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount'] = true;
}
if ($specialDiscountAviaturValidation1 || $specialDiscountAviaturValidation2) {
$tempCombination->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur'] = true;
}
$xmlCombination = str_replace('<?xml version="1.0"?>', '', $tempCombination->asXml());
}
$xmlFinalCombination .= str_replace('<?xml version="1.0"?>', '', $xmlCombination);
++$combinationCounter;
++$optionsCount2;
if ($combinationCounter >= 100 && null != $response) {
break 2;
} elseif ($optionsCount2 >= $optionsLimit) {
break;
}
}
++$optionsCount1;
if ($optionsCount1 >= $optionsLimit) {
break;
}
}
if (null != $response) {
$xmlResponseTotal = \simplexml_load_string(\preg_replace('/<PricedItinerary>/', $xmlFinalCombination.'<PricedItinerary>', $response->asXml(), 1));
} else {
$providerResults = $OneWay1->ProviderResults->asXml().$OneWay2->ProviderResults->asXml();
$OTA_attributes = '';
foreach ($OneWay1->Message->$method->attributes() as $a => $b) {
$OTA_attributes .= ' '.$a.'="'.$b.'"'; // assuming same attributes between OneWay1 and OneWay2
}
$xmlResponseTotal = \simplexml_load_string('<Envelope>'.((string) $providerResults).'<Message><'.((string) $method).((string) $OTA_attributes).'><PricedItineraries>'.((string) $xmlFinalCombination).'</PricedItineraries></'.((string) $method).'></Message></Envelope>');
}
return $xmlResponseTotal;
}
public function assembleRoundTripDirect($xmlResponseSegment1, $xmlSecondaryResponse)
{
foreach ($xmlSecondaryResponse->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
}
$stringSegment1 = $xmlResponseSegment1->asXML();
$segment1Structure = explode('<PricedItineraries>', $stringSegment1);
$segment1Structure2 = explode('</PricedItineraries>', $segment1Structure[1]);
$segment1Itineraries = $segment1Structure2[0];
$secondaryComb = $xmlSecondaryResponse->asXML();
$secondaryCombStructure = explode('<PricedItineraries>', $secondaryComb);
$secondaryCombStructure2 = explode('</PricedItineraries>', $secondaryCombStructure[1]);
$secondaryCombItineraries = $secondaryCombStructure2[0];
$providerResults = '';
foreach ($xmlResponseSegment1->ProviderResults as $provideobject) {
$providerResults .= $provideobject->asXml();
}
foreach ($xmlSecondaryResponse->ProviderResults as $provideobject) {
$providerResults .= $provideobject->asXml();
}
$transactionId = $xmlResponseSegment1->Message->OTA_AirLowFareSearchRS['TransactionIdentifier'];
$text_OTA = '<OTA_AirLowFareSearchRS Version="0" TransactionIdentifier="'.$transactionId.'">';
$openTag = '';
if (false !== strpos($segment1Structure2[1], 'Envelope')) {
$openTag = '<Envelope>';
} elseif (false !== strpos($segment1Structure2[1], 'Response')) {
$openTag = '<Response>';
}
$segment1ProviderResultsStr = /* $cant . ' - ' . $indexCant . ' - ' . */ $openTag.$providerResults.'<Message>'.$text_OTA;
$itinerariesAssembled = $segment1ProviderResultsStr.'<PricedItineraries>'.$secondaryCombItineraries.$segment1Itineraries.'</PricedItineraries>'.$segment1Structure2[1];
// $this->logSave->logSave($itinerariesAssembled, 'new_assembled', 'RS');
$newSegment1xml = \simplexml_load_string($itinerariesAssembled);
// $this->logSave->logSave($newSegment1xml->asXML(), 'new_assembled_total', 'RS');
return $newSegment1xml;
}
public function combineRoutes($agency, $xmlResponses, $variable, $method, $isNational)
{
$providerResults = '';
$xmlFinalCombination = '';
for ($i = 0, $count = is_countable($xmlResponses) ? \count($xmlResponses) : 0; $i < $count; ++$i) {
$providerResults .= $xmlResponses[$i]->ProviderResults->asXml();
$xmlFinalCombination .= $xmlResponses[$i]->Message->$method->PricedItineraries->asXml();
}
$OTA_attributes = '';
foreach ($xmlResponses[0]->Message->$method->attributes() as $a => $b) {
$OTA_attributes .= ' '.$a.'="'.$b.'"'; // assuming same attributes between xmlResponses
}
$xmlResponseTotal = \simplexml_load_string('<Envelope>'.((string) $providerResults).'<Message><'.((string) $method).((string) $OTA_attributes).'>'.((string) $xmlFinalCombination).'</'.((string) $method).'></Message></Envelope>');
return $xmlResponseTotal;
}
public function admin_fee($agency, $response, $flights, $variable, $method)
{
$current_agency = $agency->getId();
$iatas = [];
$adminFees = [];
$qseFees = [];
$domain = $this->requestStack->getCurrentRequest()->getHost();
$parametersJson = $this->session->get($domain.'[parameters]', '');
if (isset($response->Message->$method) && isset($response->Message->$method->PricedItineraries->PricedItinerary)) {
$parameters = json_decode($parametersJson);
$responseMethod = $response->Message->$method;
$transactionId = (string) $responseMethod['TransactionIdentifier'];
$timerLog = $this->session->has($transactionId.'[flight][adminFeeTimerLog]') ? $this->session->get($transactionId.'[flight][adminFeeTimerLog]') : null;
$responseMethod['TransactionID'] = $transactionId;
for ($i = 1; $i <= $flights; ++$i) {
$iatas[] = $variable['origin'.$i];
$iatas[] = $variable['destination'.$i];
}
$cityCountries = $this->em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findCountryCodes($iatas);
$airportCountries = $this->em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findCountryCodes($iatas);
$countries = array_unique(array_merge($cityCountries, $airportCountries), SORT_REGULAR);
$type = '';
if (sizeof($countries) > 1 || (sizeof($countries) > 0 && !in_array('CO', $countries))) {
$international = true;
$isINNS = 1;
$fromCurrency = $this->em->getRepository(\Aviatur\TrmBundle\Entity\Currency::class)->findOneByIata('USD');
$toCurrency = $this->em->getRepository(\Aviatur\TrmBundle\Entity\Currency::class)->findOneByIata('COP');
$TRM = $this->em->getRepository(\Aviatur\TrmBundle\Entity\Trm::class)->findOneBy(['fromCurrency' => $fromCurrency, 'toCurrency' => $toCurrency], ['id' => 'DESC']);
} else {
$international = false;
$isINNS = 0;
}
if (!in_array('CO', $countries)) {
$type = 'NNS';
++$isINNS;
}
$isAgent = false;
$agentQseAmount = $adminFeePercentage = $agentQseAmountMax = 0;
$assetsFolder = $agency->getAssetsFolder();
$this->session->set($transactionId.'_isActiveQse', false);
if (!$this->session->has('operatorId')) {
//TEMPORAL, SE DEBE HACER EL CAMBIO A SEARCH_CITIES
$destinationCity = $this->em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneByIatacode($variable['destination1']);
$marcasblancas = '';
// if (!$this->session->has('whitemark')) {
$adminFees = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFee::class)->getAdminFeebyAgency($agency, $destinationCity);
// } else {
// $whitemark = $this->em->getRepository(\Aviatur\GeneralBundle\Entity\Whitemark::class)->findOneBy(['referer' => $this->session->get('whitemark')]);
// $adminFeeswhitemark = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFeeWhitemark::class)->findBy(['whitemark' => $whitemark, 'isactive' => '1']);
// $adminFeeswhitemark += $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFeeWhitemark::class)->findBy(['whitemark' => null, 'isactive' => '1']);
// $adminFees = [];
// foreach ($adminFeeswhitemark as $key => $adminFeesW) {
// $cityID = null;
// $countryName = null;
// $countryCode = null;
// $airline_id = null;
// $iata = null;
// $name = null;
// $agency_id = null;
// if (null != $adminFeesW->getCity()) {
// $cityID = $adminFeesW->getCity()->getId();
// $countryName = $adminFeesW->getCity()->getCountry()->getDescription();
// $countryCode = $adminFeesW->getCity()->getCountry()->getCode();
// }
// if (null != $adminFeesW->getAirline()) {
// $airline_id = $adminFeesW->getAirline()->getId();
// $iata = $adminFeesW->getAirline()->getIata();
// $name = $adminFeesW->getAirline()->getName();
// }
// if (null != $adminFeesW->getWhitemark()) {
// $agency_id = $adminFeesW->getWhitemark()->getId();
// } else {
// $agency_id = $whitemark->getId();
// }
// $adminFees[$key]['id'] = (string) $adminFeesW->getId();
// $adminFees[$key]['agency_id'] = (string) $agency_id;
// $adminFees[$key]['airline_id'] = (string) $airline_id;
// $adminFees[$key]['city_id'] = (string) $cityID;
// $adminFees[$key]['valueType'] = (string) $adminFeesW->getValuetype();
// $adminFees[$key]['rangeType'] = (string) $adminFeesW->getRangetype();
// $adminFees[$key]['isActive'] = (string) $adminFeesW->getIsactive();
// $adminFees[$key]['noNationalStop'] = (string) $adminFeesW->getNonationalstop();
// $adminFees[$key]['isItFare'] = (string) $adminFeesW->getIsitfare();
// $adminFees[$key]['nationalFixed'] = (string) $adminFeesW->getNationalfixed();
// $adminFees[$key]['internationalFixed'] = (string) $adminFeesW->getInternationalfixed();
// $adminFees[$key]['roundtripNational'] = (string) $adminFeesW->getRoundtripnational();
// $adminFees[$key]['onewayNational'] = (string) $adminFeesW->getOnewaynational();
// $adminFees[$key]['rangeInternational1Start'] = (string) $adminFeesW->getRangeinternational1start();
// $adminFees[$key]['rangeInternational1End'] = (string) $adminFeesW->getRangeinternational1end();
// $adminFees[$key]['rangeInternational2Start'] = (string) $adminFeesW->getRangeinternational2start();
// $adminFees[$key]['rangeInternational2End'] = (string) $adminFeesW->getRangeinternational2end();
// $adminFees[$key]['rangeInternational3Start'] = (string) $adminFeesW->getRangeinternational3start();
// $adminFees[$key]['rangeInternational3End'] = (string) $adminFeesW->getRangeinternational3end();
// $adminFees[$key]['rangeInternational4Start'] = (string) $adminFeesW->getRangeinternational4start();
// $adminFees[$key]['rangeInternational4End'] = (string) $adminFeesW->getRangeinternational4end();
// $adminFees[$key]['valueInternational1'] = (string) $adminFeesW->getValueinternational1();
// $adminFees[$key]['valueInternational2'] = (string) $adminFeesW->getValueinternational2();
// $adminFees[$key]['valueInternational3'] = (string) $adminFeesW->getValueinternational3();
// $adminFees[$key]['valueInternational4'] = (string) $adminFeesW->getValueinternational4();
// $adminFees[$key]['iata'] = (string) $iata;
// $adminFees[$key]['name'] = (string) $name;
// $adminFees[$key]['countryName'] = (string) $countryName;
// $adminFees[$key]['countryCode'] = (string) $countryCode;
// $adminFees[$key]['admin_fee_id'] = (string) $adminFeesW->getId();
// }
// }
$nameProduct = 'flight';
$productFlightCommission = $this->em->getRepository(\Aviatur\AgentBundle\Entity\AgentQseProductCommission::class)->findOneByProductname($nameProduct);
$productFlightCommission2 = (array) $productFlightCommission;
$this->session->set($transactionId.'_isActiveQse', ((is_countable($productFlightCommission2) ? count($productFlightCommission2) : 0) > 0) ? true : false);
if (($this->authorizationChecker->isGranted('ROLE_AVIATUR_ADMIN_ADMIN_AGENT_OPERATOR') || $this->authorizationChecker->isGranted('ROLE_AVIATUR_ADMIN_ADMIN_AGENT_WAITING')) && $this->session->get($transactionId.'_isActiveQse')) {
$agent = $this->em->getRepository(\Aviatur\AgentBundle\Entity\Agent::class)->findOneByCustomer($this->tokenStorage->getToken()->getUser());
// if (!empty($agent) && $agent->getAgency()->getId() == $agency->getId()) { sentencia anterior
if (!empty($agent)) {
//$airline = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AirlineOver::class)->findByagency($agency->getId());
$airline = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AirlineOver::class)->findBy(['agency' => $agency->getId(), 'isActive' => '1']);
$airlinesArray = [];
foreach ($airline as $airlines) {
$airlinesArray[] = json_decode($airlines->getoverData());
}
// $agency = $this->em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->findOneByDomain('octopus.agents'); //anterior variable a usar
$adminFees = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AdminFee::class)->getAdminFeebyAgency($agency, $destinationCity);
$agentCommission = $this->em->getRepository(\Aviatur\AgentBundle\Entity\AgentCommission::class)->findOneByAgent($agent);
$infoQse = json_decode($agentCommission->getQseproduct());
$activeDetail = $agentCommission->getActivedetail();
$agentQseAmount = (empty($infoQse)) ? 0 : (int) $infoQse->$nameProduct->commission_money;
$agentQseAmountMax = $productFlightCommission->getQsecommissionmax();
$flightpercentage = (empty($infoQse)) ? 0 : (float) $infoQse->$nameProduct->commission_percentage;
$flightpercentagemax = $productFlightCommission->getPercentageCommissionMax();
$flightActive = (empty($infoQse)) ? 0 : (int) $infoQse->$nameProduct->active;
$productCommissionPercentage = $productFlightCommission->getQsecommissionpercentage();
$taCommissionPercentage = $productFlightCommission->getTacommissionpercentage();
$isAgent = true;
}
}
$timerLog .= 'admin fee step 10 '.microtime().'';
foreach ($adminFees as $key => $adminFee) {
$airline = $adminFee['airline_id'];
$agency = $adminFee['agency_id'];
$nnsFare = (1 == $adminFee['noNationalStop']) ? 'NNS' : '';
$itFare = (1 == $adminFee['isItFare']) ? 'IT' : '';
if (null != $airline) {
$agencyFee = (null != $agency) ? 'Agency' : '';
${'airlines'.$agencyFee.'Iata'.$nnsFare.$itFare}[] = $adminFee['iata'];
${'airlines'.$agencyFee.'Key'.$nnsFare.$itFare}[] = $key;
} elseif (null != $agency) {
${'agencyKey'.$nnsFare.$itFare} = $key;
} else {
${'generalKey'.$nnsFare.$itFare} = $key;
}
}
$timerLog .= 'admin fee step 11 '.microtime().'';
} else {
$flightModel = new FlightModel();
$responseAdmin = $this->webService->busWebServiceAmadeus('GENERALLAVE', 'dummy|http://www.aviatur.com.co/dummy/', $flightModel->getPresentialValues('VALORES_TA_PRESENCIAL'));
if (!isset($responseAdmin['error'])) {
$TRM = (float) $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TASA_CAMBIO;
if (false == $international) {
$adminFeesObj = $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TA_NACIONAL;
$adminFees[0]['currency'] = 'COP';
foreach ($adminFeesObj->ELEMENTO_TA_NACIONAL as $adminFee) {
$adminFees[0][(string) $adminFee->TIPO_RUTA] = (float) $adminFee->VALOR_TA;
}
} else {
$adminFeesObj = $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TA_INTERNACIONAL;
$i = 1;
$adminFees[0]['currency'] = 'USD';
foreach ($adminFeesObj->ELEMENTO_TA_INTERNACIONAL as $adminFee) {
$adminFees[0]['rangeInternational'.$i.'Start'] = (float) $adminFee->VALOR_INICIAL;
$adminFees[0]['rangeInternational'.$i.'End'] = (float) $adminFee->VALOR_FINAL;
$adminFees[0]['valueInternational'.$i] = (float) $adminFee->VALOR_TA;
++$i;
}
}
$this->session->set($transactionId.'[flight][ta_front]', json_encode([$adminFees, $TRM]));
} else {
return $responseAdmin;
}
$airline = null;
$agency = null;
$generalKey = 0;
$generalKeyNNS = 0;
$responseQSE = $this->webService->busWebServiceAmadeus('GENERALLAVE', 'dummy|http://www.aviatur.com.co/dummy/', $flightModel->getPresentialValues('VALORES_QSE_PRESENCIAL'));
if (!isset($responseQSE['error'])) {
$qseTRM = (float) $responseQSE->MENSAJE->VALORES_QSE->TASA_CAMBIO;
if (false == $international) {
$qseObj = $responseQSE->MENSAJE->VALORES_QSE->QSE_NACIONAL;
$qseFees[0]['currency'] = 'COP';
$qseFees[0]['value'] = (float) $qseObj->ELEMENTO_QSE_NACIONAL->VALOR_QSE;
} else {
$qseObj = $responseQSE->MENSAJE->VALORES_QSE->QSE_INTERNACIONAL;
$i = 1;
$qseFees[0]['currency'] = 'USD';
foreach ($qseObj->ELEMENTO_QSE_INTERNACIONAL as $qseFee) {
$qseFees[0]['rangeInternational'.$i.'Start'] = (float) $qseFee->VALOR_INICIAL;
$qseFees[0]['rangeInternational'.$i.'End'] = (float) $qseFee->VALOR_FINAL;
$qseFees[0]['valueInternational'.$i] = (float) $qseFee->VALOR_QSE;
$qseFees[0]['currencyInternational'.$i] = (float) $qseFee->MONEDA_QSE;
++$i;
}
}
} else {
return $responseQSE;
}
}
$timerLog .= 'admin fee step 12 '.microtime().'';
$airlineCodes = $this->em->getRepository(\Aviatur\FlightBundle\Entity\AirlineValidation::class)->findAirlineCodes();
$timerLog .= 'admin fee step 13 '.microtime().'';
$options = [];
$key = 0;
$timerLog .= 'admin fee step 14 '.microtime().'';
$blockedCompositeAirlines = [
'AA', 'AC', 'AD', 'AF', 'AM',
'AR', 'AV', 'AZ', 'BA', 'B6',
'CM', 'CU', 'CZ', 'DL', 'DT',
'EK', 'ER', 'ET', 'G3', 'EY',
'IB', 'KE', 'KL', 'LA', 'LH',
'LY', 'OZ', 'O6', 'P5', 'QF',
'R7', 'TP', 'UA', 'UX', 'V0',
'W2', 'XB', 'Z8', '2I', '4C',
'7I', '8I', 'TK',
];
$blockedOperatingAirlines = [
'4U', 'CL', 'E2', 'EN', 'EW',
'LH', 'LX', 'LZ', 'OS', 'WK',
'2C', 'EY',
];
$server = $this->requestStack->getCurrentRequest()->server;
$url = strtok($server->get('REQUEST_URI'), '?');
$blockedFares = $this->em->getRepository(\Aviatur\FlightBundle\Entity\BlockedFare::class)->findRestrictionsForUrl($url);
$blockedFares['validatingAirline'] += [sizeof($blockedFares['validatingAirline']) => 'EQ', sizeof($blockedFares['validatingAirline']) + 1 => 'HR'];
$blockedFares['validatingAirline'] = array_unique($blockedFares['validatingAirline']);
$composedFaresEntities = $this->em->getRepository(\Aviatur\FlightBundle\Entity\SpecialCompositeFare::class)->findByIsactive(1);
$blockedCompositeFares = [];
$airlineForBlockedCompositeFares = [];
foreach ($composedFaresEntities as $composedFaresEntity) {
$blockedCompositeFares[] = $composedFaresEntity->getFarebasis();
$airlineForBlockedCompositeFares[] = $composedFaresEntity->getAirlinecode();
}
$timerLog .= 'admin fee step 15 '.microtime().'';
$pi = 0;
$pricedCounter = 1;
$OTA_AirLowFareSearchRS = $response->Message->$method;
foreach ($response->Message->$method->PricedItineraries as $pricedItineraries) {
$i = 0;
foreach ($pricedItineraries->PricedItinerary as $pricedItinerary) {
$timerLog .= 'admin fee step 16 pricedItinerary Start '.$pricedCounter.' '.microtime().'';
$paymentValidation = true;
$vendorCodes = [];
foreach ($pricedItinerary->TicketingInfo->TicketingVendor as $ticketingVendor) {
$vendorCodes[] = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
}
if (!array_diff($vendorCodes, $airlineCodes)) {
if ((bool) array_intersect($blockedFares['validatingAirline'], $vendorCodes)) {
$expectedSegments = $availableSegments = [];
$operatingAirlines = [];
$marketingAirlines = [];
foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestinationOption) {
$blockedCombinedFare = '';
$removedOriginDestinationOption = false;
$isAvailable = true;
foreach ($originDestinationOption->FlightSegment as $flightSegment) {
$expectedSegments[] = (string) $originDestinationOption['RefNumber'];
$blockedCombinedFare .= (string) $flightSegment->MarketingAirline['Code'].(string) $flightSegment['FlightNumber'].(string) $flightSegment->BookingClassAvails->BookingClassAvail['ResBookDesigCode'];
$operatingAirlines[] = (string) $flightSegment->OperatingAirline['Code'];
$marketingAirlines[] = (string) $flightSegment->MarketingAirline['Code'];
if ((bool) array_intersect($vendorCodes, ['EQ', 'HR'])) {
$paymentValidation = ((in_array((string) $flightSegment->MarketingAirline['Code'], $blockedCompositeAirlines)) || (in_array((string) $flightSegment->OperatingAirline['Code'], $blockedOperatingAirlines))) ? false : $paymentValidation;
} elseif (in_array((string) $flightSegment->MarketingAirline['Code'].(string) $flightSegment['FlightNumber'].(string) $flightSegment->BookingClassAvails->BookingClassAvail['ResBookDesigCode'], $blockedFares['flightCombination'])) {
$dom = dom_import_simplexml($originDestinationOption);
$dom->parentNode->removeChild($dom);
$removedOriginDestinationOption = true;
$isAvailable = false;
break;
}
}
if (!$removedOriginDestinationOption && in_array($blockedCombinedFare, $blockedFares['flightCombination'])) {
$dom = dom_import_simplexml($originDestinationOption);
$dom->parentNode->removeChild($dom);
$isAvailable = false;
}
if ($isAvailable) {
$availableSegments[] = (string) $originDestinationOption['RefNumber'];
}
}
$paymentValidation = (sizeof(array_unique($expectedSegments)) != sizeof(array_unique($availableSegments))) ? false : $paymentValidation;
if ($paymentValidation) {
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
if (isset($fareBreakdown->FareBasisCodes) && isset($fareBreakdown->FareBasisCodes->FareBasisCode)) {
foreach ($fareBreakdown->FareBasisCodes->FareBasisCode as $fareBasisCode) {
if (in_array((string) $fareBasisCode, $blockedCompositeFares)) {
$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;
}
}
}
}
}
}
} else {
$paymentValidation = false;
}
if ($paymentValidation) {
$correlationID = str_replace('CorrelationID=', '', current(explode(';', (string) $pricedItinerary->Notes)));
$baseAmount = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$taxADT = 0;
$taxCHD = 0;
$taxINF = 0;
$resetingValues = false;
$newTotalBase = 0;
$passengerIndex = 0;
$diffIva = 0;
$diffBase = 0;
if (isset($parameters->aviatur_special_markup_airline)) {
$special_markup_params = json_decode($parameters->aviatur_special_markup_airline, true);
}
/* Si es Air Europa, y la agencia de aviatur.com (dev, vaslid, prod, aviaturmeta), no aplicar breakdowns */
$airline_code = ($pricedItinerary->TicketingInfo->TicketingVendor['Code'][0] ?? $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->OperatingAirline['Code'][0]);
$validar_breakdowns = ($airline_code != 'UX' || ($airline_code == 'UX' && !in_array($current_agency, [2, 3, 4, 5])));
if($validar_breakdowns){
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
if ('YR' == substr($tax['TaxCode'], 0, 2) || 'YQ' == substr($tax['TaxCode'], 0, 2)) {
${'tax'.$fareBreakDown->PassengerTypeQuantity['Code']} += $tax['Amount'];
}
}
}
//Markup Airline
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
$taxIndex = 0;
$originalTaxesPassegner = (string) $fareBreakDown->PassengerFare->Taxes['Amount'];
$newTaxesPassenger = 0;
if (!isset($fareBreakDown->FareBasisCodes)) {
continue;
}
foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
$newBase = 0;
if ('YS' == substr($tax['TaxCode'], 0, 2)) {
if (isset($special_markup_params) && 1 == $special_markup_params['parameters']['activation']['general']) {
if (isset($special_markup_params['parameters']['activation']['campaign']) && $special_markup_params['parameters']['activation']['campaign'] == 1) {
$campaignDates = $special_markup_params['campaignDates'];
$today = date('Y-m-d H:i:s');
if ($today >= $campaignDates['start'] && $today <= $campaignDates['end']) {
continue;
}
}
$markupByAirlines = $special_markup_params['parameters']['airlines'];
$ticketingVendor = $pricedItinerary->TicketingInfo->TicketingVendor;
$validatingAirline = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
if (array_key_exists($validatingAirline, $markupByAirlines)) {
$validFare = true;
$indexFareBasis = 0;
foreach ($fareBreakDown->FareBasisCodes->FareBasisCode as $FareBasisCode) {
$fareBasisSegment = substr((string) $FareBasisCode, -2);
if (isset($markupByAirlines[$validatingAirline][$fareBasisSegment])) {
break;
} else if ($indexFareBasis == (count($fareBreakDown->FareBasisCodes->FareBasisCode) - 1)) {
$validFare = false;
}
$indexFareBasis++;
}
if (!$validFare) {
continue;
}
$change_trm = isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM) ? (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->TRM : 1;
$resetingValues = true;
$baseAmount = (string) $fareBreakDown->PassengerFare->BaseFare['Amount'];
$usdBase = (float) ($baseAmount / $change_trm);
$newBaseUsd = round((float) $usdBase * ( 1 + ( $markupByAirlines[$validatingAirline][$fareBasisSegment] / 100)));
$newBase = ceil(round((float) ($newBaseUsd * $change_trm)) / 100) * 100;
$ivaPercentage = (float) (((string) $tax['Amount'] * 100) / ($baseAmount + ${'tax' . $fareBreakDown->PassengerTypeQuantity['Code']}));
$newIva = round((float) ((($newBase + ${'tax' . $fareBreakDown->PassengerTypeQuantity['Code']}) * $ivaPercentage) / 100));
if ($newIva % 10 != 0) {
$newIva += (10 - ($newIva % 10));
}
$diffIva += ($newIva - (string) $tax['Amount']) * $fareBreakDown->PassengerTypeQuantity['Quantity'];
$pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->BaseFare['Amount'] = $newBase;
$pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->Taxes->Tax[$taxIndex]['Amount'] = $newIva;
$newTaxesPassenger = $pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->Taxes['Amount'] = $originalTaxesPassegner + $diffIva;
$diffBase += ($newBase - $baseAmount) * $fareBreakDown->PassengerTypeQuantity['Quantity'];
$newTotalBase += $newBase * $fareBreakDown->PassengerTypeQuantity['Quantity'];
}
}
}
if ($resetingValues) {
$pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown[$passengerIndex]->PassengerFare->TotalFare['Amount'] = $newBase + $newTaxesPassenger;
++$taxIndex;
}
}
++$passengerIndex;
}
}
if ($resetingValues) {
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] = $newTotalBase;
$newTotalTaxes = $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] + $diffIva;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] = $newTotalBase + $newTotalTaxes;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->SpecialMarkup['BaseDiff'] = $diffBase;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->SpecialMarkup['TaxDiff'] = $diffIva;
}
$baseAmount += $taxADT + $taxCHD + $taxINF;
$itFare = (isset($pricedItinerary->AirItineraryPricingInfo->PriceRequestInformation->AirItineraryPricingInfo->PriceRequestInformation->NegotiatedFareCode['TicketDesignatorCode']) && 'IT' == $pricedItinerary->AirItineraryPricingInfo->PriceRequestInformation->AirItineraryPricingInfo->PriceRequestInformation->NegotiatedFareCode['TicketDesignatorCode']) ? 'IT' : '';
$passangerCount = 0;
$taxes_by_person = [];
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
if ('0' != (string) $passangers->PassengerFare->TotalFare['Amount']) {
$passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
}
/* Con esta instrucción, iremos guardando los valores que corresponden a impuestos (sobreescribe en caso de ser necesario) */
$passengersType = (string) $passangers->PassengerTypeQuantity['Code'];
$taxes_by_person['tax'.$passengersType] = ${'tax'.$passengersType};
}
$fee = null;
if ((isset(${'airlinesAgencyIata'.$type.$itFare}) && ((bool) array_intersect(${'airlinesAgencyIata'.$type.$itFare}, $vendorCodes))) || (isset(${'airlinesIata'.$type.$itFare}) && ((bool) array_intersect(${'airlinesIata'.$type.$itFare}, $vendorCodes)))) {
$agencyFee = (isset(${'airlinesAgencyIata'.$type.$itFare}) && ((bool) array_intersect(${'airlinesAgencyIata'.$type.$itFare}, $vendorCodes))) ? 'Agency' : '';
$purgeAirlinesIata = array_unique(array_intersect(${'airlines'.$agencyFee.'Iata'.$type.$itFare}, $vendorCodes));
/* Se manejarƔn variables auxiliares para garantizar una toma correcta del FEE definitivo que aplique la tarifa mƔs alta */
$previousFeeValue = 0;
$fee = null;
$feePrevious = null;
$feeNormal = null;
foreach ($purgeAirlinesIata as $airlineIata) {
$airlineIatasToFee = array_keys(${'airlines'.$agencyFee.'Iata'.$type.$itFare}, $airlineIata);
$feeCycle = null;
foreach ($airlineIatasToFee as $indexFee) {
$optionalFee = $adminFees[${'airlines'.$agencyFee.'Key'.$type.$itFare}[$indexFee]];
if (null != $optionalFee['city_id'] && $optionalFee['city_id'] == (string) $destinationCity->getId()) {
$currentFeeValue = $this->obtainCorrectFeeRegister($optionalFee, $pricedItinerary, $passangerCount, $international, $flights, $baseAmount, ($TRM ?? null), ($responseAdmin ?? null), $taxes_by_person);
if($currentFeeValue > $previousFeeValue){
$previousFeeValue = $currentFeeValue;
$feeCycle = $optionalFee;
$feePrevious = $optionalFee;
} else if($currentFeeValue == $previousFeeValue){
/* Si se tienen 2 calculos con valor igual, se debe priorizar el que tenga feeType GV113 */
if($optionalFee['feeType'] == "GV113"){
$previousFeeValue = $currentFeeValue;
$feeCycle = $optionalFee;
$feePrevious = $optionalFee;
}
}
}
}
if (null == $feeCycle) {
$feeNormal = $adminFees[${'airlines'.$agencyFee.'Key'.$type.$itFare}[array_search($airlineIata, ${'airlines'.$agencyFee.'Iata'.$type.$itFare})]];
$currentFeeValue = $this->obtainCorrectFeeRegister($feeNormal, $pricedItinerary, $passangerCount, $international, $flights, $baseAmount, ($TRM ?? null), ($responseAdmin ?? null), $taxes_by_person);
if($currentFeeValue > $previousFeeValue){
$previousFeeValue = $currentFeeValue;
$feeCycle = $feeNormal;
$feePrevious = $feeNormal;
} else if($currentFeeValue == $previousFeeValue){
/* Si se tienen 2 calculos con valor igual, se debe priorizar el que tenga feeType GV113 */
if($feeNormal['feeType'] == "GV113"){
$previousFeeValue = $currentFeeValue;
$feeCycle = $feeNormal;
$feePrevious = $feeNormal;
}
}
}
}
$fee = $feePrevious;
/* 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 */
if(is_null($fee)){
$fee = $feeNormal;
}
} elseif (isset(${'agencyKey'.$type.$itFare})) {
$fee = $adminFees[${'agencyKey'.$type.$itFare}];
} elseif (isset(${'generalKey'.$type.$itFare})) {
$fee = $adminFees[${'generalKey'.$type.$itFare}];
} else {
$fee = null;
//echo "ERROR: tarifa " . $type . " no encontrada para la aerolinea: " . $airlineIata . " y la agencia con id: " . $agency;
$administrativeCost = 0;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] = '*';
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'//'.$transactionId, 'OneFlewOvertheCuckoosNest');
}
if (!$this->session->has('operatorId')) {
$administrativeCost = 0;
if (isset($fee['rangeType']) && 1 == (int) $fee['rangeType']) {
if ($international) {
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
$passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
$compareValue = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $TRM->getRate()->getFinantialrate();
if (($fee['rangeInternational1Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational1End'])) {
$administrativeCostRange = $fee['valueInternational1'];
} elseif (($fee['rangeInternational2Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational2End'])) {
$administrativeCostRange = $fee['valueInternational2'];
} elseif (($fee['rangeInternational3Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational3End'])) {
$administrativeCostRange = $fee['valueInternational3'];
} elseif (($fee['rangeInternational4Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational4End'])) {
$administrativeCostRange = $fee['valueInternational4'];
} elseif (($fee['rangeInternational4Start'] <= $compareValue) && 0 == $fee['rangeInternational4End']) {
$administrativeCostRange = $fee['valueInternational4'];
} else {
$administrativeCostRange = 0;
}
if (0 == $fee['valueType']) {
$administrativeCost += round($administrativeCostRange * $TRM->getRate()->getFinantialrate() * $fareBreakdown->PassengerTypeQuantity['Quantity']);
} else {
$administrativeCost += round(($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) * $fareBreakdown->PassengerTypeQuantity['Quantity'] * $administrativeCostRange);
}
}
} else {
if (0 == $fee['valueType']) {
if ($flights > 1) {
$administrativeCost = $fee['roundtripNational'];
} else {
$administrativeCost = $fee['onewayNational'];
}
$administrativeCost = $administrativeCost * $passangerCount;
} else {
/*
if ($flights > 1) {
$administrativeCost = $fee['roundtripNational'];
} else {
$administrativeCost = $fee['onewayNational'];
}
*/
//$administrativeCost = $baseAmount * $administrativeCost;
$administrativeCost = $baseAmount * ($fee['nationalFixed'] ?? 0);
}
}
} else {
if ($international) {
$administrativeCost = $fee['internationalFixed'];
if (0 == $fee['valueType']) {
$administrativeCost = round($administrativeCost * $TRM->getRate()->getFinantialrate());
}
} else {
$administrativeCost = ($fee['nationalFixed'] ?? 0);
}
if (isset($fee['rangeType']) && $fee['valueType']) {
$administrativeCost = $baseAmount * $administrativeCost;
} else {
$administrativeCost = $administrativeCost * $passangerCount;
}
}
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] = '*'.$fee['admin_fee_id'];
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'/'.$fee['admin_fee_id'].'/'.$transactionId, 'OneFlewOvertheCuckoosNest');
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $administrativeCost;
}
else {
if ($international) {
$administrativeCost = 0;
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
$passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
$baseAmountCompare = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $TRM;
if (($fee['rangeInternational1Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational1End'])) {
$administrativeCostRange = $fee['valueInternational1'];
} elseif (($fee['rangeInternational2Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational2End'])) {
$administrativeCostRange = $fee['valueInternational2'];
} elseif (($fee['rangeInternational3Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational3End'])) {
$administrativeCostRange = $fee['valueInternational3'];
} elseif (($fee['rangeInternational4Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational4End'])) {
$administrativeCostRange = $fee['valueInternational4'];
} else {
$administrativeCostRange = 0;
}
$fareBreakdown->PassengerFare->AdministrativeCost['Amount'] = $administrativeCostRange * $TRM;
$administrativeCost += $administrativeCostRange * $TRM * $fareBreakdown->PassengerTypeQuantity['Quantity'];
}
if (($qseFees[0]['rangeInternational1Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational1End'])) {
$qseValue = $qseFees[0]['valueInternational1'];
$qseCurrency = $qseFees[0]['currencyInternational1'];
} elseif (($qseFees[0]['rangeInternational2Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational2End'])) {
$qseValue = $qseFees[0]['valueInternational2'];
$qseCurrency = $qseFees[0]['currencyInternational2'];
} elseif (($qseFees[0]['rangeInternational3Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational3End'])) {
$qseValue = $qseFees[0]['valueInternational3'];
$qseCurrency = $qseFees[0]['currencyInternational3'];
} elseif (($qseFees[0]['rangeInternational4Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational4End'])) {
$qseValue = $qseFees[0]['valueInternational4'];
$qseCurrency = $qseFees[0]['currencyInternational4'];
} elseif (($qseFees[0]['rangeInternational5Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $qseFees[0]['rangeInternational5End'])) {
$qseValue = $qseFees[0]['valueInternational5'];
$qseCurrency = $qseFees[0]['currencyInternational5'];
} else {
$qseValue = 0;
$qseCurrency = 'COP';
}
if ('COP' != $qseCurrency) {
$qseValue = $qseValue * $qseTRM;
}
} else {
if ($flights > 1) {
$administrativeCost = $fee['R'];
} else {
$administrativeCost = $fee['O'];
}
$administrativeCost = $administrativeCost * $passangerCount;
$qseValue = $qseFees[0]['value'];
if ('COP' != $qseFees[0]['currency']) {
$qseValue = $qseValue * $qseTRM;
}
}
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] = '*+'.$administrativeCost;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'/+'.$administrativeCost.'/'.$transactionId, 'OneFlewOvertheCuckoosNest');
// $administrativeCost = $administrativeCost * $passangerCount;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += round($administrativeCost);
$qseValue = $qseValue * $passangerCount;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->QSE['Amount'] = $qseValue;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->QSE['TotalAmount'] = $qseValue + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$insurance = ($international ? 2975 : 1975) * $passangerCount;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Insurance['Amount'] = $insurance;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Insurance['TotalAmount'] = $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals['TotalAmount'] = $qseValue + $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'])) {
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'] += round($administrativeCost);
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->QSE['TotalAmountNoDiscount'] = $qseValue + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'];
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Insurance['TotalAmountNoDiscount'] = $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'];
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals['TotalAmountNoDiscount'] = $qseValue + $insurance + (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountNoDiscount'];
//agregado
//mas
}
}
if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->MinTotalFare['Amount'])) {
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Id'] .= '//'.$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->MinTotalFare['Amount'];
}
// $acumulado_tarifa = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'] = round($administrativeCost);
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['AmountWithoutCommissions'] = $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions) && isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Markup_Kiwi)) {
$markup_Kiwi = $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Markup_Kiwi;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'] += $markup_Kiwi;
}
$qse = $qsemax = 0;
if ($isAgent) {
// Valores de dispersión octopus
$TPA = $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions;
$totalValue = $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$totalAdminCostBeforeTaxes = round(($administrativeCost / 1.19) * (float) $taCommissionPercentage); //Ganancia (TA)
// $totalAdminCostBeforeTaxes = round(($taCommissionPercentage / 1) * $administrativeCost);//Ganancia (TA)
$TPA->QSEACTIVE['Value'] = $flightActive;
$TPA->CommissionTA['Value'] = base64_encode($totalAdminCostBeforeTaxes);
$TPA->QSE['Amount'] = (0 == $flightActive) ? $agentQseAmount : $totalValue * $flightpercentage;
// $TPA->CommissionAgent['Value'] = base64_encode((0 == $flightActive) ? round((($agentQseAmount / 1.19) * $productCommissionPercentage)) : round(((($totalValue * $flightpercentage) / 1.19) * $productCommissionPercentage))); // formula anterior
$TPA->CommissionAgent['Value'] = base64_encode((0 == $flightActive) ? round((($agentQseAmount * (1 - 0.19)) * $productCommissionPercentage)) : round(((($totalValue * $flightpercentage) / 1.19) * $productCommissionPercentage))); // Ganancia QSE ($)
$TPA->QSEMAX['Amount'] = (0 == $flightActive) ? $agentQseAmountMax : $totalValue * $flightpercentagemax;
$TPA->AdministrativeCost['AgentCommission'] = round($TPA->AdministrativeCost['Amount']);
$TPA->AgentBussiness['active'] = true;
$qse = (0 == $flightActive) ? $agentQseAmount : $totalValue * $flightpercentage;
$qsemax = (0 == $flightActive) ? $agentQseAmountMax : $totalValue * $flightpercentagemax;
$TPA->QSE['CommissionPay'] = round(base64_decode($TPA->CommissionAgent['Value']) + $totalAdminCostBeforeTaxes);
$TPA->ActiveDetail['Active'] = $activeDetail;
/* * ** OVER AIRLINE **** */
if (isset($airlinesArray)) {
foreach ($airlinesArray as $airlineData) {
$iata = $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline['Code'];
if ($iata == $airlineData->iata) {
$f = 1;
$validAirline = false;
//Valida si es la misma aerolinea en ambos trayectos
foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $rutas) {
if (1 == $f) {
} else {
$iataTemp = $iata;
$iata = $rutas->FlightSegment->MarketingAirline['Code'];
//Compara si la aerlonia es diferente
if (trim($iataTemp) != trim($iata)) {
$validAirline = true;
break;
}
}
++$f;
}
if ($validAirline) {
break;
} else {
$f = 1;
$validAirline = false;
$countFlight = is_countable($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment) ? count($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment) : 0;
foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment as $destinos) {
if (1 == $f) {
$origenPais = explode(':', $destinos->Comment[3]);
$origenCiudad = explode(':', $destinos->Comment[1]);
} else {
$iataTemp = $iata;
$iata = $destinos->MarketingAirline['Code'];
//Compara si la aerlonia es diferente
if (trim($iataTemp) != trim($iata)) {
$validAirline = true;
break;
}
}
if ($f == $countFlight) {
$destinoPais = explode(':', $destinos->Comment[10]);
$destinoCiudad = explode(':', $destinos->Comment[8]);
}
++$f;
}
if ($validAirline) {
break;
} elseif ('1' == $airlineData->overGlobal) {
if ('CO' == trim($origenPais[1]) && 'CO' == trim($destinoPais[1])) {
$TPA->Over['Active'] = true;
$TPA->Over['Name'] = 'Complemento aerolĆnea';
$TPA->Over['Terminos'] = '* Complemento aerolĆnea sujeto a verificación BSP y condiciones de tarifa';
$TPA->Over['Description'] = 'Ganancia total';
$over = $airlineData->overNational;
$overAmount = $totalValue * $over;
$TPA->Over['Amount'] = $overAmount;
$TPA->Over['AmountTotal'] = round($TPA->QSE['CommissionPay'] + $overAmount);
} else {
$TPA->Over['Active'] = true;
$TPA->Over['Name'] = 'Complento aerolĆnea';
$TPA->Over['Terminos'] = '* Complemento aerolĆnea sujeto a verificación BSP y condiciones de tarifa';
$TPA->Over['Description'] = 'Ganancia total';
$over = $airlineData->overInternational;
$overAmount = $totalValue * $over;
$TPA->Over['Amount'] = $overAmount;
$TPA->Over['AmountTotal'] = round($TPA->QSE['CommissionPay'] + $overAmount);
}
} else {
foreach ($airlineData->overGeneral as $airlineDataGeneral) {
$existOverOrigin = false;
$existOverDestino = false;
foreach ($airlineDataGeneral->origin as $origin) {
$origenInfo = explode('-', $origin);
if ('Global' == $origenInfo[1]) {
if (trim($origenInfo[0]) == trim($origenPais[1])) {
$existOverOrigin = true;
break;
}
} else {
if (trim($origenInfo[0]) == trim($origenPais[1]) && trim($origenInfo[1]) == trim($origenCiudad[1])) {
$existOverOrigin = true;
break;
}
}
}
foreach ($airlineDataGeneral->destination as $destination) {
$destinationInfo = explode('-', $destination);
if ('Global' == $destinationInfo[1]) {
if (trim($destinationInfo[0]) == trim($destinoPais[1])) {
$existOverDestino = true;
break;
}
} else {
if (trim($destinationInfo[0]) == trim($destinoPais[1]) && trim($destinationInfo[1]) == trim($destinoCiudad[1])) {
$existOverDestino = true;
break;
}
}
}
if (true == $existOverOrigin && true == $existOverDestino) {
$TPA->Over['Active'] = true;
$TPA->Over['Name'] = 'Complento aerolĆnea';
$TPA->Over['Terminos'] = '* Complemento aerolĆnea sujeto a verificación BSP y condiciones de tarifa';
$TPA->Over['Description'] = 'Ganancia total';
$over = $airlineDataGeneral->commission;
$overAmount = $totalValue * $over;
$TPA->Over['Amount'] = $overAmount;
$TPA->Over['AmountTotal'] = round($TPA->QSE['CommissionPay'] + $overAmount);
break;
}
}
}
}
}
}
}
}
$pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->MarketingAirline;
$this->scanFareConditions($pricedItinerary);
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $qse;
if (isset($OTA_AirLowFareSearchRS['specialDiscountPayoutExtra'])) {
$pricedItinerary->AirItineraryPricingInfo['specialDiscountPayoutExtra'] = (string) $OTA_AirLowFareSearchRS['specialDiscountPayoutExtra'];
}
if (isset($OTA_AirLowFareSearchRS['specialDiscountPayoutExtraId'])) {
$pricedItinerary->AirItineraryPricingInfo['specialDiscountPayoutExtraId'] = (string) $OTA_AirLowFareSearchRS['specialDiscountPayoutExtraId'];
}
$ticketingVendor = $pricedItinerary->TicketingInfo->TicketingVendor;
$validatingAirline = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
$options[$pi][$key]['airline'] = $validatingAirline;
$options[$pi][$key]['amount'] = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$options[$pi][$key]['xml'] = $pricedItinerary->asXml();
$key++;
}
$timerLog .= 'admin fee step 16 pricedItinerary End '.$pricedCounter.' '.microtime().'';
++$pricedCounter;
}
++$pi;
}
$timerLog .= 'admin fee step 16 '.microtime().'';
if (0 == sizeof($options)) {
return 'no-filtered-options';
}
for ($i = 0, $count = \count($options); $i < $count; ++$i) {
usort($options[$i], function ($a, $b) {
if ($a['amount'] - $b['amount'] == 0) {
$airlineSpecialOrder = ['CM', 'UX'];
if (!in_array($a['airline'], $airlineSpecialOrder)) {
return 1;
} else {
return 0;
}
} else {
return $a['amount'] - $b['amount'];
}
});
}
$timerLog .= 'admin fee step 17 '.microtime().'';
$responseXml = explode('<PricedItineraries>', str_replace('</PricedItineraries>', '<PricedItineraries>', $response->asXml()));
$orderedResponse = $responseXml[0];
$timerLog .= 'admin fee step 18 '.microtime().'';
foreach ($options as $optionPi) {
$orderedResponse .= '<PricedItineraries>';
foreach ($optionPi as $option) {
$orderedResponse .= $option['xml'];
}
$orderedResponse .= '</PricedItineraries>';
}
$timerLog .= 'admin fee step 19 '.microtime().'';
$orderedResponse .= $responseXml[sizeof($responseXml) - 1];
$return = simplexml_load_string($orderedResponse);
$timerLog .= 'admin fee step 20 '.microtime().'';
$this->session->set($transactionId.'[flight][adminFeeTimerLog]', $timerLog);
return $return;
} else {
$this->errorHandler->errorRedirectNoEmail('', 'Error TA. The PriceItinerary was not found in this response:', print_r($response, true));
return ['error' => 'invalid response'];
}
}
public function multiRequest(array $requests, $method = null, $transactionId = null)
{
$domain = $this->requestStack->getCurrentRequest()->getHost();
$parametersJson = $this->session->get($domain.'[parameters]', '');
$parameters = json_decode($parametersJson);
if ('MPA' == $parameters->aviatur_service_web_request_type) {
$url = $parameters->aviatur_service_web_url_mpa;
} elseif ('MPB' == $parameters->aviatur_service_web_request_type) {
$url = $parameters->aviatur_service_web_url_air_mpb;
} else {
return 'Mala configuración de webservice para combinaciones';
}
$handles = [];
$timeout = 100;
$defaultOptions = [
CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_MAXREDIRS => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CONNECTTIMEOUT => $timeout,
CURLOPT_POST => true,
];
// add curl options to each handle
foreach ($requests as $k => $request) {
$headers = [
'POST /AmadeusLATAM.Aviatur.Services/services/mpaservice.asmx HTTP/1.1',
'Content-Type: text/xml; charset=utf-8',
'Content-Length: '.strlen($request),
'SOAPAction: "http://tempuri.org/Execute"',
];
$options = $defaultOptions;
$options += [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $request,
];
$ch[$k] = curl_init();
$opt = curl_setopt_array($ch[$k], $options);
$handles[$k] = $ch[$k];
$this->logSave->logSave($request, $method, 'RQ', $transactionId);
}
$mh = curl_multi_init();
// add handles
foreach ($handles as $k => $handle) {
$err = curl_multi_add_handle($mh, $handle);
}
$running_handles = null;
do {
curl_multi_exec($mh, $running_handles);
curl_multi_select($mh);
} while ($running_handles > 0);
$response = [];
foreach ($requests as $k => $request) {
if ('AirAvail' != $method) {
$response[$k]['error'] = curl_error($handles[$k]);
}
if (!empty($response[$k]['error'])) {
$response[$k]['data'] = '';
$this->logSave->logSave($response[$k]['error'], $method, 'RS', $transactionId);
} else {
$response[$k]['data'] = curl_multi_getcontent($handles[$k]); // get results
$this->logSave->logSave($response[$k]['data'], $method, 'RS', $transactionId);
}
// close current handler
curl_multi_remove_handle($mh, $handles[$k]);
}
curl_multi_close($mh);
return $response;
}
public function orderCombinationResponse($xmlResponseSegment1, $method, $optionsLimit = INF)
{
$key = 0;
$options = [];
foreach ($xmlResponseSegment1->Message->$method->PricedItineraries->PricedItinerary as $pricedItinerary) {
$options[$key]['amount'] = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$options[$key]['xml'] = $pricedItinerary->asXml();
++$key;
}
usort($options, fn($a, $b) => $a['amount'] - $b['amount']);
$responseXml = explode('<PricedItineraries>', str_replace('</PricedItineraries>', '<PricedItineraries>', $xmlResponseSegment1->asXml()));
$orderedResponse = $responseXml[0].'<PricedItineraries>';
$key = 0;
foreach ($options as $option) {
$orderedResponse .= $option['xml'];
if ($key == $optionsLimit) {
break;
}
++$key;
}
$orderedResponse .= '</PricedItineraries>'.$responseXml[sizeof($responseXml) - 1];
return \simplexml_load_string($orderedResponse);
}
public function scanFareConditions($pricedItinerary)
{
foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestinationOption) {
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
if (!isset($fareBreakDown->FareBasisCodes->FareBasisCode)) {
break;
}
$fareBasisCount = 0;
foreach ($fareBreakDown->FareBasisCodes->FareBasisCode as $fareBasisCode) {
if (!isset($originDestinationOption->FlightSegment[$fareBasisCount])) {
break;
}
if ((int) $originDestinationOption['RefNumber'] == (int) $fareBasisCode['FlightSegmentRPH'] - 1) {
$marketingAirline = $originDestinationOption->FlightSegment[$fareBasisCount]->MarketingAirline['Code'];
$conditions = [];
// PENDING: Dynamic data Branded Fares
if ('LA' == $marketingAirline || '4C' == $marketingAirline) { // Latam
// check for branded fare (SN: 'Promo', SL: 'Light', SE: 'Plus', SF: 'Top')
$brandedFare = substr((string) $fareBasisCode, 3, 2);
if (in_array($brandedFare, ['SN', 'SL', 'SE', 'SF'])) {
switch ($brandedFare) {
// 0 -> not allowed
// 1 -> charged
// 2 -> allowed
case 'SN':
$conditions = ['Refund' => 0, 'Reschedule' => 0, 'Luggage' => 1, 'SeatSelection' => 0, 'SeatFavorite' => 0, 'Ffp' => 0];
break;
case 'SL':
$conditions = ['Refund' => 0, 'Reschedule' => 0, 'Luggage' => 1, 'SeatSelection' => 1, 'SeatFavorite' => 1, 'Ffp' => 2];
break;
case 'SE':
$conditions = ['Refund' => 1, 'Reschedule' => 1, 'Luggage' => 2, 'SeatSelection' => 2, 'SeatFavorite' => 1, 'Ffp' => 2];
break;
case 'SF':
$conditions = ['Refund' => 2, 'Reschedule' => 2, 'Luggage' => 2, 'SeatSelection' => 2, 'SeatFavorite' => 2, 'Ffp' => 2];
break;
}
}
} elseif ('FC' == $marketingAirline || 'V1' == $marketingAirline) { // VivaAir
// check for branded fare (SN: 'Promo', SL: 'Light', SE: 'Plus', SF: 'Top')
$brandedFare = substr((string) $fareBasisCode, 0, 2);
if (in_array($brandedFare, ['VI', 'FB', 'FS', 'FF'])) {
switch ($brandedFare) {
// 0 -> not allowed
// 1 -> charged
// 2 -> allowed
case 'VI':
$conditions = ['Refund' => 0, 'Reschedule' => 1, 'Luggage' => 1, 'SeatSelection' => 0, 'SeatFavorite' => 1, 'Ffp' => 0, 'CounterCheckin' => 1];
break;
case 'FB':
$conditions = ['Refund' => 0, 'Reschedule' => 1, 'Luggage' => 1, 'SeatSelection' => 0, 'SeatFavorite' => 1, 'Ffp' => 0, 'CounterCheckin' => 1];
break;
case 'FS':
$conditions = ['Refund' => 0, 'Reschedule' => 1, 'Luggage' => 2, 'SeatSelection' => 0, 'SeatFavorite' => 1, 'Ffp' => 0, 'CounterCheckin' => 1];
break;
case 'FF':
$conditions = ['Refund' => 0, 'Reschedule' => 2, 'Luggage' => 2, 'SeatSelection' => 2, 'SeatFavorite' => 2, 'Ffp' => 0, 'CounterCheckin' => 2];
break;
}
}
}
if (!empty($conditions)) {
$originDestinationOption->FlightSegment[$fareBasisCount]->FareConditions = $this->objectDecrementalFill($conditions, $originDestinationOption->FlightSegment[$fareBasisCount]->FareConditions);
$originDestinationOption->FareConditions = $this->objectDecrementalFill($conditions, $originDestinationOption->FareConditions); // store most restrictive fare conditions in OriginDestinationOption
}
++$fareBasisCount;
}
}
}
}
}
public function objectDecrementalFill($conditions, $object)
{
foreach ($conditions as $condition => $requirement) {
$object[$condition] = (isset($object[$condition]) && (((int) $object[$condition]) < $requirement)) ? $object[$condition] : $requirement;
}
return $object;
}
private function obtainCorrectFeeRegister($fee, $pricedItinerary, $passangerCount, $international, $flights, $baseAmount, $TRM = null, $responseAdmin = null, $taxes_by_person = []){
$administrativeCostTemp = 0;
if (is_null($fee)) {
return 0;
}
if (!$this->session->has('operatorId')) {
$administrativeCostTemp = 0;
if (isset($fee['rangeType']) && 1 == (int) $fee['rangeType']) {
if ($international) {
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
$passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
//$compareValue = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $TRM->getRate()->getFinantialrate();
$compareValue = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + (isset($taxes_by_person['tax'.$passengersType]) ? $taxes_by_person['tax'.$passengersType] : 0)) / $TRM->getRate()->getFinantialrate();
if (($fee['rangeInternational1Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational1End'])) {
$administrativeCostRange = $fee['valueInternational1'];
} elseif (($fee['rangeInternational2Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational2End'])) {
$administrativeCostRange = $fee['valueInternational2'];
} elseif (($fee['rangeInternational3Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational3End'])) {
$administrativeCostRange = $fee['valueInternational3'];
} elseif (($fee['rangeInternational4Start'] <= $compareValue) && ($compareValue <= $fee['rangeInternational4End'])) {
$administrativeCostRange = $fee['valueInternational4'];
} elseif (($fee['rangeInternational4Start'] <= $compareValue) && 0 == $fee['rangeInternational4End']) {
$administrativeCostRange = $fee['valueInternational4'];
} else {
$administrativeCostRange = 0;
}
if (0 == $fee['valueType']) {
$administrativeCostTemp += round($administrativeCostRange * $TRM->getRate()->getFinantialrate() * $fareBreakdown->PassengerTypeQuantity['Quantity']);
} else {
//$administrativeCostTemp += round(($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) * $fareBreakdown->PassengerTypeQuantity['Quantity'] * $administrativeCostRange);
$administrativeCostTemp += round(($fareBreakdown->PassengerFare->BaseFare['Amount'] + (isset($taxes_by_person['tax'.$passengersType]) ? $taxes_by_person['tax'.$passengersType] : 0)) * $fareBreakdown->PassengerTypeQuantity['Quantity'] * $administrativeCostRange);
}
}
} else {
if (0 == $fee['valueType']) {
if ($flights > 1) {
$administrativeCostTemp = $fee['roundtripNational'];
} else {
$administrativeCostTemp = $fee['onewayNational'];
}
$administrativeCostTemp = $administrativeCostTemp * $passangerCount;
} else {
$administrativeCostTemp = $baseAmount * $fee['nationalFixed'];
}
}
} else {
if ($international) {
$administrativeCostTemp = $fee['internationalFixed'];
if (0 == $fee['valueType']) {
$administrativeCostTemp = round($administrativeCostTemp * $TRM->getRate()->getFinantialrate());
}
} else {
$administrativeCostTemp = $fee['nationalFixed'];
}
if (isset($fee['rangeType']) && $fee['valueType']) {
$administrativeCostTemp = $baseAmount * $administrativeCostTemp;
} else {
$administrativeCostTemp = $administrativeCostTemp * $passangerCount;
}
}
}
else {
if ($international) {
$administrativeCostTemp = 0;
$tasaRepMercado = (float) $responseAdmin->MENSAJE->VALORES_TARIFA_ADMINISTRATIVA->TASA_CAMBIO;;
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakdown) {
$passengersType = (string) $fareBreakdown->PassengerTypeQuantity['Code'];
$baseAmountCompare = ($fareBreakdown->PassengerFare->BaseFare['Amount'] + ${'tax'.$passengersType}) / $tasaRepMercado;
if (($fee['rangeInternational1Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational1End'])) {
$administrativeCostRange = $fee['valueInternational1'];
} elseif (($fee['rangeInternational2Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational2End'])) {
$administrativeCostRange = $fee['valueInternational2'];
} elseif (($fee['rangeInternational3Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational3End'])) {
$administrativeCostRange = $fee['valueInternational3'];
} elseif (($fee['rangeInternational4Start'] <= $baseAmountCompare) && ($baseAmountCompare <= $fee['rangeInternational4End'])) {
$administrativeCostRange = $fee['valueInternational4'];
} else {
$administrativeCostRange = 0;
}
$administrativeCostTemp += $administrativeCostRange * $tasaRepMercado * $fareBreakdown->PassengerTypeQuantity['Quantity'];
}
} else {
if ($flights > 1) {
$administrativeCostTemp = $fee['R'];
} else {
$administrativeCostTemp = $fee['O'];
}
$administrativeCostTemp = $administrativeCostTemp * $passangerCount;
}
}
return $administrativeCostTemp;
}
/**
* recalculateRouteBranchToApplyAllDiscount()
* 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)
* Author: Ing. David Rincon
* Email: david.rincon@aviatur.com
* Date: 2024/11/14
* @param $pricedItinerary (Direct Object).
* @return void
*/
public function recalculateRouteBranchToApplyAllDiscount($pricedItinerary){
$airItineraryPricingInfo = isset($pricedItinerary->AirItineraryPricingInfo) ? 'AirItineraryPricingInfo' : 'PriceInfo';
$totalBaseFare = 0;
$totalTaxes = 0;
$totalTotalFare = 0;
$discountAviatur = 0;
foreach ($pricedItinerary->$airItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
$trm = $fareBreakDown->PassengerFare->BaseFare['AuxTRM'];
$baseFare = (int) $fareBreakDown->PassengerFare->BaseFare['AuxAmount'];
$taxes = (int) $fareBreakDown->PassengerFare->Taxes['AuxAmount'];
$totalFare = (int) $fareBreakDown->PassengerFare->TotalFare['AuxAmount'];
if (0 != $baseFare) {
$ivaTaxBefore = $fareBreakDown->PassengerFare->BaseFare['AuxIvaTaxBefore'];
foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
if (isset($tax['Amount']) && ('YS' == substr($tax['TaxCode'], 0, 2))) {
$ivaTaxBefore = (int) $tax['Amount'];
}
}
$ivaPercentage = round(($ivaTaxBefore / $baseFare), 3);
$ivaDiscount = 0;
$ivaTaxAfter = $ivaTaxBefore;
$discountValue = $fareBreakDown->PassengerFare->BaseFare['AuxDiscountValue'];
// if (0 != $ivaPercentage) {
// $discountValue = round($discountValue / (1 + $ivaPercentage));
// }
// //$newBaseFare = ceil($baseFare / $trm) - $discountValue;
// $newBaseFare = ($baseFare / $trm) - $discountValue;
// if (0 != $ivaPercentage) {
// //$ivaTaxAfter = ceil(($newBaseFare * $ivaPercentage * $trm) / 10) * 10;
// $ivaTaxAfter = ($newBaseFare * $ivaPercentage * $trm);
// $ivaDiscount = $ivaTaxBefore - $ivaTaxAfter;
// $taxes = $taxes - $ivaDiscount;
// }
// foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
// if (isset($tax['Amount']) && ('YS' == substr($tax['TaxCode'], 0, 2))) {
// $tax['DiscountAviatur'] = $ivaDiscount;
// }
// }
// //$fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = $baseFare - (ceil($newBaseFare * $trm / 100) * 100);
// $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = $baseFare - ($newBaseFare * $trm);
// $baseFare = $newBaseFare;
$baseFare = $baseFare * $trm;
//$baseFare = ceil($baseFare / 100) * 100;
$paxTypeQuantity = (isset($fareBreakDown->PassengerTypeQuantity)) ? (int) $fareBreakDown->PassengerTypeQuantity['Quantity'] : (int) $fareBreakDown->PassengerTypeQuantityType['Quantity'];
$fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = $discountValue;
$totalFare = $baseFare + $taxes - $discountValue;
$tempDiscountAviatur = 0;
// if (isset($fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'])) {
// if ((float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] != (float) ($fareBreakDown->PassengerFare->BaseFare['AuxAmount'] - $baseFare)) {
// $fareBreakDown->PassengerFare->BaseFare['DiscountAviaturDifference'] = (float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'].'=!'.(float) ($fareBreakDown->PassengerFare->BaseFare['AuxAmount'] - $baseFare);
// $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'] = (float) $fareBreakDown->PassengerFare->BaseFare['AuxAmount'] - $baseFare;
// }
// $tempDiscountAviatur += (float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'];
// }
$tempDiscountAviatur += (float) $fareBreakDown->PassengerFare->BaseFare['DiscountAviatur'];
$fareBreakDown->PassengerFare->BaseFare['Amount'] = $baseFare;
$fareBreakDown->PassengerFare->Taxes['Amount'] = $taxes;
$fareBreakDown->PassengerFare->TotalFare['Amount'] = $totalFare;
foreach ($fareBreakDown->PassengerFare->Taxes->Tax as $tax) {
if (isset($tax['Amount']) && ('YS' == substr($tax['TaxCode'], 0, 2))) {
$tax['Amount'] = $ivaTaxBefore - $ivaDiscount;
$tempDiscountAviatur += $ivaDiscount;
}
}
$discountAviatur += $tempDiscountAviatur * $paxTypeQuantity;
$totalBaseFare += ((int) $baseFare * $paxTypeQuantity);
$totalTaxes += ((int) $taxes * $paxTypeQuantity);
$totalTotalFare += ((int) $totalFare * $paxTypeQuantity);
}
if (0 != $totalTotalFare) {
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->DiscountInformationAviatur['TrmAmountAviatur'] = ceil((int) $pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] / $trm);
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] = (int) $totalBaseFare;
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscountAviatur'] = true;
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] = (int) $totalTaxes;
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] = (int) $totalTotalFare;
if (isset($discountAviatur) && (0 != $discountAviatur)) {
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->DiscountInformationAviatur['Discount'] = (int)$discountAviatur;
$pricedItinerary->$airItineraryPricingInfo->ItinTotalFare->DispersionOverride = 'true';
}
}
}
}
}