Esempio n. 1
0
def deleteuserpayment(request):
    if request.is_ajax():
        if request.method == 'POST':
            txtmessage = ''

            try:
                json_data = json.loads(request.body)

                if json_data['txtmessage']:
                    txtmessage = json_data['txtmessage']

                userpayment_id = json_data['userpayment_id']
                registro = UserPayment.objects.get(
                    user_payment_id=userpayment_id)
                registro.message = txtmessage
                registro.enabled = False
                registro.status = 'CA'
                registro.channel = 'X'
                registro.save()

                # Envio envento a intercom
                ep = Setting.get_var('intercom_endpoint')
                token = Setting.get_var('intercom_token')

                try:
                    intercom = Intercom(ep, token)
                    reply = intercom.submitEvent(
                        registro.user.user_id, registro.user.email,
                        "cancelled-sub", {
                            "event_description":
                            "recurrencia cancelada por el administrador"
                        })
                    if not reply:
                        registro.message = "Intercom error: cannot post the event"
                        registro.save()
                except Exception as e:
                    registro.message = "Intercom error: %s" % str(e)
                    registro.save()

                return JsonResponse({'message': 'activado correctamente'},
                                    status=200)
            except Exception as e:
                return JsonResponse(
                    {
                        'message': 'Hubo un error',
                        'data': e.message
                    },
                    status=500)
    return JsonResponse({
        'message': 'Metodo no permitido',
        'data': ''
    },
                        status=500)
Esempio n. 2
0
def expireuser(request):
    if request.is_ajax():
        if request.method == 'GET':
            fecha = datetime.today()

        if request.method == 'POST':
            try:
                json_data = json.loads(request.body)
                user_id = json_data['user_id']
                user = User.objects.get(user_id=user_id)
                fecha = datetime.today()
                d = timedelta(days=1)
                fecha -= d
                user.expiration = fecha
                user.save()

                # Envio envento a intercom
                ep = Setting.get_var('intercom_endpoint')
                token = Setting.get_var('intercom_token')
                try:
                    intercom = Intercom(ep, token)
                    metadata = {
                        "event_description":
                        "usuario expirado por el administrador",
                        "expire_at":
                        str(int(mktime(user.expiration.timetuple())))
                    }
                    reply = intercom.submitEvent(user.user_id, user.email,
                                                 "user_expired", metadata)
                except Exception as e:
                    pass

                return JsonResponse(
                    {
                        'message': 'Guardado correctamente',
                        'data': fecha
                    },
                    status=200)
            except Exception as e:
                return JsonResponse(
                    {
                        'message': 'Hubo un error',
                        'data': e.message
                    },
                    status=500)
    return JsonResponse({
        'message': 'Metodo no permitido',
        'data': ''
    },
                        status=500)
Esempio n. 3
0
def __check_apikey(request):
    if 'HTTP_X_AUTH_CCM_KEY' in request.META:
        if request.META['HTTP_X_AUTH_CCM_KEY'] == Setting.get_var('ma_apikey'):
            return {'status': 'success'}
        else:
            return {'status': 'error'}
    else:
        return {'status': 'error'}
Esempio n. 4
0
def manual_payment(request):
    if request.is_ajax():
        if request.method == 'POST':
            try:
                json_data = json.loads(request.body)
                userpayment_id = json_data['userpayment_id']
                up = UserPayment.get_by_id(userpayment_id)

                if up is None:
                    return JsonResponse(
                        {
                            'message':
                            'Error al realizar el pago, el usuario no existe'
                        },
                        status=500)

                if up.user.has_active_recurrence():
                    return JsonResponse(
                        {
                            'message':
                            'Error al realizar el pago: el usuario ya posee una recurrencia activa'
                        },
                        status=500)

                logging.basicConfig(
                    format=
                    '%(asctime)s - manual_payments -[%(levelname)s]: %(message)s',
                    filename=Setting.get_var('log_path'),
                    level=logging.INFO)

                # Cambio a estado Pending
                up.status = 'PE'
                up.save()

                # Obtengo la tarjeta habilitada para el usuario
                card = up.user.get_card()

                if card is None:
                    msg = 'Error al obtener la tarjeta para el usuario'
                    up.error(msg)
                    return JsonResponse({'message': msg}, status=500)

                pay = make_payment(up, card, logging, True)

                if pay:
                    return JsonResponse(
                        {'message': 'Pago efectuado correctamente'},
                        status=200)
                else:
                    return JsonResponse(
                        {
                            'message':
                            'Error al realizar el pago: verificar PaymentHistory'
                        },
                        status=500)
            except Exception:
                return JsonResponse({'message': 'Hubo un error'}, status=500)
    return JsonResponse({'message': 'metodo no permitido'}, status=500)
