def create_payment(order, return_url, cancel_url, payee_email=None): """ Create payment for an order :param order: Order to create payment for. :param return_url: return url for the payment. :param cancel_url: cancel_url for the payment. :param payee_email: email of the payee. Default to event paypal email if not set :return: request_id or the error message along with an indicator. """ payee_email = payee_email or order.event.paypal_email if not payee_email: raise ConflictError( {'pointer': ''}, "Payments through Paypal hasn't been configured for the billing", ) PayPalPaymentsManager.configure_paypal() payment = paypalrestsdk.Payment({ "intent": "sale", "payer": { "payment_method": "paypal" }, "redirect_urls": { "return_url": return_url, "cancel_url": cancel_url }, "transactions": [{ "amount": { "total": float(round_money(order.amount)), "currency": order.event.payment_currency, }, "payee": { "email": payee_email }, }], }) if payment.create(): return True, payment.id return False, payment.error
def generate_pdf(self, force=False): with db.session.no_autoflush: latest_invoice_date = (EventInvoice.query.filter_by( event=self.event).filter( EventInvoice.issued_at < self.issued_at).with_entities( func.max(EventInvoice.issued_at)).scalar()) admin_info = Setting.query.first() currency = self.event.payment_currency ticket_fee_object = ( TicketFees.query.filter_by( country=self.event.payment_country).first() or TicketFees.query.filter_by(country='global').first()) if not ticket_fee_object: logger.error('Ticket Fee not found for event %s', self.event) return ticket_fee_percentage = ticket_fee_object.service_fee ticket_fee_maximum = ticket_fee_object.maximum_fee gross_revenue = self.event.calc_revenue(start=latest_invoice_date, end=self.issued_at) invoice_amount = gross_revenue * (ticket_fee_percentage / 100) if invoice_amount > ticket_fee_maximum: invoice_amount = ticket_fee_maximum self.amount = round_money(invoice_amount) if not force and self.amount == 0: logger.warning( 'Invoice amount of Event %s is 0, hence skipping generation', self.event, ) return if not force and self.amount < EventInvoice.MIN_AMOUNT: logger.warning( 'Invoice amount of Event %s is %f which is less than %f, hence skipping generation', self.event, self.amount, EventInvoice.MIN_AMOUNT, ) return net_revenue = round_money(gross_revenue - invoice_amount) orders_query = self.event.get_orders_query( start=latest_invoice_date, end=self.issued_at) first_order_date = orders_query.with_entities( func.min(Order.completed_at)).scalar() last_order_date = orders_query.with_entities( func.max(Order.completed_at)).scalar() payment_details = { 'tickets_sold': self.event.tickets_sold, 'gross_revenue': round_money(gross_revenue), 'net_revenue': round_money(net_revenue), 'first_date': first_order_date or self.previous_month_date, 'last_date': last_order_date or self.issued_at, } self.invoice_pdf_url = create_save_pdf( render_template( 'pdf/event_invoice.html', user=self.user, admin_info=admin_info, currency=currency, event=self.event, ticket_fee=ticket_fee_object, payment_details=payment_details, net_revenue=net_revenue, invoice=self, ), UPLOAD_PATHS['pdf']['event_invoice'], dir_path='/static/uploads/pdf/event_invoices/', identifier=self.identifier, extra_identifiers={'event_identifier': self.event.identifier}, new_renderer=True, ) return self.invoice_pdf_url