示例#1
0
def cancel_subscription():
    user = User(current_user)
    party = user.party

    subscriptions = Subscription.search([('party', '=', party.id),
                                         ('is_online', '=', True),
                                         ('state', '=', 'running')])

    invoices = Invoice.search([('party', '=', party.id),
                               ('state', '=', 'posted')])
    cancel_form = CancelEnrollForm()
    if len(subscriptions) == 0 and len(invoices) == 0:
        return redirect(url_for('course.index'))

    if len(subscriptions) > 0 or len(invoices) > 0:
        if cancel_form.validate_on_submit():
            if len(subscriptions) > 0:
                for subscription in subscriptions:
                    Subscription.draft([subscription])
                    Subscription.cancel([subscription])
            if len(invoices) > 0:
                for invoice in invoices:
                    Invoice.cancel([invoice])
            return redirect(url_for('course.index'))
    return render_template('course/cancel_enroll.html',
                           user=user,
                           cancel_form=cancel_form,
                           invoices=invoices,
                           subscriptions=subscriptions)
示例#2
0
def buy_with_bank():
    course_id = request.args.get('course')
    if course_id == None:
        return redirect(url_for('course.index'))

    bank_form = EnrollBankForm()
    cc_form = EnrollCreditCardForm()
    course_id = int(course_id)
    user = User(current_user)
    courses = []
    courses.append(course_id)
    with Transaction().set_context(courses=courses):
        user = User(current_user)
        if user.active_membership:
            return redirect(url_for('course.index'))
    courses = Course.search([('id', '=', course_id)], limit=1)
    if len(courses) == 1:
        course, = courses
        if bank_form.bank_membership.data == 'MONTHLY':
            service_id = course.service.id
        else:
            service_id = course.yearly_service.id
        service = Service(service_id)
    if course:
        web_course = course

    ip_address = request.remote_addr
    if not ip_address or ip_address == '127.0.0.1':
        ip_address = '186.189.195.217'
    if ipaddress.ip_address(ip_address).is_private:
        ip_address = '186.189.195.217'
    access_token = 'cda5ddffc1e6b7'
    handler = ipinfo.getHandler(access_token)

    details = handler.getDetails(ip_address)
    country_code = details.country
    country_code = str(country_code)
    lcase_country_code = country_code.lower()
    currency_id = 16

    for currency in data:
        if str(currency['code']) == country_code:
            currency_id = currency['id']
            break
    currency = Currency(currency_id)

    if bank_form.validate_on_submit():
        party = user.party
        today = date.today()
        subscriptions = Subscription.search([
            ('party', '=', party.id),
            ('state', '=', 'running'),
            ('lines.service', '=', service_id),
        ])
        if len(subscriptions) >= 1:
            print("NO ACTIVE SUBSCRIPTIONS")
            return redirect(url_for('course.payment'))
        else:
            enrolment, = Product.search([('is_enrolment', '=', True)], limit=1)
            payment_term, = PaymentTerm.search([()], limit=1)
            address = user.party.addresses[0]
            new_subscription = Subscription.create([{
                'party':
                user.party.id,
                'start_date':
                today,
                'invoice_start_date':
                today,
                'invoice_recurrence':
                service.consumption_recurrence,
                'enrolment':
                enrolment.id,
                'unit_price_enrolment':
                0,
                'invoice_address':
                address,
                'is_online':
                True,
                'payment_term':
                payment_term.id,
            }])
            new_subscription_line, = SubscriptionLine.create([{
                'subscription':
                new_subscription[0].id,
                'service':
                service.id,
                'quantity':
                1,
                'start_date':
                today,
                'consumption_recurrence':
                service.consumption_recurrence,
                'unit':
                1,
                'unit_price':
                service.product.list_price,
            }])
            Subscription.quote(new_subscription)
            Subscription.run(new_subscription)
            SaleSubscriptionLine.generate_consumption(date=today,
                                                      party=user.party)
            Subscription.generate_invoice(date=today, party=user.party)
            invoices = Invoice.search([('party', '=', user.party)],
                                      order=[('number', 'DESC')])
            if len(invoices) >= 1:
                for invoice in invoices:
                    if invoice.state == 'draft':
                        Invoice.post([invoice])

            current_line = None
            current_invoice = None

            for invoice in invoices:
                if invoice.state not in ['cancel', 'paid']:
                    move = invoice.move
                    for line in move.lines:
                        if line.debit > 0:
                            current_line = MoveLine(line.id)
                            current_invoice = invoice
                            break
            if not current_line or not current_invoice:
                return redirect(url_for('main.welcome'))

            def _group_payment_key(payment):
                return (('journal', payment.journal.id), ('kind',
                                                          payment.kind))

            def _new_group(values):
                return PaymentGroup(**values)

            invoice = current_invoice
            amount = current_invoice.total_amount
            ticket = bank_form.ticket.data
            journal, = Journal.search([('name', '=', 'DCOMPENSA')], limit=1)
            new_payment = Payment.create([{
                'journal': journal.id,
                'kind': 'receivable',
                'party': party.id,
                'line': current_line.id,
                'description': ticket,
                'amount': current_line.debit,
            }])
            Payment.approve(new_payment)
            payment, = new_payment
            groups = []
            new_payment = sorted(new_payment, key=_group_payment_key)
            for key, grouped_payments in groupby(new_payment,
                                                 key=_group_payment_key):

                def group():
                    group = _new_group(dict(key))
                    group.save()
                    groups.append(group)
                    return group

                Payment.process(list(grouped_payments), group)
            body = "Hemos recibido la siguiente informacion: " + \
                "Nombre: "+ party.name + \
                " \n  Ticket: " + ticket + \
                " \n  Usuario: " + user.email

            msg = Message('Usuario Web API: '+ party.name, \
                sender = '*****@*****.**', \
                recipients = ['*****@*****.**'])
            msg.body = "Usuario Web API " + body
            mail.send(msg)

            return redirect(url_for('main.welcome'))

    return render_template('course/enroll.html',
                           cc_form=cc_form,
                           bank_form=bank_form,
                           user=user,
                           web_course=course,
                           currency=currency)
