Ejemplo n.º 1
0
 def test_discounts_edit(self):
     with app.test_request_context():
         event, discount_code = create_discount_code(self)
         response = self.app.get(url_for(
             'event_ticket_sales.discount_codes_edit',
             event_id=event.id,
             discount_code_id=discount_code.id),
                                 follow_redirects=True)
         self.assertTrue(str(discount_code.code) in response.data,
                         msg=response.data)
         data = {
             "code": "ABC_123",
             "value": "100",
             "value_type": "percent",
             "min_quantity": "1",
             "max_quantity": "2",
             "tickets_number": "30",
             "tickets[]": ["1", "2"]
         }
         response = self.app.post(url_for(
             'event_ticket_sales.discount_codes_edit',
             event_id=event.id,
             discount_code_id=discount_code.id),
                                  data=data,
                                  follow_redirects=True)
         self.assertTrue(TicketingManager.get_discount_code(
             event.id, discount_code.id).type == 'percent',
                         msg=response.data)
 def test_discounts_toggle(self):
     with app.test_request_context():
         event, discount_code = create_discount_code(self)
         response = self.app.get(url_for('event_ticket_sales.discount_codes_toggle', event_id=event.id,
                                         discount_code_id=discount_code.id), follow_redirects=True)
         self.assertFalse(TicketingManager.get_discount_code(event.id, discount_code.id).is_active,
                          msg=response.data)
Ejemplo n.º 3
0
def discount_codes_delete(event_id, discount_code_id=None):
    discount_code = TicketingManager.get_discount_code(event_id, discount_code_id)
    if not discount_code:
        abort(404)
    delete_from_db(discount_code, "Discount code deleted")
    flash("The discount code has been deleted.", "warning")
    return redirect(url_for('.discount_codes_view', event_id=event_id))
Ejemplo n.º 4
0
def apply_promo():
    discount = TicketingManager.get_discount_code(request.form.get('event_id'), request.form.get('promo_code', ''))
    access_code = TicketingManager.get_access_code(request.form.get('event_id'), request.form.get('promo_code', ''))
    if discount and access_code and discount.is_active:
        return jsonify({
            'discount_type': discount.type,
            'discount_amount': discount.value,
            'discount_status': True,
            'access_status': True,
            'access_code_ticket': access_code.tickets,
            'discount_code_ticket': discount.tickets,
        })
    elif discount and discount.is_active:
        return jsonify({
            'discount_type': discount.type,
            'discount_amount': discount.value,
            'discount_status': True,
            'access_status': False,
            'discount_code_ticket': discount.tickets,
        })
    elif access_code:
        return jsonify({
            'access_status': True,
            'discount_status': False,
            'access_code_ticket': access_code.tickets,
        })
    else:
        return jsonify({
            'discount_status': False,
            'access_status': False,
        })
Ejemplo n.º 5
0
def discount_codes_edit(event_id, discount_code_id=None):
    if not TicketingManager.get_discount_code(event_id, discount_code_id):
        abort(404)
    if request.method == 'POST':
        TicketingManager.create_edit_discount_code(request.form, event_id, discount_code_id)
        flash("The discount code has been edited.", "success")
        return redirect(url_for('.discount_codes_view', event_id=event_id))
    return discount_codes_create(event_id=event_id, discount_code_id=discount_code_id)
Ejemplo n.º 6
0
def discount_codes_toggle(event_id, discount_code_id=None):
    discount_code = TicketingManager.get_discount_code(event_id, discount_code_id)
    if not discount_code:
        abort(404)
    discount_code.is_active = not discount_code.is_active
    save_to_db(discount_code)
    message = "Activated." if discount_code.is_active else "Deactivated."
    flash("The discount code has been " + message, "success")
    return redirect(url_for('.discount_codes_view', event_id=event_id))
Ejemplo n.º 7
0
def discount_codes_create(event_id, discount_code_id=None):
    event = DataGetter.get_event(event_id)
    if request.method == 'POST':
        TicketingManager.create_edit_discount_code(request.form, event_id)
        flash("The discount code has been added.", "success")
        return redirect(url_for('.discount_codes_view', event_id=event_id))
    discount_code = None
    if discount_code_id:
        discount_code = TicketingManager.get_discount_code(event_id, discount_code_id)
    return render_template('gentelella/users/events/tickets/discount_codes_create.html', event=event, event_id=event_id,
                           discount_code=discount_code)
Ejemplo n.º 8
0
 def test_discounts_toggle(self):
     with app.test_request_context():
         event, discount_code = create_discount_code(self)
         response = self.app.get(url_for(
             'event_ticket_sales.discount_codes_toggle',
             event_id=event.id,
             discount_code_id=discount_code.id),
                                 follow_redirects=True)
         self.assertFalse(TicketingManager.get_discount_code(
             event.id, discount_code.id).is_active,
                          msg=response.data)