Esempio n. 5
0
def deleteuserpayment(request):
    if request.is_ajax():
        if request.method == 'POST':
            try:
                json_data = json.loads(request.body)

                userpayment_id = json_data['userpayment_id']
                registro = UserPayment.objects.get(
                    user_payment_id=userpayment_id)

                if json_data['txtmessage'] != '':
                    registro.message = json_data['txtmessage']

                # Envio cancelacion a CommerceGate
                integrator = Integrator.objects.get(
                    country=registro.user.country, enabled=True)

                if integrator.name == 'commerce_gate':
                    registro.channel = 'X'
                    registro.save()
                    baseurl = Setting.get_var('baseurl')
                    url = "%sapi/v1/commercegate/set/cancel" % baseurl
                    user_id = {'user_id': registro.user.user_id}
                    data = json.dumps(user_id)
                    resp, content = Http().request(
                        url,
                        'POST',
                        body=data,
                        headers={'content-type': 'application/json'})
                else:
                    registro.channel = 'X'
                    registro.enabled = False
                    registro.status = 'CA'
                    registro.save()
                    # POST to promiscuus
                    resp_promiscuus = post_to_promiscuus(registro, 'cancel')
                    if resp_promiscuus['status'] == 'error':
                        registro.message = "%s - Promiscuus error: %s" % (
                            up.message, resp_promiscuus['message'])
                        registro.save()

                return JsonResponse({'message': 'activado correctamente'},
                                    status=200)
            except Exception as e:
                return JsonResponse(
                    {
                        'message': 'Hubo un error',
                        'data': e.message
                    },
                    status=500)
    return JsonResponse({
        'message': 'Metodo no permitido',
        'data': ''
    },
                        status=500)
Esempio n. 6
0
def activateuser(request):
    if request.is_ajax():
        if request.method == 'POST':
            try:
                json_data = json.loads(request.body)
                user_id = json_data['user_id']
                days = json_data['days']
                user = User.objects.get(user_id=user_id)

                # Sumar la cantidad de dias a hoy
                date = user.enable_for(days)

                # Envio evento a intercom
                ep = Setting.get_var('intercom_endpoint')
                token = Setting.get_var('intercom_token')

                try:
                    intercom = Intercom(ep, token)
                    metadata = {
                        'event_description':
                        'usuario activado por el administrador',
                        'expire_at': str(int(mktime(date.timetuple())))
                    }
                    reply = intercom.submitEvent(user.user_id, user.email,
                                                 'user_activated', metadata)
                except Exception as e:
                    pass

                return JsonResponse({'message': 'activado correctamente'},
                                    status=200)
            except Exception as e:
                return JsonResponse(
                    {
                        'message': 'Hubo un error',
                        'data': e.message
                    },
                    status=500)
    return JsonResponse({
        'message': 'Metodo no permitido',
        'data': ''
    },
                        status=500)
Esempio n. 7
0
def filter_recurrence(request):
    data = []

    prices = Setting.get_var('packages_recurrence').split(",")

    for price in prices:
        data.append({'key': price, 'value': price})

    body = {'status': 'success', 'data': data}

    return HttpResponse(json.dumps(body, cls=DjangoJSONEncoder),
                        content_type='application/json',
                        status=http_REQUEST_OK)