示例#3
0
def buy_with_card():

    course_id = request.args.get('course')

    if course_id == None:
        return redirect(url_for('course.index'))

    bank_form = EnrollBankForm()
    cc_form = EnrollCreditCardForm()

    if cc_form.validate_on_submit():
        course_id = int(course_id)
        user = User(current_user)
        courses = []
        courses.append(course_id)
        with Transaction().set_context(courses=courses):
            user = User(current_user)
            if user.active_membership:
                return redirect(url_for('course.index'))
        courses = Course.search([('id', '=', course_id)], limit=1)
        if len(courses) == 1:
            course, = courses
            if cc_form.cc_membership.data == 'MONTHLY':
                service_id = course.service.id
            else:
                service_id = course.yearly_service.id
            service = Service(service_id)
        party = user.party
        today = date.today()
        subscriptions = Subscription.search([
            ('party', '=', party.id),
            ('state', '=', 'running'),
            ('is_online', '=', True),
            ('lines.service', '=', service_id),
        ])
        if len(subscriptions) >= 1:
            return redirect(url_for('course.payment'))
        else:
            enrolment, = Product.search([('is_enrolment', '=', True)], limit=1)
            payment_term, = PaymentTerm.search([()], limit=1)
            address = user.party.addresses[0]
            new_subscription = Subscription.create([{
                'party':
                user.party.id,
                'start_date':
                today,
                'invoice_start_date':
                today,
                'invoice_recurrence':
                service.consumption_recurrence,
                'enrolment':
                enrolment.id,
                'unit_price_enrolment':
                0,
                'invoice_address':
                address,
                'payment_term':
                payment_term.id,
                'is_online':
                True,
            }])
            new_subscription_line, = SubscriptionLine.create([{
                'subscription':
                new_subscription[0].id,
                'service':
                service.id,
                'quantity':
                1,
                'start_date':
                today,
                'consumption_recurrence':
                service.consumption_recurrence,
                'unit':
                1,
                'unit_price':
                service.product.list_price,
            }])
            Subscription.quote(new_subscription)
            Subscription.run(new_subscription)
            SaleSubscriptionLine.generate_consumption(date=today,
                                                      party=user.party)
            Subscription.generate_invoice(date=today, party=user.party)
            invoices = Invoice.search([('party', '=', user.party)],
                                      order=[('number', 'DESC')])
            if len(invoices) >= 1:
                for invoice in invoices:
                    if invoice.state == 'draft':
                        Invoice.post([invoice])

            current_invoice = None
            for invoice in invoices:
                if invoice.state not in ['cancel', 'paid']:
                    current_invoice = invoice
                    break

            credentials = current_app.config['QPAYPRO_CREDENTIALS']
            cc_form = CreditCardForm()

            defaults = {}
            defaults['sessionid'] = uniqid()
            defaults['orgid'] = 'k8vif92e'  #'1snn5n9w' TEST OR PRODUCTION
            defaults['merchantid'] = credentials[
                'merchantid']  #'visanetgt_qpay'
            defaults['user'] = user
            defaults['cc_form'] = cc_form

            url_test = 'https://sandbox.qpaypro.com/payment/api_v1'
            url_production = 'https://payments.qpaypro.com/checkout/api_v1'

            credit_card = str(cc_form.card_number.data)
            credit_card.replace(' ', '')

            success = True

            params = {}
            params['x_login'] = credentials['x_login']  #'visanetgt_qpay'
            params['x_private_key'] = credentials[
                'x_private_key']  # '88888888888'
            params['x_api_secret'] = credentials[
                'x_api_secret']  #'99999999999'
            params['x_product_id'] = current_invoice.lines[0].product.id  #6
            params['x_audit_number'] = random.randint(1, 999999)
            params[
                'x_fp_sequence'] = current_invoice.number  #1988679099 #INVOICE SEQUENCE NUMBER
            params[
                'x_invoice_num'] = current_invoice.id  #random.randint(1,999999) #INVOICE SEQUENCE NUMBER
            params['x_fp_timestamp'] = time()
            params['x_currency_code'] = 'GTQ'
            params[
                'x_amount'] = current_invoice.total_amount  #1.00 #invoice.total_amount
            params['x_line_item'] = current_invoice.lines[
                0].product.name  #'T-shirt Live Dreams<|>w01<|><|>1<|>1000.00<|>N'
            params['x_freight'] = 0.00
            params['x_email'] = '*****@*****.**'
            params['cc_name'] = cc_form.name.data  #'john doe'
            params['cc_number'] = credit_card  #'4111111111111111'
            params['cc_exp'] = str(cc_form.expiration_date.data)  #'01/21'
            params['cc_cvv2'] = cc_form.code.data  #'4567'
            params['cc_type'] = 'visa'
            params['x_first_name'] = user.party.name  #'john'
            params['x_last_name'] = user.party.name  #'doe'
            params['x_company'] = 'API CENTRO'  #'Company'
            params['x_address'] = user.party.city  #'711-2880 Nulla'
            params['x_city'] = user.party.city  #'Guatemala'
            params['x_state'] = user.party.city  #'Guatemala'
            params['x_country'] = user.party.country  #'Guatemala'
            params['x_zip'] = '09001'
            params['x_relay_response'] = 'none'
            params['x_relay_url'] = 'none'
            params['x_type'] = 'AUTH_ONLY'
            params['x_method'] = 'CC'
            params[
                'http_origin'] = 'https://www.apixela.net'  #'http://local.test.com'
            params['visaencuotas'] = 0
            params['device_fingerprint_id'] = defaults['sessionid']
            params['bank_form'] = bank_form
            params['cc_form'] = cc_form

            response = requests.post(url=url_production, params=params)

            res = response.raise_for_status()
            response_content = response.json()

            #response_content = {'responseCode':"100",
            #    'idTransaction':"102030"}

            response_code = response_content['responseCode']
            message = get_code(response_code)

            if response_code == "00":
                transaction_id = response_content['idTransaction']
                Invoice.card_payment_succeed([current_invoice],
                                             reference=transaction_id)
            else:
                success = False
                Subscription.draft(new_subscription)
                Subscription.cancel(new_subscription)
                Invoice.cancel([current_invoice])
            if success:
                return render_template('bienvenido.html',
                                       flash_message=message,
                                       user=user)
            else:
                return render_template(
                    'bienvenido.html',
                    user=user,
                    flash_message=message,
                )
    return render_template('enroll.html', cc_form=cc_form, bank_form=bank_form)
