def get_discounted_offers(request, order_settings, start_ride_algo_data): user = request.user if request.user.is_authenticated() else None discounted_offers = [] earliest_offer_dt = ceil_datetime(max(trim_seconds(default_tz_now()) + datetime.timedelta(minutes=asap_interval()), order_settings.pickup_dt - OFFERS_TIMEDELTA), minutes=booking_interval()) discounts_data = compute_discounts_data(order_settings, earliest_offer_dt, order_settings.pickup_dt + OFFERS_TIMEDELTA, datetime.timedelta(minutes=booking_interval()), user = user ) for discount_data in discounts_data: discount_rule = discount_data.discount_rule discount_dt = discount_data.pickup_dt tariff_for_discount_offer = RuleSet.get_active_set(discount_dt) base_price_for_discount_offer = start_ride_algo_data.order_price(NEW_ORDER_ID, tariff_for_discount_offer) if base_price_for_discount_offer: discount = discount_rule.get_discount(base_price_for_discount_offer) if discount == 0: logging.info(u"skipping %s: grants zero discount" % discount_rule.name) continue offer_key = "%s_%s" % (DISCOUNTED_OFFER_PREFIX, get_uuid()) memcache.set(offer_key, DiscountData.dump(discount_data), namespace=DISCOUNTED_OFFERS_NS) offer_text = _(u"The price includes a discount of %g NIS") % discount if discount_rule.offer_text: offer_text = discount_rule.offer_text if offer_text.find("%g") > -1: # render discount amount offer_text %= discount discount_offer_data = { "ride_id": offer_key, "pickup_time": to_js_date(discount_dt), "discount_picture_url": discount_rule.picture_url, "discount_name": discount_rule.display_name, "passengers": [], "seats_left": MAX_SEATS, "price": base_price_for_discount_offer - discount, "new_ride": True, "comment": offer_text } user_agent = request.META.get("HTTP_USER_AGENT", "") if RE_2_1_AGENT.match(user_agent) is None: # only for client < 1.2.1 discount_offer_data.update({ "seats_left": MAX_SEATS - 1, "passengers": [{'name': discount_rule.display_name, 'picture_url': discount_rule.picture_url}] }) discounted_offers.append(discount_offer_data) return discounted_offers
def create_order(order_settings, passenger, ride=None, discount_data=None): """ Returns a created Order or None @param order_settings: @param passenger: @param ride: @param discount_data: a DiscountData instance @return: """ ride_id = ride.id if ride else NEW_ORDER_ID # get ride data from algo: don't trust the client candidates = [ride] if ride else [] matching_rides = get_matching_rides(candidates, order_settings) ride_data = first(lambda match: match.ride_id == ride_id, matching_rides) if not ride_data: return None order = Order.fromOrderSettings(order_settings, passenger, commit=False) if ride: # if joining a ride, order departure is as shown in offer, not what was submitted in order_settings ride_departure = compute_new_departure(ride, ride_data) new_order_pickup_point = ride_data.order_pickup_point(NEW_ORDER_ID) order.depart_time = ride_departure + datetime.timedelta(seconds=new_order_pickup_point.offset) if order_settings.private: order.type = OrderType.PRIVATE else: order.type = OrderType.SHARED order.price_data = ride_data.order_price_data(NEW_ORDER_ID) if discount_data: order = apply_discount_data(order, order_settings, discount_data) if not order: return None order.save() logging.info("created new %s order [%s]" % (OrderType.get_name(order.type), order.id)) billing_trx = BillingTransaction(order=order, amount=order.get_billing_amount(), debug=order.debug) billing_trx.save() billing_trx.commit(callback_args={ "ride_id": ride_id, "ride_data": ride_data, "discount_data": DiscountData.dump(discount_data) }) return order