pay_request_resp.py 6.15 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 = {}

    print('isi form_request_data dalam encode_to_json >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
    print(form_request_data)

    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:
        row = PartnerPay()

    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']
    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

    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)

                credit_card = "credit_card" in dat and dat["credit_card"] or {}
                #belum paham metode untuk credit card seperti gimana.
                if credit_card:
                    values.update(dict(
                        instmnt_mon='instmnt_mon' in credit_card and credit_card['instmnt_mon'] or '',
                        instmnt_type='instmnt_type' in credit_card and credit_card['instmnt_type'] or '',
                        recurr_opt='recurr_opt' in credit_card and credit_card['recurr_opt'] or 0,
                    ))
                    ccard = None
                else:
                    ccard = None

                va = "va" in dat and dat["va"] or {}
                if va:
                    values.update(dict(
                        inv_valid_date='valid_date' in va and va['valid_date'] or '',
                        inv_valid_time='valid_time' in va and va['valid_time'] or '',
                        inv_cust_va='fix_acct_id' in va and va['fix_acct_id'] or '',
                    ))

                ar_invoice = save_partner_pay_request(values, row)

                r_data["status"] = "SUCCESS"
                r_data["message"] = "Data tersimpan silahkan lanjutkan pembayaran"
                r_data['code'] = 1
                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 {}