7 #include <boost/date_time/date_iterator.hpp>
9 #include <stdair/stdair_types.hpp>
10 #include <stdair/basic/BasConst_Inventory.hpp>
11 #include <stdair/bom/BomManager.hpp>
12 #include <stdair/bom/BomRoot.hpp>
13 #include <stdair/bom/Inventory.hpp>
14 #include <stdair/bom/FlightDate.hpp>
15 #include <stdair/bom/SegmentDate.hpp>
16 #include <stdair/bom/SegmentCabin.hpp>
17 #include <stdair/bom/FareFamily.hpp>
18 #include <stdair/bom/BookingClass.hpp>
19 #include <stdair/bom/LegDate.hpp>
20 #include <stdair/bom/LegCabin.hpp>
21 #include <stdair/bom/Bucket.hpp>
22 #include <stdair/factory/FacBomManager.hpp>
23 #include <stdair/service/Logger.hpp>
31 void InventoryGenerator::
32 createFlightDate (stdair::BomRoot& ioBomRoot,
33 const FlightPeriodStruct& iFlightPeriod) {
34 const stdair::AirlineCode_T& lAirlineCode = iFlightPeriod._airlineCode;
38 stdair::Inventory* lInventory_ptr = stdair::BomManager::
39 getObjectPtr<stdair::Inventory> (ioBomRoot, lAirlineCode);
40 if (lInventory_ptr == NULL) {
41 stdair::InventoryKey lKey (lAirlineCode);
43 &stdair::FacBom<stdair::Inventory>::instance().create (lKey);
44 stdair::FacBomManager::addToListAndMap (ioBomRoot, *lInventory_ptr);
45 stdair::FacBomManager::linkWithParent (ioBomRoot, *lInventory_ptr);
47 assert (lInventory_ptr != NULL);
51 const stdair::DatePeriod_T lDateRange = iFlightPeriod._dateRange;
53 for (boost::gregorian::day_iterator itDate = lDateRange.begin();
54 itDate != lDateRange.end(); ++itDate) {
55 const stdair::Date_T& currentDate = *itDate;
58 const unsigned short currentDoW = currentDate.day_of_week().as_number();
63 const stdair::DoWStruct& lDoWList = iFlightPeriod._dow;
64 const bool isDoWActive = lDoWList.getStandardDayOfWeek (currentDoW);
66 if (isDoWActive ==
true) {
67 createFlightDate (*lInventory_ptr, currentDate, iFlightPeriod);
73 void InventoryGenerator::
74 createFlightDate (stdair::Inventory& ioInventory,
75 const stdair::Date_T& iFlightDate,
76 const FlightPeriodStruct& iFlightPeriod) {
78 const stdair::FlightNumber_T& lFlightNumber = iFlightPeriod._flightNumber;
79 stdair::FlightDateKey lFlightDateKey (lFlightNumber, iFlightDate);
88 stdair::FlightDate* lFlightDate_ptr = stdair::BomManager::
89 getObjectPtr<stdair::FlightDate> (ioInventory, lFlightDateKey.toString());
90 if (lFlightDate_ptr != NULL) {
91 std::ostringstream oMessage;
92 oMessage << ioInventory.describeKey() <<
", "
93 << lFlightDate_ptr->describeKey();
94 throw FlightDateDuplicationException (oMessage.str());
100 &stdair::FacBom<stdair::FlightDate>::instance().create (lFlightDateKey);
101 stdair::FacBomManager::addToListAndMap (ioInventory, *lFlightDate_ptr);
102 stdair::FacBomManager::linkWithParent (ioInventory, *lFlightDate_ptr);
105 stdair::Duration_T currentOffTime (0, 0, 0);
106 stdair::AirportCode_T previousOffPoint;
108 for (LegStructList_T::const_iterator itLeg = lLegList.begin();
109 itLeg != lLegList.end(); ++itLeg) {
110 const LegStruct& lLeg = *itLeg;
113 stdair::LegDate& lLegDate =
114 createLegDate (*lFlightDate_ptr, iFlightDate, lLeg);
127 if (itLeg != lLegList.begin()) {
128 const stdair::AirportCode_T& currentBoardingPoint =
129 lLegDate.getBoardingPoint();
130 assert (currentBoardingPoint == previousOffPoint);
134 previousOffPoint = lLegDate.getOffPoint();
139 for (SegmentStructList_T::const_iterator itSegment = lSegmentList.begin();
140 itSegment != lSegmentList.end(); ++itSegment) {
141 const SegmentStruct& lSegment = *itSegment;
143 createSegmentDate (*lFlightDate_ptr, lSegment);
148 stdair::LegDate& InventoryGenerator::
149 createLegDate (stdair::FlightDate& ioFlightDate,
150 const stdair::Date_T& iReferenceDate,
151 const LegStruct& iLeg) {
153 stdair::LegDateKey lKey (iLeg._boardingPoint);
154 stdair::LegDate& lLegDate =
155 stdair::FacBom<stdair::LegDate>::instance().create (lKey);
156 stdair::FacBomManager::addToListAndMap (ioFlightDate, lLegDate);
157 stdair::FacBomManager::linkWithParent (ioFlightDate, lLegDate);
160 iLeg.fill (iReferenceDate, lLegDate);
164 for (LegCabinStructList_T::const_iterator itCabin = lCabinList.begin();
165 itCabin != lCabinList.end(); ++itCabin) {
166 const LegCabinStruct& lCabin = *itCabin;
169 createLegCabin (lLegDate, lCabin);
176 void InventoryGenerator::
177 createLegCabin (stdair::LegDate& ioLegDate,
178 const LegCabinStruct& iCabin) {
180 const stdair::LegCabinKey lKey (iCabin._cabinCode);
181 stdair::LegCabin& lLegCabin =
182 stdair::FacBom<stdair::LegCabin>::instance().create (lKey);
183 stdair::FacBomManager::addToListAndMap (ioLegDate, lLegCabin);
184 stdair::FacBomManager::linkWithParent (ioLegDate, lLegCabin);
187 iCabin.fill (lLegCabin);
191 for (BucketStructList_T::const_iterator itBucket = lBucketList.begin();
192 itBucket != lBucketList.end(); ++itBucket) {
193 const BucketStruct& lBucket = *itBucket;
196 createBucket (lLegCabin, lBucket);
201 void InventoryGenerator::createBucket (stdair::LegCabin& ioLegCabin,
202 const BucketStruct& iBucket) {
204 const stdair::BucketKey lKey (iBucket._seatIndex);
205 stdair::Bucket& lBucket =
206 stdair::FacBom<stdair::Bucket>::instance().create (lKey);
207 stdair::FacBomManager::addToListAndMap (ioLegCabin, lBucket);
208 stdair::FacBomManager::linkWithParent (ioLegCabin, lBucket);
211 iBucket.fill (lBucket);
215 void InventoryGenerator::
216 createSegmentDate (stdair::FlightDate& ioFlightDate,
217 const SegmentStruct& iSegment) {
219 const stdair::AirportCode_T& lBoardingPoint = iSegment._boardingPoint;
220 const stdair::AirportCode_T& lOffPoint = iSegment._offPoint;
221 stdair::SegmentDateKey lSegmentDateKey (lBoardingPoint, lOffPoint);
223 stdair::SegmentDate& lSegmentDate =
224 stdair::FacBom<stdair::SegmentDate>::instance().create (lSegmentDateKey);
225 stdair::FacBomManager::addToListAndMap (ioFlightDate, lSegmentDate);
226 stdair::FacBomManager::linkWithParent (ioFlightDate, lSegmentDate);
229 iSegment.fill (lSegmentDate);
233 for (SegmentCabinStructList_T::const_iterator itCabin =
234 lCabinList.begin(); itCabin != lCabinList.end(); ++itCabin) {
235 const SegmentCabinStruct& lCabin = *itCabin;
238 createSegmentCabin (lSegmentDate, lCabin);
243 void InventoryGenerator::
244 createSegmentCabin (stdair::SegmentDate& ioSegmentDate,
245 const SegmentCabinStruct& iCabin) {
248 stdair::SegmentCabinKey lKey (iCabin._cabinCode);
249 stdair::SegmentCabin& lSegmentCabin =
250 stdair::FacBom<stdair::SegmentCabin>::instance().create (lKey);
253 stdair::FacBomManager::addToListAndMap (ioSegmentDate, lSegmentCabin);
254 stdair::FacBomManager::linkWithParent (ioSegmentDate, lSegmentCabin);
257 iCabin.fill (lSegmentCabin);
260 for (FareFamilyStructList_T::const_iterator itFareFamily =
261 iCabin._fareFamilies.begin();
262 itFareFamily != iCabin._fareFamilies.end(); itFareFamily++) {
263 const FareFamilyStruct& lFareFamilyStruct = *itFareFamily;
266 createFareFamily (lSegmentCabin, lFareFamilyStruct);
271 void InventoryGenerator::
272 createFareFamily (stdair::SegmentCabin& ioSegmentCabin,
273 const FareFamilyStruct& iFF) {
275 stdair::FareFamilyKey lKey (iFF._familyCode);
276 stdair::FareFamily& lFareFamily =
277 stdair::FacBom<stdair::FareFamily>::instance().create (lKey);
280 stdair::FacBomManager::addToListAndMap (ioSegmentCabin,
282 stdair::FacBomManager::linkWithParent (ioSegmentCabin,
286 iFF.fill (lFareFamily);
289 const stdair::ClassList_String_T& lClassList = iFF._classes;
290 for (stdair::ClassList_String_T::const_iterator itClass =
291 lClassList.begin(); itClass != lClassList.end(); ++itClass) {
293 std::ostringstream ostr;
295 const stdair::ClassCode_T lClassCode (ostr.str());
298 createClass (lFareFamily, lClassCode);
303 void InventoryGenerator::createClass (stdair::FareFamily& ioFareFamily,
304 const stdair::ClassCode_T& iClassCode) {
307 const stdair::BookingClassKey lClassKey (iClassCode);
308 stdair::BookingClass& lClass =
309 stdair::FacBom<stdair::BookingClass>::instance().create (lClassKey);
312 stdair::FacBomManager::addToListAndMap (ioFareFamily, lClass);
313 stdair::FacBomManager::linkWithParent (ioFareFamily, lClass);
316 stdair::SegmentCabin& lSegmentCabin =
317 stdair::BomManager::getParent<stdair::SegmentCabin> (ioFareFamily);
318 stdair::FacBomManager::addToListAndMap (lSegmentCabin, lClass);
321 stdair::SegmentDate& lSegmentDate =
322 stdair::BomManager::getParent<stdair::SegmentDate> (lSegmentCabin);
323 stdair::FacBomManager::addToListAndMap (lSegmentDate, lClass);