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
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-doc,/api/vendor/doc,Doc 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
......@@ -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-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-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.tools.api import auth_from_rpc, check_token_rpc, update_token, JsonRpcParameterNotFound
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
from opensipkd.base.views import (BaseView)
from opensipkd.pasar.models.views import deferred_vendor, deferred_customer, deferred_produk
"""
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
from .vendor import VendorClass
from ..tools import log
import urllib3
urllib3.disable_warnings()
class Vendor(VendorClass):
def __init__(self, vendor_produk, bill_no, customer_id=None,
cust_trx=None, row=None):
VendorClass.__init__(self, vendor_produk, bill_no, customer_id,
cust_trx, row)
def __init__(self, vendor_produk, invoice_det):
VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
# id_pel, customer_id, cust_trx, 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
......@@ -40,30 +41,34 @@ class Vendor(VendorClass):
return resp
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,
message='Parameter tidak lengkap')
if self.v_produk_kd[:3] =='PLN' and self.v_produk_kd != 'PLNPASCA':
params = dict(
number=self.bill_no
number=self.id_pel
)
self.request = params
log.info("ODEO Inquiry Request: %s" % params)
self.save_log("inquiry")
resp = self.request_get(params, '/prepaid/pln/inquiry')
else:
params = dict(
denom=self.v_produk_kd,
number=self.bill_no
number=self.id_pel
)
self.request = params
self.save_log("inquiry")
log.info("ODEO Inquiry Request: %s" % params)
resp = self.request_get(params, '/postpaid/inquiry')
try:
result = json.loads(resp.text)
except:
result = resp.text
log.info("ODEO Inquiry Response: %s" % result)
if resp.ok:
self.status = 1 # sukses
......@@ -80,19 +85,17 @@ class Vendor(VendorClass):
message="Other Error")
self.response = result
self.save_log('inquiry')
# self.save_log('inquiry')
return parsd
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(
denom=self.v_produk_kd,
number=self.bill_no
number=self.id_pel
)
)
self.request = params
log.info("ODEO Payment Request: %s" % self.request)
self.save_log("payment")
resp = self.request_post(params, '/prepaid/purchase')
try:
......@@ -100,49 +103,66 @@ class Vendor(VendorClass):
except:
result = resp.text
self.response = result
log.info("ODEO Payment Response: %s" % self.response)
if resp.ok:
self.status = 1 # sukses
# self.status = 1 # sukses
data = "data" in result and result["data"] or None
if data:
self.vend_trx = "order_id" in data and data["order_id"] or None
self.amt_buy = "price" in data and data["price"] or 0
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
parsd = dict(code=resp.status_code,
message=result)
message=result,
status="FAILED")
else:
self.status = -4
self.status = -4 # Other Error
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')
txt = "ODEO PARSING: {d}".format(d=json.dumps(parsd))
log.info(txt)
return parsd
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,
message='Parameter tidak lengkap')
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)
params = None
self.save_log("advice")
resp = self.request_get(params, url)
self.request = url
else:
params = dict(
data=dict(
denom=self.v_produk_kd,
number=self.bill_no
number=self.id_pel
)
)
self.request = params
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:
result = json.loads(resp.text)
except:
......@@ -167,30 +187,36 @@ class Vendor(VendorClass):
return parsd
def pars_data(self, data):
result = {}
result["trx_id"] = self.partner_log_id
result["bill_no"] = self.bill_no
result["cust_trx"] = self.cust_trx
result["vend_trx"] = self.vend_trx
result['harga'] = self.amt_buy
result = dict()
# result["trx_id"] = self.partner_log_id
# result["id_pel"] = self.id_pel
# result["cust_trx"] = self.cust_trx
# result["vend_trx"] = self.vend_trx
# result['harga'] = self.amt_buy
if not data:
return result
if "rc" in data:
if data["rc"] == "13":
self.status = -1
result["status"] = "FAILED"
self.status = -2
elif data["rc"] == "68":
result["status"] = "PENDING"
self.status = 0 #pending
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"]:
result['nopel'] = data["subscriber_id"]
else:
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"]:
result['nopel'] = data["subscriber_id"]
result['id_pel'] = data["subscriber_id"]
if "name" in data and data["name"]:
result['nama'] = data["name"]
if "subscriber_name" in data and data["subscriber_name"]:
......@@ -201,14 +227,13 @@ class Vendor(VendorClass):
result['subtotal'] = data["subtotal"]
if "discount" in data and data["discount"]:
result['discount'] = data["discount"]
if "total" in data and data["total"]:
result['total'] = data["total"]
if "tariff" in data and data["tariff"]:
if "tarif" in data and data["tariff"]:
result['tarif'] = data["tariff"]
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:
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
from . import BaseView # , save_file_upload
from ..models import (DBSession, flush_row, Satuan)
from ..models import (Produk, ProdukCategory)
from ..models import (Produk, ProdukKategori)
from ..tools import (btn_reset,
btn_cancel, btn_delete, btn_save)
......@@ -74,7 +74,7 @@ def form_validator(form, value):
def get_form(request, class_form, buttons=None, row=None):
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())
schema.request = request
if row:
......
......@@ -4,13 +4,13 @@ import colander
from datatables import ColumnDT
from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables
from opensipkd.pasar.models.produk import (deferred_vendor, deferred_produk,
deferred_departemen, PartnerProduk)
from opensipkd.pasar.models.views import (deferred_vendor, deferred_produk,
deferred_departemen)
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
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 ..tools import (btn_reset, btn_cancel, btn_delete, btn_save)
......
......@@ -15,7 +15,7 @@
<li>
<a href="${request._host}/api/vendor/add">
<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>
</li>
<li>
......@@ -24,5 +24,25 @@
<span class="menu-item-parent">List Vendor Invoice</span>
</a>
</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>
</html>
......@@ -7,7 +7,6 @@ Invoice To Customer
import hashlib
import json
import logging
import re
from datetime import datetime
from importlib import import_module
......@@ -16,290 +15,21 @@ import colander
import requests
import xmltodict
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.view import view_config
from . import BaseView # , save_file_upload
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,
btn_inquiry, btn_advice, btn_payment)
log = logging.getLogger(__name__)
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)
from ..tools import log
class VendorClass(object):
def __init__(self, vendor_produk, bill_no, customer_id=None,
cust_trx=None, row=None):
def __init__(self, vendor_produk, invoice_det, **kwargs):
"""
:param vendor_produk:
:param bill_no:
......@@ -307,14 +37,68 @@ class VendorClass(object):
:param cust_trx:
: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()
vendor_produk = "vendor_produk" in kwargs and kwargs["vendor_produk"] or None
self.vendor_id = vendor_produk.partner_id
self.produk_id = vendor_produk.produk_id
self.v_produk_kd = vendor_produk.kode
self.produk_kd = vendor_produk.produk.kode
self.kategori = vendor_produk.produk.kategori.nama
self.bill_no = bill_no
self.customer_id = customer_id
self.cust_trx = cust_trx
values = "values" in kwargs and kwargs["values"] or None
# self.bill_no = bill_no
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_id = row and row.id or None
......@@ -327,35 +111,10 @@ class VendorClass(object):
self.response = None
self.request = 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
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)
# bill_no, customer_id = customer_id,
# cust_trx_id = cust_trx_id, row = row,
#
flush_row(row)
self.partner_log = row
self.partner_log_id = row.id
def get_product(self):
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!