示例#4
0
def pay_with_bank():
    user = User(current_user)
    party = user.party
    today = date.today()
    courses = []
    subscriptions = Subscription.search([('is_online', '=', True),
                                         ('party', '=', party.id),
                                         ('state', '=', 'running')])
    if len(subscriptions) < 1:
        return render_template(
            'bienvenido.html',
            user=user,
            flash_message=
            "Something wrong. Sorry the inconvenient. We will call you later.")
    else:
        for subscription in subscriptions:
            for line in subscription.lines:
                courses.append(line.service.id)
    with Transaction().set_context(courses=courses):
        if user.active_membership:
            return redirect(url_for('course.index'))

    ip_address = request.remote_addr
    if not ip_address or ip_address == '127.0.0.1':
        ip_address = '186.189.195.217'
    if ipaddress.ip_address(ip_address).is_private:
        ip_address = '186.189.195.217'
    access_token = 'cda5ddffc1e6b7'
    handler = ipinfo.getHandler(access_token)

    details = handler.getDetails(ip_address)
    country_code = details.country
    country_code = str(country_code)
    lcase_country_code = country_code.lower()
    currency_id = 16

    for currency in data:
        if str(currency['code']) == country_code:
            currency_id = currency['id']
            break
    currency = Currency(currency_id)

    subscriptions = Subscription.search([('party', '=', party.id),
                                         ('is_online', '=', True),
                                         ('state', '=', 'running')])

    invoices = Invoice.search([
        ('party', '=', party.id),
        ('state', '=', 'posted'),
    ],
                              limit=1)

    current_line = None
    for invoice in invoices:
        move = invoice.move
        lines = move.lines
        for line in lines:
            if line.debit > 0:
                current_line = MoveLine(line.id)
                break
    if current_line is not None:
        enroll_form = EnrollRegistrationForm(invoice=current_line.description,
                                             amount=current_line.debit)
    if len(subscriptions) >= 1 and len(invoices) >= 1:
        if enroll_form.validate_on_submit():

            def _group_payment_key(payment):
                return (('journal', payment.journal.id), ('kind',
                                                          payment.kind))

            def _new_group(values):
                return PaymentGroup(**values)

            invoice = enroll_form.invoice.data
            amount = enroll_form.amount.data
            ticket = enroll_form.ticket.data
            if not current_line:
                return redirect(url_for('main.welcome'))
            journal, = Journal.search([('name', '=', 'DCOMPENSA')], limit=1)
            new_payment = Payment.create([{
                'journal': journal.id,
                'kind': 'receivable',
                'party': party.id,
                'line': current_line.id,
                'description': ticket,
                'amount': current_line.debit,
            }])
            Payment.approve(new_payment)
            payment, = new_payment
            groups = []
            new_payment = sorted(new_payment, key=_group_payment_key)
            for key, grouped_payments in groupby(new_payment,
                                                 key=_group_payment_key):

                def group():
                    group = _new_group(dict(key))
                    group.save()
                    groups.append(group)
                    return group

                Payment.process(list(grouped_payments), group)
            body = "Hemos recibido la siguiente informacion: " + \
                "Nombre: "+ party.name + \
                " \n  Ticket: " + ticket + \
                " \n  Usuario: " + user.email

            msg = Message('Usuario Web API: '+ party.name, \
                sender = '*****@*****.**', \
                recipients = ['*****@*****.**'])
            msg.body = "Usuario Web API " + body
            mail.send(msg)

            return redirect(url_for('main.welcome'))
        return render_template('course/pay_enroll_with_bank.html',
                               user=user,
                               enroll_form=enroll_form,
                               invoices=invoices,
                               subscriptions=subscriptions,
                               currency=currency)
    else:
        return redirect(url_for('course.index'))