Ejemplo n.º 9
0
def display_attendees(event_id):
    event = DataGetter.get_event(event_id)
    orders = TicketingManager.get_orders(event_id)
    holders = []
    for order in orders:
        for holder in order.ticket_holders:
            discount = TicketingManager.get_discount_code(
                event_id, order.discount_code_id)
            order_holder = {}
            order_holder['order_invoice'] = order.get_invoice_number()
            order_holder['order_url'] = url_for('ticketing.view_order_after_payment', order_identifier=order.identifier) \
                                        if order.status == 'completed' else url_for('ticketing.show_transaction_error', \
                                        order_identifier=order.identifier)
            order_holder['by_whom'] = order.user.user_detail.fullname if order.user.user_detail \
                                        and order.user.user_detail.fullname else order.user.email
            order_holder['paid_via'] = order.paid_via
            order_holder['status'] = order.status
            order_holder['completed_at'] = order.completed_at
            order_holder['created_at'] = order.created_at
            order_holder['ticket_name'] = holder.ticket.name
            order_holder['firstname'] = holder.firstname
            order_holder['lastname'] = holder.lastname
            order_holder['email'] = holder.email
            order_holder['ticket_name'] = holder.ticket.name
            order_holder['ticket_price'] = holder.ticket.price
            if discount and str(
                    holder.ticket.id) in discount.tickets.split(","):
                if discount.type == "amount":
                    order_holder['ticket_price'] = order_holder[
                        'ticket_price'] - discount.value
                else:
                    order_holder['ticket_price'] = order_holder['ticket_price'] - (order_holder['ticket_price'] \
                                                    * discount.value / 100.0 )
            order_holder['checked_in'] = holder.checked_in
            order_holder['id'] = holder.id
            holders.append(order_holder)
        if len(order.ticket_holders) == 0:
            order_holder = {}
            order_holder['order_invoice'] = order.get_invoice_number()
            order_holder['order_url'] = url_for('ticketing.view_order_after_payment', order_identifier=order.identifier) \
                                        if order.status == 'completed' else url_for('ticketing.show_transaction_error', \
                                        order_identifier=order.identifier)
            order_holder['by_whom'] = order.user.user_detail.fullname if order.user.user_detail \
                                        and order.user.user_detail.fullname else order.user.email
            order_holder['paid_via'] = order.paid_via
            order_holder['status'] = order.status
            order_holder['completed_at'] = order.completed_at
            order_holder['created_at'] = order.created_at
            holders.append(order_holder)

    return render_template('gentelella/admin/event/tickets/attendees.html',
                           event=event,
                           event_id=event_id,
                           holders=holders)
Ejemplo n.º 10
0
def check_duplicate_discount_code(event_id):
    code = request.args.get('code')
    current = request.args.get('current')
    if not current:
        current = ''
    discount_code = TicketingManager.get_discount_code(event_id, code)
    if (current == ""
            and discount_code) or (current != "" and discount_code
                                   and discount_code.id != int(current)):
        return jsonify({"status": "invalid"}), 404

    return jsonify({"status": "valid"}), 200
def check_duplicate_discount_code(event_id):
    code = request.args.get('code')
    current = request.args.get('current')
    if not current:
        current = ''
    discount_code = TicketingManager.get_discount_code(event_id, code)
    if (current == "" and discount_code) or (current != "" and discount_code and discount_code.id != int(current)):
        return jsonify({
            "status": "invalid"
        }), 404

    return jsonify({
        "status": "valid"
    }), 200
def create_discount_code(self):
    event = ObjectMother.get_event()
    save_to_db(event)
    data = {
        "code": "ABC_123",
        "value": "100",
        "value_type": "amount",
        "min_quantity": "1",
        "max_quantity": "2",
        "status": 'active',
        "tickets_number": "30",
        "tickets[]": ["1", "2"]
    }
    response = self.app.post(url_for('event_ticket_sales.discount_codes_create', event_id=event.id),
                             data=data, follow_redirects=True)
    self.assertTrue(str(data['code']) in response.data, msg=response.data)
    return event, TicketingManager.get_discount_code(event.id, data['code'])
