Beispiel #1
0
    def new_rate_plan(self, merchant_id, hotel_id, roomtype_id, name, meal_num, punish_type, ahead_days, stay_days, pay_type=None, guarantee_type=None, guarantee_start_time=None):
        room = CooperateRoomTypeModel.get_by_id(self.db, roomtype_id)
        if not room:
            raise JsonException(errcode=404, errmsg='room not exist')

        rate_plan = RatePlanModel.get_by_merchant_hotel_room_name(
            self.db, merchant_id, hotel_id, roomtype_id, name)
        if rate_plan:
            raise JsonException(errcode=405, errmsg="name exist")

        new_rateplan = RatePlanModel.new_rate_plan(self.db,
                                                   merchant_id, hotel_id, roomtype_id, room.base_hotel_id, room.base_roomtype_id,  name, meal_num, punish_type, ahead_days, stay_days, pay_type, guarantee_type, guarantee_start_time, commit=False)
        self.db.flush()
        new_roomrate = RoomRateModel.new_roomrate(
            self.db, hotel_id, roomtype_id, room.base_hotel_id, room.base_roomtype_id, new_rateplan.id, meal_num, commit=False)
        self.db.flush()

        rateplan_pusher = RatePlanPusher(self.db)
        roomrate_pusher = RoomRatePusher(self.db)
        try:
            if not (yield rateplan_pusher.post_rateplan(new_rateplan)):
                raise JsonException(2000, 'rateplan push fail')
            if not (yield rateplan_pusher.post_cancel_rule(new_rateplan)):
                raise JsonException(2001, 'cancel rule push fail')
            if not (yield roomrate_pusher.push_roomrate(new_rateplan.merchant_id, new_roomrate)):
                raise JsonException(2002, 'roomrate push fail')
            self.db.commit()

        except JsonException, e:
            self.db.rollback()
            raise e
Beispiel #2
0
    def update_rateplans_valid_status(self, rateplan_ids):
        Log.info("<< push rateplans {} update rateplan valid>>".format(
            rateplan_ids))
        if not IS_PUSH_TO_STOCK:
            raise gen.Return(True)

        rateplans = RatePlanModel.get_by_ids(self.db,
                                             rateplan_ids,
                                             with_delete=True)
        rateplan_datas = [{
            "chain_id": CHAIN_ID,
            "hotel_id": rateplan.hotel_id,
            "rate_plan_id": rateplan.id,
            "is_valid": self.cal_rateplan_isvalid(rateplan)
        } for rateplan in rateplans]

        track_id = self.generate_track_id(rateplan_ids)
        data = {'list': rateplan_datas, 'type': 3}
        params = {'track_id': track_id, 'data': json.dumps(data)}
        body = urllib.urlencode(params)
        url = API['STOCK'] + '/stock/update_state?is_async=false'

        Log.info(
            "<< push rateplan {} update rateplan valid request {}>>".format(
                rateplan_ids, params))
        try:
            r = yield AsyncHTTPClient().fetch(url, method='POST', body=body)
            Log.info("<< push rateplan {} update rateplan valid response {}>>".
                     format(rateplan_ids, r.body))
            resp = json.loads(r.body)
        except Exception, e:
            Log.exception(e)
            raise gen.Return(False)
Beispiel #3
0
    def push_by_merchant(self, merchant):
        from models.rate_plan import RatePlanModel

        rateplans = RatePlanModel.get_by_merchant(self.session,
                                                  merchant.id,
                                                  with_delete=True)
        rateplan_datas = [
            self.generate_rateplan_data(rateplan) for rateplan in rateplans
        ]
        cancel_rule_datas = [
            self.generate_cancel_rule_data(rateplan) for rateplan in rateplans
        ]

        rateplan_data_list = [
            rateplan_datas[i:i + self.MAX_PUSH_NUM]
            for i in range(0, len(rateplan_datas), self.MAX_PUSH_NUM)
        ]
        cancel_rule_list = [
            cancel_rule_datas[i:i + self.MAX_PUSH_NUM]
            for i in range(0, len(cancel_rule_datas), self.MAX_PUSH_NUM)
        ]

        for rateplan_data in rateplan_data_list:
            self.post_rateplans(rateplan_data)
        for cancel_rule_data in cancel_rule_list:
            self.post_cancel_rules(cancel_rule_data)

        self.push_roomrate_by_rateplans(rateplans)
