コード例 #1
0
    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
コード例 #2
0
    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