7 #include <stdair/bom/BomRetriever.hpp>
8 #include <stdair/bom/BomManager.hpp>
9 #include <stdair/bom/Inventory.hpp>
10 #include <stdair/bom/FlightDate.hpp>
11 #include <stdair/bom/SegmentDate.hpp>
12 #include <stdair/bom/SegmentCabin.hpp>
13 #include <stdair/bom/FareFamily.hpp>
14 #include <stdair/bom/BookingClass.hpp>
15 #include <stdair/bom/GuillotineBlock.hpp>
16 #include <stdair/bom/TravelSolutionStruct.hpp>
17 #include <stdair/service/Logger.hpp>
18 #include <stdair/bom/LegCabin.hpp>
29 const stdair::FlightDateList_T& lFlightDateList =
30 stdair::BomManager::getList<stdair::FlightDate> (iInventory);
33 for (stdair::FlightDateList_T::const_iterator itFlightDate =
34 lFlightDateList.begin();
35 itFlightDate != lFlightDateList.end(); ++itFlightDate) {
36 const stdair::FlightDate* lCurrentFlightDate_ptr = *itFlightDate;
37 assert (lCurrentFlightDate_ptr != NULL);
45 const std::string& iFullSegmentDateKey,
46 stdair::TravelSolutionStruct& ioTravelSolution) {
49 stdair::ClassAvailabilityMap_T lClassAvailabilityMap;
52 STDAIR_LOG_DEBUG (iFullSegmentDateKey);
54 stdair::SegmentDate* lSegmentDate_ptr =
55 stdair::BomRetriever::retrieveSegmentDateFromLongKey(iInventory,
57 assert (lSegmentDate_ptr != NULL);
61 const stdair::SegmentCabinList_T& lSegmentCabinList =
62 stdair::BomManager::getList<stdair::SegmentCabin> (*lSegmentDate_ptr);
63 for (stdair::SegmentCabinList_T::const_iterator itCabin =
64 lSegmentCabinList.begin();
65 itCabin != lSegmentCabinList.end(); ++itCabin) {
66 stdair::SegmentCabin* lSegmentCabin_ptr = *itCabin;
67 assert (lSegmentCabin_ptr != NULL);
73 const stdair::BookingClassList_T& lBCList =
74 stdair::BomManager::getList<stdair::BookingClass> (*lSegmentCabin_ptr);
75 for (stdair::BookingClassList_T::const_reverse_iterator itBC =
76 lBCList.rbegin(); itBC != lBCList.rend(); ++itBC) {
77 stdair::BookingClass* lBC_ptr = *itBC;
78 assert (lBC_ptr != NULL);
80 const stdair::Availability_T lAvl = lBC_ptr->getSegmentAvailability();
82 const stdair::ClassCode_T& lClassCode = lBC_ptr->getClassCode();
83 const bool insertSuccessful = lClassAvailabilityMap.
84 insert (stdair::ClassAvailabilityMap_T::value_type (lClassCode,
86 assert (insertSuccessful ==
true);
91 ioTravelSolution.addClassAvailabilityMap (lClassAvailabilityMap);
98 const std::string& iFullSegmentDateKey,
99 stdair::TravelSolutionStruct& ioTravelSolution) {
104 stdair::ClassYieldMap_T lClassYieldMap;
106 stdair::ClassBpvMap_T lClassBpvMap;
109 STDAIR_LOG_DEBUG (iFullSegmentDateKey);
111 stdair::SegmentDate* lSegmentDate_ptr =
112 stdair::BomRetriever::retrieveSegmentDateFromLongKey (iInventory,
113 iFullSegmentDateKey);
114 assert (lSegmentDate_ptr != NULL);
118 const stdair::SegmentCabinList_T& lSegmentCabinList =
119 stdair::BomManager::getList<stdair::SegmentCabin> (*lSegmentDate_ptr);
120 for (stdair::SegmentCabinList_T::const_iterator itCabin =
121 lSegmentCabinList.begin();
122 itCabin != lSegmentCabinList.end(); ++itCabin) {
123 stdair::SegmentCabin* lSegmentCabin_ptr = *itCabin;
124 assert (lSegmentCabin_ptr != NULL);
126 stdair::BidPriceVector_T lBPV;
130 stdair::LegCabinList_T lLegCabinList =
131 stdair::BomManager::getList<stdair::LegCabin> (*lSegmentCabin_ptr);
132 assert (!lLegCabinList.empty());
133 if (lLegCabinList.size() > 1) {
135 stdair::BidPrice_T lBidPriceValue = 0;
136 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
137 itLC != lLegCabinList.end(); ++itLC) {
138 const stdair::LegCabin* lLegCabin_ptr = *itLC;
139 const stdair::BidPriceVector_T& lLegCabinBPV = lLegCabin_ptr->getBidPriceVector();
140 if (!lLegCabinBPV.empty()) {
141 lBidPriceValue += lLegCabinBPV.back();
145 lBidPriceValue = std::numeric_limits<stdair::BidPrice_T>::max();
149 if (lBidPriceValue < std::numeric_limits<stdair::BidPrice_T>::max()) {
150 lBPV.push_back(lBidPriceValue);
154 const stdair::LegCabin* lLegCabin_ptr = lLegCabinList.front();
155 lBPV = lLegCabin_ptr->getBidPriceVector();
164 const stdair::Availability_T& lAvailabilityPool =
165 lSegmentCabin_ptr->getAvailabilityPool();
168 if (lAvailabilityPool < lBPV.size()) {
169 lBPV.resize(lAvailabilityPool);
174 ioTravelSolution.addBidPriceVector (lBPV);
176 const stdair::BidPriceVectorHolder_T& lBidPriceVectorHolder =
177 ioTravelSolution.getBidPriceVectorHolder();
178 const stdair::BidPriceVectorHolder_T::const_reverse_iterator itBPV =
179 lBidPriceVectorHolder.rbegin();
180 const stdair::BidPriceVector_T& lBpvRef = *itBPV;
182 const stdair::FareFamilyList_T& lFFList =
183 stdair::BomManager::getList<stdair::FareFamily> (*lSegmentCabin_ptr);
184 for (stdair::FareFamilyList_T::const_iterator itFF = lFFList.begin();
185 itFF != lFFList.end(); ++itFF) {
186 const stdair::FareFamily* lFareFamily_ptr = *itFF;
187 assert (lFareFamily_ptr != NULL);
189 const stdair::BookingClassList_T& lBCList =
190 stdair::BomManager::getList<stdair::BookingClass> (*lFareFamily_ptr);
191 for (stdair::BookingClassList_T::const_iterator itBC = lBCList.begin();
192 itBC != lBCList.end(); ++itBC) {
193 const stdair::BookingClass* lBC_ptr = *itBC;
194 assert (lBC_ptr != NULL);
196 const stdair::ClassCode_T& lClassCode = lBC_ptr->getClassCode();
198 const stdair::YieldValue_T lYld = lBC_ptr->getYield() ;
199 const bool insertYieldMapSuccessful = lClassYieldMap.
200 insert (stdair::ClassYieldMap_T::value_type (lClassCode,
202 assert (insertYieldMapSuccessful ==
true);
204 const bool insertBpvMapSuccessful = lClassBpvMap.
205 insert (stdair::ClassBpvMap_T::value_type (lClassCode,
207 assert (insertBpvMapSuccessful ==
true);
217 stdair::BidPrice_T lBpvVal = std::numeric_limits<double>::max();
218 if (lBpvRef.empty() ==
false) {
219 lBpvVal = lBpvRef.back();
223 STDAIR_LOG_DEBUG (
"Class: " << lClassCode
224 <<
", " <<
"Yield: " << lYld <<
", "
225 <<
"Bid price: " << lBpvVal <<
", "
226 <<
"Remaining capacity: " << lAvailabilityPool
227 <<
" Segment date: " << iFullSegmentDateKey);
233 ioTravelSolution.addClassYieldMap (lClassYieldMap);
234 ioTravelSolution.addClassBpvMap (lClassBpvMap);
240 const std::string& iFullSegmentDateKey,
241 const stdair::ClassCode_T& iClassCode,
242 const stdair::PartySize_T& iPartySize) {
243 bool hasSaleBeenSuccessful =
false;
246 STDAIR_LOG_DEBUG (
"Full key: '" << iFullSegmentDateKey
247 <<
"', " << iClassCode);
250 stdair::BookingClass* lBookingClass_ptr =
251 stdair::BomRetriever::retrieveBookingClassFromLongKey(ioInventory,
256 const std::string hasFoundBookingClassStr =
257 (lBookingClass_ptr != NULL)?
"Yes":
"No";
258 STDAIR_LOG_DEBUG (
"Found booking class? " << hasFoundBookingClassStr);
260 if (lBookingClass_ptr != NULL) {
262 lBookingClass_ptr->sell (iPartySize);
265 stdair::FareFamily& lFareFamily =
266 stdair::BomManager::getParent<stdair::FareFamily> (*lBookingClass_ptr);
269 stdair::SegmentCabin& lSegmentCabin =
270 stdair::BomManager::getParent<stdair::SegmentCabin> (lFareFamily);
273 stdair::SegmentDate& lSegmentDate =
274 stdair::BomManager::getParent<stdair::SegmentDate,
275 stdair::SegmentCabin> (lSegmentCabin);
278 stdair::FlightDate& lFlightDate =
279 stdair::BomManager::getParent<stdair::FlightDate,
280 stdair::SegmentDate> (lSegmentDate);
288 hasSaleBeenSuccessful =
true;
291 return hasSaleBeenSuccessful;
296 const std::string& iFullSegmentDateKey,
297 const stdair::ClassCode_T& iClassCode,
298 const stdair::PartySize_T& iPartySize) {
299 bool hasCancellationBeenSuccessful =
false;
302 STDAIR_LOG_DEBUG (
"Full key: '" << iFullSegmentDateKey
303 <<
"', " << iClassCode);
306 stdair::BookingClass* lBookingClass_ptr =
307 stdair::BomRetriever::retrieveBookingClassFromLongKey(ioInventory,
312 const std::string hasFoundBookingClassStr =
313 (lBookingClass_ptr != NULL)?
"Yes":
"No";
314 STDAIR_LOG_DEBUG (
"Found booking class? " << hasFoundBookingClassStr);
316 if (lBookingClass_ptr != NULL) {
318 lBookingClass_ptr->cancel (iPartySize);
321 stdair::FareFamily& lFareFamily =
322 stdair::BomManager::getParent<stdair::FareFamily> (*lBookingClass_ptr);
325 stdair::SegmentCabin& lSegmentCabin =
326 stdair::BomManager::getParent<stdair::SegmentCabin> (lFareFamily);
329 stdair::SegmentDate& lSegmentDate =
330 stdair::BomManager::getParent<stdair::SegmentDate,
331 stdair::SegmentCabin> (lSegmentCabin);
334 stdair::FlightDate& lFlightDate =
335 stdair::BomManager::getParent<stdair::FlightDate,
336 stdair::SegmentDate> (lSegmentDate);
344 hasCancellationBeenSuccessful =
true;
347 return hasCancellationBeenSuccessful;
352 const stdair::DateTime_T& iSnapshotTime) {
355 const stdair::GuillotineBlockList_T& lGuillotineBlockList =
356 stdair::BomManager::getList<stdair::GuillotineBlock> (iInventory);
357 for (stdair::GuillotineBlockList_T::const_iterator itGB =
358 lGuillotineBlockList.begin();
359 itGB != lGuillotineBlockList.end(); ++itGB) {
360 stdair::GuillotineBlock* lGuillotineBlock_ptr = *itGB;