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
    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
    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
Exemple #4
0
    def after_create_object(self, order, data, view_kwargs):
        """
        after create object method for OrderListPost Class
        :param order: Object created from mashmallow_jsonapi
        :param data:
        :param view_kwargs:
        :return:
        """
        order_tickets = {}
        for holder in order.ticket_holders:
            save_to_db(holder)
            if not order_tickets.get(holder.ticket_id):
                order_tickets[holder.ticket_id] = 1
            else:
                order_tickets[holder.ticket_id] += 1

        order.user = current_user

        # create pdf tickets.
        create_pdf_tickets_for_holder(order)

        for ticket in order_tickets:
            od = OrderTicket(order_id=order.id,
                             ticket_id=ticket,
                             quantity=order_tickets[ticket])
            save_to_db(od)

        order.quantity = order.tickets_count
        save_to_db(order)
        #         if not has_access('is_coorganizer', event_id=data['event']):
        #             TicketingManager.calculate_update_amount(order)

        # send e-mail and notifications if the order status is completed
        if order.status == 'completed':
            send_email_to_attendees(order, current_user.id)
            send_notif_to_attendees(order, current_user.id)

            order_url = make_frontend_url(path='/orders/{identifier}'.format(
                identifier=order.identifier))
            for organizer in order.event.organizers:
                send_notif_ticket_purchase_organizer(organizer,
                                                     order.invoice_number,
                                                     order_url,
                                                     order.event.name,
                                                     order.identifier)

        data['user_id'] = current_user.id
    def after_create_object(self, order, data, view_kwargs):
        """
        after create object method for OrderListPost Class
        :param order:
        :param data:
        :param view_kwargs:
        :return:
        """
        order_tickets = {}
        for holder in order.ticket_holders:
            if holder.id != current_user.id:
                pdf = create_save_pdf(
                    render_template('/pdf/ticket_attendee.html',
                                    order=order,
                                    holder=holder))
            else:
                pdf = create_save_pdf(
                    render_template('/pdf/ticket_purchaser.html', order=order))
            holder.pdf_url = pdf
            save_to_db(holder)
            if order_tickets.get(holder.ticket_id) is None:
                order_tickets[holder.ticket_id] = 1
            else:
                order_tickets[holder.ticket_id] += 1
        for ticket in order_tickets:
            od = OrderTicket(order_id=order.id,
                             ticket_id=ticket,
                             quantity=order_tickets[ticket])
            save_to_db(od)
        order.quantity = order.get_tickets_count()
        save_to_db(order)
        if not has_access('is_coorganizer', event_id=data['event']):
            TicketingManager.calculate_update_amount(order)
        send_email_to_attendees(order, current_user.id)
        send_notif_to_attendees(order, current_user.id)

        order_url = make_frontend_url(path='/orders/{identifier}'.format(
            identifier=order.identifier))
        for organizer in order.event.organizers:
            send_notif_ticket_purchase_organizer(organizer,
                                                 order.invoice_number,
                                                 order_url, order.event.name)

        data['user_id'] = current_user.id
Exemple #6
0
def save_order(order):
    order_tickets = {}
    for holder in order.ticket_holders:
        save_to_db(holder)
        if not order_tickets.get(holder.ticket_id):
            order_tickets[holder.ticket_id] = 1
        else:
            order_tickets[holder.ticket_id] += 1

    order.user = current_user

    for ticket in order_tickets:
        od = OrderTicket(
            order_id=order.id, ticket_id=ticket, quantity=order_tickets[ticket]
        )
        save_to_db(od)

    order.quantity = order.tickets_count
    save_to_db(order)

    on_order_completed(order)
    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
    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
