Beispiel #1
0
def create_bpay_invoice(user, booking):

    failed_bookings = []
    with transaction.atomic():
        if booking.booking_type == Booking.BOOKING_TYPE_INTERNET and booking.proposal.org_applicant and booking.proposal.org_applicant.bpay_allowed:
            try:
                now = timezone.now().date()
                dt = date(now.year, now.month, 1) + relativedelta(months=1)
                logger.info('Creating BPAY invoice for booking {}'.format(
                    booking.admission_number))
                order = create_invoice(booking, payment_method='bpay')
                invoice = Invoice.objects.get(order_number=order.number)
                #invoice.settlement_date = calc_payment_due_date(booking, dt) - relativedelta(days=1)
                #invoice.save()

                deferred_payment_date = calc_payment_due_date(
                    booking, dt) - relativedelta(days=1)
                book_inv = BookingInvoice.objects.create(
                    booking=booking,
                    invoice_reference=invoice.reference,
                    payment_method=invoice.payment_method,
                    deferred_payment_date=deferred_payment_date)

                #send_monthly_invoice_tclass_email_notification(user, booking, invoice, recipients=[booking.proposal.applicant_email])
                recipients = list(
                    set([booking.proposal.applicant_email,
                         user.email]))  # unique list
                send_invoice_tclass_email_notification(user,
                                                       booking,
                                                       invoice,
                                                       recipients=recipients)
                send_confirmation_tclass_email_notification(
                    user, booking, invoice, recipients=recipients)
                ProposalUserAction.log_action(
                    booking.proposal,
                    ProposalUserAction.ACTION_SEND_BPAY_INVOICE.format(
                        invoice.reference, booking.proposal.id,
                        ', '.join(recipients)), user)
            except Exception as e:
                logger.error(
                    'Failed to create BPAY invoice for booking_id {}'.format(
                        booking.id))
                logger.error('{}'.format(e))
                failed_bookings.append(booking.id)

    return failed_bookings
Beispiel #2
0
    def get(self, request, *args, **kwargs):
        print (" BOOKING SUCCESS ")

        context = template_context(self.request)
        basket = None
        booking = get_session_booking(request.session)

        if self.request.user.is_authenticated():
            basket = Basket.objects.filter(status='Submitted', owner=request.user).order_by('-id')[:1]
        else:
            basket = Basket.objects.filter(status='Submitted', owner=booking.proposal.submitter).order_by('-id')[:1]

        order = Order.objects.get(basket=basket[0])
        invoice = Invoice.objects.get(order_number=order.number)
        invoice_ref = invoice.reference
        book_inv, created = BookingInvoice.objects.get_or_create(booking=booking, invoice_reference=invoice_ref)

        print ("BOOKING")

        try:
            recipient = booking.proposal.applicant.email
            submitter = booking.proposal.applicant
        except:
            recipient = booking.proposal.submitter.email
            submitter = booking.proposal.submitter

        #import ipdb; ipdb.set_trace()
        send_invoice_tclass_email_notification(request, booking, invoice, recipients=[recipient])
        send_confirmation_tclass_email_notification(request, booking, invoice, recipients=[recipient])

        #delete_session_booking(request.session)

        context.update({
            'booking_id': booking.id,
            'submitter': submitter,
            'book_inv': [book_inv]
        })
        return render(request, self.template_name, context)
