pay.py 10.7 KB
import colander

from deform import widget, Form
from opensipkd.base.views import BaseView
from pyramid.view import view_config
from pyramid.httpexceptions import HTTPFound
from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog, PartnerPay, Partner
from opensipkd.pasar.models import DBSession, flush_row
from .api_payment import set_register_values, build_register
from .api_merchant import get_vendor_produk
from ..pay_request_tools import methods, vacs, cvss, loans, cps, ems
from datetime import datetime, timedelta


class VaSchema(colander.Schema):
    va_opt = colander.SchemaNode(colander.String(), title = "Pilih Layanan", missing=colander.drop)
    va_valid_date = colander.SchemaNode(colander.String(), title = "Tanggal Valid", missing=colander.drop, widget=widget.HiddenWidget())
    va_valid_time = colander.SchemaNode(colander.String(), title = "Jam Valid", missing=colander.drop, widget=widget.HiddenWidget())

class CcSchema(colander.Schema):
    cc_instmnt_type = colander.SchemaNode(colander.String(), title = "Installment type", missing=colander.drop)
    cc_instmnt_mon = colander.SchemaNode(colander.String(), title = "Installment month", missing=colander.drop)
    cc_recurr_opt = colander.SchemaNode(colander.String(), title = "Recurring Option", missing=colander.drop)

class CvsSchema(colander.Schema):
    cvs_opt = colander.SchemaNode(colander.String(), title = "Pilih Layanan", missing=colander.drop)
    cvs_valid_date = colander.SchemaNode(colander.String(), title = "Tanggal Valid", missing=colander.drop)
    cvs_valid_time = colander.SchemaNode(colander.String(), title = "Jam Valid", missing=colander.drop)

class LoanSchema(colander.Schema):
    loan_opt = colander.SchemaNode(colander.String(), title = "Pilih Layanan", missing=colander.drop)

    loan_instmnt_type = colander.SchemaNode(colander.String(), title = "Installment type", missing=colander.drop)
    loan_instmnt_mon = colander.SchemaNode(colander.String(), title = "Installment month", missing=colander.drop)
    loan_recurr_opt= colander.SchemaNode(colander.String(), title = "Recurring option", missing=colander.drop)
    loan_valid_date = colander.SchemaNode(colander.String(), title = "Expiry date", missing=colander.drop)
    loan_valid_time = colander.SchemaNode(colander.String(), title = "Expiry Time", missing=colander.drop)


class CpSchema(colander.Schema):
    cp_opt = colander.SchemaNode(colander.String(), title = "Pilih Layanan", missing=colander.drop)
    cp_merc_ref_no = colander.SchemaNode(colander.String(), title = "Merc. Ref. No.", missing=colander.drop)

class EmSchema(colander.Schema):
    em_opt = colander.SchemaNode(colander.String(), title = "Pilih Layanan", missing=colander.drop)


class FormSchema(colander.Schema):
    pay_method = colander.SchemaNode(colander.String(), title = "Metode Pembayaran", missing=colander.drop, widget=widget.HiddenWidget())
    biller_name = colander.SchemaNode(colander.String(), title = "Biller", missing=colander.drop, widget=widget.HiddenWidget())
    amount_tot = colander.SchemaNode(colander.String(), title = "Amount", missing=colander.drop, widget=widget.HiddenWidget())
    customer_name = colander.SchemaNode(colander.String(), title = "Customer", missing=colander.drop, widget=widget.HiddenWidget())

