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 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
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(): 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)
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