Commit d0ce9351 by Solo Group

test_odeo

1 parent ebf37c00
...@@ -11,9 +11,9 @@ import urllib3 ...@@ -11,9 +11,9 @@ import urllib3
urllib3.disable_warnings() urllib3.disable_warnings()
class Vendor(VendorClass): class Vendor(VendorClass):
def __init__(self, vendor_produk, bill_no, customer_id=None, def __init__(self, vendor_produk, bill_no, customer_id=None,
cust_trx_id=None, row=None): cust_trx=None, row=None):
VendorClass.__init__(self, vendor_produk, bill_no, customer_id, VendorClass.__init__(self, vendor_produk, bill_no, customer_id,
cust_trx_id, row) cust_trx, row)
settings = get_settings() settings = get_settings()
self.mid = 'odeo_mid' in settings and settings['odeo_mid'] or None self.mid = 'odeo_mid' in settings and settings['odeo_mid'] or None
self.key = 'odeo_key' in settings and settings['odeo_key'] or None self.key = 'odeo_key' in settings and settings['odeo_key'] or None
...@@ -25,32 +25,33 @@ class Vendor(VendorClass): ...@@ -25,32 +25,33 @@ class Vendor(VendorClass):
def request_post(self, params, url=None): def request_post(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)} headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
data = json.dumps(params) data = json.dumps(params)
url = url and self.url+url or self.url self.url = url and self.url + url or self.url
resp = None
with requests.session(): with requests.session():
resp = requests.post(url, data=data, resp = requests.post(self.url, data=data,
verify=False, headers=headers) verify=False, headers=headers)
return resp return resp
def request_get(self, params, url=None): def request_get(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)} headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
url = url and self.url+url or self.url self.url = url and self.url + url or self.url
with requests.session(): with requests.session():
resp = requests.get(url, params=params, resp = requests.get(self.url, params=params,
verify=False, headers=headers) verify=False, headers=headers)
return resp return resp
def inquiry(self): def inquiry(self):
# PLN ONLY
if not self.v_produk_kd or not self.bill_no: if not self.v_produk_kd or not self.bill_no:
return return dict(code=9999,
b message='Parameter tidak lengkap')
if self.v_produk_kd =='PLN' and self.v_produk_kd != 'PLNPASCA': if self.v_produk_kd =='PLN' and self.v_produk_kd != 'PLNPASCA':
params = dict( params = dict(
data=dict( data=dict(
number=self.bill_no number=self.bill_no
) )
) )
self.request = params self.request = json.dumps(params)
self.save_log("inquiry") self.save_log("inquiry")
resp = self.request_get(params, '/prepaid/pln/inquiry') resp = self.request_get(params, '/prepaid/pln/inquiry')
else: else:
...@@ -58,118 +59,340 @@ class Vendor(VendorClass): ...@@ -58,118 +59,340 @@ class Vendor(VendorClass):
denom=self.v_produk_kd, denom=self.v_produk_kd,
number=self.bill_no number=self.bill_no
) )
self.request = params self.request = json.dumps(params)
self.save_log("inquiry") self.save_log("inquiry")
resp = self.request_get(params, '/postpaid/inquiry') resp = self.request_get(params, '/postpaid/inquiry')
content = None content = resp.text
if resp and resp.text:
content = json.loads(resp.text)
if resp.ok: if resp.ok:
# todo mapping content result = json.loads(content)
"""
{
"status": "SUCCESS",
"data": {
"number": "XXX",
"subscriber_id": "XXX",
"name": "XXX",
"tariff": "XXX",
"power": "XXX"
},
"message": ""
}"""
result = content
else: else:
result = dict(code=resp.status_code, result = dict(code=resp.status_code,
message=resp.text) message=resp.text)
self.response = content self.response = content
self.save_log('inquiry') self.save_log('inquiry')
return result return self.pars_data(result)
def payment(self): def payment(self):
if not self.v_produk_kd or not self.bill_no: if not self.v_produk_kd or not self.bill_no:
return return dict(code=9999,
message='Parameter tidak lengkap')
params = dict( params = dict(
data=dict( data=dict(
denom=self.v_produk_kd, denom=self.v_produk_kd,
number=self.bill_no number=self.bill_no
) )
) )
self.request = params self.request = json.dumps(params)
self.save_log("payment") self.save_log("payment")
resp = self.request_post(params, '/prepaid/purchase') resp = self.request_post(params, '/prepaid/purchase')
content = None content = resp.text
if resp and resp.text:
content = json.loads(resp.text)
if resp.ok: if resp.ok:
#todo mapping content result = json.loads(content)
"""
{
"status": "SUCCESS",
"data": {
"order_id": 1,
"price": 5675
},
"message": ""
}
{
"status": "BAD_REQUEST",
"data": {
"errors": [
"ERROR_MESSAGE_1",
"ERROR_MESSAGE_2",
"ERROR_MESSAGE_ETC"
]
},
"message": ""
}
{
"status": "UNAUTHORIZED",
"data": {
"errors": [
"Unauthorized"
]
},
"message": ""
}
"""
result = content
else: else:
content = json.loads(resp.text)
result = dict(code=resp.status_code, result = dict(code=resp.status_code,
message=resp.text) message=resp.text)
self.response = content self.response = content
self.save_log('payment') self.save_log('payment')
return result return self.pars_data(result)
def advice(self): def advice(self):
if not self.v_produk_kd or not self.bill_no: if not self.v_produk_kd or not self.bill_no or not self.partner_log_id:
return return dict(code=9999,
message='Parameter tidak lengkap')
#todo: product category e-payment '/order/{order_id}' if self.kategori == 'e-payment':
params = dict( order_id = self.partner_log.vend_trx
data=dict( url = '/order/{order_id}'.format(order_id=order_id)
denom=self.v_produk_kd, params = None
number=self.bill_no self.save_log("advice")
resp = self.request_get(params, url)
else:
params = dict(
data=dict(
denom=self.v_produk_kd,
number=self.bill_no
)
) )
) self.request = params
self.request = params self.save_log("advice")
self.save_log("advice") resp = self.request_get(params, '/prepaid/purchase-get')
resp = self.request_get(params, '/prepaid/purchase-get') content = None
content = None
if resp and resp.text:
content = json.loads(resp.text)
content = resp.text
if resp.ok: if resp.ok:
#todo mapping content result = json.loads(content)
result = content
else: else:
result = dict(code=resp.status_code, result = dict(code=resp.status_code,
message=resp.text) message=resp.text)
data = 'data' in result and result['data'] or None
if data:
self.vend_trx = 'order_id' in data and data['order_id'] or self.vend_trx
self.response = content self.response = content
self.save_log('payment') self.save_log('advice')
return result return self.pars_data(result)
def pars_data(self, data):
# https://api.odeo.co.id/v1/affiliate/prepaid/purchase
"""
{
"data": {
"denom": "TSEL5",
"number": "0812121212"
}
}
Response
{
"status": "SUCCESS",
"data": {
"order_id": 1,
"price": 5675
},
"message": ""
}
{
"status": "BAD_REQUEST",
"data": {
"errors": [
"ERROR_MESSAGE_1",
"ERROR_MESSAGE_2",
"ERROR_MESSAGE_ETC"
]
},
"message": ""
}
{
"status": "UNAUTHORIZED",
"data": {
"errors": [
"Unauthorized"
]
},
"message": ""
}
"""
# GET https://api.odeo.co.id/v1/affiliate/prepaid/pln/inquiry
"""
Request
{
"data": {
"number": "0812121212"
}
}
Response
{
"status": "SUCCESS",
"data": {
"number": "XXX",
"subscriber_id": "XXX",
"name": "XXX",
"tariff": "XXX",
"power": "XXX"
},
"message": ""
}
"""
# GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=BPJSKES1&number=XXXX
"""
{
"status": "SUCCESS",
"data": {
"subscriber_id": "XXX",
"subscriber_name": "XXX",
"ref_id": "XXX",
"inquiries": {
"branch_code": "-",
"branch_name": "XXX",
"month_counts": 1,
"participant_counts": 3,
"base_price": 154200,
"bill_rest": 0,
"admin": 2500
},
"subtotal": 156700,
"discount": 600,
"total": 156100
},
"message": ""
}
"""
# GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=PLNPASCA&number=XXXX
"""
{
"status": "SUCCESS",
"data": {
"subscriber_id": "XXX",
"subscriber_name": "XXX",
"ref_id": "XXX",
"tariff": "R1/1300VA",
"inquiries": [
{
"period": "2016-08",
"base_price": 300000,
"fine": 0,
"admin_fee": 2500
}
],
"subtotal": 302500,
"discount": 900,
"total": 301600
},
"message": ""
}
"""
# GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=PAM...&number=XXXX
"""
{
"status": "SUCCESS",
"data": {
"subscriber_id": "XXX",
"subscriber_name": "XXX",
"ref_id": "XXX",
"inquiries": [
{
"period": "XXX",
"base_price": 300000,
"fine": 0,
"admin_fee": 2500,
"meter_changes": "XXX"
}
],
"subtotal": 302500,
"discount": 900,
"total": 301600
},
"message": ""
}
"""
# GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=PGN&number=XXXX
"""
{
"status": "SUCCESS",
"data": {
"subscriber_id": "XXX",
"subscriber_name": "XXX",
"ref_id": "XXX",
"inquiries": {
"period": "XXX",
"meter_changes": "XXX",
"usages": "XXX",
"base_price": 300000,
"admin_fee": 2500
},
"subtotal": 302500,
"discount": 900,
"total": 301600
},
"message": ""
}
"""
# Multi Finance
# GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=XXX&number=XXXX
"""
{
"status": "SUCCESS",
"data": {
"subscriber_id": "XXX",
"subscriber_name": "XXX",
"ref_id": "XXX",
"inquiries": {
"installment": "XXX",
"due_date": "XXX",
"platform": "XXX",
"base_price": 300000,
"coll_fee": 0,
"fine": 75000,
"admin": 2000
},
"subtotal": 377000,
"discount": 900,
"total": 376100
},
"message": ""
}
"""
# PLN Pasca
# GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=XXXX&number=XXXX
"""
{
"status": "SUCCESS",
"data": {
"subscriber_id": "XXX",
"subscriber_name": "XXX",
"ref_id": "XXX",
"inquiries": {
"period": "XXX",
"base_price": 300000,
"admin_fee": 1500
},
"subtotal": 301500,
"discount": 900,
"total": 300600
},
"message": ""
}
"""
"""
POST https://api.odeo.co.id/affiliate_url
{
"order_id": 1,
"status": "COMPLETED",
"message": "XXX"
"signature": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
sha256({order_id} + {MID} + {SECRET_KEY} + {status}) [COMPLETED/REFUNDED]
sha256({MID} + {SECRET_KEY} + {status}) [BROADCAST_NEW_PRICE]
{
"new_prices": {
"TSEL5": 5000
},
"status": "BROADCAST_NEW_PRICE",
"message": "XXX",
"signature": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
"""
# GET https://api.odeo.co.id/v1/affiliate/order/order_id (Cek status)
"""
{
"order_id": 123,
"name": "Telkomsel 5",
"msisdn": "08xx",
"serial_number": "XXX",
"status": "COMPLETED",
"price": 5000
}
"""
return {
"trx_id": self.partner_log_id,
"bill_no": self.bill_no,
"cust_trx": self.cust_trx,
"vend_trx": "order_id" in data and data["order_id"] or self.vend_trx,
"nama": "nama" in data and data["nama"] or "NO-NAME",
"pokok": "tagihan" in data and data["tagihan"] or 0,
"denda": "denda" in data and data["denda"] or 0,
"admin": "admin" in data and data["admin"] or 0,
"total": "total" in data and data["total"] or 0,
"ppn": "ppn" in data and data["ppn"] or 0,
"ref_no": "refnum" in data and data["refnum"] or "",
"jml_bulan": "bulan" in data and data["bulan"] or "",
"tgh_bulan": "blth" in data and data["blth"] or "",
"tarif": "tarif" in data and data["tarif"] or "",
"tgl_bayar" : "date" in data and data["date"] or "",
"info" : "info1" in data and data["info1"] or "",
"stand_meter" : "standmeter" in data and data["standmeter"] or "",
}
...@@ -52,7 +52,7 @@ def build_request(typ, values): ...@@ -52,7 +52,7 @@ def build_request(typ, values):
.filter(PartnerProduk.partner_id == vendor_id, .filter(PartnerProduk.partner_id == vendor_id,
PartnerProduk.produk_id == produk_id).first() PartnerProduk.produk_id == produk_id).first()
if not vendor_product: if not vendor_product:
return dict(error='Data Tidak Ditemukan') return dict(data = dict(error='Data Tidak Ditemukan'))
row = None row = None
if "trx_id" in values and values['trx_id']: if "trx_id" in values and values['trx_id']:
...@@ -63,36 +63,48 @@ def build_request(typ, values): ...@@ -63,36 +63,48 @@ def build_request(typ, values):
cls_module = modules.Vendor(vendor_product, bill_no, customer_id, cls_module = modules.Vendor(vendor_product, bill_no, customer_id,
cust_trx_id, row) cust_trx_id, row)
if typ=='inquiry':
result = hasattr(cls_module, typ) and cls_module.inquiry() or None cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
if result: if cls:
result["f_request"] = cls_module.request data = cls()
result["f_response"] = cls_module.response result = dict(data=data)
result["f_request"] = cls_module.request
return result result["f_response"] = cls_module.response
result["url"] = cls_module.url
elif typ=='payment':
result = cls_module.payment()
if result:
result["f_request"] = cls_module.request
result["f_response"] = cls_module.response
return result
elif typ == 'advice':
result = hasattr(cls_module, typ) and cls_module.advice() or None
if result :
result["f_request"] = cls_module.request
result["f_response"] = cls_module.response
return result
elif typ == 'info':
result = hasattr(cls_module, typ) and cls_module.info() or None
if result:
result["f_request"] = cls_module.request
result["f_response"] = cls_module.reesponse
return result
else: else:
return dict(error='Function %s tidak ditemukan' % typ) result = dict(data=dict(error='Fungsi %s tidak ada' % typ,
code=9999))
return result
# if typ=='inquiry':
# data = cls_module.inquiry()
# result = dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.response
# return result
#
# elif typ=='payment':
# data = cls_module.payment()
# result = dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.response
# return result
#
# elif typ == 'advice':
# data = hasattr(cls_module, typ) and cls_module.advice() or None
# result = dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.response
# return result
#
# elif typ == 'info':
# data = hasattr(cls_module, typ) and cls_module.info() or None
# result = dict(data=data)
# result["f_request"] = cls_module.request
# result["f_response"] = cls_module.reesponse
# return result
# else:
# return dict(error='Function %s tidak ditemukan' % typ)
@colander.deferred @colander.deferred
...@@ -284,7 +296,9 @@ class ViewHome(BaseView): ...@@ -284,7 +296,9 @@ class ViewHome(BaseView):
values = dict(c.items()) values = dict(c.items())
# if 'trx_id' not in values or not values['trx_id']: # if 'trx_id' not in values or not values['trx_id']:
# values['trx_id'] = get_random_number(10) # values['trx_id'] = get_random_number(10)
result = [] # result = build_request('inquiry', values)
#
result = None
if 'inquiry' in request.POST: if 'inquiry' in request.POST:
result = build_request('inquiry', values) result = build_request('inquiry', values)
elif 'payment' in request.POST: elif 'payment' in request.POST:
...@@ -296,16 +310,23 @@ class ViewHome(BaseView): ...@@ -296,16 +310,23 @@ class ViewHome(BaseView):
elif 'info' in request.POST: elif 'info' in request.POST:
result = build_request('info', values) result = build_request('info', values)
if not result: # if not result:
session.flash('Data Tidak Ditemukan', 'error') # session.flash('Data Tidak Ditemukan', 'error')
if result and 'error' in result: if result and 'data' in result:
session.flash(result['error'], 'error') 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 ''
else: values['f_result'] = 'data' in result \
values['result'] = json.dumps(result, indent=4) and json.dumps(result['data'], indent=4) or ''
values['ref_no'] = 'ref_no' in result and result["ref_no"] or None values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
values['trx_id'] = 'trx_id' in result and result['trx_id'] or None 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) form.render(values)
return dict(form=form, params=form_params_view) return dict(form=form, params=form_params_view)
...@@ -314,7 +335,7 @@ class ViewHome(BaseView): ...@@ -314,7 +335,7 @@ class ViewHome(BaseView):
class VendorClass(object): class VendorClass(object):
def __init__(self, vendor_produk, bill_no, customer_id=None, def __init__(self, vendor_produk, bill_no, customer_id=None,
cust_trx_id=None, row=None): cust_trx=None, row=None):
""" """
:param cid: :param cid:
merupakan customer id seperti MSN dan atu id pelanggaan merupakan customer id seperti MSN dan atu id pelanggaan
...@@ -325,11 +346,12 @@ class VendorClass(object): ...@@ -325,11 +346,12 @@ class VendorClass(object):
self.produk_id = vendor_produk.produk_id self.produk_id = vendor_produk.produk_id
self.bill_no = bill_no self.bill_no = bill_no
self.customer_id = customer_id self.customer_id = customer_id
self.cust_trx_id = cust_trx_id self.cust_trx = cust_trx
self.vend_trx = None
self.response = None self.response = None
self.request = None self.request = None
self.partner_log = row self.partner_log = row
self.partner_log_id = None self.partner_log_id = row and row.id or None
self.v_produk_kd = vendor_produk.kode self.v_produk_kd = vendor_produk.kode
self.kategori = vendor_produk.produk.kategori.nama self.kategori = vendor_produk.produk.kategori.nama
...@@ -340,7 +362,8 @@ class VendorClass(object): ...@@ -340,7 +362,8 @@ class VendorClass(object):
row.produk_id = self.produk_id row.produk_id = self.produk_id
row.bill_no = self.bill_no row.bill_no = self.bill_no
row.customer_id = self.customer_id row.customer_id = self.customer_id
row.cust_trx_id = self.cust_trx_id row.cust_trx = self.cust_trx
row.vend_trx = self.vend_trx
if typ == 'inquiry': if typ == 'inquiry':
row.inquiry = dict(request=self.request, row.inquiry = dict(request=self.request,
response=self.response) response=self.response)
......
import unittest
import transaction
from agratek.api.merchant.views.vendor import build_request
from opensipkd.base.models import Partner
from opensipkd.pasar.models import PartnerProduk, Produk
from pyramid.paster import get_appsettings
from pyramid_rpc.jsonrpc import JsonRpcError
from pyramid import testing
class TestOdeo(unittest.TestCase):
def setUp(self):
settings = get_appsettings('test.ini', name='main')
self.config = testing.setUp(settings=settings)
# self.config.include('..models')
# self.config.include('..routes')
#session_factory = self.config.registry['dbsession_factory']
#self.session = get_tm_session(session_factory, transaction.manager)
#
# self.config = testing.setUp()
# from pyramid.paster import get_appsettings
from opensipkd.base import main
app = main({}, **settings)
def test_vendor(self):
"""
Test that it can sum a list of integers
"""
produk_kd = 'TS-5'
bill_no = '081311045668'
partner_kd = 'ODEO'
vendor = Partner.query_kode(partner_kd).first()
produk = Produk.query_kode(produk_kd).first()
if not vendor or not produk:
raise JsonRpcError(message="Vendor Not Found")
values = dict(vendor_id = vendor.id,
produk_id = produk.id,
destination=bill_no)
result = build_request('payment', values)
for r in result:
print(r,":", result[r])
if __name__ == '__main__':
unittest.main()
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!