Ejemplo n.º 13
0
def create_discount_code(self):
    event = ObjectMother.get_event()
    save_to_db(event)
    data = {
        "code": "ABC_123",
        "value": "100",
        "value_type": "amount",
        "min_quantity": "1",
        "max_quantity": "2",
        "tickets_number": "30",
        "tickets[]": ["1", "2"]
    }
    response = self.app.post(url_for(
        'event_ticket_sales.discount_codes_create', event_id=event.id),
                             data=data,
                             follow_redirects=True)
    self.assertTrue(str(data['code']) in response.data, msg=response.data)
    return event, TicketingManager.get_discount_code(event.id, data['code'])
 def test_discounts_edit(self):
     with app.test_request_context():
         event, discount_code = create_discount_code(self)
         response = self.app.get(url_for('event_ticket_sales.discount_codes_edit', event_id=event.id,
                                         discount_code_id=discount_code.id), follow_redirects=True)
         self.assertTrue(str(discount_code.code) in response.data, msg=response.data)
         data = {
             "code": "ABC_123",
             "value": "100",
             "value_type": "percent",
             "min_quantity": "1",
             "max_quantity": "2",
             "tickets_number": "30",
             "tickets[]": ["1", "2"]
         }
         response = self.app.post(url_for('event_ticket_sales.discount_codes_edit', event_id=event.id,
                                          discount_code_id=discount_code.id), data=data, follow_redirects=True)
         self.assertTrue(TicketingManager.get_discount_code(event.id, discount_code.id).type == 'percent',
                         msg=response.data)
