Commit 334fd32a by aa.gusti

pln -odeo

1 parent 9dd15f42
import json
import logging
from datetime import datetime
import requests
import xmltodict
from agratek.api.merchant.views.vendor import sha256
from opensipkd.base.models import Partner, flush_row
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid.view import view_config
from ..tools import get_settings, get_jsonrpc
log = logging.Logger(__name__)
def update_harga(p, k, v):
row = PartnerProduk.query() \
.filter_by(kode=k, partner_id=p.id).first()
if not row:
row = PartnerProduk()
row.kode = k
row.partner_id = p.id
row.created = datetime.now()
else:
row.updated = datetime.now()
row.harga = v
flush_row(row)
return True
def proses_odeo(data):
settings = get_settings()
mid = 'odeo_mid' in settings and settings["odeo_mid"] or None
key = 'odeo_key' in settings and settings["odeo_key"] or None
partner = Partner.query_kode("ODEO").first()
status = str(data["status"])
if status == "BROADCAST_NEW_PRICE":
signature = sha256("{mid}{key}{status}".format(
mid=mid, key=key, status=status))
if signature != data["signature"]:
log.info("Signature Vendor Different")
log.info("local %s, vendor %s" % (signature, data["signature"]))
return dict(error="Signature different")
new_price = data["new_prices"]
for k in new_price:
v = new_price[k]
update_harga(partner, k, v)
return dict(success=True)
else:
order_id = str(data["order_id"])
signature = sha256("{order_id}{mid}{key}{status}".format(
order_id=order_id, mid=mid, key=key, status=status))
if signature != data["signature"]:
log.info("Signature Vendor Different")
log.info("local %s, vendor %s" % (signature, data["signature"]))
return dict(error="Signature Different")
order = H2hArInvoiceDet.query() \
.filter(H2hArInvoiceDet.vendor_id == partner.id,
H2hArInvoiceDet.vend_inv_no == str(order_id)).first()
if order:
if status == "COMPLETED":
order.status = 1
else:
order.status = -3
order.notify = dict(post=data)
if "sn" in data and data["sn"]:
order.serial_number = data["sn"]
else:
message = 'message' in data and data["message"] or ""
if message:
loc = message.find("SN: ")
if loc>-1:
sn = message[loc+4:loc+28]
order.serial_number=sn
flush_row(order)
# todo: add to customer notify table
# todo: create cron for notify
# proses jika status 1 notify ada isinya tapi belum ada field result
# todo: create cron torecurring order to other vendor
# jika status = -2 proses vendor yang lain
callback_merchant(order)
return order
def callback_merchant(order):
# Callback to merchant
invoice = order.invoice
customer = invoice.customer
if customer and customer.website:
url = customer.website
users = customer.users
status = order.status == 1 and "SUCCESS" \
or order.status > -2 and "FAILED" \
or "PENDING"
key = invoice.cust_inv_no + users.user_name + users.api_key + status
signature = sha256(key)
data = []
produk = []
dat = dict(
invoice_no=invoice.cust_inv_no,
signature=signature)
discount = order.discount and order.discount or 0
produk.append(dict(
denom=order.produk.kode,
id_pel=order.id_pel,
subtotal=order.amt_sell + discount,
discount=discount,
total=order.amt_sell,
status=status,
serial_number=order.serial_number
))
dat.update(produk=produk)
data.append(dat)
js = get_jsonrpc(method="notify", params=dict(data=data))
log.info("Notify: %s %s" %(url, js))
try:
with requests.session():
requests.post(url, data=data, timeout=10)
except:
pass
@view_config(route_name='api-vendor-notify', renderer='json')
def api_vendor_notify(request):
vendor_nm = request.matchdict['name']
if vendor_nm == "odeo":
data = json.loads(request.text)
order = proses_odeo(data)
@view_config(route_name='api-vendor-test', renderer="string")
def vendor_test(request):
params = request.params
vendor = request.matchdict['vendor']
result = dict(a=1)
request.response.content_type = "text / xml"
if vendor == "vsi":
controls = request.GET.items()
params = dict(controls)
params["status"] = "SUCCESS"
result = dict(root=params)
result = xmltodict.unparse(result)
elif vendor == "odeo":
params = json.loads(request.text)
result = request.text
return result
......@@ -160,6 +160,7 @@ class Vendor(VendorClass):
else:
self.status = -1
parsd = None
return self.set_failed()
return self.set_response(parsd)
......
......@@ -54,9 +54,9 @@ class VendorClass(object):
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"
message = message and message or "No Response From Biller"
data = dict(code=code,
message=message)
message=message)
self.result = data
self.save_log(typ)
......@@ -203,145 +203,3 @@ class Other(object):
def sha256(hash_string):
return hashlib.sha256(hash_string.encode()).hexdigest()
def update_harga(p, k, v):
row = PartnerProduk.query() \
.filter_by(kode=k, partner_id=p.id).first()
if not row:
row = PartnerProduk()
row.kode = k
row.partner_id = p.id
row.created = datetime.now()
else:
row.updated = datetime.now()
row.harga = v
flush_row(row)
return True
def proses_odeo(data):
settings = get_settings()
mid = 'odeo_mid' in settings and settings["odeo_mid"] or None
key = 'odeo_key' in settings and settings["odeo_key"] or None
partner = Partner.query_kode("ODEO").first()
status = str(data["status"])
if status == "BROADCAST_NEW_PRICE":
signature = sha256("{mid}{key}{status}".format(
mid=mid, key=key, status=status))
if signature != data["signature"]:
log.info("Signature Vendor Different")
log.info("local %s, vendor %s" % (signature, data["signature"]))
return dict(error="Signature different")
new_price = data["new_prices"]
for k in new_price:
v = new_price[k]
update_harga(partner, k, v)
return dict(success=True)
else:
order_id = str(data["order_id"])
signature = sha256("{order_id}{mid}{key}{status}".format(
order_id=order_id, mid=mid, key=key, status=status))
if signature != data["signature"]:
log.info("Signature Vendor Different")
log.info("local %s, vendor %s" % (signature, data["signature"]))
return dict(error="Signature Different")
order = H2hArInvoiceDet.query() \
.filter(H2hArInvoiceDet.vendor_id == partner.id,
H2hArInvoiceDet.vend_inv_no == str(order_id)).first()
if order:
if status == "COMPLETED":
order.status = 1
else:
order.status = -3
order.notify = dict(post=data)
if "sn" in data and data["sn"]:
order.serial_number = data["sn"]
else:
message = 'message' in data and data["message"] or ""
if message:
loc = message.find("SN: ")
if loc>-1:
sn = message[loc+4:loc+28]
order.serial_number=sn
flush_row(order)
# todo: add to customer notify table
# todo: create cron for notify
# proses jika status 1 notify ada isinya tapi belum ada field result
# todo: create cron torecurring order to other vendor
# jika status = -2 proses vendor yang lain
callback_merchant(order)
return order
def callback_merchant(order):
# Callback to merchant
invoice = order.invoice
customer = invoice.customer
if customer and customer.website:
url = customer.website
users = customer.users
status = order.status == 1 and "SUCCESS" \
or order.status > -2 and "FAILED" \
or "PENDING"
key = invoice.cust_inv_no + users.user_name + users.api_key + status
signature = sha256(key)
data = []
produk = []
dat = dict(
invoice_no=invoice.cust_inv_no,
signature=signature)
discount = order.discount and order.discount or 0
produk.append(dict(
denom=order.produk.kode,
id_pel=order.id_pel,
subtotal=order.amt_sell + discount,
discount=discount,
total=order.amt_sell,
status=status,
serial_number=order.serial_number
))
dat.update(produk=produk)
data.append(dat)
js = get_jsonrpc(method="notify", params=dict(data=data))
log.info("Notify: %s %s" %(url, js))
try:
with requests.session():
requests.post(url, data=data, timeout=10)
except:
pass
@view_config(route_name='api-vendor-notify', renderer='json')
def api_vendor_notify(request):
vendor_nm = request.matchdict['name']
if vendor_nm == "odeo":
data = json.loads(request.text)
order = proses_odeo(data)
@view_config(route_name='api-vendor-test', renderer="string")
def vendor_test(request):
params = request.params
vendor = request.matchdict['vendor']
result = dict(a=1)
request.response.content_type = "text / xml"
if vendor == "vsi":
controls = request.GET.items()
params = dict(controls)
params["status"] = "SUCCESS"
result = dict(root=params)
result = xmltodict.unparse(result)
elif vendor == "odeo":
params = json.loads(request.text)
result = request.text
return result
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!