Commit 5da8ce29 by Tatang

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/agratek/api/merchant/views/api_merchant.py
2 parents 3f5ca6d8 623171d9
......@@ -8,7 +8,8 @@ CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
requires=[
"opensipkd.base",
"opensipkd.pasar.models"
"opensipkd.pasar.models",
"xmltodict"
]
......
kode,path,nama,status,type
api-merchant-home,/api/merchant/home,Api Merchant Home,1,0
api-merchant,/api/merchant,Api Merchant,1,1
api-vendor-notify,/api/vendor/{name}/notify,Api Vendor Notify,1,0
......@@ -55,4 +56,11 @@ api-customer-act,/api/customer/{act}/act,Act Customer,1,0
api-customer-view,/api/customer/{id}/view,View Customer,1,0
api-customer-add,/api/customer/add,Add Customer,1,0
api-customer-edit,/api/customer/{id}/edit,Edit Customer,1,0
api-customer-delete,/api/customer/{id}/delete,Delete Customer,1,0
\ No newline at end of file
api-customer-delete,/api/customer/{id}/delete,Delete Customer,1,0
api-partner-list,/api/partner/list,Api List partner,1,0
api-partner-act,/api/partner/{act}/act,Api Act partner,1,0
api-partner-view,/api/partner/{id}/view,Api View partner,1,0
api-partner-add,/api/partner/add,Api Add partner,1,0
api-partner-edit,/api/partner/{id}/edit,Api Edit partner,1,0
api-partner-delete,/api/partner/{id}/delete,Api Delete partner,1,0
\ No newline at end of file
from opensipkd.base.views import (BaseView)
from opensipkd.pasar.models.views import deferred_vendor, deferred_customer, deferred_produk
from pyramid.view import view_config
@view_config(route_name='api-merchant-home',
permission="view",
renderer='templates/home.pt')
def view_home(request):
return dict()
from importlib import import_module
from opensipkd.base import is_devel
from opensipkd.base.models import Partner, flush_row
from opensipkd.base.tools.api import (auth_from_rpc,
JsonRpcProdukNotFoundError, JsonRpcCustomerNotFoundError,
......@@ -44,7 +42,7 @@ def build_request(typ, vendor_produk, partner_log=None):
result["f_response"] = cls_module.response
result["f_result"] = cls_module.result
result["f_request"] = cls_module.request
# result["url"] = cls_module.url
else:
log.info("Module %s Not Found" % vendor_produk.modules)
......@@ -56,6 +54,16 @@ def build_request(typ, vendor_produk, partner_log=None):
return result
def save_partner_log(values, vendor_produk):
partner_log = PartnerLog()
partner_log.vendor_id = vendor_produk.partner_id
partner_log.produk_id = vendor_produk.produk.id
partner_log.customer_id = values["customer_id"]
partner_log.id_pel = values["id_pel"]
flush_row(partner_log)
return partner_log
def qry_vendor_produk():
return PartnerProduk.query() \
.join(Partner, Partner.id == PartnerProduk.partner_id) \
......@@ -129,10 +137,10 @@ def inquiry(request, data, **kwargs):
{
denom: string,
id_pel:string
inv_no: string optional
}
:param token:
user_token
:return:
{
product_nm:string,
......
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
......@@ -9,13 +9,13 @@ from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from ..vendor import VendorClass
import logging
log = logging.getLogger(__name__)
import urllib3
urllib3.disable_warnings()
class Vendor(VendorClass):
def __init__(self, vendor_produk, invoice_det):
VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
......@@ -40,11 +40,10 @@ class Vendor(VendorClass):
# headers=self.get_headers(), timeout=15)
# # try:
# # pass
# except requests.exceptions.RequestException as e:
# resp = None
#
# return resp
# except requests.exceptions.RequestException as e:
# resp = None
#
# return resp
def inquiry(self):
if not self.v_produk_kd or not self.id_pel:
......@@ -81,13 +80,13 @@ class Vendor(VendorClass):
self.response = result
log.info("Inquiry Response: %s" % self.response)
if resp.status_code==200:
if resp.status_code == 200:
self.status = 1 # sukses
data = "data" in result and result["data"] or None
parsd = self.pars_data(data)
if parsd:
parsd.update(code=0,
messagge="SUCCES",
message="SUCCES",
status="SUCCESS")
elif resp.status_code == 400:
......@@ -100,8 +99,7 @@ class Vendor(VendorClass):
else:
self.status = -1
parsd = None
return self.set_response(parsd) #parsd
return self.set_response(parsd) # parsd
# def gagal_transaksi(self, inq):
# self.status = -2 # Try Other Vendor
......@@ -130,8 +128,8 @@ class Vendor(VendorClass):
parsd = None
if self.vendor_produk.produk.kategori.kode in ["e-payment", "e-voucher"]:
parsd = self.inquiry()
if parsd["code"]!=0:
self.status=-3
if parsd["code"] != 0:
self.status = -3
return self.set_response(typ="payment",
message="Data Tagihan Tidah ditemukan")
......@@ -141,15 +139,15 @@ class Vendor(VendorClass):
url = self.get_url("/prepaid/purchase")
try:
resp = requests.post(url, data=json.dumps(params), verify=False,
headers=self.get_headers(), timeout=15)
headers=self.get_headers(), timeout=15)
except:
resp = None
if resp is None:
self.status = 0
return self.set_pending(parsd)
#todo: dibuat seolah menjadi belum di transaksikan
#todo: membuat cron untuk melakukan pengecekan transaksi
# todo: dibuat seolah menjadi belum di transaksikan
# todo: membuat cron untuk melakukan pengecekan transaksi
try:
result = json.loads(resp.text)
self.response = result
......@@ -198,19 +196,19 @@ class Vendor(VendorClass):
if data and "errors" in data:
msg = data["errors"][0]
pos = msg.find("Sisa saldo")
message=pos > -1 and msg[:pos] or msg
message = pos > -1 and msg[:pos] or msg
pos = message.find("SN: ")
sn = ""
if pos>-1:
if pos > -1:
sn_spl = message[pos:].split(" ")
sn = len(sn_spl)>1 and sn_spl[1] or ""
parsd["serial_number"]=sn
sn = len(sn_spl) > 1 and sn_spl[1] or ""
parsd["serial_number"] = sn
return self.set_failed(parsd, message=message)
elif resp.status_code == 401:
elif resp.status_code == 401:
self.status = -2
#todo: create cron yang status -2
# todo: create cron yang status -2
return self.set_pending(parsd)
def advice(self):
......@@ -235,8 +233,8 @@ class Vendor(VendorClass):
self.save_log("advice")
try:
resp = requests.get(url,params=params, verify=False,
headers=self.get_headers(), timeout=15)
resp = requests.get(url, params=params, verify=False,
headers=self.get_headers(), timeout=15)
except:
return self.set_response()
......@@ -314,7 +312,7 @@ class Vendor(VendorClass):
jml_period += 1
if "meter_changes" in inq:
meter += inq["meter_changes"]
i+=1
i += 1
rincian["pokok"] = pokok
rincian["denda"] = denda
......@@ -410,7 +408,7 @@ class Vendor(VendorClass):
self.amt_buy = result["total"]
harga_pokok = result["subtotal"] - rincian["admin"]
admin = int(self.vendor_produk.produk.harga*i)
admin = int(self.vendor_produk.produk.harga * i)
rincian["admin"] = admin
result["subtotal"] = int(harga_pokok) + admin
......
......@@ -5,7 +5,7 @@ from datatables import ColumnDT
from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables
from opensipkd.pasar.models.views import (deferred_vendor, deferred_produk,
deferred_departemen)
deferred_departemen)
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
......@@ -138,14 +138,20 @@ class ViewData(BaseView):
params = {'columns': [dict(title="ID"),
dict(title="Kode"),
dict(title="Internal"),
dict(title="Partner"),
dict(title="Harga"),
dict(title="Discount"),
dict(title="Modules"),
dict(title="Status"),
],
'column_data': [dict(data="id", width="0px"),
dict(data="kode", width="75px"),
dict(data="internal"),
dict(data="partner"),
dict(data="harga"),
dict(data="discount"),
dict(data="modules"),
dict(data="status"),
],
'buttons': [
dict(id="btn_add", cls="btn btn btn-success", title="Tambah"),
......@@ -199,11 +205,15 @@ class ViewData(BaseView):
ColumnDT(PartnerProduk.id, mData='id'),
ColumnDT(PartnerProduk.kode, mData='kode'),
ColumnDT(Produk.kode, mData='internal'),
ColumnDT(Partner.kode, mData='partner'),
ColumnDT(PartnerProduk.harga, mData='harga'),
ColumnDT(PartnerProduk.discount, mData='discount'),
ColumnDT(PartnerProduk.modules, mData='modules'),
ColumnDT(PartnerProduk.status, mData='status'),
]
query = DBSession.query().select_from(PartnerProduk)\
.join(Produk, PartnerProduk.produk_id==Produk.id)
.join(Produk, PartnerProduk.produk_id == Produk.id)\
.join(Partner, PartnerProduk.partner_id == Partner.id)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
......
import base64
import json
import re
from time import sleep
from datetime import datetime
import requests
from opensipkd.base import get_settings
from opensipkd.base.tools import get_random_string, get_random_number
from opensipkd.base.tools.api import JsonRpcBillAllreadyPaidError, JsonRpcBillNotFoundError
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid_rpc.jsonrpc import JsonRpcError
from ..vendor import VendorClass
import logging
log = logging.getLogger(__name__)
import urllib3
urllib3.disable_warnings()
class Vendor(VendorClass):
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 = 'tangselrtr_mid' in settings and settings['tangselrtr_mid'] or None
self.key = 'tangselrtr_key' in settings and settings['tangselrtr_key'] or None
self.url = 'tangselrtr_url' in settings and settings['tangselrtr_url'] or None
key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key).decode()
self.inq_url = '{0}/inquiry'.format(self.url)
self.pay_url = '{0}/payment'.format(self.url)
def get_headers(self):
return {'Content-Type': 'application/json',
'x-api-key': self.key}
def get_url(self, url=None):
return url and self.url + url or self.url
def inquiry_field(self):
return \
{
"kode_pedagang": self.id_pel,
}
def inquiry_error(self, resp):
if resp["response_code"] == "C8111":
code = 55
message = "Data tidak dtitemukan"
elif resp["response_code"] == "C3077":
code = 54
message = "Data sudah dibayar"
else:
code = 999
message = resp["message"]
return dict(code=code, message=message)
def response_field(self):
resp = self.response
if resp["code"] == 200 and resp["is_error"] == 0:
data = resp["content"]
pokok = int(data["biaya_tagihan"] or '0')
denda = 0
disc_biller = 0
sub_total = pokok + denda - disc_biller
result = self.get_price(sub_total)
admin = int(self.vendor_produk.produk.harga)
# todo: cek kembali harga apakah wajar atau tidak
# adm_biller = int(resp["diskon"] or '0')
# jika harga admin biller > dari admin
# if self.amt_buy < sub_total+adm_biller:
# raise
# if admin < adm_biller:
# admin = adm_biller
rincian = dict(
pokok=pokok,
denda=denda,
discount=disc_biller,
subtotal=sub_total,
admin=admin,
total=sub_total + admin,
npwrd=data["kode_pedagang"],
nama=data["nama_pemilik"],
no_hp_wr=data["nomor_hp_pemilik"],
no_tel_wr=data["nomor_tlp_pemilik"],
email_wr=data["email_pemilik"],
nama_toko=data["nama_toko"],
alamat=data["lokasi_pasar"],
blok=data["blok_toko"],
keterangan=data["keterangan_alamat_toko"] or "",
luas=data["luas_toko"],
kategori=data["kategori_usaha"],
)
result.update(dict(rincian=rincian))
return result
else:
return self.inquiry_error(resp)
def _inquiry(self):
if not self.v_produk_kd or not self.id_pel:
return self.set_response(message='Parameter tidak lengkap')
self.request = self.inquiry_field()
log.info("Inquiry Request: url: {} params {}".format(self.inq_url, self.request))
self.save_log("inquiry")
params = json.dumps(self.request)
log.info(params)
try:
resp = requests.post(self.inq_url, data=params,
verify=False,
headers=self.get_headers(),
timeout=20)
except:
log.info("Biller Error")
return
if not resp:
log.info("No Response From Biller")
return
try:
result = json.loads(resp.text)
except:
result = resp.text
self.response = result
log.info("Inquiry Response: %s" % self.response)
return resp
def inquiry(self):
resp = self._inquiry()
if resp is None:
return self.set_failed(typ="inquiry")
if resp.status_code == 200:
parsd = self.response_field()
if "code" in parsd and parsd["code"] != 0:
return self.set_response(code=parsd["code"],
message=parsd["message"],
typ="inquiry")
return self.set_success(parsd, typ="inquiry")
else:
return self.set_failed(typ="inquiry")
def payment(self):
resp = self._inquiry()
typ = "payment"
if not resp:
return self.set_failed()
if self.response["is_error"] != 0:
parsd = self.inquiry_error(self.response)
return self.set_response(code=parsd["code"],
message=parsd["message"],
typ=typ)
data = self.response_field()
params = self.inquiry_field()
params.update({"jumlah_retribusi": data['rincian']['subtotal']})
self.request = params
self.save_log(typ=typ)
log.info("Payment url: {} params: {}".format(self.pay_url, json.dumps(params)))
try:
resp = requests.post(self.pay_url, data=json.dumps(params), verify=False,
headers=self.get_headers(), timeout=15)
except:
resp = None
if resp is None:
self.status = 0
return self.set_pending()
try:
result = json.loads(resp.text)
self.response = result
log.info("Payment Response: %s" % self.response)
except:
result = resp.text
self.response = result
log.info("Payment Response: %s" % self.response)
self.status = 0
return self.set_pending()
if self.response["is_error"] != 0:
parsd = self.inquiry_error(self.response)
return self.set_response(code=parsd["code"],
message=parsd["message"],
typ=typ)
elif resp.status_code == 200:
self.status = 1 # sukses
content = result["content"]
self.serial_number = 'no_reff' in content and content["no_reff"].strip() \
or self.serial_number
data["rincian"].update(dict(
serial_number=self.serial_number))
return self.set_success(data)
else:
self.status = 0
return self.set_pending()
def advice(self):
raise JsonRpcError(message="Not Implemented")
# 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.invoice_det.vend_inv_no
# url = self.get_url('/order/{order_id}'.format(order_id=order_id))
# params = None
# self.request = url
# else:
# params = dict(
# data=dict(
# denom=self.v_produk_kd,
# number=self.id_pel
# )
# )
# self.request = params
# url = self.get_url('/prepaid/purchase-get')
#
# self.save_log("advice")
# try:
# resp = requests.get(url, params=params, verify=False,
# headers=self.get_headers(), timeout=15)
# except:
# return self.set_response()
#
# try:
# result = json.loads(resp.text)
# except:
# result = resp.text
#
# self.response = result
# if resp.ok:
# self.status = 1 # sukses
# data = "data" in result and result["data"] or None
# parsd = self.pars_data(data)
#
# elif resp.status_code == 400:
# self.status = -3
# parsd = dict(code=resp.status_code,
# message=resp.text)
# else:
# self.status = -4
# parsd = dict(code=500,
# message="Other Error")
#
# self.save_log('advice')
# return parsd
import base64
import json
import logging
from datetime import datetime
import requests
import urllib3
from opensipkd.base import get_settings
from opensipkd.base.tools import get_random_number
from opensipkd.base.tools.api import JsonRpcBillAllreadyPaidError, JsonRpcBillNotFoundError
from pyramid_rpc.jsonrpc import JsonRpcError
from ..vendor import VendorClass
log = logging.getLogger(__name__)
urllib3.disable_warnings()
class Vendor(VendorClass):
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 = 'tangselpjk_mid' in settings and settings['tangselpjk_mid'] or None
self.key = 'tangselpjk_key' in settings and settings['tangselpjk_key'] or None
self.url = 'tangselpjk_url' in settings and settings['tangselpjk_url'] or None
key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key).decode()
self.inq_url = '{0}/pbbJson/inq'.format(self.url)
self.pay_url = '{0}/pbbJson/pay'.format(self.url)
def get_headers(self):
return {'Content-Type': 'application/json'}
def get_url(self, url=None):
return url and self.url + url or self.url
def inquiry_field(self):
kini = datetime.now()
date_settlement = kini.strftime("%m%d")
nop = self.id_pel[:18]
tahun = self.id_pel[-4:]
return \
{
"noRef": get_random_number(6),
"dateSettlement": date_settlement,
"merchantType": "6014",
"accountCurrency": "360",
"terminalId": "02W001",
"terminalName": "Mobile POS Tangsel",
"terminalLoc": "Tangerang Selatan",
"nop": nop,
"tahunPajak": tahun,
}
def inquiry_error(self, resp):
code = int(resp["responseCode"])
message = resp["responseDesc"]
return dict(code=code, message=message)
def response_field(self):
resp = self.response
if resp["responseCode"] == "00":
pokok = int(resp["tagihan"] or '0')
denda = int(resp["denda"] or '0')
disc_biller = int(resp["diskon"] or '0')
sub_total = pokok + denda - disc_biller
result = self.get_price(sub_total)
admin = int(self.vendor_produk.produk.harga)
# todo: cek kembali harga apakah wajar atau tidak
# adm_biller = int(resp["diskon"] or '0')
# jika harga admin biller > dari admin
# if self.amt_buy < sub_total+adm_biller:
# raise
# if admin < adm_biller:
# admin = adm_biller
rincian = dict(
pokok=pokok,
denda=denda,
discount=disc_biller,
subtotal=sub_total,
admin=admin,
total=sub_total+admin,
# code=resp["responseCode"],
# message=resp["responseDesc"],
nama=resp["nama"],
alamat=resp["lokasi"],
kelurahaan=resp["kelurahaan"],
kecamatan=resp["kecamatan"],
provinsi=resp["provinsi"],
luas_bumi=int(resp["luasTanah"]),
luas_bng=int(resp["luasBangunan"]),
jatuh_tempo=resp["tanggalJatuhTempo"],
)
result.update(dict(rincian=rincian))
return result
else:
return self.inquiry_error(resp)
def _inquiry(self):
if not self.v_produk_kd or not self.id_pel:
return self.set_response(message='Parameter tidak lengkap')
self.request = self.inquiry_field()
log.info("Inquiry Request: url: {} params {}".format(self.inq_url, self.request))
self.save_log("inquiry")
params = json.dumps(self.request)
log.info(params)
try:
resp = requests.post(self.inq_url, data=params,
verify=False,
headers=self.get_headers(),
timeout=20)
except:
log.info("Biller Error")
return
if not resp:
log.info("No Response From Biller")
return
try:
result = json.loads(resp.text)
except:
result = resp.text
self.response = result
log.info("Inquiry Response: %s" % self.response)
return resp
def inquiry(self):
resp = self._inquiry()
if resp is None:
return self.set_failed(typ="inquiry")
if resp.status_code == 200:
parsd = self.response_field()
return self.set_success(parsd, typ="inquiry")
else:
return self.set_failed(typ="inquiry")
def payment(self):
resp = self._inquiry()
if resp is None:
return self.set_failed()
if self.response["responseCode"] != "00":
return self.inquiry_error(self.response)
params = json.dumps(self.response)
log.info("Payment url: {} params: {}".format(self.pay_url, params))
try:
resp = requests.post(self.pay_url, data=params, verify=False,
headers=self.get_headers(), timeout=15)
except:
resp = None
if resp is None:
self.status = 0
return self.set_pending()
try:
result = json.loads(resp.text)
self.response = result
log.info("Payment Response: %s" % self.response)
except:
result = resp.text
self.response = result
log.info("Payment Response: %s" % self.response)
self.status = 0
return self.set_pending()
if resp.status_code == 200:
self.status = 1 # sukses
parsd = self.response_field()
self.serial_number = 'ntb' in result and result["ntb"].strip() \
or self.serial_number
parsd["rincian"].update(dict(
ntb=self.serial_number,
ntp='ntp' in result and result["ntp"].strip() or ''))
return self.set_success(parsd)
else:
self.status = 0
return self.set_pending()
def advice(self):
raise JsonRpcError(message="Not Implemented")
# 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.invoice_det.vend_inv_no
# url = self.get_url('/order/{order_id}'.format(order_id=order_id))
# params = None
# self.request = url
# else:
# params = dict(
# data=dict(
# denom=self.v_produk_kd,
# number=self.id_pel
# )
# )
# self.request = params
# url = self.get_url('/prepaid/purchase-get')
#
# self.save_log("advice")
# try:
# resp = requests.get(url, params=params, verify=False,
# headers=self.get_headers(), timeout=15)
# except:
# return self.set_response()
#
# try:
# result = json.loads(resp.text)
# except:
# result = resp.text
#
# self.response = result
# if resp.ok:
# self.status = 1 # sukses
# data = "data" in result and result["data"] or None
# parsd = self.pars_data(data)
#
# elif resp.status_code == 400:
# self.status = -3
# parsd = dict(code=resp.status_code,
# message=resp.text)
# else:
# self.status = -4
# parsd = dict(code=500,
# message="Other Error")
#
# self.save_log('advice')
# return parsd
import base64
import json
import re
from time import sleep
from datetime import datetime
import requests
from opensipkd.base import get_settings
from opensipkd.base.tools import get_random_string, get_random_number
from opensipkd.base.tools.api import JsonRpcBillAllreadyPaidError, JsonRpcBillNotFoundError
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid_rpc.jsonrpc import JsonRpcError
from ..vendor import VendorClass
import logging
log = logging.getLogger(__name__)
import urllib3
urllib3.disable_warnings()
"""
PJDL
http://103.66.86.115:8989/interface-tangerang-1.0.0/pjdlJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/pjdlJson/pay
PBB
http://103.66.86.115:8989/interface-tangerang-1.0.0/pbbJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/pbbJson/pay
BPHTB
http://103.66.86.115:8989/interface-tangerang-1.0.0/bphtbJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/bphtbJson/pay
"""
class Vendor(VendorClass):
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 = 'tangselpjk_mid' in settings and settings['tangselpjk_mid'] or None
self.key = 'tangselpjk_key' in settings and settings['tangselpjk_key'] or None
self.url = 'tangselpjk_url' in settings and settings['tangselpjk_url'] or None
key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key).decode()
self.inq_url = '{0}/pjdlJson/inq'.format(self.url)
self.pay_url = '{0}/pjdlJson/pay'.format(self.url)
def get_headers(self):
return {'Content-Type': 'application/json'}
def get_url(self, url=None):
return url and self.url + url or self.url
def inquiry_field(self):
kini = datetime.now()
date_settlement = kini.strftime("%m%d")
no_bayar = self.id_pel
return \
{
"noRef": get_random_number(6),
"dateSettlement": date_settlement,
"merchantType": "6014",
"accountCurrency": "360",
"terminalId": "02W001",
"terminalName": "Mobile POS Tangsel",
"terminalLoc": "Tangerang Selatan",
"kodeBayar": no_bayar,
}
def inquiry_error(self, resp):
code = int(resp["responseCode"])
message = resp["responseDesc"]
return dict(code=code, message=message)
# if code == 54:
# raise JsonRpcBillAllreadyPaidError()
# elif code == 55:
# raise JsonRpcBillNotFoundError()
# else:
# raise JsonRpcError(code=code, message=message)
def response_field(self):
resp = self.response
if resp["responseCode"] == "00":
pokok = int(resp["billAmount"] or '0')
denda = int(resp["chargeAmount"] or '0')
disc_biller = 0
sub_total = pokok + denda - disc_biller
result = self.get_price(sub_total)
admin = int(self.vendor_produk.produk.harga)
# todo: cek kembali harga apakah wajar atau tidak
# adm_biller = int(resp["diskon"] or '0')
# jika harga admin biller > dari admin
# if self.amt_buy < sub_total+adm_biller:
# raise
# if admin < adm_biller:
# admin = adm_biller
rincian = dict(
pokok=pokok,
denda=denda,
discount=disc_biller,
subtotal=sub_total,
admin=admin,
total=sub_total + admin,
npwp=resp['npwpd'],
nama=resp['namaWp'],
masa_awal=resp['masaAwal'],
masa_akhir=resp['masaAkhir'],
jns_pajak=resp['jenisPajak'],
kd_pajak=resp['kodeRekening'],
nm_pajal=resp['namaRekening'],
alamat1=resp['alamat1'],
alamat2=resp['alamat2'],
)
result.update(dict(rincian=rincian))
return result
else:
return self.inquiry_error(resp)
def _inquiry(self):
if not self.v_produk_kd or not self.id_pel:
return self.set_response(message='Parameter tidak lengkap')
self.request = self.inquiry_field()
log.info("Inquiry Request: url: {} params {}".format(self.inq_url, self.request))
self.save_log("inquiry")
params = json.dumps(self.request)
log.info(params)
try:
resp = requests.post(self.inq_url, data=params,
verify=False,
headers=self.get_headers(),
timeout=20)
except:
log.info("Biller Error")
return
if not resp:
log.info("No Response From Biller")
return
try:
result = json.loads(resp.text)
except:
result = resp.text
self.response = result
log.info("Inquiry Response: %s" % self.response)
return resp
def inquiry(self):
resp = self._inquiry()
if resp is None:
return self.set_failed(typ="inquiry")
if resp.status_code == 200:
parsd = self.response_field()
return self.set_success(parsd, typ="inquiry")
else:
return self.set_failed(typ="inquiry")
def payment(self):
resp = self._inquiry()
if not resp:
return self.set_failed()
if self.response["responseCode"] != "00":
return self.inquiry_error(self.response)
params = json.dumps(self.response)
log.info("Payment url: {} params: {}".format(self.pay_url, params))
try:
resp = requests.post(self.pay_url, data=params, verify=False,
headers=self.get_headers(), timeout=15)
except:
resp = None
if resp is None:
self.status = 0
return self.set_pending()
try:
result = json.loads(resp.text)
self.response = result
log.info("Payment Response: %s" % self.response)
except:
result = resp.text
self.response = result
log.info("Payment Response: %s" % self.response)
self.status = 0
return self.set_pending()
if resp.status_code == 200:
self.status = 1 # sukses
parsd = self.response_field()
self.serial_number = 'ntb' in result and result["ntb"].strip() \
or self.serial_number
parsd["rincian"].update(dict(
ntb=self.serial_number,
ntp='ntp' in result and result["ntp"].strip() or ''))
return self.set_success(parsd)
else:
self.status = 0
return self.set_pending()
def advice(self):
raise JsonRpcError(message="Not Implemented")
# 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.invoice_det.vend_inv_no
# url = self.get_url('/order/{order_id}'.format(order_id=order_id))
# params = None
# self.request = url
# else:
# params = dict(
# data=dict(
# denom=self.v_produk_kd,
# number=self.id_pel
# )
# )
# self.request = params
# url = self.get_url('/prepaid/purchase-get')
#
# self.save_log("advice")
# try:
# resp = requests.get(url, params=params, verify=False,
# headers=self.get_headers(), timeout=15)
# except:
# return self.set_response()
#
# try:
# result = json.loads(resp.text)
# except:
# result = resp.text
#
# self.response = result
# if resp.ok:
# self.status = 1 # sukses
# data = "data" in result and result["data"] or None
# parsd = self.pars_data(data)
#
# elif resp.status_code == 400:
# self.status = -3
# parsd = dict(code=resp.status_code,
# message=resp.text)
# else:
# self.status = -4
# parsd = dict(code=500,
# message="Other Error")
#
# self.save_log('advice')
# return parsd
PJDL
http://103.66.86.115:8989/interface-tangerang-1.0.0/pjdlJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/pjdlJson/pay
PBB
http://103.66.86.115:8989/interface-tangerang-1.0.0/pbbJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/pbbJson/pay
BPHTB
http://103.66.86.115:8989/interface-tangerang-1.0.0/bphtbJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/bphtbJson/pay
......@@ -49,6 +49,12 @@
<span class="menu-item-parent">Customer Invoice</span>
</a>
</li>
<li>
<a href="${request._host}/api/partner/list">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Partner List</span>
</a>
</li>
</ul>
</html>
......@@ -14,7 +14,7 @@
<div class="col-md-8 col-md-offset-3 col-xs-12 well">
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title">SISTEM INFORMASI KELURAHAN</h3>
<h3 class="panel-title">MERCHANT MANGEMENT</h3>
</div>
</div>
</div>
......
<html metal:use-macro="load: ../base.pt">
<div metal:fill-slot="content">
<div class="panel-body">
<div class="col-md-6 col-md-offset-3 col-xs-12" style="background-color:white;">
<!-- Proses Template Form -->
<form method="post" accept-charset="utf-8" id="deform" class="form-horizontal"
enctype="multipart/form-data" tal:define="field form"
style="background-color:white;">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f form">
<!-- Proses Saat Field hidden-->
<div tal:condition="f.widget.hidden">
${structure:f.serialize()}
</div>
<!-- Proses Saat Field Normal dan bukan Children-->
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p id="error-${f.oid}" class="help-block" tal:condition="f.error"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
<!-- Proses saat Form Adalah Children -->
<div tal:condition="f.children">
<!--div class="panel panel-default" title="">
<div class="panel-heading">${f.title}</div>
<div class="panel-body" -->
<input type="hidden"
name="__start__"
value="${f.name}:mapping"
readonly="readonly">
<div class="form-group" tal:repeat="f2 f.children">
<div id="item-${f2.oid}" >
<label for="${f2.oid}" id="req-${f2.oid}"
class="control-label col-md-4 ${f2.required and 'required' or ''}">
${f2.title}</label>
<div class="col-md-8">
${structure:f2.serialize()}
<p id="error-${f2.oid}" class="help-block" tal:condition="f2.error"
tal:repeat="error f2.error.messages()">
${error}</p>
</div>
</div>
</div>
<input type="hidden" name="__end__" value="${f.name}:mapping" readonly="readonly">
<!--/div>
</div>
</div-->
</div>
</div>
<div class="input-group-btn">
<button tal:repeat="fb form.buttons"
type="${fb.type}" class="btn ${fb.css_class} pull-right" name="${fb.name}">${fb.title}</button>
</div>
<label class="control-label text-danger">** Data di Isi sesuai dengan yang tertera pada KTP</label>
</div>
</form>
<!-- End Template Form -->
<!-- </div> -->
</div>
</div>
</div>
<div metal:fill-slot="scripts">
</div>
</html>
<html metal:use-macro="load: ../base.pt">
<div metal:fill-slot="content">
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title">Peringatan</h3>
</div>
<div class="panel-body">
${request.title} ID #${row.id} ?
</div>
</div>
<div tal:content="structure form"/>
</div>
</html>
<html metal:use-macro="load: ../base.pt">
<div metal:fill-slot="content">
<style>
button {
margin:0px 3px;
}
</style>
<div class="panel-body">
<div class="col-md-6 col-md-offset-3 col-xs-12 well">
<!-- Proses Template Form -->
<form method="post" accept-charset="utf-8" id="deform" class="form-horizontal"
enctype="multipart/form-data" tal:define="field form"
style="background-color:white;"
autocomplete="off">
<input type="hidden" name="_charset_">
<input type="hidden" value="deform" name="__formid__">
<!-- Tampilan untuk general error -->
<div class="alert alert-danger" tal:condition="field.error">
<div class="errorMsgLbl" i18n:translate="">
Terdapat kesalahan pengisian
</div>
<p class="errorMsg">${field.errormsg}</p>
</div>
<!-- END Tampilan untuk general error -->
<div class="col-md-12">
<!-- Looping Semua Field-->
<div tal:repeat="f form">
<!-- Proses Saat Field hidden-->
<div tal:condition="f.widget.hidden">
${structure:f.serialize()}
</div>
<!-- Proses Saat Field Normal dan bukan Children-->
<div tal:condition="not f.widget.hidden and not f.children"
class="form-group" >
<!-- Field Reqired menggunakan class required -->
<label for="${f.oid}"
class="control-label col-md-4 ${f.required and 'required' or ''}"
id="req-${f.oid}">
${f.title}</label>
<div class="col-md-8">
${structure:f.serialize()}
<p id="error-${f.oid}" class="help-block" tal:condition="f.error"
tal:repeat="error f.error.messages()">
${error}</p>
</div>
</div>
<!-- Proses saat Form Adalah Children -->
<div tal:condition="f.children">
<!--div class="panel panel-default" title="">
<div class="panel-heading">${f.title}</div>
<div class="panel-body" -->
<input type="hidden"
name="__start__"
value="${f.name}:mapping"
readonly="readonly">
<div class="form-group" tal:repeat="f2 f.children">
<div id="item-${f2.oid}" >
<label for="${f2.oid}" id="req-${f2.oid}"
class="control-label col-md-4 ${f2.required and 'required' or ''}">
${f2.title}</label>
<div class="col-md-8">
${structure:f2.serialize()}
<p id="error-${f2.oid}" class="help-block" tal:condition="f2.error"
tal:repeat="error f2.error.messages()">
${error}</p>
</div>
</div>
</div>
<input type="hidden" name="__end__" value="${f.name}:mapping" readonly="readonly">
<!--/div>
</div>
</div-->
</div>
</div>
<div class="input-group-btn">
<button tal:repeat="fb form.buttons"
type="${fb.type}" class="btn ${fb.css_class} pull-right" name="${fb.name}">${fb.title}</button>
</div>
<label class="control-label text-danger">** Data di Isi sesuai dengan yang tertera pada KTP</label>
</div>
</form>
<!-- End Template Form -->
<!-- </div> -->
</div>
</div>
</div>
<div metal:fill-slot="scripts">
</div>
</html>
<html metal:use-macro="load: ../base.pt">
<div metal:fill-slot="content">
<div class="jarviswidget" style="border-top:1px solid #ccc!important">
<div role="content">
<table id="table1" class="table table-bordered table-hover table-condensed">
<thead>
<tr>
<th>ID</th>
<th>Kode</th>
<th>Uraian</th>
<th>Vendor</th>
<th>Customer</th>
<th>Status</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<div metal:fill-slot="scripts">
<script>
var mID;
var mThn;
var oTable;
var iPos;
var oTableUrl = "${request._host}/api/partner";
var oTableUri = oTableUrl+"/grid/act";
$(document).ready(function () {
oTable = $('#table1').DataTable({
dom : '<"row"<"col-md-8"<"toolbar">Bl><"col-md-4"fr>>tip',
processing : true,
serverSide : true,
ajax : oTableUri,
stateSave : true,
scrollCollapse: true,
sort : true,
info : false,
filter : true,
autoWidth : false,
paginate : true,
paginationType: "full_numbers",
lengthMenu: [
[10, 25, 50, 100],
[10, 25, 50, 100]
],
columnDefs: [{
searchable: false,
visible: false,
targets: [0]
}],
columns: [
{ "data": "id" },
{ "data": "kode", "width": "150px", "class":"left"},
{ "data": "nama" },
{ "data": "is_vendor", "width": "100px", "class":"left" },
{ "data": "is_customer", "width": "100px", "class":"left" },
{ "data": "status", "width": "100px", "class":"center"}
],
"language": {
"search" : "Cari: ",
"paginate":{
"first" : "Awal ",
"last" : "Akhir ",
"previous": "Mundur ",
"next" : "Maju ",
},
"lengthMenu": " _MENU_ baris "
}
});
var tb_array = [
'<div class="btn-group pull-left">',
' <button id="btn_add" class="btn btn btn-success" type="button">Tambah</button>',
' <button id="btn_edt" class="btn btn btn-warning" type="button">Koreksi</button>',
' <button id="btn_del" class="btn btn btn-danger" type="button">Hapus</button>',
' <button id="btn_print" class="btn btn btn-primary" type="button">Cetak</button>',
' <button id="btn_csv" class="btn btn btn-primary" type="button">CSV</button>',
' <button id="btn_close" class="btn btn btn-warning" type="button">Tutup</button>',
' &nbsp;',
'</div>',
];
var tb = tb_array.join(' ');
$("div.toolbar").html(tb);
$("div.toolbar").attr('style', 'display:block; float: left; margin-bottom:6px; line-height:16px;');
$('#table1 tbody').on('click', 'tr', function () {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
} else {
var aData = oTable.row( this ).data();
oTable.$('tr.selected').removeClass('selected');
$(this).addClass('selected');
mID = aData.id;
console.log(mID);
//oTable.$('tr.row_selected').removeClass('row_selected');
//$(this).addClass('row_selected');
}
});
$('#btn_add').click(function () {
window.location = oTableUrl+'/add';
});
$('#btn_edt').click(function () {
if (mID) window.location = oTableUrl+'/'+mID+'/edit';
else alert('Pilih Baris yang akan di koreksi');
});
$('#btn_del').click(function () {
if (mID) window.location = oTableUrl+'/'+mID+'/delete';
else alert('Pilih Baris yang akan di hapus');
});
$('#btn_print').click(function () {
url = oTableUrl+"/pdf/rpt";
window.open(url);
});
$('#btn_csv').click(function () {
url = oTableUrl+"/csv/rpt";
window.open(url);
});
$("#btn_close").click(function () {
window.location = '/';
return false;
});
})
</script>
</div>
</html>
#
# 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
......@@ -83,11 +11,13 @@ from pyramid.view import view_config
from ..tools import get_settings, btn_purchase
from ..tools import btn_inquiry, btn_reset, btn_payment, btn_advice, btn_next
from .merchant import build_request, qry_vendor_produk
from .api_merchant import build_request, qry_vendor_produk, save_partner_log
import logging
log = logging.getLogger(__name__)
class AddSchema(colander.Schema):
customer_id = colander.SchemaNode(
colander.Integer(), title='Customer',
......@@ -125,7 +55,6 @@ class AddSchema(colander.Schema):
widget=widget.TextInputWidget(css_class="readonly")
)
f_result = colander.SchemaNode(
colander.String(), title='Result',
missing=colander.drop,
......@@ -205,10 +134,12 @@ $(document).ready(function(){
});
""")
def query_id(request):
id = request.matchdict['id']
return PartnerLog.query_id(id)
def save_ar_invoice(values, vendor_produk):
invoice = H2hArInvoice.query() \
.filter_by(cust_inv_no=values['cust_inv_no']).first()
......@@ -230,18 +161,6 @@ def save_ar_invoice(values, vendor_produk):
return invoice_det
def save_partner_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"]
flush_row(partner_log)
return partner_log
class ViewHome(BaseView):
@view_config(route_name='api-vendor-doc',
permission="api-vendor-doc",
......@@ -279,8 +198,8 @@ class ViewHome(BaseView):
return dict(form=form, params=form_params_view)
if 'inquiry' in request.POST:
invoice_det = save_partner_log(values, vendor_produk)
result = build_request('inquiry', vendor_produk, invoice_det)
partner_log = save_partner_log(values, vendor_produk)
result = build_request('inquiry', vendor_produk, partner_log)
elif 'purchase' in request.POST:
invoice_det = save_ar_invoice(values, vendor_produk)
......@@ -290,14 +209,11 @@ class ViewHome(BaseView):
invoice_det = save_ar_invoice(values, vendor_produk)
result = build_request('advice', vendor_produk, invoice_det)
elif 'payment' in request.POST:
elif 'register' in request.POST:
pass
# invoice_det = get_invoice(values, vendor_produk)
# result = build_request('payment', vendor_produk, invoice_det)
# elif 'info' in request.POST:
# invoice, invoice_det = save_ar_invoice(values, vendor_produk)
# result = build_request('info', vendor_produk, invoice)
elif 'payment' in request.POST:
pass
if result:
values.update(result)
......@@ -319,38 +235,110 @@ class ViewHome(BaseView):
form.render(values)
return dict(form=form, params=form_params_edit)
@view_config(route_name='api-vendor-view',
permission="api-vendor-view",
renderer='templates/form.pt')
def view_edit(self):
request = self.req
session = self.ses
form = get_form(request, AddSchema)
row = query_id(request).first()
if not row:
return id_not_found(request)
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_detail)
# @view_config(route_name='api-vendor-view',
# permission="api-vendor-view",
# renderer='templates/form.pt')
# def view_edit(self):
# request = self.req
# session = self.ses
# form = get_form(request, AddSchema)
# row = query_id(request).first()
# if not row:
# return id_not_found(request)
# 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_detail)
#
# values = dict(c.items())
# save_request(request, values, row)
# return route_list(request)
# valus = row.to_dict()
# values = {}
#
# for val in valus:
# if valus[val] != None:
# values[val] = valus[val]
# # values['npwpd']= get_npwpd(row.customer_id)
# values['id_pel'] = row.id_pel
# form.render(values)
# return dict(form=form, params=form_params_detail)
values = dict(c.items())
save_request(request, values, row)
return route_list(request)
valus = row.to_dict()
values = {}
for val in valus:
if valus[val] != None:
values[val] = valus[val]
# values['npwpd']= get_npwpd(row.customer_id)
values['id_pel'] = row.id_pel
form.render(values)
return dict(form=form, params=form_params_detail)
def get_row(id):
return PartnerLog.query().filter_by(id=id).first()
#
# 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)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!