Ejemplo n.º 1
0
    def get(self):
        form = OrderListForm()
        products = Product.objects(seller_id=current_user.id)

        status = request.args.get('status')
        if status == ORDER_STATUS['TRANSFERING']:
            orders = Order.objects(product_id__in=products,
                                   status=ORDER_STATUS["TRANSFERING"])
        elif status == ORDER_STATUS['RECEIPTING']:
            orders = Order.objects(product_id__in=products,
                                   status=ORDER_STATUS["RECEIPTING"])
        elif status == ORDER_STATUS['COMPLETE']:
            orders = Order.objects(product_id__in=products,
                                   status=ORDER_STATUS["COMPLETE"])
        elif status == ORDER_STATUS['CANCEL']:
            orders = Order.objects(product_id__in=products,
                                   status=ORDER_STATUS["CANCEL"])
        else:
            status = ORDER_STATUS["ALL"]
            orders = Order.objects(product_id__in=products)

        orders = sorted(orders, key=lambda k: k.create_time, reverse=False)

        return render_template('user/selling/order.html',
                               orders=orders,
                               ORDER_STATUS=ORDER_STATUS,
                               status=status,
                               form=form)
Ejemplo n.º 2
0
    def post(self, user_id):
        # Get arguments
        args = self.parser.parse_args()

        # Validate user, address and cleaner ids
        if User.get_by_id(user_id) is None:
            abort(404, 'User not found')

        if Address.get_by_id(args['address_id']) is None:
            abort(404, 'Address not found')

        if Cleaner.get_by_id(args['cleaner_id']) is None:
            abort(404, 'Cleaner not found')

        # Create new order
        order = Order(user_id=user_id,
                      address_id=args['address_id'],
                      cleaner_id=args['cleaner_id'],
                      date=args['date'],
                      start_time=args['start_time'],
                      end_time=args['end_time'],
                      rooms=args['rooms'],
                      special_rooms=args['special_rooms'],
                      extra_services=args['extra_services'],
                      reference=args['reference'],
                      transaction=args['transaction'],
                      price=args['price'])

        # Persist and return order
        success = order.persist()
        if not success:
            abort(400, 'Parameters incorrect')

        return order, 201
Ejemplo n.º 3
0
	def get(self):
		payments = Payment.objects(payer_id=current_user.id, confirm=True)
		buy_orders = Order.objects(buyer_id=current_user.id, status__ne=ORDER_STATUS["CANCEL"])
		sell_orders = Order.objects(product_id__in=Product.objects(seller_id=current_user.id), status=ORDER_STATUS["COMPLETE"])

		records = list()
		for payment in payments:
			record = Record("儲值", payment.amount, payment.create_time)
			records.append(record)
		for order in buy_orders:
			if order.product_id.bidding == False:
				if order.coupon_id == None:
					record = Record("購買" + order.product_id.name, -1 * int(order.product_id.price * order.product_id.discount), order.create_time)
				else:
					record = Record("購買" + order.product_id.name, -1 * max(0, int(order.product_id.price * order.product_id.discount - order.coupon_id.discount)), order.create_time)
			else:
				record = Record("購買" + order.product_id.name, -1 * order.product_id.bid.now_price, order.create_time)
			records.append(record)
		for order in sell_orders:
			if order.product_id.bidding == False:
				record = Record("販賣" + order.product_id.name, int(order.product_id.price * RATE), order.finish_time)
			else:
				record = Record("販賣" + order.product_id.name, int(order.product_id.bid.now_price * RATE), order.finish_time)
			records.append(record)
		records = sorted(records, key=lambda k: k.time, reverse=True)
		return render_template('user/hicoin/record.html', records=records)
Ejemplo n.º 4
0
    def __create_order(self, snap):
        '''将订单写入到数据库'''
        order_no = OrderService.make_order_no()
        with db.auto_commit():
            order = Order()
            order.user_id = self.uid
            order.order_no = order_no
            order.total_price = snap['order_price']
            order.total_count = snap['total_count']
            order.snap_img = snap['snap_img']
            order.snap_name = snap['snap_name']
            order.snap_address = snap['snap_address']
            order.snap_items = json.dumps(snap['p_status'], ensure_ascii=False)
            db.session.add(order)

            db.session.flush()  # 刷新数据库缓存,不操作事务
            order_id = order.id  # 获取更新后的order信息
            for p in self.o_products:
                # 起初每个p的格式 {'product_id': x, 'count': y}
                p['order_id'] = order_id
            db.session.add_all([
                Order2Product(p['order_id'], p['product_id'], p['count'])
                for p in self.o_products
            ])

        return {
            'order_no': order_no,
            'order_id': order_id,
            'create_time': order.create_time
        }