Beispiel #4
0
    def push_rateplan(self,
                      rateplan_id,
                      with_cancel_rule=True,
                      with_roomrate=True):
        self.log.info("<< push rateplan {}>>".format(rateplan_id))
        from models.rate_plan import RatePlanModel
        from models.room_rate import RoomRateModel

        rateplan = RatePlanModel.get_by_id(self.session,
                                           rateplan_id,
                                           with_delete=True)
        roomrate = RoomRateModel.get_by_rateplan(self.session,
                                                 rateplan_id,
                                                 with_delete=True)
        if not rateplan or not roomrate:
            self.log.info('not found')
            return

        self.post_rateplan(rateplan)

        if with_cancel_rule:
            self.post_cancel_rule(rateplan)

        if with_roomrate:
            self.post_roomrate(rateplan.merchant_id, roomrate)
Beispiel #5
0
    def update_rateplans_valid_status(self, rateplan_ids):
        if not IS_PUSH_TO_STOCK:
            return

        self.log.info("<< push rateplans {} update rateplan valid>>".format(
            rateplan_ids))
        from models.rate_plan import RatePlanModel

        rateplans = RatePlanModel.get_by_ids(self.session,
                                             rateplan_ids,
                                             with_delete=True)
        rateplan_datas = [{
            "chain_id": CHAIN_ID,
            "hotel_id": rateplan.hotel_id,
            "rate_plan_id": rateplan.id,
            "is_valid": self.cal_rateplan_isvalid(rateplan)
        } for rateplan in rateplans]

        track_id = self.generate_track_id(rateplan_ids)
        data = {'list': rateplan_datas, 'type': 3}
        params = {'track_id': track_id, 'data': json.dumps(data)}
        url = API['STOCK'] + '/stock/update_state?is_async=false'
        self.log.info(
            "<< push rateplan {} update rateplan valid request {}>>".format(
                rateplan_ids, params))
        r = req.post(url, data=params)
        self.log.info(
            "<< push rateplan {} update rateplan valid response {}>>".format(
                rateplan_ids, r.text))
Beispiel #6
0
    def modify_rateplan(self, rateplan_id, name, meal_num, punish_type, guarantee_type, guarantee_start_time, ahead_days, stay_days):
        rateplan = RatePlanModel.get_by_id(self.db, rateplan_id)
        if not rateplan:
            raise JsonException(errcode=404, errmsg="rateplan not found")

        if name is not None:
            _rateplan = RatePlanModel.get_by_merchant_hotel_room_name(self.db,
                                                                      rateplan.merchant_id, rateplan.hotel_id, rateplan.roomtype_id, name)
            if _rateplan and _rateplan.id != rateplan.id:
                raise JsonException(errcode=405, errmsg="name exist")
            else:
                rateplan.name = name

        if meal_num is not None:
            roomrate = RoomRateModel.set_meal(
                self.db, rateplan.id, meal_num, commit=False)
        if punish_type is not None:
            rateplan.punish_type = punish_type
        if rateplan.pay_type == rateplan.PAY_TYPE_ARRIVE:
            if guarantee_type is not None:
                rateplan.guarantee_type = guarantee_type
            if guarantee_start_time is not None:
                rateplan.guarantee_start_time = guarantee_start_time
        if ahead_days is not None:
            rateplan.ahead_days = ahead_days
        if stay_days is not None:
            rateplan.stay_days = stay_days


        self.db.flush()
        rateplan_pusher = RatePlanPusher(self.db)
        roomrate_pusher = RoomRatePusher(self.db)
        try:
            if not (yield rateplan_pusher.post_rateplan(rateplan)):
                raise JsonException(2000, 'rateplan push fail')
            if not (yield rateplan_pusher.post_cancel_rule(rateplan)):
                raise JsonException(2001, 'cancel rule push fail')
            if not (yield roomrate_pusher.push_roomrate(rateplan.merchant_id, roomrate)):
                raise JsonException(2002, 'roomrate push fail')
            self.db.commit()

        except JsonException, e:
            self.db.rollback()
            raise e
