Commit d4d5fc90 by Solo Group

VSI

1 parent b42e9f0e
...@@ -27,17 +27,6 @@ class Vendor(VendorClass): ...@@ -27,17 +27,6 @@ class Vendor(VendorClass):
key = ":".join([self.mid, self.key]).encode() key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key).decode() self.auth = base64.b64encode(key).decode()
def set_response(self, data=None, message=None, code=999, typ="inquiry"):
if not data and message:
message = message and message or "Biller No Response"
data = dict(code=code,
message=message)
self.result = data
self.save_log(typ)
log.info("Result: %s" % data)
return data
def get_headers(self): def get_headers(self):
return {'Authorization': 'Bearer {key}'.format(key=self.auth)} return {'Authorization': 'Bearer {key}'.format(key=self.auth)}
...@@ -114,21 +103,21 @@ class Vendor(VendorClass): ...@@ -114,21 +103,21 @@ class Vendor(VendorClass):
return self.set_response(parsd) #parsd return self.set_response(parsd) #parsd
def gagal_transaksi(self, inq): # def gagal_transaksi(self, inq):
self.status = -2 # Try Other Vendor # self.status = -2 # Try Other Vendor
if inq: # if inq:
inq.update(dict(code=68, # inq.update(dict(code=68,
message="PENDING", # message="PENDING",
status="PENDING")) # status="PENDING"))
return self.set_response(data=inq, typ="payment") # return self.set_response(data=inq, typ="payment")
else: # else:
parsd = self.get_price() # parsd = self.get_price()
parsd.update(dict(code=68, # parsd.update(dict(code=68,
message="PENDING", # message="PENDING",
status="PENDING")) # status="PENDING"))
return self.set_response(data=parsd, typ="payment") # return self.set_response(data=parsd, typ="payment")
def get_price(self, inq=None): def get_price(self):
product_id = self.invoice_det.produk.id product_id = self.invoice_det.produk.id
if hasattr(self.invoice_det, "customer_id"): if hasattr(self.invoice_det, "customer_id"):
partner_id = self.invoice_det.customer_id partner_id = self.invoice_det.customer_id
...@@ -139,9 +128,9 @@ class Vendor(VendorClass): ...@@ -139,9 +128,9 @@ class Vendor(VendorClass):
self.discount = PartnerProduk.get_discount(partner_id, product_id) self.discount = PartnerProduk.get_discount(partner_id, product_id)
self.amt_sell = harga - self.discount self.amt_sell = harga - self.discount
return dict( return dict(
subtotal=harga, subtotal=int(harga),
discount=self.discount, discount=int(self.discount),
total=self.amt_sell total=int(self.amt_sell)
) )
def payment(self): def payment(self):
...@@ -151,19 +140,21 @@ class Vendor(VendorClass): ...@@ -151,19 +140,21 @@ class Vendor(VendorClass):
number=self.id_pel number=self.id_pel
) )
) )
self.request = params self.request = params
log.info("Payment Request: %s" % self.request) log.info("Payment Request: %s" % self.request)
self.save_log("payment") self.save_log("payment")
inq = None parsd = None
if self.vendor_produk.produk.kategori.kode in ["e-payment", "e-voucher"]: if self.vendor_produk.produk.kategori.kode in ["e-payment", "e-voucher"]:
inq = self.inquiry() parsd = self.inquiry()
if inq["code"]!=0: if parsd["code"]!=0:
return self.set_response() self.status=-3
return self.set_response(typ="payment",
message="Data Tagihan Tidah ditemukan")
url = self.get_url("/prepaid/purchase") if not parsd:
parsd = self.get_price()
url = self.get_url("/prepaid/purchase")
try: try:
resp = requests.post(url, data=json.dumps(params), verify=False, resp = requests.post(url, data=json.dumps(params), verify=False,
headers=self.get_headers(), timeout=15) headers=self.get_headers(), timeout=15)
...@@ -171,76 +162,66 @@ class Vendor(VendorClass): ...@@ -171,76 +162,66 @@ class Vendor(VendorClass):
resp = None resp = None
if not resp: if not resp:
self.gagal_transaksi(inq) self.status = 0
return self.set_pending(parsd)
#todo: dibuat seolah menjadi belum di transaksikan
#todo: membuat cron untuk melakukan pengecekan transaksi
try: try:
result = json.loads(resp.text) result = json.loads(resp.text)
self.response = result
log.info("Payment Response: %s" % self.response)
except: except:
result = resp and resp.text or {} result = resp.text
self.response = result
log.info("Payment Response: %s" % self.response)
self.status = 0
return self.set_pending(parsd)
self.response = result
log.info("Payment Response: %s" % self.response)
# odeo mengembalikan result dalam bentuk status # odeo mengembalikan result dalam bentuk status
# 0200 ok # 0200 ok
# 0400 bad request # 0400 bad request
# 0401 auth error # 0401 auth error
parsd = {}
if resp.status_code == 200 and type(result) is dict: # 0200 if resp.status_code == 200 and type(result) is dict: # 0200
data = "data" in result and result["data"] or {} data = "data" in result and result["data"] or {}
if not data: if not data:
return self.gagal_transaksi(inq) self.status = 0
return self.set_pending(parsd)
self.vend_inv_no = "order_id" in data and data["order_id"] or self.vend_inv_no
self.amt_buy = "price" in data and data["price"] or self.amt_buy
if "rc" in data: if "rc" in data:
parsd["code"] = int(data["rc"])
if data["rc"] == "13": if data["rc"] == "13":
parsd["status"] = "FAILED" return self.set_failed(parsd)
self.status = -3
elif data["rc"] == "67": elif data["rc"] == "67":
parsd["status"] = "DOUBLE" return self.set_double(parsd)
self.status = -3 # Gagal Karena Pernah Transaksi
elif data["rc"] == "68": elif data["rc"] == "68":
parsd["status"] = "PENDING"
self.status = -1 # pending self.status = -1 # pending
return self.set_pending(parsd)
if self.status == -1:
parsd["message"] = "PENDING"
else:
parsd["message"] = "FAILED"
# Status ini hanya sementara nunggu refund
# Status -2 ini harus dicari solusi mencari vendor lain
else: else:
self.status = 1
parsd["code"] = 0
parsd["status"] = "SUCCESS"
self.serial_number = 'serial_number' in data and data["serial_numner"] \ self.serial_number = 'serial_number' in data and data["serial_numner"] \
or self.serial_number or self.serial_number
return self.set_success(parsd)
self.vend_inv_no = "order_id" in data and data["order_id"] or self.vend_inv_no
self.amt_buy = "price" in data and data["price"] or self.amt_buy
elif resp.status_code == 400:
if not inq:
if parsd["code"] == 0 or parsd["code"] == 68:
parsd = self.get_price(inq)
else:
inq.update(parsd)
parsd = inq
#
# self.result = parsd
# log.info("Payment Result: %s" % self.result)
return self.set_response(parsd, 'payment')
elif resp.status_code == 400: # BAD REQUEST
self.status = -3 self.status = -3
data = "data" in result and result["data"] or None
return dict(code=13, message = ""
message="FAILED") if data and "error" in data:
msg = data["error"][0]
else: pos = msg.find("Sisa saldo")
self.status = -1 message=pos > -1 and msg[:pos] or msg
return dict(code=68, return self.set_failed(parsd, message=message)
message="PENDING")
elif resp.status_code == 401:
self.status = -2
#todo: create cron yang status -2
return self.set_pending(parsd)
def advice(self): def advice(self):
if not self.v_produk_kd or not self.id_pel or not self.invoice_det: if not self.v_produk_kd or not self.id_pel or not self.invoice_det:
......
...@@ -52,6 +52,56 @@ class VendorClass(object): ...@@ -52,6 +52,56 @@ class VendorClass(object):
and invoice_det.serial_number or None and invoice_det.serial_number or None
self.amt_buy = 0 self.amt_buy = 0
def set_response(self, data=None, message=None, code=999, typ="inquiry"):
if not data and message:
message = message and message or "Biller No Response"
data = dict(code=code,
message=message)
self.result = data
self.save_log(typ)
log.info("Result: %s" % data)
return data
def set_success(self, data=None):
self.status = 1
typ = "payment"
data = data and data or {}
data.update(dict(code=0,
message="SUCCESS",
status="SUCCESS"))
return self.set_response(data, typ=typ)
def set_failed(self, data=None, message=None):
typ = "payment"
self.status = -3
data = data and data or {}
message = message and message or "FAILED"
data.update(dict(code=13,
message=message,
status="FAILED"))
return self.set_response(data, typ=typ)
def set_double(self, data=None, message=None):
self.status = -3
typ = "payment"
message = message and message or "DOUBLE"
data = data and data or {}
data.update(dict(code=67,
message=message,
status="FAILED"))
return self.set_response(data, typ=typ)
def set_pending(self, data=None, message=None):
data = data and data or {}
typ = "payment"
message = message and message or "PENDING"
data.update(dict(code=68,
status="PENDING",
message=message)
)
return self.set_response(data, typ=typ)
def save_log(self, typ): def save_log(self, typ):
# if not self.partner_log: # if not self.partner_log:
# row = self.partner_log or PartnerLog() # row = self.partner_log or PartnerLog()
......
...@@ -283,10 +283,12 @@ class ViewHome(BaseView): ...@@ -283,10 +283,12 @@ class ViewHome(BaseView):
if result: if result:
values.update(result) values.update(result)
if result["f_result"]["code"]==0: if result["f_result"]["code"] == 0:
session.flash("Sukses") session.flash(result["f_result"]["message"])
else:
session.flash(result["f_result"]["message"], "error")
else: else:
session.flash(result["f_result"]["message"], "error") session.flash("No Result Found", "error")
form.render(values) form.render(values)
return dict(form=form, params=form_params_view) return dict(form=form, params=form_params_view)
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!