Ejemplo n.º 5
0
def create_order():
    data, errors = OrderAmountInputSchema().load(request.get_json())
    if errors:
        return make_response(jsonify(errors), 422)

    tickets_dict = data['tickets']
    order_amount = calculate_order_amount(tickets_dict, data.get('discount_code'))
    ticket_ids = {ticket['id'] for ticket in tickets_dict}
    ticket_map = {int(ticket['id']): ticket for ticket in tickets_dict}
    tickets = (
        Ticket.query.filter_by(deleted_at=None).filter(Ticket.id.in_(ticket_ids)).all()
    )

    if not tickets:
        raise UnprocessableEntityError(
            {'source': 'tickets'},
            "Tickets missing in Order request",
        )

    event = tickets[0].event

    try:
        attendees = []
        for ticket in tickets:
            for _ in range(ticket_map[ticket.id]['quantity']):
                ticket.raise_if_unavailable()
                attendees.append(
                    TicketHolder(firstname='', lastname='', ticket=ticket, event=event)
                )
                db.session.commit()
    except Exception as e:
        db.session.rollback()
        raise e

    validate_attendees({attendee.id for attendee in attendees})

    if data.get('amount') is not None and (
        current_user.is_staff or has_access('is_coorganizer', event_id=event.id)
    ):
        # If organizer or admin has overrided the amount of order
        order_amount['total'] = data['amount']

    order = Order(
        amount=order_amount['total'],
        event=event,
        discount_code_id=data.get('discount_code'),
        ticket_holders=attendees,
    )
    db.session.commit()
    order.populate_and_save()

    order_tickets = OrderTicket.query.filter_by(order_id=order.id).all()
    for order_ticket in order_tickets:
        ticket_info = ticket_map[order_ticket.ticket.id]
        order_ticket.price = ticket_info.get('price')
        save_to_db(order_ticket)
    
    return OrderSchema().dump(order)
Ejemplo n.º 6
0
    def expense(self):
        params = request.args.get("type", None)
        if params == "ship":
            orders = Order.group_service_orders(kind="ship")
        elif params == "deduct":
            orders = Order.group_service_orders(kind="intro")
        else:
            orders = Order.group_service_orders()

        return dict(msg="ok", code=200, orders=orders)
Ejemplo n.º 7
0
def create_order():
    if not request.json:
        abort(400)
    order = Order()
    order.user_id = request.json.get('user_id', "")
    order.service_name = request.json.get('service_name', "")
    order.service_type = request.json.get('service_type', "")
    db.session.add(order)
    db.session.commit()
    return jsonify({'order': order.to_json()}), 201
Ejemplo n.º 8
0
 def setUp(self):
     self.BaseSetUp()
     self.mock_order = Order(is_deleted=False,
                             created_at=datetime.now(),
                             id=1,
                             user_id=1,
                             date_booked_for=date.today(),
                             date_booked=date.today(),
                             channel='web',
                             meal_period='lunch',
                             order_status='booked',
                             has_rated=True,
                             menu_id=1,
                             location_id=1)
     self.mock_deleted_order = Order(is_deleted=True,
                                     created_at=datetime.now(),
                                     id=1,
                                     user_id='mock',
                                     date_booked_for=date.today(),
                                     date_booked=date.today(),
                                     channel='web',
                                     meal_period='lunch',
                                     order_status='booked',
                                     has_rated=True,
                                     menu_id=1,
                                     location_id=1)
     self.mock_collected_order = Order(is_deleted=False,
                                       created_at=datetime.now(),
                                       id=1,
                                       user_id='mock',
                                       date_booked_for=date.today(),
                                       date_booked=date.today(),
                                       channel='web',
                                       meal_period='lunch',
                                       order_status='collected',
                                       has_rated=True,
                                       menu_id=1,
                                       location_id=1)
     self.mock_meal_item = MealItem(is_deleted=False,
                                    created_at=datetime.now(),
                                    updated_at=datetime.now(),
                                    id=1,
                                    meal_type='main',
                                    name='mock',
                                    image='mock',
                                    location_id=1)
     self.pagination_meta = {
         'total_rows': 1,
         'total_pages': 1,
         'current_page': 1,
         'next_page': False,
         'prev_page': False
     }
     self.faker = Faker()
     self.faker.add_provider(date_time)