Esempio n. 8
0
def __callback_paymentez_proc(data, country):
    # Verifico el stoken
    if not __validate_stoken(data, country):
        body = {"status": "error", "message": "not authorized"}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=200)

    # Obtengo los valores segun la respuesta de Paymentez
    pr = paymentez_translator(data)

    # Obtengo el PaymentHistory con el dev_reference informado
    try:
        ph = PaymentHistory.objects.get(
            payment_id=data["transaction"]["dev_reference"])
    except ObjectDoesNotExist:
        body = {"status": "error", "message": "invalid dev_refence"}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=200)

    # Verifico que este en Waiting Callback
    if ph.status == 'W' or (ph.status == 'A' and pr["ph_status"] == 'C'):

        # Seteo los valores de la UserPayment
        ph.user_payment.status = pr["up_status"]
        ph.user_payment.message = pr["up_message"]
        ph.user_payment.enabled = pr["up_recurrence"]

        if ph.user_payment.status == 'AC':
            # calcular next_payment_day
            ph.user_payment.payment_date = ph.user_payment.calc_payment_date()
            # Fija la fecha de expiration del usuario
            ph.user_payment.user.set_expiration(ph.user_payment.payment_date)
            if ph.user_payment.disc_counter > 0:
                ph.user_payment.disc_counter = ph.user_payment.disc_counter - 1
        else:
            ph.user_payment.channel = 'C'
        ph.user_payment.save()

        # Seteo los valores del PaymentHistory
        ph.status = pr["ph_status"]
        ph.gateway_id = pr["ph_gatewayid"]
        ph.message = pr["ph_message"]
        ph.save()

        if pr["user_expire"]:
            ph.user_payment.user.expire()

        if pr["intercom"]["action"]:
            ep = Setting.get_var('intercom_endpoint')
            token = Setting.get_var('intercom_token')
            try:
                intercom = Intercom(ep, token)
                reply = intercom.submitEvent(
                    ph.user_payment.user.user_id, ph.user_payment.user.email,
                    pr["intercom"]["event"],
                    paymentez_intercom_metadata(data['transaction']))
                if not reply:
                    ph.message = "%s - Intercom error: cannot post the event" % (
                        ph.message)
                    ph.save()
            except Exception as e:
                ph.message = "%s - Intercom error: %s" % (ph.message, str(e))
                ph.save()

    else:
        body = {
            "status": "error",
            "message": "ignoring callback: PH status %s" % ph.status
        }
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=200)

    body = {'status': 'success', 'message': ''}
    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=200)
Esempio n. 9
0
def payment_pagodigital(request):
    # Vars
    integrator = Integrator.get('pagodigital')
    baseurl = Setting.get_var('baseurl')
    template = 'pagodigital/pagodigital.html'

    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Cargo el JSON
    try:
        data = json.loads(request.body)
        print "CONTENT MA: %s" % data
    except Exception:
        message = 'error decoding json'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorias
    keys = ['user_id', 'email', 'payment_date', 'recurrence']
    json_loader = __validate_json(data, keys)

    if json_loader['status'] == 'error':
        return HttpResponse(json.dumps(json_loader),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico si el usuario existe y sino lo creo
    try:
        user = User.objects.get(user_id=data['user_id'])
        user.email = data['email']
        user.save()
    except ObjectDoesNotExist:
        user = User.create(data['user_id'], data['email'], integrator.country)

    # Verifico que no tenga un User Payment activo
    up = UserPayment.get_active(user)
    if up is not None:
        if up.enabled_card:
            message = 'enabled user payment already exists'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)
        else:
            up.status = 'PE'
            up.save()

    # Obtengo el paquete
    if 'package_id' in data:
        package = Package.get_by_id(data['package_id'], integrator)
    else:
        package = Package.get(data['recurrence'], integrator)

    if package is None:
        message = "package not found with that duration"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Creo UserPayment
    up = UserPayment.create_from_package(user, package, data['payment_date'],
                                         0, 0, True)

    # Aplico descuento si existe
    if 'discount' in data and 'disc_counter' in data:
        up.discount(data['discount'], data['disc_counter'])

    # Creo el form
    form = Form.create(user, up, integrator, template, 'UP', package)
    if form is None:
        message = "form could not be created"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_INTERNAL_ERROR)

    iframe_params = {'user_id': user.user_id, 'token': form.token}
    iframe_url = '%sapi/v1/pagodigital/userpayment/form/?%s' % (
        baseurl, urlencode(iframe_params))
    body = {'status': 'success', 'value': {'url': iframe_url}}

    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=http_POST_OK)