示例#5
0
def payment():
    #FIX WHEN CREDIT CARD IS ACTIVE
    return redirect(url_for('course.pay_with_bank'))
    user = User(current_user)
    party = user.party
    today = date.today()
    courses = []
    subscriptions = Subscription.search([('is_online', '=', True),
                                         ('party', '=', party.id),
                                         ('state', '=', 'running')])
    if len(subscriptions) < 1:
        return render_template(
            'bienvenido.html',
            user=user,
            flash_message=
            "Something wrong. Sorry the inconvenient. We will call you later.")
    else:
        for subscription in subscriptions:
            for line in subscription.lines:
                courses.append(line.service.id)
    with Transaction().set_context(courses=courses):
        user = User(current_user)
        if user.active_membership:
            return redirect(url_for('course.index'))

    ip_address = request.remote_addr
    if not ip_address or ip_address == '127.0.0.1':
        ip_address = '186.189.195.217'
    if ipaddress.ip_address(ip_address).is_private:
        ip_address = '186.189.195.217'
    access_token = 'cda5ddffc1e6b7'
    handler = ipinfo.getHandler(access_token)

    details = handler.getDetails(ip_address)
    country_code = details.country
    country_code = str(country_code)
    lcase_country_code = country_code.lower()
    currency_id = 16

    for currency in data:
        if str(currency['code']) == country_code:
            currency_id = currency['id']
            break
    currency = Currency(currency_id)

    with Transaction().set_context(currency_web=currency_id):
        invoices = Invoice.search([
            ('party', '=', party.id),
            ('state', '=', 'posted'),
        ])

    if len(subscriptions) >= 1 and len(invoices) >= 1:
        credentials = current_app.config['QPAYPRO_CREDENTIALS']
        cc_form = CreditCardForm()

        defaults = {}
        defaults['sessionid'] = uniqid()
        defaults['orgid'] = 'k8vif92e'  #'1snn5n9w' TEST OR PRODUCTION
        defaults['merchantid'] = credentials['merchantid']  #'visanetgt_qpay'
        defaults['user'] = user
        defaults['cc_form'] = cc_form
        defaults['invoices'] = invoices
        defaults['subscriptions'] = subscriptions
        defaults['currency'] = currency

        url_test = 'https://sandbox.qpaypro.com/payment/api_v1'
        url_production = 'https://payments.qpaypro.com/checkout/api_v1'

        if cc_form.validate_on_submit():
            credit_card = str(cc_form.card_number.data)
            credit_card.replace(' ', '')
            #invoice, = invoices
            success = True
            for invoice in invoices:
                params = {}
                params['x_login'] = credentials['x_login']  #'visanetgt_qpay'
                params['x_private_key'] = credentials[
                    'x_private_key']  # '88888888888'
                params['x_api_secret'] = credentials[
                    'x_api_secret']  #'99999999999'
                params['x_product_id'] = invoice.lines[0].product.id  #6
                params['x_audit_number'] = random.randint(1, 999999)
                params[
                    'x_fp_sequence'] = invoice.number  #1988679099 #INVOICE SEQUENCE NUMBER
                params[
                    'x_invoice_num'] = invoice.id  #random.randint(1,999999) #INVOICE SEQUENCE NUMBER
                params['x_fp_timestamp'] = time()
                params['x_currency_code'] = 'GTQ'
                params[
                    'x_amount'] = invoice.total_amount  #1.00 #invoice.total_amount
                params['x_line_item'] = invoice.lines[
                    0].product.name  #'T-shirt Live Dreams<|>w01<|><|>1<|>1000.00<|>N'
                params['x_freight'] = 0.00
                params['x_email'] = '*****@*****.**'
                params['cc_name'] = cc_form.name.data  #'john doe'
                params['cc_number'] = credit_card  #'4111111111111111'
                params['cc_exp'] = str(cc_form.expiration_date.data)  #'01/21'
                params['cc_cvv2'] = cc_form.code.data  #'4567'
                params['cc_type'] = 'visa'
                params['x_first_name'] = user.party.name  #'john'
                params['x_last_name'] = user.party.name  #'doe'
                params['x_company'] = 'API CENTRO'  #'Company'
                params['x_address'] = user.party.city  #'711-2880 Nulla'
                params['x_city'] = user.party.city  #'Guatemala'
                params['x_state'] = user.party.city  #'Guatemala'
                params['x_country'] = user.party.country  #'Guatemala'
                params['x_zip'] = '09001'
                params['x_relay_response'] = 'none'
                params['x_relay_url'] = 'none'
                params['x_type'] = 'AUTH_ONLY'
                params['x_method'] = 'CC'
                params[
                    'http_origin'] = 'https://www.apixela.net'  #'http://local.test.com'
                params['visaencuotas'] = 0
                params['device_fingerprint_id'] = defaults['sessionid']

                response = requests.post(url=url_production, params=params)

                res = response.raise_for_status()
                response_content = response.json()

                #response_content = {'responseCode':"100",
                #    'idTransaction':"102030"}

                response_code = response_content['responseCode']
                message = get_code(response_code)

                if response_code == "00":
                    transaction_id = response_content['idTransaction']
                    Invoice.card_payment_succeed([invoice],
                                                 reference=transaction_id)
                else:
                    success = False
                    break
            if success:
                return render_template('bienvenido.html',
                                       flash_message=message,
                                       user=user)
            else:
                return render_template(
                    'bienvenido.html',
                    user=user,
                    flash_message=
                    "Something wrong. Sorry the inconvenient. We will call you later."
                )
        return render_template('course/pay_enroll.html', **defaults)
    elif len(subscriptions) >= 1 and user.party.receivable != 0:
        return render_template(
            'bienvenido.html',
            user=user,
            flash_message=
            "Something wrong. Sorry the inconvenient. We will call you later.")
    else:
        return redirect(url_for('course.index'))