Ejemplo n.º 9
0
def add_order_service(data):
    """
    生成订单
    :param data:[
        {
            "product_id": 78, # 产品id
            "product_num": 2, # 产品数量
        }
    ]
    :return:
    """
    session = g.session
    user_id = get_user_info()["user_id"]
    for item in to_list(data):
        result = session.query(Product).filter(
            Product.id == item["product_id"]).one()
        order = Order()
        order.order_num = date_time(fmt="%Y%m%d%H%M%S") + str(user_id) + str(
            item["product_id"])
        order.product_id = item["product_id"]
        order.buyer_id = user_id
        order.seller_id = result.publisher_id
        order.product_num = item["product_num"]
        order.product_amount = item["product_num"] * result.price
        order.logistics_amount = result.logistics_price
        session.add(order)

    session.commit()
    return True
Ejemplo n.º 10
0
 def report_orders(self):
     return dict(msg="ok",
                 code=200,
                 total_amount=Order.total_income_amount(),
                 total_count=Order.total_orders_count(),
                 total_amount_month=Order.total_income_amount(current=True),
                 total_count_month=Order.total_orders_count(current=True),
                 expense=Order.expense_total_amount(),
                 profit=Order.expense_total_amount(profit=True),
                 sale=Order.total_income_amount(kind="intro"),
                 install=Order.total_income_amount(kind="install"),
                 ship=Order.total_income_amount(kind="ship"),
                 measure=Order.total_income_amount(kind="measure"))
Ejemplo n.º 11
0
def get_pay_close(oid):
    uid = g.user.uid
    order = Order.query.filter(
        and_(Order.user_id == uid, Order.order_no == oid,
             Order.status == 1)).first_or_404()
    pay_info = CloseOrder(oid).get_close_info()
    if pay_info['result_code'] == 'FAIL':
        return UserException(msg=pay_info['err_code'])
    Order.restore_product_stock(dict(order)['snap_product'])
    with db.auto_commit():
        order.status = 0
        order.update()
    return Success(msg='订单已关闭')
Ejemplo n.º 12
0
def delete_order(oid):
    resp_data = {'code': 200, 'msg': '查询成功~~', 'data': {}}
    addNav(resp_data)
    uid = current_user.id
    order = Order()

    with db.auto_commit():
        order.deleteOrderById(oid)

    userAllOrderList = order.getUserAllOrderList(uid)
    orderCollection = OrderCollection(userAllOrderList)
    resp_data['data'] = orderCollection.data
    return render_template('order.html', data=resp_data)
Ejemplo n.º 13
0
    def run():
        """
        Create 4 orders seeds
        """

        userid = [1, 2, 2, 3]
        status = ['reserved', 'confirmed', 'reserved', 'confirmed']

        for i in range(0, 4):
            orderrow = Order()
            orderrow.user_id = userid[i]
            orderrow.status = status[i]
            db.session.add(orderrow)
            db.session.commit()
Ejemplo n.º 14
0
    def post(self):
        data = request.get_json()
        orderDict = orderSchema.load(data)
        product = Product.get_by_id((orderDict['product']['id']))
        order = Order(orderDict['productName'], orderDict['totalProduct'],
                      orderDict['totalCompra'], product)
        totalCalculado = calculateTotalCompra(product)

        if (totalCalculado != order.totalCompra):
            print(totalCalculado)
            print('error son diferentes')
        else:
            order.save()
        resp = orderSchema.dump(order)
        return resp, 201