Esempio n. 10
0
def add_card_pagodigital(request):
    # Vars
    integrator = Integrator.get('pagodigital')
    baseurl = Setting.get_var('baseurl')
    template = 'pagodigital/pagodigital.html'

    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Cargo el JSON
    try:
        data = json.loads(request.body)
    except Exception:
        message = 'error decoding json'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorias
    keys = ['user_id']
    json_loader = __validate_json(data, keys)

    if json_loader['status'] == 'error':
        return HttpResponse(json.dumps(json_loader),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico si el usuario existe y sino devuelvo error
    try:
        user = User.objects.get(user_id=data['user_id'])
    except ObjectDoesNotExist:
        message = 'user does not exist'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Obtengo el User Payment activo sino devuelvo error
    up = UserPayment.get_active(user)
    if up is None:
        message = 'enabled user payment does not exist'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Creo el form
    form = Form.create(user, up, integrator, template, 'AC')
    if form is None:
        message = "form could not be created"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_INTERNAL_ERROR)

    iframe_params = {'user_id': user.user_id, 'token': form.token}
    iframe_url = '%sapi/v1/pagodigital/addcard/form/?%s' % (
        baseurl, urlencode(iframe_params))
    body = {'status': 'success', 'value': {'url': iframe_url}}

    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=http_POST_OK)