示例#6
0
def yearly_enroll():
    course_id = request.args.get('course')
    if course_id == None:
        return redirect(url_for('course.index'))
    course_id = int(course_id)
    user = User(current_user)
    courses = []
    courses.append(course_id)
    with Transaction().set_context(courses=courses):
        user = User(current_user)
        if user.active_membership:
            return redirect(url_for('course.index'))
    courses = Course.search([('id', '=', course_id)], limit=1)
    if len(courses) == 1:
        course, = courses
        service_id = course.yearly_service.id
        service = Service(service_id)
    party = user.party
    today = date.today()
    subscriptions = Subscription.search([
        ('party', '=', party.id),
        ('state', '=', 'running'),
        ('lines.service', '=', service_id),
    ])
    if len(subscriptions) >= 1:
        return redirect(url_for('course.payment'))
    else:
        enrolment, = Product.search([('is_enrolment', '=', True)], limit=1)
        payment_term, = PaymentTerm.search([()], limit=1)
        address = user.party.addresses[0]
        new_subscription = Subscription.create([{
            'party':
            user.party.id,
            'start_date':
            today,
            'invoice_start_date':
            today,
            'invoice_recurrence':
            service.consumption_recurrence,
            'enrolment':
            enrolment.id,
            'unit_price_enrolment':
            0,
            'invoice_address':
            address,
            'is_online':
            True,
            'payment_term':
            payment_term.id,
        }])
        new_subscription_line, = SubscriptionLine.create([{
            'subscription':
            new_subscription[0].id,
            'service':
            service.id,
            'quantity':
            1,
            'start_date':
            today,
            'consumption_recurrence':
            service.consumption_recurrence,
            'unit':
            1,
            'unit_price':
            service.product.list_price,
        }])
        Subscription.quote(new_subscription)
        Subscription.run(new_subscription)
        SaleSubscriptionLine.generate_consumption(date=today, party=user.party)
        Subscription.generate_invoice(date=today, party=user.party)
        invoices = Invoice.search([('party', '=', user.party)])
        if len(invoices) >= 1:
            for invoice in invoices:
                if invoice.state == 'draft':
                    Invoice.post([invoice])
        return redirect(url_for('course.payment'))