Ejemplo n.º 15
0
    def create(self, payloads):
        self.model_order = Order()
        order_details = payloads['order_details']
        self.model_order.user_id = payloads['user_id']
        self.model_order.status = 'pending'
        referal = db.session.query(Referal).filter_by(
            referal_code=payloads['referal_code'])
        if (referal.first() is not None):
            self.model_order.referal_id = referal.first().as_dict()['id']
        db.session.add(self.model_order)
        try:
            db.session.commit()
            data = self.model_order.as_dict()
            # insert the order details
            order_id = data['id']
            order_items = []
            for item in order_details:
                order_item = OrderDetails()
                order_item.ticket_id = item['ticket_id']
                order_item.count = item['count']
                order_item.order_id = order_id
                # get ticket data
                ticket = self.get_ticket(item['ticket_id'])
                if payloads['payment_type'] == 'paypal':
                    order_item.price = ticket.usd_price
                else:
                    order_item.price = ticket.price
                db.session.add(order_item)
                db.session.commit()
                order_items.append(order_item.as_dict())
            if payloads['payment_type'] == 'offline':
                gross_amount = (item['count'] * ticket.price)
                payment = Payment()
                payment.order_id = order_id
                payment.payment_type = 'offline'
                payment.gross_amount = gross_amount
                payment.transaction_time = datetime.datetime.now()
                payment.transaction_status = 'pending'
                db.session.add(payment)
                db.session.commit()

                # if payloads['payment_type'] == 'paypal':
                # self.paypalorder(payloads)
            # save all items
            return {'error': False, 'data': data, 'included': order_items}
        except SQLAlchemyError as e:
            data = e.orig.args
            return {'error': True, 'data': data}
Ejemplo n.º 16
0
    def create_order(form, from_organizer=False):
        order = Order()
        order.status = 'pending'
        order.identifier = TicketingManager.get_new_order_identifier()
        order.event_id = form.get('event_id')

        if from_organizer:
            order.paid_via = form.get('payment_via')

        ticket_ids = form.getlist('ticket_ids[]')
        ticket_quantity = form.getlist('ticket_quantities[]')
        ticket_discount=form.get('promo_code','')
        discount=None
        if ticket_discount:
            discount=TicketingManager.get_discount_code(form.get('event_id'), form.get('promo_code',''))
            if not discount:
                flash('The promotional code entered is not valid. No offer has been applied to this order.', 'danger')
            else:
                flash('The promotional code entered is valid.offer has been applied to this order.', 'success')
        ticket_subtotals = []
        if from_organizer:
            ticket_subtotals = form.getlist('ticket_subtotals[]')

        amount = 0
        for index, id in enumerate(ticket_ids):
            if not string_empty(id) and int(ticket_quantity[index]) > 0:
                with db.session.no_autoflush:
                    order_ticket = OrderTicket()
                    order_ticket.ticket = TicketingManager.get_ticket(id)
                    order_ticket.quantity = int(ticket_quantity[index])
                    order.tickets.append(order_ticket)

                    if from_organizer:
                        amount += int(ticket_subtotals[index])
                    else:
                        amount += (order_ticket.ticket.price * order_ticket.quantity)
        if discount and discount.type=="amount":
            order.amount = max(amount-discount.value,0)
        elif discount:
            order.amount=amount-(discount.value*amount/100)
        else:
            order.amount=amount

        if login.current_user.is_authenticated:
            order.user_id = login.current_user.id

        save_to_db(order)
        return order
Ejemplo n.º 17
0
def get_paginate_by_status(status):
    member = get_current_member()
    start, count = paginate()
    res = Order.get_paginate(member.id, start, count, status, throw=True)
    for order in res['models']:
        order.hide('snap_address', 'snap_products')
    return jsonify(res)
Ejemplo n.º 18
0
 def orders(self):
     page = request.args.get("page", 1)
     orders, page = Order.complete_orders(page)
     return dict(msg="ok",
                 code=200,
                 orders=[o.to_json() for o in orders],
                 page=page)
Ejemplo n.º 19
0
def get_summary():
    '''获取全部订单简要信息(分页)'''
    validator = PaginateValidator().validate_for_api()
    paged_orders = OrderModel.get_summary_by_user(uid=g.user.uid,
                                                  page=validator.page.data,
                                                  size=validator.size.data)
    return Success(paged_orders)
