Go to the documentation of this file.00001
00002
00003
00004
00005 #include <cassert>
00006
00007 #include <stdair/basic/BasConst_Request.hpp>
00008 #include <stdair/bom/BomManager.hpp>
00009 #include <stdair/bom/BomRoot.hpp>
00010 #include <stdair/bom/Inventory.hpp>
00011 #include <stdair/bom/FlightDate.hpp>
00012 #include <stdair/bom/SegmentDate.hpp>
00013 #include <stdair/bom/SegmentCabin.hpp>
00014 #include <stdair/bom/FareFamily.hpp>
00015 #include <stdair/bom/BookingClass.hpp>
00016 #include <stdair/bom/TravelSolutionStruct.hpp>
00017 #include <stdair/bom/AirportPair.hpp>
00018 #include <stdair/bom/PosChannel.hpp>
00019 #include <stdair/bom/DatePeriod.hpp>
00020 #include <stdair/bom/TimePeriod.hpp>
00021 #include <stdair/bom/YieldFeatures.hpp>
00022 #include <stdair/bom/AirlineClassList.hpp>
00023 #include <stdair/factory/FacBomManager.hpp>
00024 #include <stdair/service/Logger.hpp>
00025
00026 #include <airrac/AIRRAC_Types.hpp>
00027 #include <airrac/command/YieldManager.hpp>
00028
00029 namespace AIRRAC {
00030
00031
00032 YieldManager::YieldManager() {
00033 assert (false);
00034 }
00035
00036
00037 YieldManager::YieldManager (const YieldManager&) {
00038 assert (false);
00039 }
00040
00041
00042 YieldManager::~YieldManager() {
00043 }
00044
00045
00046 void YieldManager::
00047 calculateYield (stdair::TravelSolutionList_T& ioTravelSolutionList,
00048 const stdair::BomRoot& iBomRoot) {
00049
00050
00051 for (stdair::TravelSolutionList_T::iterator itTravelSolution =
00052 ioTravelSolutionList.begin();
00053 itTravelSolution != ioTravelSolutionList.end(); ++itTravelSolution) {
00054 stdair::TravelSolutionStruct& lTravelSolution = *itTravelSolution;
00055
00056
00057 YieldManager::calculateYield (lTravelSolution, iBomRoot);
00058 }
00059 }
00060
00061
00062 void YieldManager::
00063 calculateYield (stdair::TravelSolutionStruct& ioTravelSolution,
00064 const stdair::BomRoot& iBomRoot) {
00065
00066
00067
00068
00069
00070 }
00071
00072
00073 void YieldManager::updateYields (const stdair::BomRoot& iBomRoot) {
00074
00075 const stdair::InventoryList_T lInvList =
00076 stdair::BomManager::getList<stdair::Inventory> (iBomRoot);
00077 for (stdair::InventoryList_T::const_iterator itInv = lInvList.begin();
00078 itInv != lInvList.end(); ++itInv) {
00079 const stdair::Inventory* lInv_ptr = *itInv;
00080 assert (lInv_ptr != NULL);
00081
00082
00083 const stdair::AirlineCode_T& lAirlineCode = lInv_ptr->getAirlineCode();
00084
00085
00086 const stdair::FlightDateList_T& lFDList =
00087 stdair::BomManager::getList<stdair::FlightDate> (*lInv_ptr);
00088 for (stdair::FlightDateList_T::const_iterator itFD = lFDList.begin();
00089 itFD != lFDList.end(); ++itFD) {
00090 const stdair::FlightDate* lFD_ptr = *itFD;
00091 assert (lFD_ptr != NULL);
00092
00093
00094 const stdair::SegmentDateList_T& lSDList =
00095 stdair::BomManager::getList<stdair::SegmentDate> (*lFD_ptr);
00096 for (stdair::SegmentDateList_T::const_iterator itSD = lSDList.begin();
00097 itSD != lSDList.end(); ++itSD) {
00098 const stdair::SegmentDate* lSD_ptr = *itSD;
00099 assert (lSD_ptr != NULL);
00100
00101
00102 const stdair::AirportCode_T& lOrigin = lSD_ptr->getBoardingPoint();
00103 const stdair::AirportCode_T& lDestination = lSD_ptr->getOffPoint();
00104
00105
00106 const stdair::AirportPairKey lAirportPairKey (lOrigin, lDestination);
00107 stdair::AirportPair* lAirportPair_ptr = stdair::BomManager::
00108 getObjectPtr<stdair::AirportPair> (iBomRoot,
00109 lAirportPairKey.toString());
00110 if (lAirportPair_ptr == NULL) {
00111 STDAIR_LOG_ERROR ("Cannot find yield corresponding to the airport "
00112 << "pair: " << lAirportPairKey.toString());
00113 assert (false);
00114 }
00115
00116
00117 const stdair::Date_T& lDate = lSD_ptr->getBoardingDate();
00118 const stdair::Duration_T& lTime = lSD_ptr->getBoardingTime();
00119
00120
00121 const stdair::DatePeriodList_T& lDatePeriodList =
00122 stdair::BomManager::getList<stdair::DatePeriod> (*lAirportPair_ptr);
00123 for (stdair::DatePeriodList_T::const_iterator itDatePeriod =
00124 lDatePeriodList.begin();
00125 itDatePeriod != lDatePeriodList.end(); ++itDatePeriod) {
00126 const stdair::DatePeriod* lDatePeriod_ptr = *itDatePeriod;
00127 assert (lDatePeriod_ptr != NULL);
00128
00129 const bool isDepartureDateValid =
00130 lDatePeriod_ptr->isDepartureDateValid (lDate);
00131
00132 if (isDepartureDateValid == true) {
00133
00134
00135 const stdair::PosChannelKey lPosChannelKey (stdair::DEFAULT_POS,
00136 stdair::DEFAULT_CHANNEL);
00137 stdair::PosChannel* lPosChannel_ptr = stdair::BomManager::
00138 getObjectPtr<stdair::PosChannel> (*lDatePeriod_ptr,
00139 lPosChannelKey.toString());
00140 if (lPosChannel_ptr == NULL) {
00141 STDAIR_LOG_ERROR ("Cannot find yield corresponding to the PoS-"
00142 << "Channel: " << lPosChannelKey.toString());
00143 assert (false);
00144 }
00145
00146
00147 const stdair::TimePeriodList_T& lTimePeriodList = stdair::
00148 BomManager::getList<stdair::TimePeriod> (*lPosChannel_ptr);
00149 for (stdair::TimePeriodList_T::const_iterator itTimePeriod =
00150 lTimePeriodList.begin();
00151 itTimePeriod != lTimePeriodList.end(); ++itTimePeriod) {
00152 const stdair::TimePeriod* lTimePeriod_ptr = *itTimePeriod;
00153 assert (lTimePeriod_ptr != NULL);
00154
00155 const bool isDepartureTimeValid =
00156 lTimePeriod_ptr->isDepartureTimeValid (lTime);
00157
00158 if (isDepartureTimeValid == true) {
00159 updateYields (*lSD_ptr, *lTimePeriod_ptr, lAirlineCode);
00160 }
00161 }
00162 }
00163 }
00164 }
00165 }
00166 }
00167 }
00168
00169
00170 void YieldManager::updateYields (const stdair::SegmentDate& iSegmentDate,
00171 const stdair::TimePeriod& iTimePeriod,
00172 const stdair::AirlineCode_T& iAirlineCode) {
00173
00174
00175 const stdair::SegmentCabinList_T& lSegmentCabinList =
00176 stdair::BomManager::getList<stdair::SegmentCabin> (iSegmentDate);
00177 for (stdair::SegmentCabinList_T::const_iterator itSC =
00178 lSegmentCabinList.begin(); itSC != lSegmentCabinList.end(); ++itSC) {
00179 const stdair::SegmentCabin* lSegmentCabin_ptr = *itSC;
00180 assert (lSegmentCabin_ptr != NULL);
00181
00182 const stdair::CabinCode_T& lCabinCode = lSegmentCabin_ptr->getCabinCode();
00183 const stdair::TripType_T lTripType (stdair::TRIP_TYPE_ONE_WAY);
00184 const stdair::YieldFeaturesKey lYieldFeaturesKey (lTripType,
00185 lCabinCode);
00186 const stdair::YieldFeatures* lYieldFeatures_ptr = stdair::BomManager::
00187 getObjectPtr<stdair::YieldFeatures> (iTimePeriod,
00188 lYieldFeaturesKey.toString());
00189 if (lYieldFeatures_ptr == NULL) {
00190 STDAIR_LOG_ERROR ("Cannot find the yield features corresponding to "
00191 << iTimePeriod.describeKey() << ", "
00192 << lCabinCode << " and " << lTripType);
00193 assert (false);
00194 }
00195
00196
00197 const stdair::FareFamilyList_T& lFFlist = stdair::BomManager::
00198 getList<stdair::FareFamily> (*lSegmentCabin_ptr);
00199 for (stdair::FareFamilyList_T::const_iterator itFF = lFFlist.begin();
00200 itFF != lFFlist.end(); ++itFF) {
00201 const stdair::FareFamily* lFF_ptr = *itFF;
00202 assert (lFF_ptr != NULL);
00203
00204 const stdair::BookingClassList_T& lBCList = stdair::BomManager::
00205 getList<stdair::BookingClass> (*lFF_ptr);
00206 for (stdair::BookingClassList_T::const_iterator itBC = lBCList.begin();
00207 itBC != lBCList.end(); ++itBC) {
00208 stdair::BookingClass* lBookingClass_ptr = *itBC;
00209 assert (lBookingClass_ptr != NULL);
00210
00211 const stdair::ClassCode_T& lClassCode =
00212 lBookingClass_ptr->getClassCode();
00213 stdair::AirlineCodeList_T lAirlineCodeList;
00214 lAirlineCodeList.push_back (iAirlineCode);
00215 stdair::ClassList_StringList_T lClassList;
00216 lClassList.push_back (lClassCode);
00217 const stdair::AirlineClassListKey lACListKey (lAirlineCodeList,
00218 lClassList);
00219
00220 const stdair::AirlineClassList* lAirlineClassList_ptr = stdair::
00221 BomManager::getObjectPtr<stdair::AirlineClassList> (*lYieldFeatures_ptr, lACListKey.toString());
00222 if (lAirlineClassList_ptr != NULL) {
00223 const stdair::Yield_T& lYield = lAirlineClassList_ptr->getYield();
00224 lBookingClass_ptr->setYield (lYield);
00225
00226
00227 STDAIR_LOG_DEBUG ("Update yield of " << lYield << " for "
00228 << iAirlineCode << ", "
00229 << iSegmentDate.describeKey() << ", "
00230 << lBookingClass_ptr->describeKey());
00231 }
00232 }
00233 }
00234 }
00235 }
00236 }