Esempio n. 11
0
def userpayment_form_pagodigital(request):
    ########  Metodo POST  ########
    if request.method == 'POST':
        data = request.POST
        template = 'pagodigital/redirect.html'

        # Verifico las key mandatorias
        keys = [
            'name', 'phone', 'address', 'id_card', 'email', 'city', 'state',
            'cc_number', 'cc_exp_month', 'cc_exp_year', 'cc_cvv',
            'cc_fr_number', 'cc_fr_name', 'user_id', 'token'
        ]

        json_loader = __validate_json(data, keys)
        if json_loader['status'] == 'error':
            return HttpResponse(json.dumps(json_loader),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Obtengo el usuario y el form vinculado al token
        user = User.get(data['user_id'])
        form = Form.get(user, data['token'])
        if form is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Verifico que no tenga un User Payment activo
        active_up = UserPayment.get_active(user)
        if active_up is not None:
            message = 'enabled user payment already exists'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        up = form.user_payment

        # Obtengo settings del integrator
        api_key = IntegratorSetting.get_var(form.integrator, 'api_key')
        api_secret = IntegratorSetting.get_var(form.integrator, 'api_secret')
        success_url = IntegratorSetting.get_var(form.integrator,
                                                'redirect_url_success')
        failed_url = IntegratorSetting.get_var(form.integrator,
                                               'redirect_url_failed')
        jwt_endpoint = IntegratorSetting.get_var(form.integrator,
                                                 'jwt_endpoint')
        jwt_user = IntegratorSetting.get_var(form.integrator, 'jwt_user')
        jwt_pass = IntegratorSetting.get_var(form.integrator, 'jwt_pass')

        # Obtengo el JWT
        pd_jwt_gw = PagoDigitalJWTGateway(jwt_endpoint, jwt_user, jwt_pass)
        try:
            ret, content = pd_jwt_gw.doPost()
            if not ret:
                message = "%s - %s" % (content['STATUS_MESSAGE'],
                                       content['MESSAGE'])
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            if not 'TOKEN' in content:
                message = "JWT ERROR - TOKEN key not found"
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            pd_jwt = content['TOKEN']
        except Exception as e:
            message = 'jwt error: %s' % e
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Realizar add card y obtener token
        pd_ac_endpoint = IntegratorSetting.get_var(form.integrator,
                                                   'add_card_endpoint')
        pd_gw = PagoDigitalGateway(pd_ac_endpoint, api_key, api_secret, pd_jwt)
        pd_card = PagoDigitalCard(data['cc_number'], data['cc_cvv'],
                                  data['cc_fr_number'], data['cc_exp_month'],
                                  data['cc_exp_year'], data['name'],
                                  data['id_card'], data['address'],
                                  data['email'], data['phone'], data['city'],
                                  data['state'])
        new_card = True
        try:
            ret, content = pd_gw.doPost(pd_card.to_dict())
            if not ret:
                message = "%s - %s" % (content['STATUS_MESSAGE'],
                                       content['MESSAGE'])
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            if 'CODIGO_RESPUESTA' in content:
                if str(content['CODIGO_RESPUESTA']) not in SUCCESS_CODES:
                    message = "ADD CARD ERROR - code: %s - message: %s" % (
                        content['CODIGO_RESPUESTA'], content['RESPUESTA'])
                    up.reply_error(message)
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
            elif 'CODIGO_ERROR' in content and content[
                    'CODIGO_ERROR'] == 'PD38':
                if 'TOKEN' not in content:
                    message = "ADD CARD ERROR - CODIGO_ERROR PD38 but TOKEN not returned"
                    up.reply_error(message)
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
                new_card = False
            else:
                message = "ADD CARD ERROR - CODIGO_RESPUESTA not found"
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
        except Exception as e:
            message = 'add card error: %s' % e
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Habilito tarjeta en UP
        up.enabled_card = True

        # Deshabilito cualquier tarjeta existente
        cards = Card.objects.filter(user=user, enabled=True)
        for card in cards:
            card.disable()

        # Creo la tarjeta o la obtengo si ya existe
        card = Card.get_by_token(up.user, content['TOKEN'])
        if card is not None:
            card.enable()
        elif new_card:
            card_exp = "%s/%s" % (data['cc_exp_month'],
                                  data['cc_exp_year'][-2:])
            card = Card.create_with_token(user, content['TOKEN'],
                                          data['cc_number'][-4:], card_exp,
                                          data['cc_fr_name'], form.integrator)
        else:
            up.enabled_card = False
            message = 'add card error: Token %s not found' % content['TOKEN']
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Verifico si es trial y aplico descuento si corresponde
        if up.is_trial:
            trial_flag = True
            disc_flag = False
            disc_pct = 0
        else:
            trial_flag = False
            if up.has_discount:
                disc_flag = True
                disc_pct = up.disc_pct
            else:
                disc_pct = 0
                disc_flag = False

        # Genero tx id sumando al userid el timestamp
        payment_id = "PH_%s_%d" % (user.user_id, int(time()))

        # Creo el registro en PaymentHistory
        ph = PaymentHistory.create(up, payment_id, form.integrator, card,
                                   disc_pct)

        if ph.amount > 0:
            # Realizar pago
            pd_tx_endpoint = IntegratorSetting.get_var(form.integrator,
                                                       'process_tx_endpoint')
            pd_gw = PagoDigitalGateway(pd_tx_endpoint, api_key, api_secret,
                                       pd_jwt)
            try:
                pd_tx = PagoDigitalTx(int(ph.amount), card.token)
                ret, content = pd_gw.doPost(pd_tx.to_dict())
                print ret
                print content
            except Exception as e:
                message = 'Payment error: %s' % e
                up.reply_error(message)
                ph.error('', message)
                return False
        else:
            ret = True
            content = {
                'CODIGO_RESPUESTA': '-10',
                'id': '-10',
                'message': 'Pago con descuento del 100%'
            }

        if ret:
            # Obtengo los valores segun la respuesta de Pagodigital
            pr = pagodigital_translator(content)

            # Seteo los valores de la UserPayment
            up.status = pr["up_status"]
            up.message = pr["up_message"]
            up.enabled = pr["up_recurrence"]

            if up.status == 'AC':
                # calcular next_payment_day
                up.payment_date = up.calc_payment_date()
                # Fija la fecha de expiration del usuario
                user.set_expiration(up.payment_date)
                if disc_flag:
                    up.disc_counter -= 1
                if trial_flag:
                    up.trial_counter -= 1
            else:
                up.channel = 'R'
            up.save()

            # Seteo los valores del PaymentHistory
            ph.status = pr["ph_status"]
            ph.gateway_id = pr["ph_gatewayid"]
            ph.message = pr["ph_message"]
            ph.save()

            if ph.status == 'A':
                redirect_url = success_url
            else:
                redirect_url = failed_url

            if pr["user_expire"]:
                user.expire()

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': redirect_url}
            return render(request, template, context)

        else:
            message = "could not create user payment"
            up.reply_error(message)
            ph.error('', message)

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': failed_url}
            return render(request, template, context)

    ########  Metodo GET  ########
    elif request.method == 'GET':
        user = User.get(request.GET['user_id'])
        template = Form.get_template(user, request.GET['token'])
        baseurl = Setting.get_var('baseurl')

        if template is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        context = {
            'country': user.country.code,
            'email': user.email,
            'baseurl': baseurl
        }
        return render(request, template, context)
Esempio n. 12
0
def payment_error(request):
    template = 'error/paymenterror.html'
    base_url = Setting.get_var('ma_base_url')
    url = "%sprofile" % base_url
    context = {'redirect_url': url}
    return render(request, template, context)
Esempio n. 13
0
def userpayment_form_prisma_view(request):
    ########  Metodo POST  ########
    if request.method == 'POST':
        data = request.POST
        template = 'prisma/redirect.html'

        # Verifico las key mandatorias
        keys = [
            'card_number', 'card_expiration_month', 'card_expiration_year',
            'security_code', 'card_holder_name', 'card_type', 'id_type',
            'id_number', 'user_id', 'token'
        ]
        json_loader = __validate_json(data, keys)
        if json_loader['status'] == 'error':
            return HttpResponse(json.dumps(json_loader),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Obtengo el id de la tarjeta
        payment_method_id = get_prisma_card_id(data['card_type'])
        if payment_method_id is None:
            message = 'invalid payment method ID'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Obtengo el usuario y el form vinculado al token
        user = User.get(data['user_id'])
        form = Form.get(user, data['token'])
        if form is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Verifico que no tenga un User Payment activo
        active_up = UserPayment.get_active(user)
        if active_up is not None:
            message = 'enabled user payment already exists'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        up = form.user_payment

        # Obtengo settings del integrator
        public_apikey = IntegratorSetting.get_var(form.integrator,
                                                  'public_apikey')
        private_apikey = IntegratorSetting.get_var(form.integrator,
                                                   'private_apikey')
        success_url = IntegratorSetting.get_var(form.integrator,
                                                'redirect_url_success')
        failed_url = IntegratorSetting.get_var(form.integrator,
                                               'redirect_url_failed')
        endpoint = IntegratorSetting.get_var(form.integrator, 'endpoint')

        prisma_gw = PrismaGateway(endpoint, public_apikey, private_apikey)

        # Obtengo Token de pago
        prisma_token = PrismaPaymentToken(data['card_number'],
                                          data['card_expiration_month'],
                                          data['card_expiration_year'],
                                          data['security_code'],
                                          data['card_holder_name'],
                                          data['id_type'], data['id_number'])

        try:
            ret, content = prisma_gw.get_payment_token(
                prisma_token.serialize())  # Revisar que devuelve
            if not ret:
                up.reply_error(json.dumps(content))
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            payment_token = content['id']
        except Exception as e:
            message = {
                'status': 'error',
                'message': 'get_payment_token(): %s' % e
            }
            up.reply_error(json.dumps(message))
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Realizo primer pago para tokenizar tarjeta
        payment_id = "PH_%s_%dc" % (user.user_id, int(time()))
        cc_bin = data['card_number'][:6]
        add_card_amount = 10 * 100
        add_card_tx = PrismaTx(user.user_id, user.email, payment_id,
                               payment_token, cc_bin, add_card_amount,
                               payment_method_id)
        try:
            ret, content = prisma_gw.add_card(add_card_tx.serialize())
            if not ret:
                up.reply_error(json.dumps(content))
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            card_token = content['customer_token']
            if card_token is None:
                message = 'add card error - payment(): card token is null'
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
        except Exception as e:
            message = 'add card error - payment(): %s' % e
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Habilito tarjeta en UP
        up.enabled_card = True

        # Deshabilito cualquier tarjeta existente
        cards = Card.objects.filter(user=user, enabled=True)
        for card in cards:
            card.disable()

        # Creo la tarjeta o la obtengo si ya existe
        card = Card.get_by_token(up.user, card_token)
        if card is not None:
            card.enable()
        else:
            card_exp = "%s/%s" % (data['card_expiration_month'],
                                  data['card_expiration_month'])
            card = Card.create_with_token(user, card_token,
                                          data['card_number'][-4:], card_exp,
                                          data['card_type'], form.integrator,
                                          data['security_code'],
                                          data['card_number'][:6])

        # Verifico si es un pago futuro
        if up.payment_date > timezone.now().date():
            context = {'redirect_url': success_url}
            return render(request, template, context)

        # Verifico si es trial y aplico descuento si corresponde
        if up.is_trial:
            trial_flag = True
            disc_flag = False
            disc_pct = 0
        else:
            trial_flag = False
            if up.has_discount:
                disc_flag = True
                disc_pct = up.disc_pct
            else:
                disc_pct = 0
                disc_flag = False

        # Genero tx id sumando al userid el timestamp
        payment_id = "PH_%s_%d" % (user.user_id, int(time()))

        # Creo el registro en PaymentHistory
        ph = PaymentHistory.create(up, payment_id, form.integrator, card,
                                   disc_pct)

        if ph.amount > 0:
            # Obtengo nuevo Token de pago
            payment_data = {'token': card.token, 'security_code': card.cvv}
            try:
                ret, content = prisma_gw.get_recurrence_token(
                    payment_data)  # Revisar que devuelve
                if not ret:
                    up.reply_error(json.dumps(content))
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
                payment_token = content['id']
            except Exception as e:
                message = 'ERROR get_recurrence_token(): %s' % e
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)

            # Realizo pago
            final_amount = int(ph.amount * 100) - add_card_amount
            prisma_tx = PrismaTx(user.user_id, user.email, payment_id,
                                 payment_token, cc_bin, final_amount,
                                 payment_method_id)
            try:
                ret, content = prisma_gw.payment(prisma_tx.serialize())
                if not ret:
                    up.reply_error(json.dumps(content))
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
                card_token = content['customer_token']
            except Exception as e:
                message = 'ERROR payment(): %s' % e
                up.reply_error(message)
                ph.error('', message)
                return False
        else:
            ret = True
            content = {"status": "approved", "code": '-10'}

        if ret:
            # Obtengo los valores segun la respuesta de Prisma
            pr = prisma_translator(content)

            # Seteo los valores de la UserPayment
            up.status = pr["up_status"]
            up.message = pr["up_message"]
            up.enabled = pr["up_recurrence"]

            if up.status == 'AC':
                # calcular next_payment_day
                up.payment_date = up.calc_payment_date()
                # Fija la fecha de expiration del usuario
                user.set_expiration(up.payment_date)
                if disc_flag:
                    up.disc_counter -= 1
                if trial_flag:
                    up.trial_counter -= 1
            else:
                up.channel = 'R'
            up.save()

            # Seteo los valores del PaymentHistory
            ph.status = pr["ph_status"]
            ph.gateway_id = pr["ph_gatewayid"]
            ph.message = pr["ph_message"]
            ph.save()

            if ph.status == 'A':
                redirect_url = success_url
            else:
                redirect_url = failed_url

            if pr["user_expire"]:
                user.expire()

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': redirect_url}
            return render(request, template, context)

        else:
            message = json.dumps(content)
            up.reply_error(message)
            ph.error('', message)

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': failed_url}
            return render(request, template, context)

    ########  Metodo GET  ########
    elif request.method == 'GET':
        user = User.get(request.GET['user_id'])
        template = Form.get_template(user, request.GET['token'])
        baseurl = Setting.get_var('baseurl')

        if template is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        context = {
            'country': user.country.code,
            'email': user.email,
            'baseurl': baseurl
        }
        return render(request, template, context)