Ejemplo n.º 20
0
    async def update_item_list(self, db: Session, *, order_db: Order,
                               order_update: OrderUpdate) -> Order:

        db.query(ItemOrder).filter(ItemOrder.order_id == order_db.id).delete()

        item_orders: List[ItemOrder] = []

        for item in order_update.items_in_order:

            item_order = ItemOrder(
                tot_price=item.tot_price,
                quantity=item.quantity,
                order_id=order_db.id,
                item_id=item.item_id,
            )

            item_orders.append(item_order)

        order_db.items = item_orders

        db.add(order_db)
        db.commit()
        db.flush(order_db)

        return order_db
Ejemplo n.º 21
0
    def get(self):
        form = CouponForm()
        if request.args.get('status') == str(COUPON_STATUS["ALL"]):
            coupons = list(
                Information.objects(user_id=current_user.id).first().coupon)
            for i in range(len(coupons) - 1, -1, -1):
                if coupons[i].status == COUPON_STATUS[
                        "EXPIRED"] or Order.objects(
                            buyer_id=current_user.id,
                            coupon_id=coupons[i].id,
                            status__ne=ORDER_STATUS["CANCEL"]).first() != None:
                    del coupons[i]
            status = COUPON_STATUS["ALL"]
        else:
            coupons = Coupon.objects(
                id__nin=[
                    coupon.id for coupon in Information.objects(
                        user_id=current_user.id).first().coupon
                ],
                begin_time__lte=datetime.datetime.utcnow() +
                datetime.timedelta(hours=8),
                status=COUPON_STATUS["ACTIVE"])
            status = None

        return render_template('user/coupon/list.html',
                               status=status,
                               coupons=coupons,
                               form=form,
                               COUPON_STATUS=COUPON_STATUS)
Ejemplo n.º 22
0
def get_pay_order(oid):
    uid = g.user.uid
    user = User.query.filter_by(id=uid).first().append('openid')
    order = Order.get_one_order(oid)
    wx_pay = UnifiedOrder(oid, user.openid, order.pay_price)
    pay_info = wx_pay.get_pay_info()
    return jsonify(pay_info)
Ejemplo n.º 23
0
def create_order():
    uid = g.user.uid
    form = CreateOrderValidator().validate_for_api()
    order_no = Order.create_order(form.product_ids.data, form.address_id.data,
                                  form.user_coupon_id.data, form.remark.data,
                                  uid)
    return jsonify(order_no)
Ejemplo n.º 24
0
    def create_order(self, db: Session, invoice_id, order, total):
        db_order = Order(
            product_image=order.image,
            product_name=order.product_name,
            name=order.name,
            street=order.street,
            number=order.number,
            neighborhood=order.neighborhood,
            complement=order.complement,
            zip=order.zip,
            city=order.city,
            uf=order.uf,
            cellphone=order.cellphone,
            note=order.note,
            total=total,
            status="created",
            invoice_id=invoice_id,
            created_at=datetime.now(),
            merchant_id=order.merchant_id,
            type_id=order.type_id,
        )

        db.add(db_order)
        db.commit()
        db.refresh(db_order)
        return db_order
Ejemplo n.º 25
0
    def put(self, order_id):
        # Get order by id
        order = Order.get_by_id(order_id)
        if order is None:
            abort(404)

        # Update order fields
        args = self.parser.parse_args()
        order.cleaner_id = assign(args['cleaner_id'], order.cleaner_id)
        order.address_id = assign(args['address_id'], order.address_id)
        order.date = assign(args['date'], order.date)
        order.start_time = assign(args['start_time'], order.start_time)
        order.end_time = assign(args['end_time'], order.end_time)
        order.rooms = assign(args['rooms'], order.rooms)
        order.special_rooms = assign(args['special_rooms'],
                                     order.special_rooms)
        order.extra_services = assign(args['extra_services'],
                                      order.extra_services)
        order.reference = assign(args['reference'], order.reference)
        order.transaction = assign(args['transaction'], order.transaction)
        order.price = assign(args['price'], order.price)

        # Persist changes and return order
        order.persist()
        return order