Exemple #9
0
def create_order():
    data = request.get_json()
    tickets, discount_code = calculate_order_amount_wrapper(data)
    attendee = data['attendee']
    for attribute in attendee:
        attendee[attribute.replace('-', '_')] = attendee.pop(attribute)
    schema = AttendeeSchema()
    json_api_attendee = {
        "data": {
            "attributes": data['attendee'],
            "type": "attendee"
        }
    }
    result = schema.load(json_api_attendee)
    if result.errors:
        return make_response(jsonify(result.errors), 422)
    ticket_ids = {int(ticket['id']) for ticket in tickets}
    quantity = {int(ticket['id']): ticket['quantity'] for ticket in tickets}
    ticket_list = (db.session.query(Ticket).filter(
        Ticket.id.in_(ticket_ids)).filter_by(event_id=data['event_id'],
                                             deleted_at=None).all())
    ticket_ids_found = {
        ticket_information.id
        for ticket_information in ticket_list
    }
    tickets_not_found = ticket_ids - ticket_ids_found
    if tickets_not_found:
        return make_response(
            jsonify(
                status='Order Unsuccessful',
                error='Tickets with id {} were not found in Event {}.'.format(
                    tickets_not_found, data['event_id']),
            ),
            404,
        )
    for ticket_info in ticket_list:
        if (ticket_info.quantity - get_count(
                db.session.query(TicketHolder.id).filter_by(
                    ticket_id=int(ticket_info.id),
                    deleted_at=None))) < quantity[ticket_info.id]:
            return make_response(
                jsonify(status='Order Unsuccessful',
                        error='Ticket already sold out.'),
                409,
            )
    attendee_list = []
    for ticket in tickets:
        for ticket_amount in range(ticket['quantity']):
            attendee = TicketHolder(**result[0],
                                    event_id=int(data['event_id']),
                                    ticket_id=int(ticket['id']))
            db.session.add(attendee)
            attendee_list.append(attendee)
    ticket_pricing = calculate_order_amount(tickets, discount_code)
    if not has_access('is_coorganizer', event_id=data['event_id']):
        data['status'] = 'initializing'
    # create on site attendees
    # check if order already exists for this attendee.
    # check for free tickets and verified user
    order = Order(
        amount=ticket_pricing['total_amount'],
        user_id=current_user.id,
        event_id=int(data['event_id']),
        status=data['status'],
    )
    db.session.add(order)
    db.session.commit()
    db.session.refresh(order)
    order_tickets = {}
    for holder in attendee_list:
        holder.order_id = order.id
        db.session.add(holder)
        if not order_tickets.get(holder.ticket_id):
            order_tickets[holder.ticket_id] = 1
        else:
            order_tickets[holder.ticket_id] += 1

    create_pdf_tickets_for_holder(order)

    for ticket in order_tickets:
        od = OrderTicket(order_id=order.id,
                         ticket_id=ticket,
                         quantity=order_tickets[ticket])
        db.session.add(od)

    order.quantity = order.tickets_count
    db.session.add(order)
    db.session.commit()
    db.session.refresh(order)
    order_schema = OrderSchema()
    return order_schema.dump(order)
Exemple #10
0
    def after_create_object(self, order, data, view_kwargs):
        """
        after create object method for OrderListPost Class
        :param order: Object created from mashmallow_jsonapi
        :param data:
        :param view_kwargs:
        :return:
        """
        order_tickets = {}
        for holder in order.ticket_holders:
            save_to_db(holder)
            if not order_tickets.get(holder.ticket_id):
                order_tickets[holder.ticket_id] = 1
            else:
                order_tickets[holder.ticket_id] += 1

        order.user = current_user

        # create pdf tickets.
        create_pdf_tickets_for_holder(order)

        for ticket in order_tickets:
            od = OrderTicket(order_id=order.id,
                             ticket_id=ticket,
                             quantity=order_tickets[ticket])
            save_to_db(od)

        order.quantity = order.tickets_count
        save_to_db(order)
        #         if not has_access('is_coorganizer', event_id=data['event']):
        #             TicketingManager.calculate_update_amount(order)

        # send e-mail and notifications if the order status is completed
        if order.status == 'completed' or order.status == 'placed':
            # fetch tickets attachment
            order_identifier = order.identifier

            key = UPLOAD_PATHS['pdf']['ticket_attendee'].format(
                identifier=order_identifier)
            ticket_path = 'generated/tickets/{}/{}/'.format(
                key, generate_hash(key)) + order_identifier + '.pdf'

            key = UPLOAD_PATHS['pdf']['order'].format(
                identifier=order_identifier)
            invoice_path = 'generated/invoices/{}/{}/'.format(
                key, generate_hash(key)) + order_identifier + '.pdf'

            # send email and notifications.
            send_email_to_attendees(order=order,
                                    purchaser_id=current_user.id,
                                    attachments=[ticket_path, invoice_path])

            send_notif_to_attendees(order, current_user.id)

            if order.payment_mode in ['free', 'bank', 'cheque', 'onsite']:
                order.completed_at = datetime.utcnow()

            order_url = make_frontend_url(path='/orders/{identifier}'.format(
                identifier=order.identifier))
            for organizer in order.event.organizers:
                send_notif_ticket_purchase_organizer(organizer,
                                                     order.invoice_number,
                                                     order_url,
                                                     order.event.name,
                                                     order.identifier)

        data['user_id'] = current_user.id