Commit 69ccc330 by yasir

update fitur payment request

1 parent a33e5ae3
......@@ -86,4 +86,9 @@ odeo-postpaid-inquiry,/api/odeo/postpaid/inquiry,API TEST ODEO INQUIRY POSTPAUD,
test-purchase,/api/test/prepaid/purchase,API TEST PURCHASE,1,0
test-prepaid-inquiry-pln,/api/test/prepaid/pln/inquiry,API TEST PLN PRE INQUIRY,1,0
test-postpaid-inquiry,/api/test/postpaid/inquiry,API TEST INQUIRY POSTPAUD,1,0
api-vsi,/api/vsi,'API VSI,1,0
\ No newline at end of file
api-vsi,/api/vsi,'API VSI,1,0
pay-form,/pay/{pay_token},Metode Pembayaran,1,0
pay-info,/pay_info/{pay_token}/{meth},Informasi Pembayaran,1,0
pay-request,/pay_request,Pembayaran,1,0
pay-request-resp,/pay_request_resp,Respon Request Pembayaran,1,0
\ No newline at end of file
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
methods = [
("VA", "Virtual Account"),
("CC", "Credit Card"),
("CVS", "Convenience Store"),
("EM", "E-Money"),
("loan", "Installment Non‐Bank(Loan)"),
("CP", "ClickPay")
]
vacs = [
("VA-MANDIRI", "Bank Mandiri"),
("VA-BNI", "Bank Negara Indonesia 46"),
("VA-BRI", "Bank Rakyat Indonesia"),
("VA-DANAMON", "Bank Danamon Indonesia"),
("VA-MAYBANK", "Bank International Indonesia Maybank"),
("VA-PERMATA", "Bank Permata"),
("VA-HANABANK", "Bank KEB Hana Indonesia"),
("VA-CIMB", "Bank CIMB Niaga"),
]
cvss = [
("CVS-INMAR", "Indomaret"),
("CVS-ALMAR", "Alfamart"),
("CVS-ALMAR", "Lawson"),
("CVS-ALMAR", "Alfamidi"),
("CVS-ALMAR", "Dan Dan Store"),
]
loans = [
("PL-AK", "Akulaku"),
("PL-KR", "Kredivo"),
]
cps = [
("CP-BCA", "Bank BCA (BCA KlikPay)"),
("CP-CIMB", "Bank CIMB Niaga (CIMB Clicks)"),
]
ems = [
("WL-OVO", "OVO"),
("WL-LINKA", "LinkAja"),
]
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)
va_valid_time = colander.SchemaNode(colander.String(), title = "Jam Valid", missing=colander.drop)
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)
biller_name = colander.SchemaNode(colander.String(), title = "Biller", missing=colander.drop)
amount_tot = colander.SchemaNode(colander.String(), title = "Amount", missing=colander.drop)
customer_name = colander.SchemaNode(colander.String(), title = "Customer", missing=colander.drop)
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.kode == request.session['partner_kd']).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)
if not vendor_produk:
#error vendor_produk
pass
row = DBSession.query(PartnerPay).filter(PartnerPay.token_pay_req == url_dict['pay_token']).first()
row.vendor_id = vendor_produk.partner_id
row.produk_id = vendor_produk.produk.id
ccard = None
if mth == 'VA':
row.inv_valid_date='va_valid_date' in items and items['va_valid_date'] or ''
row.inv_valid_time='va_valid_time' in items and items['va_valid_time'] or ''
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['customer_name'] = row.inv_cust_nm
produks = row.cart['item']
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,
produks = produks,
)
\ No newline at end of file
from opensipkd.base.views import BaseView
from opensipkd.pasar.models.produk import PartnerPay
from pyramid.view import view_config
class view_pay(BaseView):
@view_config(route_name = 'pay-info', renderer = 'templates/pay_info.pt')#permission = 'pay-form',
def the_form(self):
request = self.req
session = self.ses
url_dict = request.matchdict
meth = url_dict['meth']
pay_token = url_dict['pay_token']
row = PartnerPay.query().filter(PartnerPay.token_pay_req == pay_token).first()
if meth == 'VA':
subject = 'Nomor VA :'
content = row.card_no
elif meth == 'CC':
content = row.card_no
elif meth == 'CVS':
subject = ''
content = ''
elif meth == 'EM':
subject = ''
content = ''
elif meth == 'loan':
subject = ''
content = ''
elif meth == 'CP':
subject = ''
content = ''
return dict(
subject = subject,
content = content
)
\ No newline at end of file
import colander
import requests
import json
from datetime import datetime
from opensipkd.base.views import BaseView
from pyramid.view import view_config
from deform import widget, Form
from pyramid.httpexceptions import HTTPFound
from ..models import (Produk, DBSession, ProdukKategori)
from sqlalchemy import or_
from deform.form import Button
from ..tools import btn_add, btn_delete
form_params_view = dict(
# scripts="""
# $(document).ready(function(){
# $("form#deform input[type=text]").each(function() {
# var input = $(this).prop("disabled", false);
# })
# $("form#deform textarea").each(function() {
# var input = $(this).prop("disabled", false);
# })
# });
# """
scripts = ""
)
# @colander.deferred
# def deffered_produk(node, kw):
# values = kw.get('daftar_produk', [])
# # print('isi daftar_kelurahan >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
# # print(values)
# return widget.SelectWidget(values=values)
def get_products_e_det():
query = DBSession.query(Produk.id, ProdukKategori.nama.label('kat'), Produk.harga)\
.join(ProdukKategori, Produk.kategori_id == ProdukKategori.id) \
.filter(or_(ProdukKategori.kode.ilike("e-%"),
ProdukKategori.kode.in_(['pemda', 'pajak'])
)
).all()
return query
def get_products_e():
query = DBSession.query(Produk.id, Produk.nama)\
.join(ProdukKategori, Produk.kategori_id == ProdukKategori.id) \
.filter(or_(ProdukKategori.kode.ilike("e-%"),
ProdukKategori.kode.in_(['pemda', 'pajak'])
)
).all()
return query
btn_TambahItem = Button('add_item', type= 'button', title='Tambah', css_class="btn-success")
btn_HapusItem = Button('del_item', type= 'button', title='Hapus', css_class="btn-danger")
class ParamsSchema(colander.Schema):
time_stamp = colander.SchemaNode(colander.String(), oid="time_stamp", widget=widget.HiddenWidget(readonly=True))
currency = colander.SchemaNode(colander.String(), title = "Mata Uang ", widget=widget.HiddenWidget(readonly=True))
amount = colander.SchemaNode(colander.String(), title = "Total Bayar")
invoice_no = colander.SchemaNode(colander.String(), title = "Nomor Invoice")
description = colander.SchemaNode(colander.String(), title = "Deskripsi Transaksi", missing=colander.drop)
fee = colander.SchemaNode(colander.Integer(), title = "Fee")
vat = colander.SchemaNode(colander.Integer(), title = "VAT")
notax_amt = colander.SchemaNode(colander.String(), title = "No tax amount")
req_dt = colander.SchemaNode(colander.String(), title = "Tanggal ", widget=widget.HiddenWidget(readonly=True))
req_tm = colander.SchemaNode(colander.String(), title = "Jam ", widget=widget.HiddenWidget(readonly=True))
class BillerSchema(colander.Schema):
name_biller = colander.SchemaNode(colander.String(), title = "Nama ")
phone_biller = colander.SchemaNode(colander.String(), title = "No. Telp ")
email_biller = colander.SchemaNode(colander.String(), title = "Email")
address_biller = colander.SchemaNode(colander.String(), title = "Alamat", missing=colander.drop)
city_biller = colander.SchemaNode(colander.String(), title = "Kota")
state_biller = colander.SchemaNode(colander.Integer(), title = "Provinsi")
post_code_biller = colander.SchemaNode(colander.Integer(), title = "Kode Pos")
country_biller = colander.SchemaNode(colander.String(), title = "Negara")
class CustomerSchema(colander.Schema):
name_cust = colander.SchemaNode(colander.String(), title = "Nama ")
phone_cust = colander.SchemaNode(colander.String(), title = "No. Telp ")
email_cust = colander.SchemaNode(colander.String(), title = "Email")
address_cust = colander.SchemaNode(colander.String(), title = "Alamat", missing=colander.drop)
city_cust = colander.SchemaNode(colander.String(), title = "Kota")
state_cust = colander.SchemaNode(colander.Integer(), title = "Provinsi")
post_code_cust = colander.SchemaNode(colander.Integer(), title = "Kode Pos")
country_cust = colander.SchemaNode(colander.String(), title = "Negara")
ip_cust = colander.SchemaNode(colander.String(), oid="ip_cust", widget=widget.HiddenWidget(readonly=True))
session_id_cust = colander.SchemaNode(colander.Integer(), oid="session_id_cust", widget=widget.HiddenWidget(readonly=True))
agent_cust = colander.SchemaNode(colander.Integer(), oid="agent_cust", widget=widget.HiddenWidget(readonly=True))
language_cust = colander.SchemaNode(colander.String(), oid="language_cust", widget=widget.HiddenWidget(readonly=True))
class DeliverToSchema(colander.Schema):
name_deliver = colander.SchemaNode(colander.String(), title = "Nama ")
phone_deliver = colander.SchemaNode(colander.String(), title = "No. Telp ")
email_deliver = colander.SchemaNode(colander.String(), title = "Email", missing=colander.drop)
address_deliver = colander.SchemaNode(colander.String(), title = "Alamat", missing=colander.drop)
city_deliver = colander.SchemaNode(colander.String(), title = "Kota")
state_deliver = colander.SchemaNode(colander.Integer(), title = "Provinsi")
post_code_deliver = colander.SchemaNode(colander.Integer(), title = "Kode Pos")
country_deliver = colander.SchemaNode(colander.String(), title = "Negara")
class ItemsSchema(colander.Schema):
img_url = colander.SchemaNode(colander.String(), title = "URL Gambar ")
goods_name = colander.SchemaNode(colander.String(), title = "Nama Produk")
goods_detail = colander.SchemaNode(colander.String(), title = "Detail")
goods_amt = colander.SchemaNode(colander.String(), title = "Harga")
class CartSchema(colander.Schema):
count = colander.SchemaNode(colander.String(), title = "Jumlah", oid="count")
class ServerSchema(colander.Schema):
domain_server = colander.SchemaNode(colander.String(), oid = "domain_server", missing=colander.drop)
ip_server = colander.SchemaNode(colander.String(), oid = "ip_server", missing=colander.drop)
def form_validator(form, value):
pass
def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator)
# schema = class_form()
# schema = schema.bind(
# daftar_produk=Produk.get_e_list()
# )
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
# buttons = (btn_inquiry, btn_reset)
buttons = ()
return Form(schema, buttons=buttons)
class view_pay(BaseView):
@view_config(route_name = 'pay-request', permission = 'pay-request', renderer = 'templates/pay_request.pt')#permission = 'pay-form',
@view_config(route_name = 'pay-request', request_param='fmt=lanjut', renderer='templates/pay.pt')
def the_form(self):
request = self.req
session = self.ses
url_dict = request.matchdict
buttons_cart = (btn_TambahItem,)
formParams = Form(ParamsSchema())
formCart = get_form(request, CartSchema, buttons_cart)
itemCartSchema = ItemsSchema()
itemCartSchema.request = request
formItemCart = Form(itemCartSchema)
billerSchema = BillerSchema()
billerSchema.request = request
formBiller = Form(billerSchema)
customerSchema = CustomerSchema()
customerSchema.request = request
formCustomer = Form(customerSchema)
deliverSchema = DeliverToSchema()
deliverSchema.request = request
formDeliver = Form(deliverSchema)
formServer = ServerSchema()
formServer.request = request
formServer = Form(formServer)
print('masuk controller pay_request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
post_data = request.POST
if post_data:
items = dict(post_data)
if 'lanjut' in post_data and 'bayar' not in 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])
produk = dict(
img_url = items['img_url-' + uniq],
goods_name = items[key],
goods_detail = items['goods_detail-' + uniq],
goods_amt = items['goods_amt-' + uniq],
)
produks.append(produk)
# REQUEST PAYMENT
url = "http://localhost:6543/api/merchant"
headers = {
# "userId": "pasarqu",
# "signature": "/IN9xDinJvPzNCuAHgz5l4XHOyh/lC2WPJlKb2q5Xzo=",
# "key": "1570522181",
"Content-Type": "application/json"
}
time_stamp = datetime.now().strftime('%Y%m%d%H%M%S')
req_dt = datetime.now().strftime('%Y%m%d')
req_tm = datetime.now().strftime('%H%M%S')
body = {
"jsonrpc": "2.0",
"id": "1",
"method": "pay_request",
"params": {
"data": {
"time_stamp": time_stamp,
"currency": "IDR",
"amount": items['amount'],
"invoice_no": items['invoice_no'],
"description": "Test Transaction Pasarqu",
"fee": "0",
"vat": "0",
"notax_amt": "0",
"req_dt": req_dt,
"req_tm": req_tm,
"biller": {
"name": items['name_biller'],
"phone": items['phone_biller'],
"email": items['email_biller'],
"address": items['address_biller'],
"city": items['city_biller'],
"state": items['state_biller'],
"post_code": items['post_code_biller'],
"country": items['country_biller']
},
"customer": {
"name": items['name_cust'],
"phone": items['phone_cust'],
"email": items['email_cust'],
"address": items['address_cust'],
"city": items['city_cust'],
"state": items['state_cust'],
"post_code": items['post_code_cust'],
"country": "Indonesia",
"ip": "127.0.0.1",
"session_id": "697D6922C961070967D3BA1BA5699C2C",
"agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"language": "en-US"
},
"deliver_to": {
"name": items['name_deliver'],
"phone": items['phone_deliver'],
"email": items['email_deliver'],
"address": items['address_deliver'],
"city": items['city_deliver'],
"state": items['state_deliver'],
"post_code": items['post_code_deliver'],
"country": "Indonesia"
},
"cart": {
"count": len(produks),
"item": produks
},
"server": {
"domain": "merchant.com",
"ip": "127.0.0.1"
}
}
}
}
print('isi json >>>>>>>>>>>>>>>>>>>>>>>>')
print(json.dumps(body))
r = requests.post(url, data=json.dumps(body), headers=headers)
dict_results = json.loads(r.text)
print('result >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(dict_results)
a = request.route_url(route_name='pay-form', pay_token = dict_results['result']['token'])
# print('isi request route >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
# print(a)
# return HTTPFound(location = 'http://localhost:6543/pay/' + dict_results['result']['token'])
return HTTPFound(location = a )
# def jprint(obj):
# text = json.dumps(obj, sort_keys=True, indent=4)
# print(text)
# if 'result' in r.json():
# jprint(r.json())
# va_number = r.json()['result']['token']
# print('tokeeeeeen >>>>>>>>>>>>>>>>>>>>>>>>>>>.')
# print(va_number)
# else:
# jprint(r.json())
# err_code = r.json()['error']['code']
# err_msg = r.json()['error']['message']
# raise custom_error(err_code, err_msg)
listOfTuple = get_products_e_det()
icikiwir = []
for item in listOfTuple:
item = list(item)
icikiwir.append(item)
return dict(
formParams = formParams,
formBiller = formBiller,
formCustomer = formCustomer,
formDeliver = formDeliver,
formServer = formServer,
formCart = formCart,
formItemCart = formItemCart,
params = form_params_view,
produks = get_products_e(),
itemDet = icikiwir
)
\ No newline at end of file
import random
import string
import colander
import logging
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:
raise JsonRpcInvoiceFoundError()
dat['produk'] = dat['cart']
values = set_register_values(dat, customer)
values = added_register_values(values, dat)
print('isi dat >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(dat)
print('isi values >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
print(values)
credit_card = "credit_card" in dat and dat["credit_card"] or {}
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)
# dat.update(ar_invoice.inquiry["result"])
# if "form" in result:
# dat.update(dict(form=result["form"]))
# # request.environ["application"]="text/html"
# # request.response()
# # return request.response
r_data['token'] = ar_invoice.token_pay_req
# data = is_list and r_data or r_data[0]
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 {}
<html metal:use-macro="load: opensipkd.base:views/templates/base3.pt">
<ul metal:fill-slot="navs">
<li>
<a href="${request._host}/pay_request">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Request Pembayaran</span>
</a>
</li>
<li>
<a href="${request._host}/api/kategori/list">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">List Kategori</span>
......
<html metal:use-macro="load: base.pt">
<div metal:fill-slot="content">
<style>
button {
margin:0px 3px;
}
#main{min-height: 1px;
padding-bottom: 1px;}
hr {
display: block;
margin-top: 0px;
margin-bottom: 5px;
margin-left: auto;
margin-right: auto;
/*border-style: inset;*/
/*border-width: 0.2px;*/
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
.control-label{
text-align: left !important;
}
</style>
</div>
<div metal:fill-slot="scripts">
<div class="panel-body col-md-12">
<div class="col-md-6 col-md-offset-3 col-xs-12 well">
<!-- Proses Template Form -->
<form method="post"
accept-charset="utf-8"
id="deform"
class="form-horizontal"
enctype="multipart/form-data"
style="background-color:white;"
autocomplete="off">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div tal:define="field form" class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<div tal:define="fieldItem form['biller_name']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
${structure:fieldItem.serialize()}
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem form['amount_tot']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
${structure:fieldItem.serialize()}
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem form['customer_name']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
${structure:fieldItem.serialize()}
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div class="col-md-12" style="margin-bottom: 5px;">
<table style="width:100%">
<tr>
<th>Produk</th>
<th>Detail</th>
<th>Amount</th>
<th>Gambar</th>
</tr>
<tr tal:repeat="prod produks">
<td>${prod['goods_name']}</td>
<td>${prod['goods_detail']}</td>
<td style="text-align: right;">${prod['goods_amt']}</td>
<td>${prod['img_url']}</td>
</tr>
</table>
</div>
<!-- Looping Semua Field-->
<div tal:define="fieldItem form['pay_method']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<select class="form-control" name="${fieldItem.name}" id="${fieldItem.name}">
<option tal:repeat="item meth" value="${item[0]}">${item[1]}</option>
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<hr class="col-md-12">
<div id="va_box" class="col-md-12" style="display: none;">
<div tal:define="fieldItem formVa['va_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<select class="form-control" name="${fieldItem.name}" id="${fieldItem.name}">
<option tal:repeat="item vacs" value="${item[0]}">${item[1]}</option>
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formVa['va_valid_date']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formVa['va_valid_time']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="cc_box" class="col-md-12" style="display: none;">
<div tal:define="fieldItem formCC['cc_instmnt_type']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formCC['cc_instmnt_mon']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formCC['cc_recurr_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="cvs_box" class="col-md-12" style="display: none;">
<div tal:define="fieldItem formCvs['cvs_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<select class="form-control" name="${fieldItem.name}" id="${fieldItem.name}">
<option tal:repeat="item cvss" value="${item[0]}">${item[1]}</option>
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formCvs['cvs_valid_date']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formCvs['cvs_valid_time']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="loan_box" class="col-md-12" style="display: none;">
<div tal:define="fieldItem formLoan['loan_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<select class="form-control" name="${fieldItem.name}" id="${fieldItem.name}">
<option tal:repeat="item loans" value="${item[0]}">${item[1]}</option>
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formLoan['loan_instmnt_type']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formLoan['loan_instmnt_mon']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formLoan['loan_recurr_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formLoan['loan_valid_date']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formLoan['loan_valid_time']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="cp_box" class="col-md-12" style="display: none;">
<div tal:define="fieldItem formCp['cp_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<select class="form-control" name="${fieldItem.name}" id="${fieldItem.name}">
<option tal:repeat="item cps" value="${item[0]}">${item[1]}</option>
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
<div tal:define="fieldItem formCp['cp_merc_ref_no']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<input type="text" class="form-control" id="${fieldItem.name}-cnt" name="${fieldItem.name}-cnt" value="" style="width: 150px">
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="em_box" class="col-md-12" style="display: none; margin-bottom: 5px;">
<div tal:define="fieldItem formEm['em_opt']" class="col-md-12" id="item-${fieldItem.oid}" style="margin-bottom: 5px;">
<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-8">
<select class="form-control" name="${fieldItem.name}" id="${fieldItem.name}">
<option tal:repeat="item ems" value="${item[0]}">${item[1]}</option>
</select>
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
</div>
</div>
<div id="bt_box" class="col-md-12" style="text-align: right;">
<button style="width: 100px;" class="btn btn-success" type="submit" name="bayar" id="bt_bayar" >Bayar</button>
<button class="btn btn-warning" type="submit" name="batal_bayar" id="bt_batal_bayar" >Batal</button>
</div>
</div>
<div>
</div>
</form>
<!-- End Template Form -->
<!-- </div> -->
</div>
</div>
<script>
$(document).ready(function() {
$("[name=biller_name]").prop("readonly", true);
$("[name=amount_tot]").prop("readonly", true);
$("[name=customer_name]").prop("readonly", true);
$("#va_box").show();
$("#pay_method").change(function(){
opt = $(this).val();
switch(opt) {
case "VA":
// code block
$("#va_box").show();
$("#cc_box").hide();
$("#cvs_box").hide();
$("#em_box").hide();
$("#loan_box").hide();
$("#cp_box").hide();
break;
case "CC":
// code block
$("#cc_box").show();
$("#va_box").hide();
$("#cvs_box").hide();
$("#em_box").hide();
$("#loan_box").hide();
$("#cp_box").hide();
break;
case "CVS":
$("#cvs_box").show();
$("#cc_box").hide();
$("#va_box").hide();
$("#em_box").hide();
$("#loan_box").hide();
$("#cp_box").hide();
break;
case "EM":
$("#em_box").show();
$("#cc_box").hide();
$("#va_box").hide();
$("#cvs_box").hide();
$("#loan_box").hide();
$("#cp_box").hide();
break;
case "loan":
$("#loan_box").show();
$("#cc_box").hide();
$("#va_box").hide();
$("#em_box").hide();
$("#cvs_box").hide();
$("#cp_box").hide();
break;
case "CP":
$("#cp_box").show();
$("#cc_box").hide();
$("#va_box").hide();
$("#em_box").hide();
$("#loan_box").hide();
$("#cvs_box").hide();
break;
// code block
}
})
})
</script>
</div>
</html>
<html metal:use-macro="load: base.pt">
<div metal:fill-slot="content">
<style>
button {
margin:0px 3px;
}
#main{min-height: 1px;
padding-bottom: 1px;}
hr {
display: block;
margin-top: 0px;
margin-bottom: 5px;
margin-left: auto;
margin-right: auto;
/*border-style: inset;*/
/*border-width: 0.2px;*/
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
.control-label{
text-align: left !important;
}
</style>
</div>
<div metal:fill-slot="scripts">
<div class="panel-body col-md-12">
<div class="col-md-6 col-md-offset-3 col-xs-12 well">
<!-- Proses Template Form -->
<form method="post"
accept-charset="utf-8"
id="deform"
class="form-horizontal"
enctype="multipart/form-data"
style="background-color:white;"
autocomplete="off">
<!-- Tampilan untuk general error -->
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<h3 style="width: 100%; text-align: center;">Sukses Melakukan Pembayaran :)</h3>
<hr class="col-md-12">
<div style="margin-right: 20%; margin-left: 20%">
<h5 style="width: 100%; text-align: center;">${subject}</h5>
<h6 style="width: 100%; text-align: center;">${content}</h6>
</div>
<div id="bt_box" class="col-md-12" style="text-align: right;">
<!-- <button style="width: 100px;" class="btn btn-success" type="submit" name="bayar" id="bt_bayar" >Bayar</button>
<button class="btn btn-warning" type="submit" name="batal_bayar" id="bt_batal_bayar" >Batal</button> -->
</div>
</div>
<div>
</div>
</form>
<!-- End Template Form -->
<!-- </div> -->
</div>
</div>
<script>
$(document).ready(function() {
})
</script>
</div>
</html>
<html metal:use-macro="load: base.pt">
<div metal:fill-slot="content">
<style>
button {
margin:0px 3px;
}
#main{min-height: 1px;
padding-bottom: 1px;}
</style>
<form method="post" accept-charset="utf-8" id="deform" class="form-horizontal"
enctype="multipart/form-data"
style="background-color:white;"
autocomplete="off">
<div class="panel-body col-md-6">
<div class="col-md-12" style="padding-left: 0px; padding-right: 0px; margin-bottom: 5px;">
<button id="btn_submit" class="btn btn-primary" type="submit" name="lanjut" value="Lanjut">Lanjutkan Pembayaran ></button>
</div>
<div class="col-md-12 col-xs-12 well">
<!-- Proses Template Form -->
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div tal:define="field formParams" class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f formParams">
<div tal:condition="f.widget.hidden">
<!-- Proses Saat Field hidden-->
${structure:f.serialize()}
</div>
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Proses Saat Field Normal dan bukan Children-->
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p tal:condition="f.error" id="error-${f.oid}" class="help-block"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 panel panel-default" style="padding-left: 0px; padding-right: 0px;">
<div class="panel-heading">
<h3 class="panel-title">Biller</h3>
</div>
<div class="panel-body">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div tal:define="field formBiller" class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f formBiller">
<div tal:condition="f.widget.hidden">
<!-- Proses Saat Field hidden-->
${structure:f.serialize()}
</div>
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Proses Saat Field Normal dan bukan Children-->
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p tal:condition="f.error" id="error-${f.oid}" class="help-block"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 panel panel-default" style="padding-left: 0px; padding-right: 0px;">
<div class="panel-heading">
<h3 class="panel-title">Deliver To</h3>
</div>
<div class="panel-body">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div tal:define="field formDeliver" class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f formDeliver">
<div tal:condition="f.widget.hidden">
<!-- Proses Saat Field hidden-->
${structure:f.serialize()}
</div>
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Proses Saat Field Normal dan bukan Children-->
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p tal:condition="f.error" id="error-${f.oid}" class="help-block"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 panel panel-default" style="padding-left: 0px; padding-right: 0px;">
<div class="panel-heading">
<h3 class="panel-title">Server</h3>
</div>
<div class="panel-body">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div tal:define="field formDeliver" class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f formServer">
<div tal:condition="f.widget.hidden">
<!-- Proses Saat Field hidden-->
${structure:f.serialize()}
</div>
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Proses Saat Field Normal dan bukan Children-->
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p tal:condition="f.error" id="error-${f.oid}" class="help-block"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="col-md-12 panel panel-default" style="padding-left: 0px; padding-right: 0px;">
<div class="panel-heading">
<h3 class="panel-title">Customer</h3>
</div>
<div class="panel-body">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div tal:define="field formCustomer" class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f formCustomer">
<div tal:condition="f.widget.hidden">
<!-- Proses Saat Field hidden-->
${structure:f.serialize()}
</div>
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Proses Saat Field Normal dan bukan Children-->
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p tal:condition="f.error" id="error-${f.oid}" class="help-block"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="padding-left: 0px; padding-right: 0px;" class="col-md-12 panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Produk</h3>
</div>
<div class="panel-body">
<div tal:define="fieldItem formCart['count']" id="item-${fieldItem.oid}">
<label for="${fieldItem.oid}" class="control-label col-md-3 required" id="req-${fieldItem.oid}">
${fieldItem.title}</label>
<div class="col-md-5">
${structure:fieldItem.serialize()}
<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>
</div>
<button tal:repeat="fb formCart.buttons" type="${fb.type}"
class="btn ${fb.css_class} "
name="${fb.name}" id="${fb.name}">${fb.title}</button>
</div>
<div class="col-md-12" id="itemsnya">
</div>
</div>
</div>
</div>
</form>
</div>
<div metal:fill-slot="scripts">
<script>
var detdet = ${itemDet};
$(document).ready(function () {
$("[name=count]").prop("readonly", true);
// $("[name=count]").prop("style", "width: 100px;");
$("#deform").each(function(){
$(this).find(':input').attr("required", "required"); //<-- Should return all input elements in that specific form.
});
$("[name=description]").removeAttr("required", "");
$("[name=address_biller]").removeAttr("required", "");
$("[name=email_deliver]").removeAttr("required", "");
$("[name=address_deliver]").removeAttr("required", "");
$("[name=domain_server]").removeAttr("required", "");
$("[name=ip_server]").removeAttr("required", "");
$("[name=address_cust]").removeAttr("required", "");
// $("[name=req_dt]").prop("style", "width: 150px;");
// $("[name=req_dt]").datepicker({
// format: 'dd-mm-yyyy',
// autoclose: true
// });
// $("[name=req_tm]").prop("style", "width: 100px;");
// $("[name=req_tm]").clockpicker();
})
function a(){
}
function getItemsCount(){
return $("#itemsnya #judul")['length'];
}
function removeItem(idnya){
$("#" + idnya).remove();
$("[name=count]").val(getItemsCount());
}
function doAdditem(cnt = 0, jml = 0){
$("#itemsnya").append(
`<div class="col-md-12" id="pack-`+cnt+`">`+
`<legend id="judul"></legend>`+
`<button type="button" onclick="removeItem('pack-`+cnt+`')">Hapus</button> `+
`<div tal:define="fieldItem formItemCart['img_url']" id="item-${fieldItem.oid}">`+
`<div class="col-md-8">`+
`<input type="hidden" name="${fieldItem.name}-`+cnt+`" value="" id="${fieldItem.name}-`+cnt+`">`+
`</div>`+
`</div>`+
`<br></br>`+
`<div tal:define="fieldItem formItemCart['goods_name']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4 required" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8">`+
`<select class="form-control" name="${fieldItem.name}-`+cnt+`" id="${fieldItem.name}-`+cnt+`" required="required">`+
`<option disabled selected value> -- pilih produk -- </option>`+
`<option tal:repeat="item produks" value="${item[1]}">${item[1]}</option>`+
`</select>`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
`<br></br>`+
`<div tal:define="fieldItem formItemCart['goods_detail']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8">`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" readonly="">`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
`<br></br>`+
`<div tal:define="fieldItem formItemCart['goods_amt']" id="item-${fieldItem.oid}">`+
`<label for="${fieldItem.oid}" class="control-label col-md-4" id="req-${fieldItem.oid}">`+
`${fieldItem.title}</label>`+
`<div class="col-md-8" style="width: 150px;">`+
`<input type="text" class="form-control" id="${fieldItem.name}-`+cnt+`" name="${fieldItem.name}-`+cnt+`" value="" readonly="">`+
`<p id="error-${fieldItem.oid}" class="help-block" tal:condition="fieldItem.error" tal:repeat="error fieldItem.error.messages()">${error}</p>`+
`</div>`+
`</div>`+
`</div>`
);
var itemControl = $("#${formItemCart['goods_name'].name}-" + cnt);
var detailControl = $("#${formItemCart['goods_detail'].name}-" + cnt);
var hargaControl = $("#${formItemCart['goods_amt'].name}-" + cnt);
$(itemControl).change(function () {
var selectedIndex = itemControl.find(":selected").index();
detailControl.val(${itemDet}[selectedIndex][1]);
hargaControl.val(${itemDet}[selectedIndex][2]);
});
}
$("#add_item").click(function (){
doAdditem(Math.random().toString(36).substr(2, 5), getItemsCount() + 1);
$("[name=count]").val(getItemsCount());
})
</script>
</div>
</html>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!