Ejemplo n.º 26
0
def get_summary_by_user():
    '''订单摘要: 按用户查询&分页'''
    validator = PaginateValidator().validate_for_api()
    page = validator.page.data
    size = validator.size.data
    paging_orders = OrderModel.get_summary_by_user(g.user.uid, page, size)
    return Success(paging_orders)
Ejemplo n.º 27
0
def order_delete():
    meta = {
        'title': '订单管理',
        'css_nav_sub_order': 'active',
        'css_nav_reptile': 'active'
    }

    ids = request.values.get('ids', '')
    type = request.values.get('type', 1)
    if not ids:
        return jsonify(success=False, message='缺少请求参数!')

    try:
        arr = ids.split(',')
        for d in arr:
            order = Order.objects(_id=bson.objectid.ObjectId(d)).first()
            order.mark_delete() if order else None
    except (Exception) as e:
        return jsonify(success=False, message=str(e))

    return jsonify(success=True,
                   message='操作成功!',
                   data={
                       'ids': ids,
                       'type': type
                   },
                   redirect_to=url_for('admin.order_list'))
Ejemplo n.º 28
0
    def delete(self, order_id):
        # Delete order
        success = Order.delete_by_id(order_id)
        if not success:
            abort(404)

        return {'result': True}
Ejemplo n.º 29
0
def check_login():
    """
    获取用户请求头中的 Headers 中的 Authorization的值
    根据这个的值找出数据库中的用户的解析, 并且返回用户
    如果没有找到就返回错误
    """
    token = request.headers.get("Authorization", None)
    if not token:
        return dict(msg="需要授权登录才能访问", code=419)
    user = User.conver_token(token)
    if not user:
        return dict(msg="登录验证失效", code=419)
    User.set_account(user.account_id)
    Order.set_account(user.account_id)
    Order.set_current_user(user)
    g.current_user = user
    g.current_account = user.current_account
Ejemplo n.º 30
0
    def get(self, order_id):
        # Get order by id
        order = Order.get_by_id(order_id)
        if order is None:
            abort(404)

        # Return order
        return order
Ejemplo n.º 31
0
    def test_create_order_rating_when_order_already_rated(
            self, mock_vendor_engagement_repo_get, mock_meal_item_repo_get,
            mock_auth_user, mock_vendor_rating_controller_request_params,
            mock_order_repo_get):
        '''Test create_order_rating when order has already been rated.
        '''
        # Arrange
        with self.app.app_context():
            mock_meal_item = MealItem(id=1,
                                      created_at=datetime.now(),
                                      updated_at=datetime.now(),
                                      meal_type='main',
                                      name='Mock meal',
                                      image='',
                                      location_id=1)
            mock_vendor_engagement = VendorEngagement(
                id=1,
                created_at=datetime.now(),
                updated_at=datetime.now(),
                vendor_id=1,
                location_id=1,
                start_date=datetime.now(),
                end_date=(datetime.now() + timedelta(days=5)),
                status=1,
                termination_reason='Mock reason')
            mock_order = Order(id=1,
                               created_at=datetime.now(),
                               updated_at=datetime.now(),
                               user_id='user_id',
                               date_booked_for=datetime.now(),
                               date_booked=datetime.now(),
                               channel='web',
                               meal_period='lunch',
                               order_status='booked',
                               has_rated=True,
                               menu_id=1,
                               location_id=1)
            mock_vendor_rating_controller_request_params.return_value = (1,
                                                                         None,
                                                                         None,
                                                                         None,
                                                                         3,
                                                                         None,
                                                                         None)
            mock_auth_user.return_value = 1
            mock_meal_item_repo_get.return_value = mock_meal_item
            mock_vendor_engagement_repo_get.return_value = \
                mock_vendor_engagement
            mock_order_repo_get.return_value = mock_order
            vendor_rating_controller = VendorRatingController(
                self.request_context)

            # Act
            result = vendor_rating_controller.create_order_rating()

            # Assert
            assert result.status_code == 400
            assert result.get_json()['msg'] == 'This order has been rated'
    def create_order(form, from_organizer=False):
        order = Order()
        order.status = 'pending'
        order.identifier = TicketingManager.get_new_order_identifier()
        order.event_id = form.get('event_id')

        if from_organizer:
            order.paid_via = form.get('payment_via')

        ticket_ids = form.getlist('ticket_ids[]')
        ticket_quantity = form.getlist('ticket_quantities[]')

        ticket_subtotals = []
        if from_organizer:
            ticket_subtotals = form.getlist('ticket_subtotals[]')

        amount = 0
        for index, id in enumerate(ticket_ids):
            if not string_empty(id) and int(ticket_quantity[index]) > 0:
                with db.session.no_autoflush:
                    order_ticket = OrderTicket()
                    order_ticket.ticket = TicketingManager.get_ticket(id)
                    order_ticket.quantity = int(ticket_quantity[index])
                    order.tickets.append(order_ticket)

                    if from_organizer:
                        amount += int(ticket_subtotals[index])
                    else:
                        amount += (order_ticket.ticket.price * order_ticket.quantity)

        order.amount = amount

        if login.current_user.is_authenticated:
            order.user_id = login.current_user.id

        save_to_db(order)
        return order