Beispiel #7
0
    def push_by_id(self, rateplan_id, with_roomrate=True, with_cancel_rule=True):

        rateplan = RatePlanModel.get_by_id(self.db, rateplan_id, with_delete=True)
        roomrate = RoomRateModel.get_by_rateplan(self.db, rateplan_id, with_delete=True)
        if not rateplan or not roomrate:
            raise gen.Return()

        if not (yield self.post_rateplan(rateplan)):
            raise JsonException(1000, 'push rateplan fail')

        if with_cancel_rule:
            self.post_cancel_rule(rateplan)
Beispiel #8
0
    def delete(self, hotel_id, roomtype_id, rateplan_id):
        rateplan = RatePlanModel.get_by_id_with_merchant(self.db, rateplan_id, self.merchant.id)
        if not rateplan:
            raise JsonException(1001, 'rateplan not found')

        r = yield self.delete_rateplan(rateplan)
        if r:
            self.db.commit()
            self.finish_json(result=dict(
                rateplan=rateplan.todict(),
                ))
        else:
            self.db.rollback()
            raise JsonException(2000, 'delete fail')
Beispiel #9
0
    def push_by_merchant(self, merchant):
        from models.rate_plan import RatePlanModel

        rateplans = RatePlanModel.get_by_merchant(self.session, merchant.id, with_delete=True)
        rateplan_datas = [self.generate_rateplan_data(rateplan) for rateplan in rateplans]
        cancel_rule_datas =  [self.generate_cancel_rule_data(rateplan) for rateplan in rateplans]

        rateplan_data_list = [rateplan_datas[i: i+self.MAX_PUSH_NUM] for i in range(0, len(rateplan_datas), self.MAX_PUSH_NUM)]
        cancel_rule_list = [cancel_rule_datas[i: i+self.MAX_PUSH_NUM] for i in range(0, len(cancel_rule_datas), self.MAX_PUSH_NUM)]

        for rateplan_data in rateplan_data_list:
            self.post_rateplans(rateplan_data)
        for cancel_rule_data in cancel_rule_list:
            self.post_cancel_rules(cancel_rule_data)

        self.push_roomrate_by_rateplans(rateplans)
Beispiel #10
0
    def update_rateplans_valid_status(self, rateplan_ids):
        if not IS_PUSH_TO_STOCK:
            return

        self.log.info("<< push rateplans {} update rateplan valid>>".format(rateplan_ids))
        from models.rate_plan import RatePlanModel

        rateplans = RatePlanModel.get_by_ids(self.session, rateplan_ids, with_delete=True)
        rateplan_datas = [{"chain_id": CHAIN_ID, "hotel_id": rateplan.hotel_id, "rate_plan_id": rateplan.id, "is_valid": self.cal_rateplan_isvalid(rateplan)} for rateplan in rateplans]

        track_id = self.generate_track_id(rateplan_ids)
        data = {'list': rateplan_datas, 'type': 3}
        params = {'track_id': track_id, 'data': json.dumps(data)}
        url = API['STOCK'] + '/stock/update_state?is_async=false'
        self.log.info("<< push rateplan {} update rateplan valid request {}>>".format(rateplan_ids, params))
        r = req.post(url, data=params)
        self.log.info("<< push rateplan {} update rateplan valid response {}>>".format(rateplan_ids, r.text))
Beispiel #11
0
    def push_rateplan(self, rateplan_id, with_cancel_rule=True, with_roomrate=True):
        self.log.info("<< push rateplan {}>>".format(rateplan_id))
        from models.rate_plan import RatePlanModel
        from models.room_rate import RoomRateModel

        rateplan = RatePlanModel.get_by_id(self.session, rateplan_id, with_delete=True)
        roomrate = RoomRateModel.get_by_rateplan(self.session, rateplan_id, with_delete=True)
        if not rateplan or not roomrate:
            self.log.info('not found')
            return

        self.post_rateplan(rateplan)

        if with_cancel_rule:
            self.post_cancel_rule(rateplan)

        if with_roomrate:
            self.post_roomrate(rateplan.merchant_id, roomrate)
Beispiel #12
0
    def push_by_id(self,
                   rateplan_id,
                   with_roomrate=True,
                   with_cancel_rule=True):

        rateplan = RatePlanModel.get_by_id(self.db,
                                           rateplan_id,
                                           with_delete=True)
        roomrate = RoomRateModel.get_by_rateplan(self.db,
                                                 rateplan_id,
                                                 with_delete=True)
        if not rateplan or not roomrate:
            raise gen.Return()

        if not (yield self.post_rateplan(rateplan)):
            raise JsonException(1000, 'push rateplan fail')

        if with_cancel_rule:
            self.post_cancel_rule(rateplan)
