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)
# """
# 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)
......@@ -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>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!