Beispiel #3
0
    def get(self, request, *args, **kwargs):
        print(" BOOKING SUCCESS ")

        booking = None
        submitter = None
        invoice = None
        try:
            context = template_context(self.request)
            basket = None
            booking = get_session_booking(request.session)
            proposal = booking.proposal

            try:
                recipient = proposal.applicant.email
                submitter = proposal.applicant
            except:
                recipient = proposal.submitter.email
                submitter = proposal.submitter

            if self.request.user.is_authenticated():
                basket = Basket.objects.filter(
                    status='Submitted', owner=request.user).order_by('-id')[:1]
            else:
                basket = Basket.objects.filter(
                    status='Submitted',
                    owner=booking.proposal.submitter).order_by('-id')[:1]

            order = Order.objects.get(basket=basket[0])
            invoice = Invoice.objects.get(order_number=order.number)
            invoice_ref = invoice.reference
            book_inv, created = BookingInvoice.objects.get_or_create(
                booking=booking,
                invoice_reference=invoice_ref,
                payment_method=invoice.payment_method)

            if booking.booking_type == Booking.BOOKING_TYPE_TEMPORARY:
                try:
                    inv = Invoice.objects.get(reference=invoice_ref)
                    #if (inv.payment_method == Invoice.PAYMENT_METHOD_BPAY):
                    #    # will return 1st of the next month + monthly_payment_due_period (days) e.g 20th of next month
                    #    now = timezone.now().date()
                    #    dt = date(now.year, now.month, 1) + relativedelta(months=1)
                    #    inv.settlement_date = calc_payment_due_date(booking, dt) - relativedelta(days=1)
                    #    inv.save()

                    order = Order.objects.get(number=inv.order_number)
                    order.user = submitter
                    order.save()
                except Invoice.DoesNotExist:
                    logger.error(
                        '{} tried paying an admission fee with an incorrect invoice'
                        .format('User {} with id {}'.
                                format(proposal.submitter.get_full_name(
                                ), proposal.submitter.id) if proposal.
                                submitter else 'An anonymous user'))
                    return redirect('external-proposal-detail',
                                    args=(proposal.id, ))
                if inv.system not in ['0557']:
                    logger.error(
                        '{} tried paying an admission fee with an invoice from another system with reference number {}'
                        .format(
                            'User {} with id {}'.format(
                                proposal.submitter.get_full_name(),
                                proposal.submitter.id) if proposal.submitter
                            else 'An anonymous user', inv.reference))
                    return redirect('external-proposal-detail',
                                    args=(proposal.id, ))

                if book_inv:
                    booking.booking_type = Booking.BOOKING_TYPE_INTERNET
                    booking.expiry_time = None
                    #booking.set_admission_number()
                    update_payments(invoice_ref)

                    if not (
                            invoice.payment_status == 'paid'
                            or invoice.payment_status == 'over_paid'
                    ) and invoice.payment_method == Invoice.PAYMENT_METHOD_CC:
                        logger.error(
                            'Payment Method={} - Admission Fee Invoice payment status is {}'
                            .format(invoice.get_payment_method_display(),
                                    invoice.payment_status))
                        raise

                    booking.save()
                    request.session['cols_last_booking'] = booking.id
                    delete_session_booking(request.session)

                    send_invoice_tclass_email_notification(
                        request, booking, invoice, recipients=[recipient])
                    send_confirmation_tclass_email_notification(
                        request, booking, invoice, recipients=[recipient])

                    context.update({
                        'booking_id': booking.id,
                        'submitter': submitter,
                        'invoice_reference': invoice.reference
                    })
                    return render(request, self.template_name, context)

        except Exception as e:
            #logger.error('{}'.format(e))
            if ('cols_last_booking'
                    in request.session) and Booking.objects.filter(
                        id=request.session['cols_last_booking']).exists():
                booking = Booking.objects.get(
                    id=request.session['cols_last_booking'])
                proposal = booking.proposal

                try:
                    recipient = proposal.applicant.email
                    submitter = proposal.applicant
                except:
                    recipient = proposal.submitter.email
                    submitter = proposal.submitter

                if BookingInvoice.objects.filter(booking=booking).count() > 0:
                    bi = BookingInvoice.objects.filter(booking=booking)
                    invoice = bi[0]
            else:
                return redirect('home')

        context.update({
            'booking_id': booking.id,
            'submitter': submitter,
            'invoice_reference': invoice.invoice_reference
        })
        return render(request, self.template_name, context)