pay_request_resp.py 7.14 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):
    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

def get_input_error(data):    
    print('isi data >>>>>')
    print(data)
    err_dict = {}
    err_dict['code'] = 0

    data_read = data[0]
    print('data_read >>>>>>>>>>>>')
    print(data_read)
    biller_data = data_read['biller']
    cust_data = data_read['customer']
    print('biller_data >>>>>>>>>>>>>>>>>>>>.')
    print(biller_data)

    cust_city = cust_data['city']
    cust_state = cust_data['state']

    bill_name = biller_data['name'] 
    bill_phone = biller_data['phone']
    bill_email = biller_data['email']
    bill_city = biller_data['city']
    bill_state = biller_data['state']

    amt_total = data_read['amount']

    if cust_city == None or cust_city == '':
        err_dict['msg'] = 'customer_city tidak boleh kosong'
        err_dict['code'] = 9025
    if cust_state == None or cust_state == '':
        err_dict['msg'] = 'customer_state tidak boleh kosong'
        err_dict['code'] = 9026


    if bill_name == None or bill_name == '':
        err_dict['msg'] = 'biller_name tidak boleh kosong'
        err_dict['code'] = 9016

    if bill_phone == None or bill_name == '':
        err_dict['msg'] = 'biller_phone tidak boleh kosong'
        err_dict['code'] = 9017

    if bill_email == None or bill_email == '':
        err_dict['msg'] = 'biller_email tidak boleh kosong'
        err_dict['code'] = 9018

    if bill_city == None or bill_city == '':
        err_dict['msg'] = 'bill_city tidak boleh kosong'
        err_dict['code'] = 9025
    if bill_state == None or bill_state == '':
        err_dict['msg'] = 'bill_state tidak boleh kosong'
        err_dict['code'] = 9026

    return err_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
    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 Requestt: %s" % (customer.kode, data))

    basic_error = get_input_error(data)
    if basic_error['code'] != 0 :
        r_data['status'] = "FAILED"
        r_data['message'] = basic_error['msg']
        r_data['code'] = basic_error['code']
    else:
        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 {}