Beispiel #13
0
    def format_order(self, order_json):
        Log.info(order_json)
        try:
            order_entity = SubmitOrder(order_json)
        except ValueError as e:
            raise JsonException(errcode=1, errmsg=e.message)
        Log.info(order_entity)

        rate_plan = RatePlanModel.get_by_id(self.db, order_entity.rateplan_id)
        if not rate_plan:
            raise JsonException(1, 'no rate plan')

        order_entity.pay_type = rate_plan.pay_type
        order_entity.merchant_id = rate_plan.merchant_id
        order_entity.cancel_type = rate_plan.cancel_type
        order_entity.punish_type = rate_plan.punish_type
        order_entity.punish_value = rate_plan.punish_value
        order_entity.guarantee_type = rate_plan.guarantee_type
        order_entity.guarantee_start_time = rate_plan.guarantee_start_time

        return order_entity
Beispiel #14
0
    def format_order(self, order_json):
        Log.info(order_json)
        try:
            order_entity = SubmitOrder(order_json)
        except ValueError as e:
            raise JsonException(errcode=1, errmsg=e.message)
        Log.info(order_entity)

        rate_plan = RatePlanModel.get_by_id(self.db, order_entity.rateplan_id)
        if not rate_plan:
            raise JsonException(1, 'no rate plan')

        order_entity.pay_type = rate_plan.pay_type
        order_entity.merchant_id = rate_plan.merchant_id
        order_entity.cancel_type = rate_plan.cancel_type
        order_entity.punish_type = rate_plan.punish_type
        order_entity.punish_value = rate_plan.punish_value
        order_entity.guarantee_type = rate_plan.guarantee_type
        order_entity.guarantee_start_time = rate_plan.guarantee_start_time

        return order_entity
Beispiel #15
0
    def update_rateplans_valid_status(self, rateplan_ids):
        Log.info("<< push rateplans {} update rateplan valid>>".format(rateplan_ids))
        if not IS_PUSH_TO_STOCK:
            raise gen.Return(True)

        rateplans = RatePlanModel.get_by_ids(self.db, rateplan_ids, with_delete=True)
        rateplan_datas = [{"chain_id": CHAIN_ID, "hotel_id": rateplan.hotel_id, "rate_plan_id": rateplan.id, "is_valid": self.cal_rateplan_isvalid(rateplan)} for rateplan in rateplans]

        track_id = self.generate_track_id(rateplan_ids)
        data = {'list': rateplan_datas, 'type': 3}
        params = {'track_id': track_id, 'data': json.dumps(data)}
        body = urllib.urlencode(params)
        url = API['STOCK'] + '/stock/update_state?is_async=false'

        Log.info("<< push rateplan {} update rateplan valid request {}>>".format(rateplan_ids, params))
        try:
            r = yield AsyncHTTPClient().fetch(url, method='POST', body=body)
            Log.info("<< push rateplan {} update rateplan valid response {}>>".format(rateplan_ids, r.body))
            resp = json.loads(r.body)
        except Exception, e:
            Log.exception(e)
            raise gen.Return(False)
Beispiel #16
0
 def _delete_rateplan_by_roomtype(self, roomtype):
     rateplans = RatePlanModel.get_by_roomtype(self.db, roomtype.id)
     r = yield self._delete_rateplans(rateplans)
     raise gen.Return(r)
Beispiel #17
0
def get_rateplan(session, order):
    rate_plan = RatePlanModel.get_by_id(session, order.rateplan_id)
    if not rate_plan:
        # callback no rateplan
        pass
    return rate_plan
Beispiel #18
0
 def get_by_room(self, merchant_id, hotel_id, roomtype_id):
     rateplans = RatePlanModel.get_by_room(self.db, merchant_id, hotel_id, roomtype_id)
     rateplan_ids = [rateplan.id for rateplan in rateplans]
     roomrates= RoomRateModel.get_by_rateplans(self.db, rateplan_ids)
     Log.info(roomrates)
     return rateplans, roomrates
Beispiel #19
0
 def _delete_rateplan_by_roomtype(self, roomtype):
     rateplans = RatePlanModel.get_by_roomtype(self.db, roomtype.id)
     r = yield self._delete_rateplans(rateplans)
     raise gen.Return(r)