Commit d9000a78 by Solo Group

aaaaaa

1 parent 75b9afd9
...@@ -15,7 +15,6 @@ api-vendor-edit,/api/vendor/{id}/edit,Edit Api Vendor,1,0 ...@@ -15,7 +15,6 @@ api-vendor-edit,/api/vendor/{id}/edit,Edit Api Vendor,1,0
api-vendor-delete,/api/vendor/{id}/delete,Delete Api Vendor,1,0 api-vendor-delete,/api/vendor/{id}/delete,Delete Api Vendor,1,0
api-vendor-view,/api/vendor/{id}/view,View Api Vendor,1,0 api-vendor-view,/api/vendor/{id}/view,View Api Vendor,1,0
api-vendor-doc,/api/vendor/doc,Doc Api Vendor,1,0 api-vendor-doc,/api/vendor/doc,Doc Api Vendor,1,0
api-vendor-test,/api/vendor/{vendor}/test,Test Api Vendor,1,0 api-vendor-test,/api/vendor/{vendor}/test,Test Api Vendor,1,0
api-produk-list,/api/produk/list,List Produk,1,0 api-produk-list,/api/produk/list,List Produk,1,0
...@@ -32,3 +31,20 @@ api-produk-vendor-view,/api/produk/vendor/{id}/view,View Produk Vendor,1,0 ...@@ -32,3 +31,20 @@ api-produk-vendor-view,/api/produk/vendor/{id}/view,View Produk Vendor,1,0
api-produk-vendor-add,/api/produk/vendor/add,Add Produk Vendor,1,0 api-produk-vendor-add,/api/produk/vendor/add,Add Produk Vendor,1,0
api-produk-vendor-edit,/api/produk/vendor/{id}/edit,Edit Produk Vendor,1,0 api-produk-vendor-edit,/api/produk/vendor/{id}/edit,Edit Produk Vendor,1,0
api-produk-vendor-delete,/api/produk/vendor/{id}/delete,Delete Produk Vendor,1,0 api-produk-vendor-delete,/api/produk/vendor/{id}/delete,Delete Produk Vendor,1,0
api-payment-list,/api/payment/list,Test Api Payment,1,0
api-payment-add,/api/payment/add,Add Api Payment,1,0
api-payment-edit,/api/payment/{id}/edit,Edit Api Payment,1,0
api-payment-delete,/api/payment/{id}/delete,Delete Api Payment,1,0
api-payment-view,/api/payment/{id}/view,View Api Payment,1,0
api-payment-doc,/api/payment/doc,Doc Api Payment,1,0
api-payment-notify,/api/payment/{name}/notify,Api Payment Notify,1,0
api-integrated-list,/api/integrated/list,Test Api Integrated Payment,1,0
api-integrated-add,/api/integrated/add,Add Api Integrated Payment,1,0
api-integrated-edit,/api/integrated/{id}/edit,Edit Api Integrated Payment,1,0
api-integrated-delete,/api/integrated/{id}/delete,Delete Api Integrated Payment,1,0
api-integrated-view,/api/integrated/{id}/view,View Api Integrated Payment,1,0
api-integrated-doc,/api/integrated/doc,Doc Api Integrated Payment,1,0
api-integrated-notify,/api/integrated/{name}/notify,Api Integrated Payment Notify,1,0
from opensipkd.base.models import Departemen, User from opensipkd.base.views import (BaseView)
from opensipkd.base.tools.api import auth_from_rpc, check_token_rpc, update_token, JsonRpcParameterNotFound from opensipkd.pasar.models.views import deferred_vendor, deferred_customer, deferred_produk
from pyramid_rpc.jsonrpc import jsonrpc_method
from opensipkd.pasar.models import DepartemenProduk, Produk, PartnerProduk
from opensipkd.pasar.models import ProdukCategory
from opensipkd.base.views import BaseView
@jsonrpc_method(method='get_product', endpoint='api-merchant')
def get_product(request, token, data ):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
product_kd: string, //optional
page:integer, //optional
length:integer, //optional
category:string, //optional
search:string //optional
}
:return: [
{
product_kd:string,
product_nm:string,
harga:integer
}
]
"""
auth_from_rpc(request)
i =0
qry = DepartemenProduk.query() \
.filter(Departemen.kode == '100000')
for dat in data:
page = 'page' in dat and dat['page'] or 1
length = 'length' in dat and dat['length'] or 5
product_kd = 'product_kd' in dat and dat['product_kd'] or None
search = 'search' in dat and dat['search'] or None
category = 'category' in dat and dat['category'] or None
if product_kd :
rst = qry.join(Produk).filter(Produk.kode == product_kd)
elif search:
rst = qry.join(Produk).filter(Produk.nama.ilike("".join(['%',search,'%' ])))
elif category:
rst = qry.join(Produk).join(ProdukCategory) \
.filter(ProdukCategory.nama.ilike("".join(['%',category,'%' ])))
else:
rst = qry
rst = rst.limit(length).offset((page-1)*length)
result = []
for row in rst.all():
result.append(dict(product_kd=row.produk.kode,
produk_nm=row.produk.nama,
harga=row.harga ))
r_data = dat
r_data.update(dict(data=result))
data[i]=r_data
i += 1
return data
@jsonrpc_method(method='get_biaya', endpoint='api-merchant')
def get_biaya(request, data, token=None):
"""
Digunakan untuk mencari methode pembayaran dan biaya layanan
:param request:
:param data:
{
biaya_kd: string,
harga:integer,
cname:string,
cid:string,
cvv:string, optional
}
:param token:
user_token
:return:
{
product_kd:string,
product_nm:string,
harga:integer
}
"""
user = auth_from_rpc(request, token)
i =0
qry = DepartemenProduk.query() \
.filter(Departemen.kode == '100000')
for dat in data:
product_kd = 'biaya_kd' in dat and dat['biaya_kd'] or None
cid = 'cid' in dat and dat['cid'] or None
if not product_kd :
raise JsonRpcParameterNotFound(message='Paramter product_kd wajib di isi')
rst = qry.join(Produk).filter(Produk.kode == product_kd)
result = []
for row in rst.all():
if row.is_cid and not cid:
raise JsonRpcParameterNotFound(message="Parameter cid wajib di isi")
if row.produk.fixed:
harga = row.harga
else:
harga = dat['harga']*row.harga
result.append(dict(biaya_kd=row.produk.kode,
produk_nm=row.produk.nama,
harga=harga))
r_data = dat
r_data.update(dict(data=result))
data[i]=r_data
i += 1
return data
@jsonrpc_method(method='inquiry', endpoint='api-merchant')
def inquiry(request, token, data ):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
product_kd: string, //optional
cid:string //optional
}
:param token:
user_token
:return:
{
product_kd:string,
product_nm:string,
harga:integer,
admin:integer,
discount:integer
}
"""
auth_from_rpc(request)
i =0
qry = DepartemenProduk.query() \
.filter(Departemen.kode == '100000')
dat = data and data is list and data[0] or data
for dat in data:
product_kd = 'product_kd' in dat and dat['product_kd'] or None
cid = 'cid' in dat and dat['cid'] or None
if not product_kd :
raise JsonRpcParameterNotFound(message='Paramter product_kd wajib di isi')
rst = qry.join(Produk).filter(Produk.kode == product_kd)
result = []
for row in rst.all():
if row.is_cid and not cid:
raise JsonRpcParameterNotFound(message="Parameter cid wajib di isi")
result.append(dict(product_kd=row.produk.kode,
produk_nm=row.produk.nama,
harga=row.harga ))
r_data = dat
r_data.update(dict(data=result))
data[i]=r_data
i += 1
return data
@jsonrpc_method(method='payment', endpoint='api-merchant')
def payment(request, token, data):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
product_kd: string,
cid:string
payment_kd: string optional
}
:param token:
user_token
:return:
{
product_kd:string,
product_nm:string,
harga:integer,
admin:integer,
discount:integer
}
"""
auth_from_rpc(request, token)
i = 0
qry = DepartemenProduk.query() \
.filter(Departemen.kode == '100000')
dat = data and data is list and data[0] or data
for dat in data:
product_kd = 'product_kd' in dat and dat['product_kd'] or None
cid = 'cid' in dat and dat['cid'] or None
if not product_kd:
raise JsonRpcParameterNotFound(message='Paramter product_kd wajib di isi')
rst = qry.join(Produk).filter(Produk.kode == product_kd)
result = []
for row in rst.all():
if row.is_cid and not cid:
raise JsonRpcParameterNotFound(message="Parameter cid wajib di isi")
result.append(dict(product_kd=row.produk.kode,
produk_nm=row.produk.nama,
harga=row.harga))
r_data = dat
r_data.update(dict(data=result))
data[i] = r_data
i += 1
return data
"""
Module proses:
Save
Invoice To Vendor
Invoice To Customer
"""
import hashlib
import json
import logging
import re
from datetime import datetime
from importlib import import_module
import colander
import requests
import xmltodict
from deform import widget, Form, ValidationFailure
# from opensipkd.pasar.models import PartnerLog
from opensipkd.pasar.models.views import deferred_payment
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Partner, PartnerProduk)
from ..models import (Produk, ProdukKategori)
from ..tools import (btn_next, date_from_str, get_settings, btn_reset,
btn_inquiry, btn_advice, btn_payment)
log = logging.getLogger(__name__)
from ..views import deferred_vendor, deferred_customer, deferred_produk
class AddSchema(colander.Schema):
customer_id = colander.SchemaNode(
colander.Integer(), title='Payment Type',
oid="customer_id", widget=deferred_customer)
cust_inv_no = colander.SchemaNode(
colander.String(), title='No Invoice',
missing=colander.drop,
oid="destination")
produk_id = colander.SchemaNode(
colander.Integer(), title='Produk',
oid="produk_id", widget=deferred_produk)
amount = colander.SchemaNode(
colander.Integer(), title='Jumlah',
oid="amount")
payment_id = colander.SchemaNode(
colander.Integer(), title='Payment Type',
oid="payment_id", widget=deferred_payment)
vendor_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
missing = colander.drop,
oid="vendor_id", widget=deferred_vendor)
card_no = colander.SchemaNode(
colander.String(), title='No. Kartu',
missing=colander.drop,
oid="card_no")
card_exp = colander.SchemaNode(
colander.String(), title='Expire (YYMM)',
missing=colander.drop,
widget = widget.TextInputWidget(min_len=4, max_len=4),
oid="card_exp")
card_cvv = colander.SchemaNode(
colander.String(), title='Valid',
missing=colander.drop,
widget=widget.TextInputWidget(min_len=3, max_len=3),
oid="card_cvv")
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.Integer(), title='ID',
missing=colander.drop,
oid="id", widget=widget.HiddenWidget())
def form_validator(form, value):
pass
def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator)
schema = schema.bind(vendor=Produk.get_vendor_payment_list(),
produk=Produk.get_e_list(),
payment=Produk.get_pay_list(),
customer=Partner.get_customer_list())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_inquiry, btn_reset)
return Form(schema, buttons=buttons)
def route_list(request):
return HTTPFound(location=request.route_url('simkel-permohonan'))
def save(values, row):
if not row:
row = PartnerLog()
row.create_uid = values['uid']
row.created = datetime.now()
else:
row.update_uid = values['uid']
row.updated = datetime.now()
row.from_dict(values)
flush_row(row)
return row
def save_request(request, values, row=None):
values['tgl_lahir'] = date_from_str(values['tgl_lahir'])
values['uid'] = request.user.id
row = save(values, row)
request.session.flash('Data %s Berhasil disimpan' % values['nama'])
return row
form_params_edit = dict(scripts="""
$(document).ready(function(){
$(".tanggal").datepicker({format:"dd-mm-yyyy"});
$(".tanggal").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
$("#nip_penerima, #nopel").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
def query_id(request):
id = request.matchdict['id']
return PartnerProduk.query_id(id)
class ViewHome(BaseView):
@view_config(route_name='api-integrated-doc',
permission="api-integrated",
renderer='templates/integrated_doc.pt')
def view_merchant_doc(self):
return dict()
@view_config(route_name='api-integrated-add',
permission="api-integrated-add",
renderer='templates/form.pt')
def view_home(self):
request = self.req
session = self.ses
form = get_form(request, AddSchema, (btn_inquiry, btn_payment, btn_advice, btn_next))
settings = get_settings()
if request.POST:
controls = request.POST.items()
try:
c = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form, params=form_params_edit)
values = dict(c.items())
result = None
# if 'inquiry' in request.POST:
# result = build_request('inquiry', values)
# # if product_kd == "crc" or product_kd[:3]=="EWL":
# # return HTTPFound('api-cc-form', params=result["params"])
# elif 'payment' in request.POST:
# result = build_request('payment', values)
# elif 'advice' in request.POST:
# result = build_request('advice', values)
# elif 'info' in request.POST:
# result = build_request('info', values)
if result and 'data' in result and result["data"]:
data = result['data']
values['f_request'] = 'f_request' in result \
and json.dumps(result['f_request'], indent=4) or ''
values['f_response'] = 'f_response' in result \
and json.dumps(result['f_response'], indent=4) or ''
values['f_result'] = 'data' in result \
and json.dumps(result['data'], indent=4) or ''
values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
if 'error' in data and data['error']:
session.flash(data['error'], 'error')
else:
session.flash("No Result Data")
form.render(values)
return dict(form=form, params=form_params_view)
values = dict(card_no="5409120028181901",
card_exp="2012",
card_cvv="111",
amount=1000,
payment_id=51,
cust_inv_no="123456789")
form.render(values)
return dict(form=form, params=form_params_edit)
def sha256(hash_string):
return hashlib.sha256(hash_string.encode()).hexdigest()
def proses_nice_pay(request):
pass
@view_config(route_name='api-payment-notify', renderer='json')
def api_vendor_notify(request):
vendor_nm = request.matchdict['name']
if vendor_nm == "nice_pay":
proses_nice_pay(request)
from importlib import import_module
from opensipkd.base.models import Partner, flush_row
from opensipkd.base.tools.api import (auth_from_rpc,
JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError,
JsonRpcParameterNotFound)
from opensipkd.pasar.models import Produk, PartnerProduk
from opensipkd.pasar.models.produk import H2hArInvoice, H2hArInvoiceDet, PartnerLog
from pyramid_rpc.jsonrpc import jsonrpc_method
from opensipkd.base.tools import log
def build_request(typ, vendor_produk, partner_log=None):
# produk_id = values['produk_id']
# vendor_id = values['vendor_id']
# bill_no = values['destination']
# customer_id = 'customer_id' in values and values['customer_id'] or None
# cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None
log.info("Modules: %s" % vendor_produk.modules)
modules = import_module('.' + vendor_produk.modules, 'agratek.api.merchant.views')
cls_module = modules.Vendor(vendor_produk, partner_log)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls:
data = cls()
result = data
# dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.response
# result["url"] = cls_module.url
else:
log.info("Module %s Not Found" % vendor_produk.modules)
result = dict(error='Fungsi %s tidak ada' % typ,
code=9999)
# dict(data=)
return result
@jsonrpc_method(method='inquiry', endpoint='api-merchant')
def inquiry(request, data, **kwargs):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
product_kd: string, //optional
cid:string //optional
}
:param token:
user_token
:return:
{
product_kd:string,
product_nm:string,
harga:integer,
admin:integer,
discount:integer
}
"""
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
denom: string,
id_pel:string
inv_no: string optional
}
:param token:
user_token
:return:
{
product_nm:string,
denom: string,
id_pel:string
inv_no: string optional
denom:string,
harga:integer,
admin:integer,
discount:integer,
total:integer,
status:success/pending/failed
"""
user = auth_from_rpc(request)
i = 0
is_list = type(data) == list
data = is_list and data or [data]
customer = Partner.query_user(user).filter(Partner.is_customer == 1).first()
if not customer:
raise JsonRpcCustomerNotFoundError()
r_data = []
for dat in data:
prods = "produk" in dat and dat["produk"] or None
for prod in prods:
log.info(prod)
produk_kd = 'denom' in prod and prod['denom'] or None
if not produk_kd:
raise JsonRpcProdukNotFoundError(message="Produk harus diisi")
# todo: search product lowest price
vend_kd = 'ODEO'
vendor_produk = PartnerProduk.query() \
.join(Partner, Partner.id == PartnerProduk.partner_id) \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
if not vendor_produk:
raise JsonRpcProdukNotFoundError(message="Produk %s tidak ditemukan" % produk_kd)
partner_log = PartnerLog()
partner_log.vendor_id = vendor_produk.partner_id
partner_log.customer_id = customer.id
partner_log.produk_id = vendor_produk.produk.id
# partner_log.cust_inv = dat["inv_no"]
partner_log.id_pel = prod["id_pel"]
flush_row(partner_log)
result = build_request('inquiry', vendor_produk, partner_log)
if result["code"] == 0:
prod.update(dict(subtotal=result["subtotal"],
discount=result["purchase"],
total=result["total"]
)
)
else:
prod.update(dict(status="FAILED",
message=result["message"]))
r_data.append(prod)
data = is_list and r_data or r_data[0]
return data
def build_purchase(vendor_produk, partner_log=None):
return build_request('payment', vendor_produk, partner_log)
@jsonrpc_method(method='purchase', endpoint='api-merchant')
def purchase(request, data, **kwargs):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
denom: string,
id_pel:string
inv_no: string optional
}
:param token:
user_token
:return:
{
product_nm:string,
denom: string,
id_pel:string
inv_no: string optional
denom:string,
harga:integer,
admin:integer,
discount:integer,
total:integer,
status:success/pending/failed
"""
user = auth_from_rpc(request)
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
r_data = []
log.info("%s Payment Request: %s" % (customer.kode, data))
for dat in data:
if "inv_no" not in dat or "produk" not in dat or not dat["produk"]:
dat["status"] = "FAILED"
dat["message"] = "Parameter tidak lengkap"
else:
inv_no = dat["inv_no"]
produk = dat["produk"]
# todo cek apakah invoice sudah ada atau belum
ar_invoice = H2hArInvoice()
ar_invoice.customer_id = customer.id
ar_invoice.cust_inv_no = inv_no
ar_invoice.cust_inv_no = dat["inv_no"]
ar_invoice.payment = dict(request=dat)
flush_row(ar_invoice)
r_prod = []
for prod in produk:
produk_kd = 'denom' in prod and prod['denom'] or None
id_pel = 'id_pel' in prod and prod['id_pel'] or None
if not produk_kd or not id_pel:
prod["status"] = "FAILED"
prod["message"] = "Denom atau id pelanggan tidak diisi"
else:
# produk = Produk.query_kode(produk_kd).first()
# todo: search product lowest price
vend_kd = 'ODEO'
vendor_produk = PartnerProduk.query() \
.join(Partner, Partner.id == PartnerProduk.partner_id) \
.filter(Partner.kode == vend_kd) \
.filter(Produk.kode == produk_kd).first()
if not vendor_produk:
prod["status"] = "FAILED"
prod["message"] = "Data tidak ditemukan"
else:
ar_invoice_det = H2hArInvoiceDet()
ar_invoice_det.vendor_id = vendor_produk.partner_id
ar_invoice_det.produk_id = vendor_produk.produk.id
ar_invoice_det.ar_invoice_id = ar_invoice.id
ar_invoice_det.id_pel = prod["id_pel"]
ar_invoice_det.amt_sell = vendor_produk.produk.harga
flush_row(ar_invoice_det)
result = build_purchase(vendor_produk, ar_invoice_det)
# ar_invoice_det.status = 'status' in result and result["status"] or 'FAILED'
if result["code"] == 9:
ar_invoice_det.amt_buy = result["response"].total
discount = 0
prod.update(
dict(
subtotal=ar_invoice_det.amt_sell,
discount=discount,
total=ar_invoice_det.amt_sell + discount
)
)
prod.update(status=result["status"])
r_prod.append(prod)
ar_invoice.payment["response"] = r_prod
dat["produk"] = r_prod
r_data.append(dat)
data = is_list and r_data or r_data[0]
log.info("%s Payment Response: %s " % (customer.kode, data))
return data
@jsonrpc_method(method='advice', endpoint='api-merchant')
def advice(request, token, data):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
denom: string,
id_pel:string
inv_no: string optional
}
:param token:
user_token
:return:
{
product_nm:string,
denom: string,
id_pel:string
inv_no: string optional
denom:string,
harga:integer,
admin:integer,
discount:integer,
total:integer,
status:success/pending/failed
"""
user = auth_from_rpc(request, None)
i = 0
is_list = type(data) == list
data = is_list and data or [data]
customer = Partner.query_user(user)
r_data = []
for dat in data:
cust_inv = dat["inv_no"]
partner_log = PartnerLog.query().filter(
PartnerLog.cust_inv == cust_inv
).all()
r_prod = []
for p in partner_log:
produk = PartnerProduk.query(). \
filter(PartnerProduk.partner_id == p.vendor_id,
PartnerProduk.produk_id == p.produk_id).first()
status = p.status == 0 and 'PENDING' or p.status == 1 and 'SUCCESS' \
or p.status == 2 and 'FAILED'
r_prod.append(dict(denom=produk.kode,
id_pel=partner_log["id_pel"],
subtotal=partner_log["amt_sell"] + partner_log["discount"],
discount=partner_log["discount"],
total=partner_log["amt_sell"],
status=status,
serial_number=partner_log.serial_number, )
)
dat["produk"] = r_prod
r_data.append(dat)
i += 1
data = is_list and r_data or r_data[0]
return data
#
# @jsonrpc_method(method='payment', endpoint='api-merchant')
# def payment(request, token, data):
# """
# Digunakan untuk mendapatkan daftar produk
# :param request:
# :param data:
# {
# denom: string,
# id_pel:string
# inv_no: string optional
# }
# :param token:
# user_token
# :return:
# {
# product_nm:string,
#
# denom: string,
# id_pel:string
# inv_no: string optional
# denom:string,
# harga:integer,
# admin:integer,
# discount:integer,
# total:integer,
# status:success/pending/failed 00/01/02
# """
# user = auth_from_rpc(request, token)
# i = 0
# dat = data is list and data or [data]
# costumer = Partner.query_user(user)
# for dat in data:
# produk_kd = 'denom' in dat and dat['denom'] or None
# if not produk_kd :
# raise JsonRpcProdukNotFound(message="Produk harus diisi")
#
# produk = Produk.query_kode(produk_kd).first()
# if not produk:
# raise JsonRpcProdukNotFound(message="Produk %s tidak ditemukan" % produk_kd)
#
# # todo: search product lowest price
# vend_kd = 'ODEO'
#
# qry = PartnerProduk.query() \
# .filter(Partner.kode == vend_kd) \
# .filter(Produk.kode == produk_kd).first()
#
# r_data = dat
# r_data.update(dict(data=result))
# data[i] = r_data
# i += 1
# return data
#
#
# @jsonrpc_method(method='get_product', endpoint='api-merchant')
# def get_product(request, token, data ):
# """
# Digunakan untuk mendapatkan daftar produk
# :param request:
# :param data:
# {
# product_kd: string, //optional
# page:integer, //optional
# length:integer, //optional
# category:string, //optional
# search:string //optional
# }
# :return: [
# {
# product_kd:string,
# product_nm:string,
# harga:integer
# }
#
# ]
# """
# auth_from_rpc(request)
# i =0
# qry = DepartemenProduk.query() \
# .filter(Departemen.kode == '100000')
# for dat in data:
# page = 'page' in dat and dat['page'] or 1
# length = 'length' in dat and dat['length'] or 5
# product_kd = 'product_kd' in dat and dat['product_kd'] or None
# search = 'search' in dat and dat['search'] or None
# category = 'category' in dat and dat['category'] or None
# if product_kd :
# rst = qry.join(Produk).filter(Produk.kode == product_kd)
# elif search:
# rst = qry.join(Produk).filter(Produk.nama.ilike("".join(['%',search,'%' ])))
# elif category:
# rst = qry.join(Produk).join(ProdukKategori) \
# .filter(ProdukKategori.nama.ilike("".join(['%', category, '%'])))
# else:
# rst = qry
#
# rst = rst.limit(length).offset((page-1)*length)
# result = []
# for row in rst.all():
# result.append(dict(product_kd=row.produk.kode,
# produk_nm=row.produk.nama,
# harga=row.harga ))
# r_data = dat
# r_data.update(dict(data=result))
# data[i]=r_data
# i += 1
# return data
#
# @jsonrpc_method(method='get_biaya', endpoint='api-merchant')
# def get_biaya(request, data, token=None):
# """
# Digunakan untuk mencari methode pembayaran dan biaya layanan
# :param request:
# :param data:
# {
# biaya_kd: string,
# harga:integer,
# cname:string,
# cid:string,
# cvv:string, optional
# }
# :param token:
# user_token
# :return:
# {
# product_kd:string,
# product_nm:string,
# harga:integer
# }
# """
#
# user = auth_from_rpc(request, token)
# i =0
# qry = DepartemenProduk.query() \
# .filter(Departemen.kode == '100000')
# for dat in data:
# product_kd = 'biaya_kd' in dat and dat['biaya_kd'] or None
# cid = 'cid' in dat and dat['cid'] or None
# if not product_kd :
# raise JsonRpcParameterNotFound(message='Paramter product_kd wajib di isi')
#
# rst = qry.join(Produk).filter(Produk.kode == product_kd)
# result = []
# for row in rst.all():
# if row.is_cid and not cid:
# raise JsonRpcParameterNotFound(message="Parameter cid wajib di isi")
# if row.produk.fixed:
# harga = row.harga
# else:
# harga = dat['harga']*row.harga
#
# result.append(dict(biaya_kd=row.produk.kode,
# produk_nm=row.produk.nama,
# harga=harga))
#
# r_data = dat
# r_data.update(dict(data=result))
# data[i]=r_data
# i += 1
# return data
# """
# Module proses:
# Save
# Invoice To Vendor
# Invoice To Customer
# """
# import os
# import re
# from datetime import datetime
#
# import colander
# import requests
# from deform import FileData, widget, Form, ValidationFailure
# from pyramid.httpexceptions import HTTPFound
# from pyramid.renderers import render_to_response
# from pyramid.view import view_config
#
# from . import BaseView #, save_file_upload
# from ..models import (DBSession, flush_row, save_row, Partner)
# from ..models import (Produk, ProdukCategory)
#
# from ..tools import (btn_next, date_from_str, get_ext,
# btn_save, btn_cancel, get_settings, btn_reset,
# dmy, btn_upload, btn_inquiry, btn_advice, btn_payment, get_random_number)
#
#
# def vendor():
# return DBSession.query(Partner.id, Partner.nama)\
# .filter(Partner.is_vendor == 1).all()
#
# def customer():
# return DBSession.query(Partner.id, Partner.nama)\
# .filter(Partner.is_customer == 1).all()
#
# def produk():
# return DBSession.query(Produk.id, Produk.nama)\
# .join(ProdukCategory, Produk.kategori_id==ProdukCategory.id)\
# .filter(ProdukCategory.kode.in_('e-pulsa', 'e-voucher', 'e-payment')).all()
#
#
# @colander.deferred
# def deferred_vendor(node, kw):
# values = kw.get('vendor', [])
# return widget.SelectWidget(values=values)
#
#
# @colander.deferred
# def deferred_customer(node, kw):
# values = kw.get('customer', [])
# return widget.SelectWidget(values=values)
#
#
# @colander.deferred
# def deferred_produk(node, kw):
# values = kw.get('produk', [])
# return widget.SelectWidget(values=values)
#
#
# class PageSchema(colander.Schema):
# customer_id = colander.SchemaNode(
# colander.Integer(), title='Customer',
# oid="customer_id", widget=deferred_customer)
#
# produk_id = colander.SchemaNode(
# colander.Integer(), title='Produk',
# oid="produk_id", widget=deferred_produk)
#
# destination = colander.SchemaNode(
# colander.Integer(), title='No.Tujuan/ID Pelanggan',
# oid="destination", widget=widget.TextInputWidget())
#
# vendor_id = colander.SchemaNode(
# colander.Integer(), title='Vendor',
# oid="vendor_id", widget=deferred_produk)
# trx_id = colander.SchemaNode(
# colander.Integer(), title='TRX ID',
# missing=colander.drop,
# oid="trx_id",
# # widget=widget.HiddenWidget()
# )
#
#
# class PageEditSchema(PageSchema):
#
# id = colander.SchemaNode(
# colander.Integer(), title='ID',
# missing=colander.drop,
# oid="id", widget=widget.HiddenWidget())
#
#
# def form_validator(form, value):
# pass
#
#
# def get_form(request, class_form, buttons=None, row=None):
# schema = class_form(validator=form_validator)
# schema = schema.bind(customer=customer(),
# vendor=vendor())
# schema.request = request
# if row:
# schema.deserialize(row)
# if not buttons:
# buttons = (btn_inquiry, btn_reset)
# return Form(schema, buttons=buttons)
#
#
# def upload_form(request, values, form):
# docs = PartnerDocs.query() \
# .filter(PartnerDocs.partner_id == values['partner_id'])
# uploads = []
# preview_url = "{host}/simkel/api_download?partner_id={partner_id}&jdoc_id={jdoc_id}"
# for doc in docs:
# uploads.append(dict(jdoc_id=doc.jdoc_id,
# upload=dict(filename=doc.doc_name,
# uid=doc.id, )))
#
# values['uploads'] = uploads
# form = form.render(values)
# return render_to_response('templates/form-upload.pt', dict(form=form),
# request=request)
#
#
# def route_list(request):
# return HTTPFound(location=request.route_url('simkel-permohonan'))
#
#
# def save(values, row):
# if not row:
# row = Penduduk()
# kode = re.sub("\D", "", values["kode"])
# values['kode'] = kode
# values['is_vendor'] = 0
# values['is_customer'] = 1
# row.create_uid = values['uid']
# row.created = datetime.now()
# else:
# row.update_uid = values['uid']
# row.updated = datetime.now()
#
# row.from_dict(values)
# flush(row)
# return row
#
#
# def save_permohonan(values, partner, row=None):
# if not row:
# row = Permohonan()
# row.partner_id = partner.id
# row.jenis_id = values['jenis_id']
# row.tgl_permohonan = datetime.now()
# row.create_uid = values['uid']
# row.created = datetime.now()
# else:
# row.update_uid = values['uid']
# row.updated = datetime.now()
#
# flush(row)
# return row
#
#
# def save_request(request, values, row=None):
# values['tgl_lahir'] = date_from_str(values['tgl_lahir'])
# values['uid'] = request.user.id
# row = save(values, row)
# row_permohonan = Permohonan.query(). \
# filter(Permohonan.partner_id == row.id,
# Permohonan.status == 0,
# Permohonan.jenis_id == values['jenis_id']). \
# first()
# if not row_permohonan:
# row_permohonan = save_permohonan(values, row)
#
# request.session.flash('Data %s Berhasil disimpan' % values['nama'])
# return row_permohonan
#
#
# form_params_edit = dict(scripts="""
# $(document).ready(function(){
# $(".tanggal").datepicker({format:"dd-mm-yyyy"});
# $(".tanggal").attr("readonly", true);
#
# });
# """)
#
# form_params_view = dict(scripts="""
# $(document).ready(function(){
# $("#nip_penerima, #nopel").attr("readonly", true);
# });
# """)
#
#
# def query_id(request):
# id = request.matchdict['id']
# return ApInvoice.query_id(id)
#
#
# class ViewHome(BaseView):
# @view_config(route_name='api-merchant-doc',
# permission="api-merchant-doc",
# renderer='templates/merchan_doc.pt')
# def view_merchant_doc(self):
# return dict()
#
# @view_config(route_name='api-merchant-add',
# permission="api-merchant-add",
# renderer='templates/form.pt')
# def view_home(self):
# request = self.req
# session = self.ses
# form = get_form(request, PageSchema, (btn_inquiry, btn_payment, btn_advice, btn_next))
# form_params = dict(scripts=None)
# settings = get_settings()
# if request.POST:
# if 'inquiry' in request.POST:
# controls = request.POST.items()
# try:
# c = form.validate(controls)
# except ValidationFailure as e:
# form.set_appstruct(e.cstruct)
# return dict(form=form, params=form_params)
#
# values = dict(c.items())
# values['trx_id'] = get_random_number(10)
# form.render(values)
# return dict(form=form, params=form_params)
#
#
# # values = dict(partner_id=71)
# # return upload_form(request, values)
# return dict(form=form, params=form_params)
import json
# Import Library (Mandatory)
from datetime import datetime, timedelta
from opensipkd.base import get_settings, is_devel
from opensipkd.base.models import Partner
from opensipkd.base.tools import ymd, hms
from .Lib import Nicepay
# setMandatoryParameter
from ..vendor import VendorClass
class Vendor(object): #VendorClass
def __init__(self, vendor_produk, **kwargs):
# VendorClass.__init__(self, vendor_produk, bill_no, **kwargs)
if not vendor_produk or kwargs is None or not "values" in kwargs:
return
args = kwargs
self.values = args["values"]
self.v_produk_kd = vendor_produk.kode
customer = Partner.query_id(self.values["customer_id"]).first()
if customer:
self.cust_kd = customer.kode
self.cust_inv_no = "cust_inv_no" in self.values \
and self.values["cust_inv_no"] or None
self.agra_cust_inv_no = self.cust_kd and self.cust_inv_no \
and self.cust_kd + self.cust_inv_no or None
settings = get_settings()
self.mid = 'np_mid' in settings and settings['np_mid'] or None
self.key = 'np_key' in settings and settings['np_key'] or None
self.url = 'np_url' in settings and settings['np_url'] or None
Nicepay.merchantKey = self.key
Nicepay.iMid = self.mid
self.ip = Nicepay.userIp()
self.customer = dict(
barang='GOODSNM',
nama='BILLING NAME',
phone='08123456789',
email='ADETEST01@GMAIL.COM',
kota='JAKARTA',
provinsi='JAKARTA',
kd_pos='14350',
negara='INDONESIA',
)
# self.cust_trx = 'REFERENCENO'
# self.pay_method = '01'
self.url = 'https://www.merchant.com/Notification'
self.bank_cd, self.pay_method = self.v_produk_kd.split('-')
self.va_typ = "float"
self.notify_url = "dev.agratek.co.id/api/np/notify"
self.callback_url = "dev.agratek.co.id/api/np/calllback"
self.reccuring = False
self.amt = str(self.values["amount"])
now = datetime.now()
self.time_stamp = now.strftime("%Y%m%d%H%M%S")
tommorow = now + timedelta(days=1)
self.valid_date = tommorow.strftime("%Y%m%d")
self.valid_time = "235500"
def request_payment(self, response):
Nicepay.requestData={}
Nicepay.set('timeStamp', self.time_stamp)
# '20180109181300'
# Nicepay.set('reffenceNo', self.time_stamp) #'20180109181300'
Nicepay.set('referenceNo', self.agra_cust_inv_no)
#'5a44213129be40320ef1a4b57095bfa61cd3ff0436bc442a9d82232e62203f37')
Nicepay.set('tXid', response["tXid"]) # 'IONPAYTEST02201802051512483907'get tXid from register first
Nicepay.set('cardNo', self.values["card_no"]) #'5409120028181901'
Nicepay.set('cardExpYymm', self.values["card_exp"]) # format Yymm '2012'
Nicepay.set('cardCvv', self.values["card_cvv"])
Nicepay.set('recurringToken', '')
Nicepay.set('preauthToken', '')
Nicepay.set('clickPayNo', '')
Nicepay.set('dataField3', '')
Nicepay.set('clickPayToken', '')
Nicepay.set('callBackUrl', self.callback_url)
result = Nicepay.nicePayment()
return result
def set_static_params(self):
if not self.agra_cust_inv_no:
return
Nicepay.set('timeStamp', self.time_stamp) #
Nicepay.set('iMid', self.mid)
Nicepay.set('payMethod', self.pay_method)
Nicepay.set('currency', 'IDR')
Nicepay.set('amt', self.amt)
Nicepay.set('referenceNo', self.agra_cust_inv_no)
Nicepay.set('userIP', self.ip)
Nicepay.set('dbProcessUrl', self.url)
Nicepay.set('merchantToken', Nicepay.merchantToken())
return True
def set_billing_param(self):
if not self.customer:
return
Nicepay.set('goodsNm', self.customer['barang'])
Nicepay.set('billingNm', self.customer['nama'])
Nicepay.set('billingPhone', self.customer['phone'])
Nicepay.set('billingEmail', self.customer['email'])
Nicepay.set('billingCity', self.customer['kota'])
Nicepay.set('billingState', self.customer['provinsi'])
Nicepay.set('billingPostCd', self.customer['kd_pos'])
Nicepay.set('billingCountry', self.customer['negara'])
return True
def set_optional_param(self):
pass
# setOptionalParameter
# Nicepay.set('billingAddr', 'Billing Address')
# Nicepay.set('deliveryNm', 'Buyer Name')
# Nicepay.set('deliveryPhone', '02112345678')
# Nicepay.set('deliveryAddr', 'Billing Address')
# Nicepay.set('deliveryCity', 'Jakarta')
# Nicepay.set('deliveryState', 'Jakarta')
# Nicepay.set('deliveryPostCd', '12345')
# Nicepay.set('deliveryCountry', 'Indonesia')
# Nicepay.set('vat', '0')
# Nicepay.set('fee', '0')
# Nicepay.set('notaxAmt', '0')
# Nicepay.set('description', 'Description')
# Nicepay.set('reqDt', '20160301') # Format (YYYYMMDD)
# Nicepay.set('reqTm', '135959') # Format (HHiiss)
# Nicepay.set('reqDomain', 'merchant.com')
# Nicepay.set('reqServerIP', '127.0.0.1')
# Nicepay.set('reqClientVer', '1.0')
# Nicepay.set('userSessionID', 'userSessionID')
# Nicepay.set('userAgent', 'Mozilla')
# Nicepay.set('userLanguage', 'en-US')
def inquiry(self):
Nicepay.requestData = {}
if not self.set_static_params() or not self.set_billing_param():
return
Nicepay.set('cartData', '{}')
# For Credit Card (Don't forgot change payMethod to '01')
if self.pay_method == '01':
Nicepay.set('instmntType', '2')
Nicepay.set('instmntMon', '1')
if (self.reccuring):
# For Credit Card Reccuring Only
Nicepay.set('recurrOpt', '0')
# For Virtual Account (Don't forgot change payMethod to '02')
elif self.pay_method == '02':
Nicepay.set('bankCd', self.bank_cd)
Nicepay.set('vacctValidDt', self.valid_date) # Format (YYYYMMDD)
Nicepay.set('vacctValidTm', self.valid_time) # Format (HHiiss)
if self.va_typ == "fixed":
# For Virtual Account Fix Account
Nicepay.set('merFixAcctId', '12345679')
# length value of merFixAcctId setting By Mid. Contact
# Nicepay IT for Information
elif self.pay_method in ['03', '04', '05']:
# For CVS,ClickPay or E-Wallet
# (Don't forgot change payMethod to '03'/'04'/'05')
Nicepay.set('mitraCd', self.bank_cd)
if self.pay_method == '03':
# For CVS Only
Nicepay.set('payValidDt', self.valid_date) # Format (YYYYMMDD)
Nicepay.set('payValidTm', self.valid_time) # Format (HHiiss)
elif self.pay_method == '04':
# For ClickPay Only
Nicepay.set('mRefNo', self.cust_inv_no)
self.set_optional_param()
self.request = Nicepay.requestData
# self.save_log('inquiry')
# result = {}
resultData = Nicepay.niceRegister()
response = json.loads(resultData)
# Jika kartu kredit
if self.pay_method == '01':
payment = self.request_payment(response)
self.response = response
# # Payment Response String Format
if 'resultCd' not in response:
self.result = dict(
error="Connection Timeout. Please Try Again!"
)
return
else:
result = dict()
#
if response['resultCd'] == '0000':
result["resultCd"]=response['resultCd']
result["resultMsg"]=response['resultMsg']
result["tXid"]=response['tXid']
result["referenceNo"]=response['referenceNo']
result["payMethod"]=response['payMethod']
result["amount"]=response['amt']
result["transDt"]=response['transDt']
result["transTm"]=response['transTm']
if response['goodsNm']:
result["goodsNm"]=response['goodsNm']
if response['billingNm']:
result["billingNm"]=response['billingNm']
if response['currency']:
result["currency"]=response['currency']
elif response['payMethod'] == "02":
result["bankCd"]=response['bankCd']
result["vacctNo"]=response['vacctNo']
result["vacctValidDt"]=response['vacctValidDt']
result["vacctValidTm"]=response['vacctValidTm']
elif response['payMethod'] == "03":
result["mitraCd"]=response['mitraCd']
result["payNo"]=response['payNo']
result["vacctValidDt"]=response['payValidDt']
result["vacctValidTm"]=response['payValidTm']
elif result['payMethod'] == "04":
result["mitraCd"]=response['mitraCd']
result["receiptCode"]=response['receiptCode']
elif result['payMethod'] == "05":
result["mitraCd"]=response['mitraCd']
result["receiptCode"]='receiptCode' in response and response['receiptCode'] or ''
else:
result["resultCd"]=response['resultCd']
result["resultMsg"]=response['resultMsg']
self.result = response
# self.save_log('inquiry')
return dict(data=result)
# https://api.nicepay.co.id/nicepay/direct/v2/registration
# Request Body
"""
{
"deliveryPhone": "62-21-0000-0000",
"mitraCd": "ALMA",
"fee": "0",
"amt": "1000",
"description": "this is test transaction!!",
"notaxAmt": "0",
"reqDomain": "localhost",
"userLanguage": "ko-KR,en-US;q=0.8,ko;q=0.6,en;q=0.4",
"vacctValidDt": "",
"billingEmail": "no-reply@ionpay.net",
"merFixAcctId": "",
"payMethod": "01",
"deliveryAddr": "Jalan Jenderal Gatot Subroto Kav.57",
"billingCountry": "ID",
"userIP": "0:0:0:0:0:0:0:1",
"instmntMon": "1",
"currency": "IDR",
"payValidDt": "",
"deliveryCity": "Jakarta",
"merchantToken": "b5149659e1a2f1271fb0833f8ea20e174b6fd389db26bc6ad036cc0dae6fa797",
"goodsNm": "T-1000",
"referenceNo": "OrdNo2017717942577",
"vat": "0",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/60.0.3112.101 Safari/537.36",
"billingState": "Jakarta",
"userSessionID": "697D6922C961070967D3BA1BA5699C2C",
"instmntType": "1",
"deliveryNm": "HongGilDong",
"deliveryPostCd": "12950",
"reqClientVer": "",
"iMid": "IONPAYTEST",
"billingNm": "HongGilDong",
"timeStamp": "20170822170942",
"dbProcessUrl": "http://127.0.0.1:8080/nicepay/test3/dbProcess.do",
"payValidTm": "",
"cartData": "{“count”: “1”,
“item”: [{“img_url”: “https://www.lecs.com/image/introduction/img_vmd020101.jpg”,
“goods_name”: “Jam Tangan Army - Strap Kulit - Hitam”,
“goods_detail”: “jumlah 1”,
“goods_amt”: “400”}]}",
"deliveryState": "Jakarta",
"deliveryCountry": "ID",
"bankCd": "",
"billingPostCd": "12950",
"billingAddr": "Jalan Jenderal Gatot Subroto Kav.57",
"reqServerIP": "172.29.2.178",
"vacctValidTm": "",
"billingPhone": "021-579-00000",
"billingCity": "Jakarta"
}
// Response Body
{
"resultCd": "0000",
"resultMsg": "SUCCESS",
"tXid": "IONPAYTEST01201708221510237472",
"referenceNo": "OrdNo2017717942577",
"payMethod": "01",
"amt": "1000",
"transDt": "20170822",
"transTm": "171029",
"description": "this is test transaction!!",
"bankCd": null,
"vacctNo": null,
"mitraCd": null,
"payNo": null
….
}
"""
...@@ -6,14 +6,15 @@ from opensipkd.base import get_settings ...@@ -6,14 +6,15 @@ from opensipkd.base import get_settings
from .vendor import VendorClass from .vendor import VendorClass
from ..tools import log
import urllib3 import urllib3
urllib3.disable_warnings() urllib3.disable_warnings()
class Vendor(VendorClass): class Vendor(VendorClass):
def __init__(self, vendor_produk, bill_no, customer_id=None, def __init__(self, vendor_produk, invoice_det):
cust_trx=None, row=None): VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
VendorClass.__init__(self, vendor_produk, bill_no, customer_id, # id_pel, customer_id, cust_trx, row
cust_trx, row)
settings = get_settings() settings = get_settings()
self.mid = 'odeo_mid' in settings and settings['odeo_mid'] or None self.mid = 'odeo_mid' in settings and settings['odeo_mid'] or None
self.key = 'odeo_key' in settings and settings['odeo_key'] or None self.key = 'odeo_key' in settings and settings['odeo_key'] or None
...@@ -40,30 +41,34 @@ class Vendor(VendorClass): ...@@ -40,30 +41,34 @@ class Vendor(VendorClass):
return resp return resp
def inquiry(self): def inquiry(self):
if not self.v_produk_kd or not self.bill_no: if not self.v_produk_kd or not self.id_pel:
return dict(code=9999, return dict(code=9999,
message='Parameter tidak lengkap') message='Parameter tidak lengkap')
if self.v_produk_kd[:3] =='PLN' and self.v_produk_kd != 'PLNPASCA': if self.v_produk_kd[:3] =='PLN' and self.v_produk_kd != 'PLNPASCA':
params = dict( params = dict(
number=self.bill_no number=self.id_pel
) )
self.request = params self.request = params
log.info("ODEO Inquiry Request: %s" % params)
self.save_log("inquiry") self.save_log("inquiry")
resp = self.request_get(params, '/prepaid/pln/inquiry') resp = self.request_get(params, '/prepaid/pln/inquiry')
else: else:
params = dict( params = dict(
denom=self.v_produk_kd, denom=self.v_produk_kd,
number=self.bill_no number=self.id_pel
) )
self.request = params self.request = params
self.save_log("inquiry") self.save_log("inquiry")
log.info("ODEO Inquiry Request: %s" % params)
resp = self.request_get(params, '/postpaid/inquiry') resp = self.request_get(params, '/postpaid/inquiry')
try: try:
result = json.loads(resp.text) result = json.loads(resp.text)
except: except:
result = resp.text result = resp.text
log.info("ODEO Inquiry Response: %s" % result)
if resp.ok: if resp.ok:
self.status = 1 # sukses self.status = 1 # sukses
...@@ -80,19 +85,17 @@ class Vendor(VendorClass): ...@@ -80,19 +85,17 @@ class Vendor(VendorClass):
message="Other Error") message="Other Error")
self.response = result self.response = result
self.save_log('inquiry') # self.save_log('inquiry')
return parsd return parsd
def payment(self): def payment(self):
if not self.v_produk_kd or not self.bill_no:
return dict(code=9999,
message='Parameter tidak lengkap')
params = dict(data=dict( params = dict(data=dict(
denom=self.v_produk_kd, denom=self.v_produk_kd,
number=self.bill_no number=self.id_pel
) )
) )
self.request = params self.request = params
log.info("ODEO Payment Request: %s" % self.request)
self.save_log("payment") self.save_log("payment")
resp = self.request_post(params, '/prepaid/purchase') resp = self.request_post(params, '/prepaid/purchase')
try: try:
...@@ -100,49 +103,66 @@ class Vendor(VendorClass): ...@@ -100,49 +103,66 @@ class Vendor(VendorClass):
except: except:
result = resp.text result = resp.text
self.response = result
log.info("ODEO Payment Response: %s" % self.response)
if resp.ok: if resp.ok:
self.status = 1 # sukses # self.status = 1 # sukses
data = "data" in result and result["data"] or None data = "data" in result and result["data"] or None
if data: if data:
self.vend_trx = "order_id" in data and data["order_id"] or None self.vend_trx = "order_id" in data and data["order_id"] or None
self.amt_buy = "price" in data and data["price"] or 0 self.amt_buy = "price" in data and data["price"] or 0
parsd = self.pars_data(data) parsd = self.pars_data(data)
if not parsd:
self.status = -4
parsd = dict(code=500,
message="Other Error",
status="FAILED")
elif resp.status_code==400:
elif resp.status_code==400: # BAD REQUEST
self.status = -3 self.status = -3
parsd = dict(code=resp.status_code, parsd = dict(code=resp.status_code,
message=result) message=result,
status="FAILED")
else: else:
self.status = -4 self.status = -4 # Other Error
parsd = dict(code=500, parsd = dict(code=500,
message="Other Error") message="Other Error",
status="FAILED")
if 'ref_no' in parsd:
self.vend_inv_no = parsd["ref_no"]
self.response = result
self.save_log('payment') self.save_log('payment')
txt = "ODEO PARSING: {d}".format(d=json.dumps(parsd))
log.info(txt)
return parsd return parsd
def advice(self): def advice(self):
if not self.v_produk_kd or not self.bill_no or not self.partner_log_id: if not self.v_produk_kd or not self.id_pel or not self.invoice_det:
return dict(code=9999, return dict(code=9999,
message='Parameter tidak lengkap') message='Parameter tidak lengkap')
if self.kategori == 'e-payment': if self.kategori == 'e-payment':
order_id = self.partner_log.vend_trx order_id = self.invoice_det.vend_inv_no
url = '/order/{order_id}'.format(order_id=order_id) url = '/order/{order_id}'.format(order_id=order_id)
params = None params = None
self.save_log("advice") self.request = url
resp = self.request_get(params, url)
else: else:
params = dict( params = dict(
data=dict( data=dict(
denom=self.v_produk_kd, denom=self.v_produk_kd,
number=self.bill_no number=self.id_pel
) )
) )
self.request = params self.request = params
self.save_log("advice") self.save_log("advice")
resp = self.request_get(params, '/prepaid/purchase-get') url = '/prepaid/purchase-get'
self.save_log("advice")
resp = self.request_get(params, url)
try: try:
result = json.loads(resp.text) result = json.loads(resp.text)
except: except:
...@@ -167,30 +187,36 @@ class Vendor(VendorClass): ...@@ -167,30 +187,36 @@ class Vendor(VendorClass):
return parsd return parsd
def pars_data(self, data): def pars_data(self, data):
result = {} result = dict()
result["trx_id"] = self.partner_log_id # result["trx_id"] = self.partner_log_id
result["bill_no"] = self.bill_no # result["id_pel"] = self.id_pel
result["cust_trx"] = self.cust_trx # result["cust_trx"] = self.cust_trx
result["vend_trx"] = self.vend_trx # result["vend_trx"] = self.vend_trx
result['harga'] = self.amt_buy # result['harga'] = self.amt_buy
if not data: if not data:
return result return result
if "rc" in data: if "rc" in data:
if data["rc"] == "13": if data["rc"] == "13":
self.status = -1 result["status"] = "FAILED"
self.status = -2
elif data["rc"] == "68": elif data["rc"] == "68":
result["status"] = "PENDING"
self.status = 0 #pending self.status = 0 #pending
elif data["rc"] == "67": elif data["rc"] == "67":
self.status = -2 # Gagal Karena Pernah Transaksi result["status"] = "DOUBLE"
self.status = -1 # Gagal Karena Pernah Transaksi
if "subscriber_id" in data and data["subscriber_id"]: else:
result['nopel'] = data["subscriber_id"] self.status = 1
result["code"] = 0
result["status"] = "SUCCESS"
self.serial_number = 'serial_number' in data and data["serial_numner"] \
or self.serial_number
if "subscriber_id" in data and data["subscriber_id"]: if "subscriber_id" in data and data["subscriber_id"]:
result['nopel'] = data["subscriber_id"] result['id_pel'] = data["subscriber_id"]
if "name" in data and data["name"]: if "name" in data and data["name"]:
result['nama'] = data["name"] result['nama'] = data["name"]
if "subscriber_name" in data and data["subscriber_name"]: if "subscriber_name" in data and data["subscriber_name"]:
...@@ -201,14 +227,13 @@ class Vendor(VendorClass): ...@@ -201,14 +227,13 @@ class Vendor(VendorClass):
result['subtotal'] = data["subtotal"] result['subtotal'] = data["subtotal"]
if "discount" in data and data["discount"]: if "discount" in data and data["discount"]:
result['discount'] = data["discount"] result['discount'] = data["discount"]
if "total" in data and data["total"]: if "total" in data and data["total"]:
result['total'] = data["total"] result['total'] = data["total"]
if "tariff" in data and data["tariff"]: if "tarif" in data and data["tariff"]:
result['tarif'] = data["tariff"] result['tarif'] = data["tariff"]
inquiries = 'inquiries' in data and data['inquiries'] \ inquiries = 'inquiries' in data and data['inquiries'] \
or 'inquiry' in data and data['inquiry'] or None or 'inquiry' in data and data['inquiry'] or {}
if not inquiries: if not inquiries:
return result return result
......
import base64
import json
import requests
from opensipkd.base import get_settings
from .vendor import VendorClass
import urllib3
urllib3.disable_warnings()
class Vendor(VendorClass):
def __init__(self, vendor_produk, bill_no, customer_id=None,
cust_trx_id=None, row=None):
VendorClass.__init__(self, vendor_produk, bill_no, customer_id,
cust_trx_id, row)
settings = get_settings()
self.mid = 'odeo_mid' in settings and settings['odeo_mid'] or None
self.key = 'odeo_key' in settings and settings['odeo_key'] or None
self.url = 'odeo_url' in settings and settings['odeo_url'] or None
self.url += '/prepaid/pln/purchase'
key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key)
def request_post(self, params):
headers = {'Authorization': 'Bearer {key}'.format(key=self.key)}
data = json.dumps(params)
with requests.session():
resp = requests.post(url=self.url, data=data,
verify=False, headers=headers)
return resp
def request_get(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.key)}
url = url and self.url+url or self.url
with requests.session():
resp = requests.get(url, params=params,
verify=False, headers=headers)
return resp
def inquiry(self):
if not self.v_produk_kd or not self.bill_no:
return
params = dict(
data=dict(
number=self.bill_no
)
)
self.request = params
self.save_log("inquiry")
resp = self.request_get(params)
content = None
if resp and resp.text:
content = json.loads(resp.text)
if resp.ok:
#todo mapping content
result = content
else:
result = dict(code=resp.status_code,
message=resp.text)
self.response = content
self.save_log('payment')
return result
def advice(self):
if not self.v_produk_kd or not self.bill_no:
return
params = dict(
data=dict(
denom=self.v_produk_kd,
number=self.bill_no
)
)
self.request = params
self.save_log("advice")
resp = self.request_get(params, '-get')
content = None
if resp and resp.text:
content = json.loads(resp.text)
if resp.ok:
#todo mapping content
result = content
else:
result = dict(code=resp.status_code,
message=resp.text)
self.response = content
self.save_log('payment')
return result
"""
Module proses:
Save
Invoice To Vendor
Invoice To Customer
"""
import hashlib
import json
import logging
import re
from datetime import datetime
from importlib import import_module
import colander
import requests
import xmltodict
from deform import widget, Form, ValidationFailure
# from opensipkd.pasar.models import PartnerLog
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Partner, PartnerProduk)
from ..models import (Produk, ProdukKategori)
from ..tools import (btn_next, date_from_str, get_settings, btn_reset,
btn_inquiry, btn_advice, btn_payment)
log = logging.getLogger(__name__)
from ..views import deferred_vendor, deferred_customer, deferred_produk
def build_request(typ, values):
produk_id = values['produk_id']
vendor_id = values['vendor_id']
# bill_no = values['destination']
# customer_id = 'customer_id' in values and values['customer_id'] or None
# cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None
vendor_product = PartnerProduk.query() \
.join(Produk, PartnerProduk.produk_id == Produk.id) \
.filter(PartnerProduk.partner_id == vendor_id,
PartnerProduk.produk_id == produk_id).first()
if not vendor_product:
return dict(data=dict(error='Data Tidak Ditemukan'))
modules = import_module('.' + vendor_product.modules, 'agratek.api.merchant.views')
cls_module = modules.Vendor(vendor_product, values=values)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls:
data = cls()
result = dict(data=data)
result["f_request"] = cls_module.request
result["f_response"] = cls_module.response
result["url"] = cls_module.url
else:
result = dict(data=dict(error='Fungsi %s tidak ada' % typ,
code=9999))
return result
class AddSchema(colander.Schema):
customer_id = colander.SchemaNode(
colander.Integer(), title='Payment Type',
oid="customer_id", widget=deferred_customer)
cust_inv_no = colander.SchemaNode(
colander.String(), title='No Invoice',
missing=colander.drop,
oid="destination")
produk_id = colander.SchemaNode(
colander.Integer(), title='Payment Type',
oid="produk_id", widget=deferred_produk)
amount = colander.SchemaNode(
colander.Integer(), title='Jumlah',
oid="amount")
vendor_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
missing = colander.drop,
oid="vendor_id", widget=deferred_vendor)
card_no = colander.SchemaNode(
colander.String(), title='No. Kartu',
missing=colander.drop,
oid="card_no")
card_exp = colander.SchemaNode(
colander.String(), title='Expire (YYMM)',
missing=colander.drop,
widget = widget.TextInputWidget(min_len=4, max_len=4),
oid="card_exp")
card_cvv = colander.SchemaNode(
colander.String(), title='Valid',
missing=colander.drop,
widget=widget.TextInputWidget(min_len=3, max_len=3),
oid="card_cvv")
f_result = colander.SchemaNode(
colander.String(), title='Result to Merchant',
missing=colander.drop,
oid="f_result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_request = colander.SchemaNode(
colander.String(), title='Request',
missing=colander.drop,
oid="f_request",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_response = colander.SchemaNode(
colander.String(), title='Response',
missing=colander.drop,
oid="f_response",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.Integer(), title='ID',
missing=colander.drop,
oid="id", widget=widget.HiddenWidget())
def form_validator(form, value):
pass
def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator)
schema = schema.bind(vendor=Produk.get_vendor_payment_list(),
produk=Produk.get_payment_list(),
customer=Partner.get_customer_list())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_inquiry, btn_reset)
return Form(schema, buttons=buttons)
def route_list(request):
return HTTPFound(location=request.route_url('simkel-permohonan'))
def save(values, row):
if not row:
row = PartnerLog()
row.create_uid = values['uid']
row.created = datetime.now()
else:
row.update_uid = values['uid']
row.updated = datetime.now()
row.from_dict(values)
flush_row(row)
return row
def save_request(request, values, row=None):
values['tgl_lahir'] = date_from_str(values['tgl_lahir'])
values['uid'] = request.user.id
row = save(values, row)
request.session.flash('Data %s Berhasil disimpan' % values['nama'])
return row
form_params_edit = dict(scripts="""
$(document).ready(function(){
$(".tanggal").datepicker({format:"dd-mm-yyyy"});
$(".tanggal").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
$("#nip_penerima, #nopel").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
def query_id(request):
id = request.matchdict['id']
return PartnerProduk.query_id(id)
class ViewHome(BaseView):
@view_config(route_name='api-payment-doc',
permission="api-payment",
renderer='templates/payment_doc.pt')
def view_merchant_doc(self):
return dict()
@view_config(route_name='api-payment-add',
permission="api-payment-add",
renderer='templates/form.pt')
def view_home(self):
request = self.req
session = self.ses
form = get_form(request, AddSchema, (btn_inquiry, btn_payment, btn_advice, btn_next))
settings = get_settings()
if request.POST:
controls = request.POST.items()
try:
c = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form, params=form_params_edit)
values = dict(c.items())
result = None
if 'inquiry' in request.POST:
result = build_request('inquiry', values)
# if product_kd == "crc" or product_kd[:3]=="EWL":
# return HTTPFound('api-cc-form', params=result["params"])
elif 'payment' in request.POST:
result = build_request('payment', values)
elif 'advice' in request.POST:
result = build_request('advice', values)
elif 'info' in request.POST:
result = build_request('info', values)
if result and 'data' in result and result["data"]:
data = result['data']
values['f_request'] = 'f_request' in result \
and json.dumps(result['f_request'], indent=4) or ''
values['f_response'] = 'f_response' in result \
and json.dumps(result['f_response'], indent=4) or ''
values['f_result'] = 'data' in result \
and json.dumps(result['data'], indent=4) or ''
values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
if 'error' in data and data['error']:
session.flash(data['error'], 'error')
else:
session.flash("No Result Data")
form.render(values)
return dict(form=form, params=form_params_view)
values = dict(card_no="5409120028181901",
card_exp="2012",
card_cvv="111",
amount=1000,
produk_id=51,
cust_inv_no="123456789")
form.render(values)
return dict(form=form, params=form_params_edit)
def sha256(hash_string):
return hashlib.sha256(hash_string.encode()).hexdigest()
def proses_nice_pay(request):
pass
...@@ -9,7 +9,7 @@ from pyramid.view import view_config ...@@ -9,7 +9,7 @@ from pyramid.view import view_config
from . import BaseView # , save_file_upload from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Satuan) from ..models import (DBSession, flush_row, Satuan)
from ..models import (Produk, ProdukCategory) from ..models import (Produk, ProdukKategori)
from ..tools import (btn_reset, from ..tools import (btn_reset,
btn_cancel, btn_delete, btn_save) btn_cancel, btn_delete, btn_save)
...@@ -74,7 +74,7 @@ def form_validator(form, value): ...@@ -74,7 +74,7 @@ def form_validator(form, value):
def get_form(request, class_form, buttons=None, row=None): def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator) schema = class_form(validator=form_validator)
schema = schema.bind(produk_category=ProdukCategory.get_list(), schema = schema.bind(produk_category=ProdukKategori.get_list(),
satuan=Satuan.get_list()) satuan=Satuan.get_list())
schema.request = request schema.request = request
if row: if row:
......
...@@ -4,13 +4,13 @@ import colander ...@@ -4,13 +4,13 @@ import colander
from datatables import ColumnDT from datatables import ColumnDT
from deform import widget, Form, ValidationFailure from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables from opensipkd.base.views import DataTables
from opensipkd.pasar.models.produk import (deferred_vendor, deferred_produk, from opensipkd.pasar.models.views import (deferred_vendor, deferred_produk,
deferred_departemen, PartnerProduk) deferred_departemen)
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView # , save_file_upload from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Partner, Produk) from ..models import (DBSession, flush_row, Partner, Produk, PartnerProduk)
from ..models import (Departemen) from ..models import (Departemen)
from ..tools import (btn_reset, btn_cancel, btn_delete, btn_save) from ..tools import (btn_reset, btn_cancel, btn_delete, btn_save)
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<li> <li>
<a href="${request._host}/api/vendor/add"> <a href="${request._host}/api/vendor/add">
<i class="fa fa-lg fa-fw fa-home"></i> <i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Add Vendor Invoice</span> <span class="menu-item-parent">Biller Invoice</span>
</a> </a>
</li> </li>
<li> <li>
...@@ -24,5 +24,25 @@ ...@@ -24,5 +24,25 @@
<span class="menu-item-parent">List Vendor Invoice</span> <span class="menu-item-parent">List Vendor Invoice</span>
</a> </a>
</li> </li>
<li>
<a href="${request._host}/api/payment/add">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Add Payment Method</span>
</a>
</li>
<li>
<a href="${request._host}/api/payment/list">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">List Payment</span>
</a>
</li>
<li>
<a href="${request._host}/api/integrated/add">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Integrated Test</span>
</a>
</li>
</ul> </ul>
</html> </html>
...@@ -7,7 +7,6 @@ Invoice To Customer ...@@ -7,7 +7,6 @@ Invoice To Customer
import hashlib import hashlib
import json import json
import logging
import re import re
from datetime import datetime from datetime import datetime
from importlib import import_module from importlib import import_module
...@@ -16,290 +15,21 @@ import colander ...@@ -16,290 +15,21 @@ import colander
import requests import requests
import xmltodict import xmltodict
from deform import widget, Form, ValidationFailure from deform import widget, Form, ValidationFailure
from opensipkd.pasar.models import PartnerLog # from opensipkd.pasar.models import PartnerLog
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView # , save_file_upload from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Partner, PartnerProduk) from ..models import (DBSession, flush_row, Partner, PartnerProduk)
from ..models import (Produk, ProdukCategory) from ..models import (Produk, ProdukKategori)
from ..tools import (btn_next, date_from_str, get_settings, btn_reset, from ..tools import (btn_next, date_from_str, get_settings, btn_reset,
btn_inquiry, btn_advice, btn_payment) btn_inquiry, btn_advice, btn_payment)
log = logging.getLogger(__name__) from ..tools import log
def vendor():
return DBSession.query(Partner.id, Partner.nama) \
.filter(Partner.is_vendor == 1).all()
def customer():
return DBSession.query(Partner.id, Partner.nama) \
.filter(Partner.is_customer == 1).all()
def produk():
return DBSession.query(Produk.id, Produk.nama) \
.join(ProdukCategory, Produk.kategori_id == ProdukCategory.id) \
.filter(ProdukCategory.kode.in_(['e-pulsa', 'e-voucher', 'e-payment'])).all()
def build_request(typ, values):
produk_id = values['produk_id']
vendor_id = values['vendor_id']
bill_no = values['destination']
customer_id = 'customer_id' in values and values['customer_id'] or None
cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None
vendor_product = PartnerProduk.query() \
.join(Produk, PartnerProduk.produk_id == Produk.id) \
.filter(PartnerProduk.partner_id == vendor_id,
PartnerProduk.produk_id == produk_id).first()
if not vendor_product:
return dict(data=dict(error='Data Tidak Ditemukan'))
row = None
if "trx_id" in values and values['trx_id']:
trx_id = int(values['trx_id'])
row = PartnerLog.query().filter_by(id=trx_id).first()
modules = import_module('.' + vendor_product.modules, 'agratek.api.merchant.views')
cls_module = modules.Vendor(vendor_product, bill_no, customer_id,
cust_trx_id, row)
cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if cls:
data = cls()
result = dict(data=data)
result["f_request"] = cls_module.request
result["f_response"] = cls_module.response
result["url"] = cls_module.url
else:
result = dict(data=dict(error='Fungsi %s tidak ada' % typ,
code=9999))
return result
@colander.deferred
def deferred_vendor(node, kw):
values = kw.get('vendor', [])
return widget.SelectWidget(values=values)
@colander.deferred
def deferred_customer(node, kw):
values = kw.get('customer', [])
return widget.SelectWidget(values=values)
@colander.deferred
def deferred_produk(node, kw):
values = kw.get('produk', [])
return widget.SelectWidget(values=values)
class AddSchema(colander.Schema):
produk_id = colander.SchemaNode(
colander.Integer(), title='Produk',
oid="produk_id", widget=deferred_produk)
destination = colander.SchemaNode(
colander.String(), title='No.Tujuan/ID Pelanggan',
oid="destination", widget=widget.TextInputWidget())
vendor_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
oid="vendor_id", widget=deferred_vendor)
trx_id = colander.SchemaNode(
colander.String(), title='TRX ID',
missing=colander.drop,
oid="trx_id",
widget=widget.TextInputWidget(css_class="readonly")
)
ref_no = colander.SchemaNode(
colander.String(), title='REF. NO',
missing=colander.drop,
oid="ref_no",
widget=widget.TextInputWidget(css_class="readonly")
)
vend_trx = colander.SchemaNode(
colander.String(), title='TRX Vendor',
missing=colander.drop,
oid="vend_trx",
widget=widget.TextInputWidget(css_class="readonly")
)
cust_trx = colander.SchemaNode(
colander.String(), title='TRX Customer',
missing=colander.drop,
oid="cust_trx",
widget=widget.TextInputWidget(css_class="readonly")
)
f_result = colander.SchemaNode(
colander.String(), title='Result',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_request = colander.SchemaNode(
colander.String(), title='Request',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_response = colander.SchemaNode(
colander.String(), title='Response',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.Integer(), title='ID',
missing=colander.drop,
oid="id", widget=widget.HiddenWidget())
def form_validator(form, value):
pass
def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator)
schema = schema.bind(vendor=vendor(),
produk=produk())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_inquiry, btn_reset)
return Form(schema, buttons=buttons)
def route_list(request):
return HTTPFound(location=request.route_url('simkel-permohonan'))
def save(values, row):
if not row:
row = Penduduk()
kode = re.sub("\D", "", values["kode"])
values['kode'] = kode
values['is_vendor'] = 0
values['is_customer'] = 1
row.create_uid = values['uid']
row.created = datetime.now()
else:
row.update_uid = values['uid']
row.updated = datetime.now()
row.from_dict(values)
flush(row)
return row
def save_request(request, values, row=None):
values['tgl_lahir'] = date_from_str(values['tgl_lahir'])
values['uid'] = request.user.id
row = save(values, row)
row_permohonan = Permohonan.query(). \
filter(Permohonan.partner_id == row.id,
Permohonan.status == 0,
Permohonan.jenis_id == values['jenis_id']). \
first()
if not row_permohonan:
row_permohonan = save_permohonan(values, row)
request.session.flash('Data %s Berhasil disimpan' % values['nama'])
return row_permohonan
form_params_edit = dict(scripts="""
$(document).ready(function(){
$(".tanggal").datepicker({format:"dd-mm-yyyy"});
$(".tanggal").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
$("#nip_penerima, #nopel").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
def query_id(request):
id = request.matchdict['id']
return ApInvoice.query_id(id)
class ViewHome(BaseView):
@view_config(route_name='api-vendor-doc',
permission="api-vendor-doc",
renderer='templates/vendor_doc.pt')
def view_merchant_doc(self):
return dict()
@view_config(route_name='api-vendor-add',
permission="api-vendor-add",
renderer='templates/form.pt')
def view_home(self):
request = self.req
session = self.ses
form = get_form(request, AddSchema, (btn_inquiry, btn_payment, btn_advice, btn_next))
settings = get_settings()
if request.POST:
controls = request.POST.items()
try:
c = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form, params=form_params_edit)
values = dict(c.items())
result = None
if 'inquiry' in request.POST:
result = build_request('inquiry', values)
elif 'payment' in request.POST:
result = build_request('payment', values)
elif 'advice' in request.POST:
result = build_request('advice', values)
elif 'info' in request.POST:
result = build_request('info', values)
if result and 'data' in result:
data = result['data']
values['f_request'] = 'f_request' in result \
and json.dumps(result['f_request'], indent=4) or ''
values['f_response'] = 'f_response' in result \
and json.dumps(result['f_response'], indent=4) or ''
values['f_result'] = 'data' in result \
and json.dumps(result['data'], indent=4) or ''
values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
if 'error' in data and data['error']:
session.flash(data['error'], 'error')
form.render(values)
return dict(form=form, params=form_params_view)
return dict(form=form, params=form_params_edit)
class VendorClass(object): class VendorClass(object):
def __init__(self, vendor_produk, bill_no, customer_id=None, def __init__(self, vendor_produk, invoice_det, **kwargs):
cust_trx=None, row=None):
""" """
:param vendor_produk: :param vendor_produk:
:param bill_no: :param bill_no:
...@@ -307,14 +37,68 @@ class VendorClass(object): ...@@ -307,14 +37,68 @@ class VendorClass(object):
:param cust_trx: :param cust_trx:
:param row: :param row:
""" """
self.vendor_produk = vendor_produk
self.invoice_det = invoice_det
self.v_produk_kd = vendor_produk.kode
self.kategori = vendor_produk.produk.kategori.kode
self.id_pel = invoice_det and invoice_det.id_pel or None
self.request = None
self.response = None
self.vend_inv_no = invoice_det and invoice_det.vend_inv_no or None
self.status = invoice_det and invoice_det.status or 0
if hasattr(invoice_det , 'serial_number'):
self.serial_number = invoice_det and invoice_det.serial_number or None
def save_log(self, typ):
# if not self.partner_log:
# row = self.partner_log or PartnerLog()
# row.vendor_id = self.vendor_id
# row.produk_id = self.produk_id
# row.bill_no = self.bill_no
# row.customer_id = self.customer_id
#
# row.cust_trx = self.cust_trx
# row.vend_trx = self.vend_trx
# row.status = self.status
# row.amt_buy = self.amt_buy
# row.amt_sell = self.amt_sell
self.invoice_det.status = self.status
if hasattr(self.invoice_det, 'serial_number'):
self.invoice_det.serial_number = self.serial_number
if self.vend_inv_no:
self.invoice_det.vend_inv_no = self.vend_inv_no
if typ == 'inquiry':
self.invoice_det.inquiry = dict(request=self.request,
response=self.response)
elif typ == 'payment':
self.invoice_det.payment = dict(request=self.request,
response=self.response)
elif typ == 'advice':
self.invoice_det.advice = dict(request=self.request,
response=self.response)
elif typ == 'info':
self.invoice_det.info = dict(request=self.request,
response=self.response)
flush_row(self.invoice_det)
class Other(object):
def __init_subclass__(self, **kwargs):
self.settings = get_settings() self.settings = get_settings()
vendor_produk = "vendor_produk" in kwargs and kwargs["vendor_produk"] or None
self.vendor_id = vendor_produk.partner_id self.vendor_id = vendor_produk.partner_id
self.produk_id = vendor_produk.produk_id self.produk_id = vendor_produk.produk_id
self.v_produk_kd = vendor_produk.kode self.v_produk_kd = vendor_produk.kode
self.produk_kd = vendor_produk.produk.kode
self.kategori = vendor_produk.produk.kategori.nama self.kategori = vendor_produk.produk.kategori.nama
self.bill_no = bill_no values = "values" in kwargs and kwargs["values"] or None
self.customer_id = customer_id # self.bill_no = bill_no
self.cust_trx = cust_trx self.customer_id = 'customer_id' in values and values['customer_id'] or None
self.cust_trx = 'cust_trx' in values and values['cust_trx'] or None
row = 'row' in values and values['row'] or None
self.partner_log = row self.partner_log = row
self.partner_log_id = row and row.id or None self.partner_log_id = row and row.id or None
...@@ -327,35 +111,10 @@ class VendorClass(object): ...@@ -327,35 +111,10 @@ class VendorClass(object):
self.response = None self.response = None
self.request = None self.request = None
def save_log(self, typ): # bill_no, customer_id = customer_id,
# if not self.partner_log: # cust_trx_id = cust_trx_id, row = row,
row = self.partner_log or PartnerLog() #
row.vendor_id = self.vendor_id
row.produk_id = self.produk_id
row.bill_no = self.bill_no
row.customer_id = self.customer_id
row.cust_trx = self.cust_trx
row.vend_trx = self.vend_trx
row.status = self.status
row.amt_buy = self.amt_buy
row.amt_sell = self.amt_sell
if typ == 'inquiry':
row.inquiry = dict(request=self.request,
response=self.response)
elif typ == 'payment':
row.payment = dict(request=self.request,
response=self.response)
elif typ == 'advice':
row.advice = dict(request=self.request,
response=self.response)
elif typ == 'info':
row.info = dict(request=self.request,
response=self.response)
flush_row(row)
self.partner_log = row
self.partner_log_id = row.id
def get_product(self): def get_product(self):
pass pass
......
#
# def vendor():
# return DBSession.query(Partner.id, Partner.nama) \
# .filter(Partner.is_vendor == 1).all()
#
#
# def customer():
# return DBSession.query(Partner.id, Partner.nama) \
# .filter(Partner.is_customer == 1).all()
#
#
# def produk():
# return DBSession.query(Produk.id, Produk.nama) \
# .join(ProdukKategori, Produk.kategori_id == ProdukKategori.id) \
# .filter(ProdukKategori.kode.in_(['e-pulsa', 'e-voucher', 'e-payment'])).all()
#
#
# def build_request(typ, values):
# produk_id = values['produk_id']
# vendor_id = values['vendor_id']
# bill_no = values['destination']
# customer_id = 'customer_id' in values and values['customer_id'] or None
# cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None
#
# vendor_product = PartnerProduk.query() \
# .join(Produk, PartnerProduk.produk_id == Produk.id) \
# .filter(PartnerProduk.partner_id == vendor_id,
# PartnerProduk.produk_id == produk_id).first()
# if not vendor_product:
# return dict(data=dict(error='Data Tidak Ditemukan'))
#
# row = None
# if "trx_id" in values and values['trx_id']:
# trx_id = int(values['trx_id'])
# row = PartnerLog.query().filter_by(id=trx_id).first()
#
# modules = import_module('.' + vendor_product.modules, 'agratek.api.merchant.views')
#
# cls_module = modules.Vendor(vendor_product, bill_no, customer_id,
# cust_trx_id, row)
#
# cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
# if cls:
# data = cls()
# result = dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.response
# result["url"] = cls_module.url
# else:
# result = dict(data=dict(error='Fungsi %s tidak ada' % typ,
# code=9999))
# return result
#
#
#
# @colander.deferred
# def deferred_vendor(node, kw):
# values = kw.get('vendor', [])
# return widget.SelectWidget(values=values)
#
#
# @colander.deferred
# def deferred_customer(node, kw):
# values = kw.get('customer', [])
# return widget.SelectWidget(values=values)
#
#
# @colander.deferred
# def deferred_produk(node, kw):
# values = kw.get('produk', [])
# return widget.SelectWidget(values=values)
import json
import colander
from deform import widget, Form, ValidationFailure
from opensipkd.base.models import Partner, flush_row
from opensipkd.base.views import BaseView
from opensipkd.pasar.models import Produk, PartnerLog, PartnerProduk, H2hArInvoice, H2hArInvoiceDet
from opensipkd.pasar.models.views import (deferred_produk, deferred_vendor,
deferred_customer)
from paste.httpexceptions import HTTPFound
from pyramid.view import view_config
from ..tools import get_settings, log, btn_purchase
from ..tools import btn_inquiry, btn_reset, btn_payment, btn_advice, btn_next
from .merchan import build_request
class AddSchema(colander.Schema):
customer_id = colander.SchemaNode(
colander.Integer(), title='Customer',
oid="customer_id", widget=deferred_customer)
cust_inv_no = colander.SchemaNode(
colander.String(), title='TRX Customer',
oid="cust_inv_no",
widget=widget.TextInputWidget()
)
produk_id = colander.SchemaNode(
colander.Integer(), title='Produk',
oid="produk_id", widget=deferred_produk)
id_pel = colander.SchemaNode(
colander.String(), title='No.Tujuan/ID Pelanggan',
oid="id_pel", widget=widget.TextInputWidget())
vendor_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
oid="vendor_id", widget=deferred_vendor)
vend_inv_no = colander.SchemaNode(
colander.String(), title='TRX Vendor',
missing=colander.drop,
oid="vend_inv_no",
widget=widget.TextInputWidget(css_class="readonly")
)
serial = colander.SchemaNode(
colander.String(), title='REF. NO',
missing=colander.drop,
oid="serial",
widget=widget.TextInputWidget(css_class="readonly")
)
f_result = colander.SchemaNode(
colander.String(), title='Result',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_request = colander.SchemaNode(
colander.String(), title='Request',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
f_response = colander.SchemaNode(
colander.String(), title='Response',
missing=colander.drop,
oid="result",
widget=widget.TextAreaWidget(rows=10, css_class="readonly")
)
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.Integer(), title='ID',
missing=colander.drop,
oid="id", widget=widget.HiddenWidget())
def form_validator(form, value):
pass
def get_form(request, class_form, buttons=None, row=None):
schema = class_form(validator=form_validator)
schema = schema.bind(vendor=Partner.get_vendor_list(),
produk=Produk.get_e_list(),
customer=Partner.get_customer_list())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_inquiry, btn_reset)
return Form(schema, buttons=buttons)
# def route_list(request):
# return HTTPFound(location=request.route_url('simkel-permohonan'))
form_params_edit = dict(scripts="""
$(document).ready(function(){
$(".tanggal").datepicker({format:"dd-mm-yyyy"});
$(".tanggal").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
$("#nip_penerima, #nopel").attr("readonly", true);
$(".readonly").attr("readonly", true);
});
""")
def get_invoice(values, vendor_produk):
invoice = H2hArInvoice.query() \
.filter_by(cust_inv_no=values['cust_inv_no']).first()
if not invoice:
invoice = H2hArInvoice()
invoice.from_dict(values)
flush_row(invoice)
invoice_det = H2hArInvoiceDet.query() \
.filter_by(ar_invoice_id=invoice.id, produk_id=values['produk_id']).first()
if not invoice_det:
invoice_det = H2hArInvoiceDet()
invoice_det.ar_invoice_id = invoice.id
invoice_det.vendor_id = values["vendor_id"]
invoice_det.produk_id = values["produk_id"]
invoice_det.id_pel = values["id_pel"]
invoice_det.amt_sell = vendor_produk.produk.harga
flush_row(invoice)
return invoice_det
def get_log(values, vendor_produk):
partner_log = PartnerLog()
partner_log.vendor_id = vendor_produk.partner_id
partner_log.customer_id = values["customer_id"]
partner_log.produk_id = vendor_produk.produk.id
# partner_log.cust_inv = dat["inv_no"]
partner_log.id_pel = values["id_pel"]
return partner_log
class ViewHome(BaseView):
@view_config(route_name='api-vendor-doc',
permission="api-vendor-doc",
renderer='templates/vendor_doc.pt')
def view_merchant_doc(self):
return dict()
@view_config(route_name='api-vendor-add',
permission="api-vendor-add",
renderer='templates/form.pt')
def view_home(self):
request = self.req
session = self.ses
form = get_form(request, AddSchema, (btn_inquiry, btn_purchase,
btn_payment, btn_advice, btn_next))
settings = get_settings()
if request.POST:
controls = request.POST.items()
try:
c = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form, params=form_params_edit)
values = dict(c.items())
result = None
vendor_produk = PartnerProduk.query() \
.join(Partner, Partner.id == PartnerProduk.partner_id) \
.filter(Partner.id == values['vendor_id']) \
.filter(Produk.id == values['produk_id']).first()
if 'inquiry' in request.POST:
invoice_det = get_log(values, vendor_produk)
result = build_request('inquiry', vendor_produk, invoice_det)
elif 'purchase' in request.POST:
invoice_det = get_invoice(values, vendor_produk)
result = build_request('payment', vendor_produk, invoice_det)
elif 'payment' in request.POST:
pass
# invoice_det = get_invoice(values, vendor_produk)
# result = build_request('payment', vendor_produk, invoice_det)
elif 'advice' in request.POST:
invoice_det = get_invoice(values, vendor_produk)
result = build_request('advice', vendor_produk, invoice_det)
elif 'info' in request.POST:
invoice, invoice_det = get_invoice(values, vendor_produk)
result = build_request('info', vendor_produk, invoice)
if result:
data = result
log.info(data)
# values['f_request'] = 'f_request' in result \
# and json.dumps(result['f_request'], indent=4) or ''
# values['f_response'] = 'f_response' in result \
# and json.dumps(result['f_response'], indent=4) or ''
#
# values['f_result'] = 'data' in result \
# and json.dumps(result['data'], indent=4) or ''
# values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
# values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
# values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
# if 'error' in data and data['error']:
# session.flash(data['error'], 'error')
form.render(values)
return dict(form=form, params=form_params_view)
values = dict(
vendor_id=3,
id_pel=1234567890,
cust_inv_no="C-iNV-123",
)
form.render(values)
return dict(form=form, params=form_params_edit)
def get_row(id):
return PartnerLog.query().filter_by(id=id).first()
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!