def encode_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 whatisthis(s):
    if isinstance(s, str):
        print("ordinary string")
    elif isinstance(s, unicode):
        print("unicode string")
    else:
        print("not a string")

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

        print('isi url_dict >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
        print(url_dict)
        print('isi request.params >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
        print(request.params)

        data_form = {}
        post_data = request.POST
        items = dict(post_data)
        produks = []
        print('masuk controller pay >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')

        if post_data:
            if 'bayar' in post_data:
                print('masuk bayar >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                if 'invoice_no' not in post_data:
                    #error invoice

                    pass
                user_id = request.session

                # inv_no = items['invoice_no']
                # row = PartnerPay.query().filter_by(cust_inv_no=inv_no).first()
                
                customer = Partner.query().filter(Partner.id == 6).first()
                # customer = Partner.query_user(user).first()
                # if row and row.status > 0:
                #     #error invoice
                #     pass

                produk_kd = ''

                mth = post_data['pay_method']

                denom = ''
                if mth == 'VA':
                    denom = items['va_opt']
                elif mth == 'CC':
                    denom = mth
                elif mth == 'CVS':
                    denom = items['cvs_opt']
                elif mth == 'EM':
                    denom = items['em_opt']
                elif mth == 'loan':
                    denom = items['loan_opt']
                elif mth == 'CP':
                    denom = items['cp_opt']

                vendor_kd = None
                produk_kd = denom
                print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>jenis string')
                # whatisthis(produk_kd)
                produk_kd = produk_kd.replace('\xad', '')
                produk_kd = produk_kd.replace('\u00ad', '')
                produk_kd = produk_kd.replace('\N{SOFT HYPHEN}', '')
                print('isi denom >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                print(denom)
                vendor_produk = get_vendor_produk(produk_kd, vendor_kd = vendor_kd)

                row = DBSession.query(PartnerPay).filter(PartnerPay.token_pay_req == url_dict['pay_token']).first()
                # row = DBSession.query(PartnerPay).filter(PartnerPay.id == 519).first()
                row.vendor_id = vendor_produk.partner_id
                row.produk_id = vendor_produk.produk.id

                hours_24_from_now = datetime.now() + timedelta(hours=24)
                dt = format(hours_24_from_now, '%Y%m%d')
                tm = format(hours_24_from_now, '%H%M%S')

                row.pay_token_date_exp = dt
                row.pay_token_time_exp = tm
                row.pay_req_mth = mth
                row.pay_denom = denom

                ccard = None
                if mth == 'VA':
                    row.inv_valid_date='va_valid_date' in items and items['va_valid_date'] or dt
                    row.inv_valid_time='va_valid_time' in items and items['va_valid_time'] or tm
                    row.inv_cust_va='va_fix_acct_id' in items and items['va_fix_acct_id'] or ''
                    ccard = None
                elif mth == 'CC':
                    row.instmnt_mon='cc_instmnt_mon' in items and items['cc_instmnt_mon'] or ''
                    row.instmnt_type='cc_instmnt_type' in items and items['cc_instmnt_type'] or ''
                    row.recurr_opt='cc_recurr_opt' in items and items['cc_recurr_opt'] or 0
                    ccard = None

                flush_row(row)
                result_request = build_register(vendor_produk, row, ccard=ccard)


                # values = set_register_values(encode_to_json(items, produks), customer)


                print('hasil build request > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                print(result_request)
                a = request.route_url(route_name='pay-info', pay_token = url_dict['pay_token'], meth = mth)
                return HTTPFound(a)

            elif 'batal' in post_data:
                return HTTPFound(location=request.route_url('api-merchant-home'))


        formSchema = FormSchema()
        formSchema.request = request
        form = Form(formSchema)

        row = DBSession.query(
                                PartnerPay.biller_name,
                                PartnerPay.amt_sell,
                                PartnerPay.inv_cust_nm,
                                PartnerPay.cart,
                                ).filter(PartnerPay.token_pay_req == url_dict['pay_token']).first()

        data_form['biller_name'] = row.biller_name
        data_form['amount_tot'] = row.amt_sell        
        data_form['amount_tot_th'] = format(int(data_form['amount_tot']), ',d').replace(',', '.')
        data_form['customer_name'] = row.inv_cust_nm
        produks = row.cart['item']

        for trans in produks:
            trans['goods_amt'] = format(int(trans['goods_amt']), ',d').replace(',', '.')
            trans['subtotal'] = format(int(trans['subtotal']), ',d').replace(',', '.')

        form.render(data_form)

        vaSchema = VaSchema()
        vaSchema.request = request
        formVa = Form(vaSchema)

        formCC = CcSchema()
        formCC.request = request
        formCC = Form(formCC)

        formCvs = CvsSchema()
        formCvs.request = request
        formCvs = Form(formCvs)

        formCp = CpSchema()
        formCp.request = request
        formCp = Form(formCp)

        formLoan = LoanSchema()
        formLoan.request = request
        formLoan = Form(formLoan)

        formEm = EmSchema()
        formEm.request = request
        formEm = Form(formEm)


        return dict(
                    form = form,
                    formVa = formVa,
                    formCC = formCC,
                    formCvs = formCvs,
                    formCp = formCp,
                    formLoan = formLoan,
                    formEm = formEm,

                    meth = methods,
                    vacs = vacs,
                    cvss = cvss,
                    loans = loans,
                    cps = cps,
                    ems = ems,
                    formData = data_form,

                    produks = produks,

                    )