Ejemplo n.º 33
0
    def create_order(form, from_organizer=False):
        order = Order()
        order.status = 'pending'
        order.identifier = TicketingManager.get_new_order_identifier()
        order.event_id = form.get('event_id')

        if from_organizer:
            order.paid_via = form.get('payment_via')

        ticket_ids = form.getlist('ticket_ids[]')
        ticket_quantity = form.getlist('ticket_quantities[]')
        ticket_discount = form.get('promo_code', '')
        discount = None
        if ticket_discount:
            discount = TicketingManager.get_discount_code(form.get('event_id'), form.get('promo_code', ''))
            access_code = TicketingManager.get_access_code(form.get('event_id'), form.get('promo_code', ''))
            if access_code and discount:
                order.discount_code = discount
                flash('Both access code and discount code have been applied. You can make this order now.', 'success')
            elif discount:
                order.discount_code = discount
                flash('The promotional code entered is valid. Offer has been applied to this order.', 'success')
            elif access_code:
                flash('Your access code is applied and you can make this order now.', 'success')
            else:
                flash('The promotional code entered is not valid. No offer has been applied to this order.', 'danger')

        ticket_subtotals = []
        if from_organizer:
            ticket_subtotals = form.getlist('ticket_subtotals[]')

        amount = 0
        total_discount = 0
        fees = DataGetter.get_fee_settings_by_currency(DataGetter.get_event(order.event_id).payment_currency)
        for index, id in enumerate(ticket_ids):
            if not string_empty(id) and int(ticket_quantity[index]) > 0:
                with db.session.no_autoflush:
                    order_ticket = OrderTicket()
                    order_ticket.ticket = TicketingManager.get_ticket(id)
                    order_ticket.quantity = int(ticket_quantity[index])
                    order.tickets.append(order_ticket)

                    if order_ticket.ticket.absorb_fees or not fees:
                        ticket_amount = (order_ticket.ticket.price * order_ticket.quantity)
                        amount += (order_ticket.ticket.price * order_ticket.quantity)
                    else:
                        order_fee = fees.service_fee * (order_ticket.ticket.price * order_ticket.quantity) / 100
                        if order_fee > fees.maximum_fee:
                            ticket_amount = (order_ticket.ticket.price * order_ticket.quantity) + fees.maximum_fee
                            amount += (order_ticket.ticket.price * order_ticket.quantity) + fees.maximum_fee
                        else:
                            ticket_amount = (order_ticket.ticket.price * order_ticket.quantity) + order_fee
                            amount += (order_ticket.ticket.price * order_ticket.quantity) + order_fee

                    if from_organizer:
                        amount += float(ticket_subtotals[index])
                    else:
                        if discount and str(order_ticket.ticket.id) in discount.tickets.split(","):
                            if discount.type == "amount":
                                total_discount += discount.value * order_ticket.quantity
                            else:
                                total_discount += discount.value * ticket_amount / 100

        if discount:
            order.amount = max(amount - total_discount, 0)
        elif discount:
            order.amount = amount - (discount.value * amount / 100.0)
        else:
            order.amount = amount

        if login.current_user.is_authenticated:
            order.user_id = login.current_user.id

        save_to_db(order)
        return order