pay_request_resp.py 5.39 KB
import random
import string
import colander
import logging
from opensipkd.base import get_settings
from opensipkd.pasar.models.produk import PartnerPay
from opensipkd.base.models import User, DBSession, Partner, flush_row
from pyramid_rpc.jsonrpc import jsonrpc_method
from opensipkd.base.views import BaseView
from opensipkd.base.tools.api import (auth_from_rpc,
                                      JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError,
                                      JsonRpcParameterNotFound)
from pyramid.view import view_config
from .api_payment import set_register_values

from opensipkd.base.views import BaseView

log = logging.getLogger(__name__)

def encode_form_to_json(form_request_data, parsed_produks):
    decoded_dict = {}

    customer_req = {}
    deliver_to = {}
    server = {}
    for key in form_request_data:
        if key[-5:] == '_cust':
            customer_req[key.replace('_cust', '')] = form_request_data[key]
        elif key[-8:] == '_deliver':
            deliver_to[key.replace('_deliver', '')] = form_request_data[key]
        elif key[-8:] == '_server':
            server[key.replace('_server', '')] = form_request_data[key]
        else:
            decoded_dict[key] = form_request_data[key]

    produks = parsed_produks

    decoded_dict['customer'] = customer_req
    decoded_dict['deliver_to'] = deliver_to
    decoded_dict['server'] = server
    decoded_dict['produk'] = produks

    return decoded_dict

def randomString(stringLength):

    letters = string.ascii_letters
    return ''.join(random.choice(letters) for i in range(stringLength))

def save_partner_pay_request(values, row=None):
    print('masuk save_partner_pay_request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
    if not row:
        print('data baru loh >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
        row = PartnerPay()
    else:
        print('kok bisa sudah ada datanya >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')

    row.from_dict(values)
    random_token = randomString(20)
    row.token_pay_req = random_token

    flush_row(row)
    return row

def added_register_values(current_register_values, dat):
    added_dict = current_register_values
    added_dict['biller_name'] = dat['biller']['name']
    added_dict['biller_phone'] = dat['biller']['phone']
    added_dict['biller_email'] = dat['biller']['email']
    added_dict['biller_address'] = dat['biller']['address']
    added_dict['biller_city'] = dat['biller']['city']
    added_dict['biller_state'] = dat['biller']['state']
    added_dict['biller_post_code'] = dat['biller']['post_code']
    added_dict['biller_country'] = dat['biller']['country']
    added_dict['response_url'] = dat['response_url']

    return added_dict

@jsonrpc_method(method='pay_request', endpoint='api-merchant')
def pay_request(request, data, **kwargs):
    user = auth_from_rpc(request)
    # user = DBSession.query(User).filter(User.id == 1).first()
    i = 0
    print('masuk sini loh >>>>>>>>>>>>>>>>>>>>>>>>>>>')
    if not data:
        raise JsonRpcParameterNotFound

    is_list = type(data) == list
    data = is_list and data or [data]
    customer = Partner.query_user(user).first()
    if not customer:
        raise JsonRpcCustomerNotFoundError

    #todo, json request testing
    r_data = {}
    log.info("%s Payment Attempt Request: %s" % (customer.kode, data))
    for dat in data:
        if "invoice_no" not in dat or \
                'amount' not in dat or not dat['amount']:
            r_data["status"] = "FAILED"
            r_data["message"] = "Parameter tidak lengkap"
            r_data['code'] = -1
        else:
            inv_no = dat["invoice_no"]
            row = PartnerPay.query().filter_by(cust_inv_no=inv_no).first()
            if row and row.status > 0:
                r_data["status"] = "FAILED"
                r_data["message"] = "Nomor Invoice Tersebut sudah ada"
                r_data['code'] = -1
            else:
                dat['produk'] = dat['cart']

                values = set_register_values(dat, customer)
                values = added_register_values(values, dat)

                ar_invoice = save_partner_pay_request(values, row)

                r_data["status"] = "SUCCESS"
                r_data["message"] = "Data tersimpan silahkan lanjutkan pembayaran"
                r_data['code'] = 0
                r_data['pay_token'] = ar_invoice.token_pay_req
                r_data['pay_url'] = request._host + '/pay/' + ar_invoice.token_pay_req

    log.info("%s Payment Request Response: %s " % (customer.kode, r_data))
    return r_data

class view_pay(BaseView):
    @view_config(route_name = 'pay-request-resp', permission = 'pay-request-resp', renderer = 'templates/pay_request_resp.pt')#permission = 'pay-form',
    def the_form(self):
        request = self.req
        session = self.ses
        url_dict = request.matchdict

        post_data = request.POST
        items = dict(post_data)


        if post_data:         
            produks = []
            for key in items:
                print(key)
                if key[:10] == 'goods_name':
                    uniq = key.split('-')
                    uniq = uniq[1]
                    produk = (items[key], items['goods_detail-' + uniq], "{:n}".format(int(items['goods_amt-' + uniq])), items['img_url-' + uniq])
                    produks.append(produk)

            json_dict_request = encode_to_json(items, produks)
        return {}