Ejemplo n.º 15
0
def sales_by_events_view(path):
    from_date = request.args.get('from_date')
    to_date = request.args.get('to_date')

    if ('from_date' in request.args and not from_date) or ('to_date' in request.args and not to_date) or \
        ('from_date' in request.args and 'to_date' not in request.args) or \
        ('to_date' in request.args and 'from_date' not in request.args):
        return redirect(url_for('.sales_by_events_view', path=path))

    promoted_events = path == 'discounted-events'

    if from_date and to_date:
        orders = TicketingManager.get_orders(
            from_date=datetime.strptime(from_date, '%d/%m/%Y'),
            to_date=datetime.strptime(to_date, '%d/%m/%Y'),
            promoted_event=promoted_events
        )
    else:
        orders = TicketingManager.get_orders(promoted_event=promoted_events)

    if promoted_events:
        events = DataGetter.get_all_events_with_discounts()
    else:
        events = DataGetter.get_all_events()

    orders_summary = {
        'completed': {
            'class': 'success',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'placed': {
            'class': 'info',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'pending': {
            'class': 'warning',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'expired': {
            'class': 'danger',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'deleted': {
            'class': 'primary',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'cancelled': {
            'class': 'default',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        }
    }

    tickets_summary_event_wise = {}
    tickets_summary_organizer_wise = {}
    tickets_summary_location_wise = {}

    for event in events:
        tickets_summary_event_wise[str(event.id)] = {
            'name': event.name,
            'payment_currency': event.payment_currency,
            'marketer': '',
            'discount_code': '',
            'live_url': url_for('event_detail.display_event_detail_home', identifier=event.identifier).replace('events',
                                                                                                               'e'),
            'event_url': url_for('events.details_view', event_id=event.id),
            'start_time': event.start_time,
            'end_time': event.end_time,
            'completed': {
                'tickets_count': 0,
                'sales': 0
            },
            'placed': {
                'tickets_count': 0,
                'sales': 0
            },
            'pending': {
                'tickets_count': 0,
                'sales': 0
            },
            'expired': {
                'class': 'danger',
                'tickets_count': 0,
                'sales': 0
            },
            'cancelled': {
                'tickets_count': 0,
                'sales': 0
            },
            'deleted': {
                'tickets_count': 0,
                'sales': 0
            },
        }
        organizer = DataGetter.get_user_event_roles_by_role_name(event.id, 'organizer').first()

        if promoted_events:
            tickets_summary_event_wise[str(event.id)]['marketer'] = \
                event.discount_code.marketer.email
            tickets_summary_event_wise[str(event.id)]['discount_code'] = \
                str(event.discount_code.value) + '% off for ' + str(event.discount_code.max_quantity) + ' months'

        tickets_summary_organizer_wise[str(organizer.user.id)] = \
            copy.deepcopy(tickets_summary_event_wise[str(event.id)])
        if organizer:
            tickets_summary_organizer_wise[str(organizer.user.id)]['name'] = organizer.user.email

        tickets_summary_location_wise[unicode(event.searchable_location_name)] = \
            copy.deepcopy(tickets_summary_event_wise[str(event.id)])
        tickets_summary_location_wise[unicode(event.searchable_location_name)]['name'] = \
            event.searchable_location_name

    for order in orders:
        if order.event:
            if order.status == 'initialized':
                order.status = 'pending'
            orders_summary[str(order.status)]['orders_count'] += 1
            orders_summary[str(order.status)]['total_sales'] += forex(order.event.payment_currency,
                                                                      display_currency, order.amount)
            for order_ticket in order.tickets:
                discount = TicketingManager.get_discount_code(order.event_id, order.discount_code_id)
                orders_summary[str(order.status)]['tickets_count'] += order_ticket.quantity
                ticket = CachedGetter.get_ticket(order_ticket.ticket_id)
                tickets_summary_event_wise[str(order.event_id)][str(order.status)]['tickets_count'] \
                    += order_ticket.quantity
                tickets_summary_organizer_wise[str(organizer.user.id)][str(order.status)]['tickets_count'] \
                    += order_ticket.quantity
                tickets_summary_location_wise[unicode(order.event.searchable_location_name)][str(order.status)][
                    'tickets_count'] \
                    += order_ticket.quantity

                if order.paid_via != 'free' and order.amount > 0:
                    if discount and str(ticket.id) in discount.tickets.split(","):
                        if discount.type == "amount":
                            tickets_summary_event_wise[str(order.event_id)][str(order.status)][
                                'sales'] += forex(order.event.payment_currency, display_currency, \
                                            order_ticket.quantity * (ticket.price - discount.value))
                            tickets_summary_organizer_wise[str(organizer.user.id)][str(order.status)][
                                'sales'] += forex(order.event.payment_currency, display_currency, \
                                            order_ticket.quantity * (ticket.price - discount.value))
                            tickets_summary_location_wise[str(order.event.searchable_location_name)][str(order.status)][
                                'sales'] += forex(order.event.payment_currency, display_currency, \
                                            order_ticket.quantity * (ticket.price - discount.value))
                        else:
                            tickets_summary_event_wise[str(order.event_id)][str(order.status)]['sales'] += \
                                forex(order.event.payment_currency, display_currency, \
                                    order_ticket.quantity * (ticket.price - discount.value * ticket.price / 100.0))
                            tickets_summary_organizer_wise[str(organizer.user.id)][str(order.status)]['sales'] += \
                                forex(order.event.payment_currency, display_currency, \
                                    order_ticket.quantity * (ticket.price - discount.value * ticket.price / 100.0))
                            tickets_summary_location_wise[str(order.event.searchable_location_name)][str(order.status)]['sales'] += \
                                forex(order.event.payment_currency, display_currency, \
                                    order_ticket.quantity * (ticket.price - discount.value * ticket.price / 100.0))
                    else:
                        tickets_summary_event_wise[str(order.event_id)][str(order.status)][
                            'sales'] += forex(order.event.payment_currency, display_currency, order_ticket.quantity * ticket.price)
                        tickets_summary_organizer_wise[str(organizer.user.id)][str(order.status)][
                            'sales'] += forex(order.event.payment_currency, display_currency, order_ticket.quantity * ticket.price)
                        tickets_summary_location_wise[str(order.event.searchable_location_name)][str(order.status)][
                            'sales'] += forex(order.event.payment_currency, display_currency, order_ticket.quantity * ticket.price)
    if path == 'events' or path == 'discounted-events':
        return render_template(
            'gentelella/super_admin/sales/by_events.html',
            tickets_summary=tickets_summary_event_wise,
            display_currency=display_currency,
            from_date=from_date,
            to_date=to_date,
            path=path,
            orders_summary=orders_summary,
            navigation_bar=list_navbar())
    elif path == 'organizers':
        return render_template(
            'gentelella/super_admin/sales/by_organizer.html',
            tickets_summary=tickets_summary_organizer_wise,
            display_currency=display_currency,
            from_date=from_date,
            to_date=to_date,
            path=path,
            orders_summary=orders_summary,
            navigation_bar=list_navbar())
    elif path == 'locations':
        return render_template(
            'gentelella/super_admin/sales/by_location.html',
            tickets_summary=tickets_summary_location_wise,
            display_currency=display_currency,
            from_date=from_date,
            to_date=to_date,
            path=path,
            orders_summary=orders_summary,
            navigation_bar=list_navbar())

    else:
        abort(404)
def display_ticket_stats(event_id):
    event = DataGetter.get_event(event_id)
    orders = TicketingManager.get_orders(event_id)

    orders_summary = {
        'completed': {
            'class': 'success',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'placed': {
            'class': 'info',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'pending': {
            'class': 'warning',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'expired': {
            'class': 'danger',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'deleted': {
            'class': 'primary',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'cancelled': {
            'class': 'default',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        }
    }

    tickets_summary = {}

    for ticket in event.tickets:
        tickets_summary[str(ticket.id)] = {
            'name': ticket.name,
            'quantity': ticket.quantity,
            'completed': {
                'tickets_count': 0,
                'sales': 0
            },
            'placed': {
                'tickets_count': 0,
                'sales': 0
            },
            'pending': {
                'tickets_count': 0,
                'sales': 0
            },
            'expired': {
                'class': 'danger',
                'tickets_count': 0,
                'sales': 0
            },
            'deleted': {
                'tickets_count': 0,
                'sales': 0
            },
            'cancelled': {
                'tickets_count': 0,
                'sales': 0
            },
        }

    for order in orders:
        if order.status == 'initialized':
            order.status = 'pending'
        fees = DataGetter.get_fee_settings_by_currency(DataGetter.get_event(order.event_id).payment_currency)
        orders_summary[str(order.status)]['orders_count'] += 1
        orders_summary[str(order.status)]['total_sales'] += order.amount

        for order_ticket in order.tickets:
            discount = TicketingManager.get_discount_code(event_id, order.discount_code_id)
            orders_summary[str(order.status)]['tickets_count'] += order_ticket.quantity
            ticket = get_ticket(order_ticket.ticket_id)
            tickets_summary[str(ticket.id)][str(order.status)]['tickets_count'] += order_ticket.quantity
            ticket_price = ticket.price
            if fees and not ticket.absorb_fees:
                order_fee = fees.service_fee * (ticket.price * order_ticket.quantity) / 100.0
                if order_fee > fees.maximum_fee:
                    ticket_price = ticket.price + fees.maximum_fee / order_ticket.quantity
                else:
                    ticket_price = ticket.price + fees.service_fee * ticket.price / 100.0

            if order.paid_via != 'free' and order.amount > 0:
                if discount and str(ticket.id) in discount.tickets.split(","):
                    if discount.type == "amount":
                        tickets_summary[str(ticket.id)][str(order.status)]['sales'] += order_ticket.quantity * (
                            ticket_price - discount.value)
                    else:
                        tickets_summary[str(ticket.id)][str(order.status)]['sales'] += order_ticket.quantity * (
                            ticket_price - discount.value * ticket_price / 100.0)
                else:
                    tickets_summary[str(ticket.id)][str(order.status)]['sales'] += order_ticket.quantity * ticket_price
    return render_template('gentelella/users/events/tickets/tickets.html', event=event, event_id=event_id,
                           orders_summary=orders_summary, tickets_summary=tickets_summary)
Ejemplo n.º 17
0
def display_ticket_stats(event_id):
    event = DataGetter.get_event(event_id)
    orders = TicketingManager.get_orders(event_id)

    orders_summary = {
        'completed': {
            'class': 'success',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'placed': {
            'class': 'info',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'pending': {
            'class': 'warning',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'expired': {
            'class': 'danger',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'deleted': {
            'class': 'primary',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'cancelled': {
            'class': 'default',
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        }
    }

    tickets_summary = {}

    for ticket in event.tickets:
        tickets_summary[str(ticket.id)] = {
            'name': ticket.name,
            'quantity': ticket.quantity,
            'completed': {
                'tickets_count': 0,
                'sales': 0
            },
            'placed': {
                'tickets_count': 0,
                'sales': 0
            },
            'pending': {
                'tickets_count': 0,
                'sales': 0
            },
            'expired': {
                'class': 'danger',
                'tickets_count': 0,
                'sales': 0
            },
            'deleted': {
                'tickets_count': 0,
                'sales': 0
            },
            'cancelled': {
                'tickets_count': 0,
                'sales': 0
            },
        }

    for order in orders:
        if order.status == 'initialized':
            order.status = 'pending'
        fees = DataGetter.get_fee_settings_by_currency(
            DataGetter.get_event(order.event_id).payment_currency)
        orders_summary[str(order.status)]['orders_count'] += 1
        orders_summary[str(order.status)]['total_sales'] += order.amount

        for order_ticket in order.tickets:
            discount = TicketingManager.get_discount_code(
                event_id, order.discount_code_id)
            orders_summary[str(
                order.status)]['tickets_count'] += order_ticket.quantity
            ticket = get_ticket(order_ticket.ticket_id)
            tickets_summary[str(ticket.id)][str(
                order.status)]['tickets_count'] += order_ticket.quantity
            ticket_price = ticket.price
            if fees and not ticket.absorb_fees:
                order_fee = fees.service_fee * (ticket.price *
                                                order_ticket.quantity) / 100.0
                if order_fee > fees.maximum_fee:
                    ticket_price = ticket.price + fees.maximum_fee / order_ticket.quantity
                else:
                    ticket_price = ticket.price + fees.service_fee * ticket.price / 100.0

            if order.paid_via != 'free' and order.amount > 0:
                if discount and str(ticket.id) in discount.tickets.split(","):
                    if discount.type == "amount":
                        tickets_summary[str(ticket.id)][str(
                            order.status
                        )]['sales'] += order_ticket.quantity * (ticket_price -
                                                                discount.value)
                    else:
                        tickets_summary[str(ticket.id)][str(
                            order.status
                        )]['sales'] += order_ticket.quantity * (
                            ticket_price -
                            discount.value * ticket_price / 100.0)
                else:
                    tickets_summary[str(ticket.id)][str(
                        order.status
                    )]['sales'] += order_ticket.quantity * ticket_price
    return render_template('gentelella/users/events/tickets/tickets.html',
                           event=event,
                           event_id=event_id,
                           orders_summary=orders_summary,
                           tickets_summary=tickets_summary)
Ejemplo n.º 18
0
def display_attendees(event_id):
    event = DataGetter.get_event(event_id)
    from_date = request.args.get('from_date')
    to_date = request.args.get('to_date')
    selected_ticket = request.args.get('ticket_name')
    if ('from_date' in request.args and not from_date) or ('to_date' in request.args and not to_date) or \
        ('from_date' in request.args and 'to_date' not in request.args) or \
        ('to_date' in request.args and 'from_date' not in request.args):
        return redirect(url_for('.display_attendees', event_id=event_id))
    if from_date and to_date:
        orders = TicketingManager.get_orders(
            event_id=event_id,
            from_date=datetime.strptime(from_date, '%d/%m/%Y'),
            to_date=datetime.strptime(to_date, '%d/%m/%Y'))
    else:
        orders = TicketingManager.get_orders(event_id)
    holders = []
    ticket_names = []
    for ticket in event.tickets:
        ticket_names.append(ticket.name)
    for order in orders:
        for holder in order.ticket_holders:
            if selected_ticket is not None:
                if selected_ticket != "All":
                    if holder.ticket.name != selected_ticket:
                        continue
            discount = TicketingManager.get_discount_code(
                event_id, order.discount_code_id)
            order_holder = {
                'order_invoice': order.get_invoice_number(),
                'paid_via': order.paid_via,
                'status': order.status,
                'completed_at': order.completed_at,
                'created_at': order.created_at,
                'ticket_name': holder.ticket.name,
                'firstname': holder.firstname,
                'lastname': holder.lastname,
                'email': holder.email,
                'ticket_price': holder.ticket.price
            }

            if order.status == 'completed':
                order_holder['order_url'] = url_for(
                    'ticketing.view_order_after_payment',
                    order_identifier=order.identifier)
            else:
                order_holder['order_url'] = url_for(
                    'ticketing.show_transaction_error',
                    order_identifier=order.identifier)

            order_holder['by_whom'] = order.user.user_detail.fullname \
                if order.user.user_detail and order.user.user_detail.fullname else order.user.email
            if discount and str(
                    holder.ticket.id) in discount.tickets.split(","):
                if discount.type == "amount":
                    order_holder['ticket_price'] = order_holder[
                        'ticket_price'] - discount.value
                else:
                    order_holder['ticket_price'] -= order_holder[
                        'ticket_price'] * discount.value / 100.0
            order_holder['checked_in'] = holder.checked_in
            order_holder['id'] = holder.id
            holders.append(order_holder)
        if len(order.ticket_holders) == 0:

            order_holder = {
                'order_invoice': order.get_invoice_number(),
                'paid_via': order.paid_via,
                'status': order.status,
                'completed_at': order.completed_at,
                'created_at': order.created_at
            }

            if order.status == 'completed':
                order_holder['order_url'] = url_for(
                    'ticketing.view_order_after_payment',
                    order_identifier=order.identifier)
            else:
                order_holder['order_url'] = url_for(
                    'ticketing.show_transaction_error',
                    order_identifier=order.identifier)

            order_holder['by_whom'] = order.user.user_detail.fullname \
                if order.user.user_detail and order.user.user_detail.fullname else order.user.email

            holders.append(order_holder)

    return render_template('gentelella/users/events/tickets/attendees.html',
                           event=event,
                           event_id=event_id,
                           holders=holders,
                           from_date=from_date,
                           to_date=to_date,
                           ticket_names=ticket_names,
                           selected_ticket=selected_ticket)
def display_attendees(event_id, pdf=None):
    event = DataGetter.get_event(event_id)
    from_date = request.args.get('from_date')
    to_date = request.args.get('to_date')
    selected_ticket = request.args.get('ticket_name')
    if ('from_date' in request.args and not from_date) or ('to_date' in request.args and not to_date) or \
        ('from_date' in request.args and 'to_date' not in request.args) or \
        ('to_date' in request.args and 'from_date' not in request.args):
        return redirect(url_for('.display_attendees', event_id=event_id))
    if from_date and to_date:
        orders = TicketingManager.get_orders(
            event_id=event_id,
            from_date=datetime.strptime(from_date, '%d/%m/%Y'),
            to_date=datetime.strptime(to_date, '%d/%m/%Y')
        )
    else:
        orders = TicketingManager.get_orders(event_id)
    holders = []
    ticket_names = []
    for ticket in event.tickets:
        ticket_names.append(ticket.name)
    for order in orders:
        for holder in order.ticket_holders:
            if selected_ticket is not None:
                if selected_ticket != "All":
                    if holder.ticket.name != selected_ticket:
                        continue
            discount = TicketingManager.get_discount_code(event_id, order.discount_code_id)
            order_holder = {
                'order_invoice': order.get_invoice_number(),
                'paid_via': order.paid_via,
                'status': order.status,
                'completed_at': order.completed_at,
                'created_at': order.created_at,
                'ticket_name': holder.ticket.name,
                'ticket_type': holder.ticket.type,
                'firstname': holder.firstname,
                'lastname': holder.lastname,
                'email': holder.email,
                'country': holder.country,
                'ticket_price': holder.ticket.price,
                'discount': discount
            }

            if order.status == 'completed':
                order_holder['order_url'] = url_for('ticketing.view_order_after_payment',
                                                    order_identifier=order.identifier)
            else:
                order_holder['order_url'] = url_for('ticketing.show_transaction_error',
                                                    order_identifier=order.identifier)

            order_holder['by_whom'] = order.user.user_detail.fullname \
                if order.user.user_detail and order.user.user_detail.fullname else order.user.email
            if discount and str(holder.ticket.id) in discount.tickets.split(","):
                if discount.type == "amount":
                    order_holder['ticket_price'] = order_holder['ticket_price'] - discount.value
                else:
                    order_holder['ticket_price'] -= order_holder['ticket_price'] * discount.value / 100.0
            order_holder['checked_in'] = holder.checked_in
            order_holder['id'] = holder.id
            holders.append(order_holder)
        if len(order.ticket_holders) == 0:

            order_holder = {
                'order_invoice': order.get_invoice_number(),
                'paid_via': order.paid_via,
                'status': order.status,
                'completed_at': order.completed_at,
                'created_at': order.created_at
            }

            if order.status == 'completed':
                order_holder['order_url'] = url_for('ticketing.view_order_after_payment',
                                                    order_identifier=order.identifier)
            else:
                order_holder['order_url'] = url_for('ticketing.show_transaction_error',
                                                    order_identifier=order.identifier)

            order_holder['by_whom'] = order.user.user_detail.fullname \
                if order.user.user_detail and order.user.user_detail.fullname else order.user.email

            holders.append(order_holder)

    if pdf is not None:
        return (event, event_id, holders, orders, ticket_names, selected_ticket)
    else:
        return render_template('gentelella/users/events/tickets/attendees.html', event=event,
                               event_id=event_id, holders=holders, from_date=from_date, to_date=to_date,
                               ticket_names=ticket_names, selected_ticket=selected_ticket)
Ejemplo n.º 20
0
def details_view(event_id):
    event = DataGetter.get_event(event_id)
    orders = TicketingManager.get_orders(event_id)
    checklist = {"": ""}

    if fields_not_empty(event, [
            'name', 'start_time', 'end_time', 'location_name',
            'organizer_name', 'organizer_description'
    ]):
        checklist["1"] = 'success'
    elif fields_not_empty(event, ['name', 'start_time', 'end_time']):
        checklist["1"] = 'missing_some'
    else:
        checklist["1"] = 'missing_main'

    call_for_speakers = DataGetter.get_call_for_papers(event_id).first()
    if call_for_speakers:
        if fields_not_empty(call_for_speakers,
                            ['announcement', 'start_date', 'end_date']):
            checklist["4"] = "success"
        elif fields_not_empty(call_for_speakers, ['start_date', 'end_date']):
            checklist["4"] = "missing_some"
        else:
            checklist["4"] = 'missing_main'
    else:
        checklist["4"] = "optional"

    sponsors = DataGetter.get_sponsors(event_id).all()
    if not sponsors:
        checklist["2"] = 'optional'
    else:
        for sponsor in sponsors:
            if fields_not_empty(
                    sponsor, ['name', 'description', 'url', 'level', 'logo']):
                checklist["2"] = 'success'
                break
            else:
                checklist["2"] = 'missing_some'
    if event.has_session_speakers:
        session_types = DataGetter.get_session_types_by_event_id(event_id)
        tracks = DataGetter.get_tracks(event_id)
        microlocations = DataGetter.get_microlocations(event_id)

        if not session_types and not tracks and not microlocations:
            checklist["3"] = 'optional'
        elif not session_types or not tracks or not microlocations:
            checklist["3"] = 'missing_main'
        else:
            for session_type in session_types:
                if fields_not_empty(session_type, ['name', 'length']):
                    checklist["3"] = 'success'
                    break
                else:
                    checklist["3"] = 'missing_some'
            for microlocation in microlocations:
                if fields_not_empty(microlocation, ['name']):
                    checklist["3"] = 'success'
                    break
                else:
                    checklist["3"] = 'missing_some'
            for tracks in tracks:
                if fields_not_empty(tracks, ['name', 'color']):
                    checklist["3"] = 'success'
                    break
                else:
                    checklist["3"] = 'missing_some'

        checklist["5"] = 'success'
    else:
        checklist["3"] = 'optional'
        checklist["4"] = 'optional'
        checklist["5"] = 'optional'

    if not current_user.can_publish_event(
    ) and not AuthManager.is_verified_user():
        flash(
            Markup(
                'To make your event live, please verify your email by '
                'clicking on the confirmation link that has been emailed to you.<br>'
                'Did not get the email? Please <a href="/resend_email/" class="alert-link"> click here to '
                'resend the confirmation.</a>'))

    sessions = {
        'pending':
        get_count(
            DataGetter.get_sessions_by_state_and_event_id('pending',
                                                          event_id)),
        'accepted':
        get_count(
            DataGetter.get_sessions_by_state_and_event_id(
                'accepted', event_id)),
        'rejected':
        get_count(
            DataGetter.get_sessions_by_state_and_event_id(
                'rejected', event_id)),
        'draft':
        get_count(
            DataGetter.get_sessions_by_state_and_event_id('draft', event_id))
    }
    tickets_summary = {}

    for ticket in event.tickets:
        tickets_summary[str(ticket.id)] = {
            'name': ticket.name,
            'quantity': ticket.quantity,
            'completed': {
                'tickets_count': 0,
                'sales': 0
            },
            'placed': {
                'tickets_count': 0,
                'sales': 0
            },
            'pending': {
                'tickets_count': 0,
                'sales': 0
            },
            'expired': {
                'class': 'danger',
                'tickets_count': 0,
                'sales': 0
            },
            'deleted': {
                'tickets_count': 0,
                'sales': 0
            },
            'cancelled': {
                'tickets_count': 0,
                'sales': 0
            },
        }

    orders_summary = {
        'completed': {
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'placed': {
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'pending': {
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'expired': {
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'deleted': {
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        },
        'cancelled': {
            'tickets_count': 0,
            'orders_count': 0,
            'total_sales': 0
        }
    }

    for order in orders:
        if order.status == 'initialized':
            order.status = 'pending'
        fees = DataGetter.get_fee_settings_by_currency(
            DataGetter.get_event(order.event_id).payment_currency)
        orders_summary[str(order.status)]['orders_count'] += 1
        orders_summary[str(order.status)]['total_sales'] += order.amount

        for order_ticket in order.tickets:
            discount = TicketingManager.get_discount_code(
                event_id, order.discount_code_id)
            orders_summary[str(
                order.status)]['tickets_count'] += order_ticket.quantity
            ticket = get_ticket(order_ticket.ticket_id)
            tickets_summary[str(ticket.id)][str(
                order.status)]['tickets_count'] += order_ticket.quantity
            ticket_price = ticket.price
            if fees and not ticket.absorb_fees:
                order_fee = fees.service_fee * (ticket.price *
                                                order_ticket.quantity) / 100.0
                if order_fee > fees.maximum_fee:
                    ticket_price = ticket.price + fees.maximum_fee / order_ticket.quantity
                else:
                    ticket_price = ticket.price + fees.service_fee * ticket.price / 100.0

            if order.paid_via != 'free' and order.amount > 0:
                if discount and str(ticket.id) in discount.tickets.split(","):
                    if discount.type == "amount":
                        tickets_summary[str(ticket.id)][str(
                            order.status
                        )]['sales'] += order_ticket.quantity * (ticket_price -
                                                                discount.value)
                    else:
                        tickets_summary[str(ticket.id)][str(
                            order.status
                        )]['sales'] += order_ticket.quantity * (
                            ticket_price -
                            discount.value * ticket_price / 100.0)
                else:
                    tickets_summary[str(ticket.id)][str(
                        order.status
                    )]['sales'] += order_ticket.quantity * ticket_price
    return render_template('gentelella/users/events/details/details.html',
                           event=event,
                           checklist=checklist,
                           sessions=sessions,
                           tickets_summary=tickets_summary,
                           orders_summary=orders_summary,
                           settings=get_settings())