Commit 7e0eb4ae by Solo Group

odeo

1 parent cd0673bc
......@@ -17,3 +17,18 @@ 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
api-produk-act,/api/produk/{act}/act,Act Produk,1,0
api-produk-view,/api/produk/{id}/view,View Produk,1,0
api-produk-add,/api/produk/add,Add Produk,1,0
api-produk-edit,/api/produk/{id}/edit,Edit Produk,1,0
api-produk-delete,/api/produk/{id}/delete,Delete Produk,1,0
api-produk-vendor-list,/api/produk/vendor/list,List Produk Vendor,1,0
api-produk-vendor-act,/api/produk/vendor/{act}/act,Act Produk Vendor,1,0
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
......@@ -21,7 +21,74 @@ class Vendor(VendorClass):
key = ":".join([self.mid, self.key]).encode()
self.auth = base64.b64encode(key)
def request_post(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
data = json.dumps(params)
url = url and self.url+url or self.url
with requests.session():
resp = requests.post(url, data=data,
verify=False, headers=headers)
return resp
def request_get(self, params, url=None):
headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
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):
# PLN ONLY
if not self.v_produk_kd or not self.bill_no:
return
if self.v_produk_kd =='PLN' and self.v_produk_kd != 'PLNPASCA':
params = dict(
data=dict(
number=self.bill_no
)
)
self.request = 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
)
self.request = params
self.save_log("inquiry")
resp = self.request_get(params, '/postpaid/inquiry')
content = None
if resp and resp.text:
content = json.loads(resp.text)
if resp.ok:
# todo mapping content
"""
{
"status": "SUCCESS",
"data": {
"number": "XXX",
"subscriber_id": "XXX",
"name": "XXX",
"tariff": "XXX",
"power": "XXX"
},
"message": ""
}"""
result = content
else:
result = dict(code=resp.status_code,
message=resp.text)
self.response = content
self.save_log('inquiry')
return result
def payment(self):
if not self.v_produk_kd or not self.bill_no:
return
......@@ -32,29 +99,58 @@ class Vendor(VendorClass):
)
)
self.request = params
self.save_log("inquiry")
with requests.session():
headers = {'Authorization': 'Bearer {key}'.format(key=self.key)}
data = json.dumps(params)
resp = requests.post(url=self.url, data=data,
verify=False, headers=headers)
if resp.ok:
content = resp.json() #json.dumps(resp.text)
self.response=content
self.save_log('inquiry')
if 'status' in content and content['status']=="NOT_FOUND":
content = dict(code=content['data']['error'],
error=content['data']['messsage'])
else:
content = dict(code=resp.status_code,
error=resp.text)
return content
self.save_log("payment")
resp = self.request_post(params, '/prepaid/purchase')
content = None
if resp and resp.text:
content = json.loads(resp.text)
if resp.ok:
#todo mapping 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:
result = dict(code=resp.status_code,
message=resp.text)
self.response = content
self.save_log('payment')
return result
def payment(self):
def advice(self):
if not self.v_produk_kd or not self.bill_no:
return
#todo: product category e-payment '/order/{order_id}'
params = dict(
data=dict(
denom=self.v_produk_kd,
......@@ -62,17 +158,18 @@ class Vendor(VendorClass):
)
)
self.request = params
self.save_log("payment")
with requests.session():
headers = {'Authorization': 'Bearer {key}'.format(key=self.key)}
data = json.dumps(params)
resp = requests.post(url=self.url, data=data,
verify=False, headers=headers)
if resp.ok:
content = resp.json() #json.dumps(resp.text)
self.response=content
self.save_log('payment')
else:
content = dict(code=resp.status_code,
message=resp.text)
return content
\ No newline at end of file
self.save_log("advice")
resp = self.request_get(params, '/prepaid/purchase-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
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
from datetime import datetime
import colander
from datatables import ColumnDT
from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables
from pyramid.httpexceptions import HTTPFound
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 ..tools import (btn_reset,
btn_cancel, btn_delete, btn_save)
@colander.deferred
def deferred_category(node, kw):
values = kw.get('produk_category', [])
return widget.SelectWidget(values=values)
@colander.deferred
def deferred_satuan(node, kw):
values = kw.get('satuan', [])
return widget.SelectWidget(values=values)
class AddSchema(colander.Schema):
__tablename__ = 'produk'
nama = colander.SchemaNode(
colander.String(),
oid="nama ", widget=widget.TextInputWidget()
)
status = colander.SchemaNode(
colander.Boolean(),
oid="status",
)
harga = colander.SchemaNode(
colander.Float(),
oid="harga",
)
no_urut = colander.SchemaNode(
colander.Integer(),
oid="no_urut",
missing=colander.drop
)
kategori_id = colander.SchemaNode(
colander.Integer(), title='Kategori',
oid="kategori_id", widget=deferred_category)
satuan_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
oid="satuan_id", widget=deferred_satuan)
volume = colander.SchemaNode(
colander.Integer(),
oid="volume "
)
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(produk_category=ProdukCategory.get_list(),
satuan=Satuan.get_list())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_save, btn_reset)
return Form(schema, buttons=buttons)
def route_list(request):
return HTTPFound(location=request.route_url('api-produk-list'))
def save(values, row):
if not row:
row = Produk()
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['status'] = 'status' in values and values['status'] and 1 or 0
values['volume'] = 'volume' in values and values['volume'] or 0
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(){
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
});
""")
def id_not_found(request):
id = request.matchdict['id']
request.session.flash('Data %s Tidak Ditemukan' % id, 'error')
return route_list(request)
def query_id(request):
id = request.matchdict['id']
return Produk.query_id(id)
class ViewData(BaseView):
@view_config(route_name='api-produk-list',
permission="api-produk-list",
renderer='templates/list.pt')
def view_list(self):
params = {'columns': [dict(title="ID"),
dict(title="Kode"),
dict(title="Nama"),
dict(title="Harga"),
],
'column_data': [dict(data="id", width="0px"),
dict(data="kode", width="75px"),
dict(data="nama"),
dict(data="harga"),
],
'buttons': [
dict(id="btn_add", cls="btn btn btn-success", title="Tambah"),
dict(id="btn_edit", cls="btn btn btn-primary", title="Edit"),
dict(id="btn_delete", cls="btn btn btn-primary", title="Hapus"),
dict(id="btn_close", cls="btn btn-danger", title="Tutup"),
],
'route': "/api/produk",
'scripts': """
$('#btn_edit').click(function() {
if (mID) window.location = oTableUri + '/' + mID + '/edit';
else
$.SmartMessageBox({
title : "Edit",
content : "Pilih Baris yang akan di lihat...",
buttons : '[Oke]'
});;
});
$('#btn_delete').click(function() {
if (mID) window.location = oTableUri + '/' + mID + '/delete';
else
$.SmartMessageBox({
title : "Delete",
content : "Pilih Baris yang akan di lihat...",
buttons : '[Oke]'
});;
});
$('#btn_add').click(function() {
window.location = oTableUri + '/add';
});
$("#btn_close").click(function() {
window.location = '/api/merchant';
return false;
});
"""}
return dict(params=params)
@view_config(route_name='api-produk-add',
permission="api-produk-admin",
renderer='templates/form.pt')
def view_add(self):
request = self.req
form = get_form(request, AddSchema)
# form_params = dict(scripts=None)
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())
row = save_request(request, values)
return route_list(request)
return dict(form=form, params=form_params_edit)
@view_config(route_name='api-produk-act', renderer='json',
permission="api-produk-list"
)
def view_act(self):
request = self.req
url_dict = request.matchdict
act = url_dict['act']
if act == "grid":
columns = [
ColumnDT(Produk.id, mData='id'),
ColumnDT(Produk.kode, mData='kode'),
ColumnDT(Produk.nama, mData='nama'),
ColumnDT(Produk.harga, mData='harga'),
]
query = DBSession.query().select_from(Produk)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='api-produk-edit',
permission="api-produk-admin",
renderer='templates/form.pt')
def view_edit(self):
request = self.req
form = get_form(request, AddSchema)
row = query_id(request).first()
if not row:
return id_not_found()
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())
save_request(request, values, row)
return route_list(request)
values = row.to_dict()
form.render(values)
return dict(form=form, params=form_params_edit)
@view_config(route_name='api-produk-delete',
renderer='templates/form.pt',
permission="api-produk-admin")
def view_delete(self):
request = self.req
form = get_form(request, EditSchema, (btn_cancel, btn_delete))
for f in form:
form[f].widget.readonly = True
query = query_id(request)
row = query.first()
if not row:
return id_not_found(request)
if request.POST:
if 'delete' in request.POST:
request.session.flash('Data %s berhasil dihapus' % row.nama)
query.delete()
return route_list(request)
values = row.to_dict()
form.render(values)
return dict(form=form, params={"scripts": None})
from datetime import datetime
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 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 (Departemen)
from ..tools import (btn_reset, btn_cancel, btn_delete, btn_save)
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
oid="kode", widget=widget.TextInputWidget()
)
# nama = colander.SchemaNode(
# colander.String(),
# oid="nama ", widget=widget.TextInputWidget()
# )
harga = colander.SchemaNode(
colander.Float(),
oid="harga",
)
disc = colander.SchemaNode(
colander.Float(),
missing=colander.drop,
oid="disc",
)
status = colander.SchemaNode(
colander.Boolean(),
oid="status",
)
partner_id = colander.SchemaNode(
colander.Integer(), title='Vendor',
oid="partner_id", widget=deferred_vendor)
produk_id = colander.SchemaNode(
colander.Integer(), title='Produk',
oid="produk_id", widget=deferred_produk)
departemen_id = colander.SchemaNode(
colander.Integer(), title='Departemen',
oid="departemen_id", widget=deferred_departemen)
modules = colander.SchemaNode(
colander.String(),
oid="nama ", widget=widget.TextInputWidget()
)
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(produk=Produk.get_e_list(),
vendor=Partner.get_vendor_list(),
departemen=Departemen.get_list())
schema.request = request
if row:
schema.deserialize(row)
if not buttons:
buttons = (btn_save, btn_reset)
return Form(schema, buttons=buttons)
def route_list(request):
return HTTPFound(location=request.route_url('api-produk-vendor-list'))
def save(values, row):
if not row:
row = PartnerProduk()
row.create_uid = values['user_id']
row.created = datetime.now()
else:
row.update_uid = values['user_id']
row.updated = datetime.now()
row.from_dict(values)
flush_row(row)
return row
def save_request(request, values, row=None):
values['status'] = 'status' in values and values['status'] and 1 or 0
values['disc'] = 'disc' in values and values['disc'] or 0
values['user_id'] = request.user.id
row = save(values, row)
request.session.flash('Data %s Berhasil disimpan' % values['kode'])
return row
form_params_edit = dict(scripts="""
$(document).ready(function(){
});
""")
form_params_view = dict(scripts="""
$(document).ready(function(){
});
""")
def id_not_found(request):
id = request.matchdict['id']
request.session.flash('Data %s Tidak Ditemukan' % id, 'error')
return route_list(request)
def query_id(request):
id = request.matchdict['id']
return PartnerProduk.query_id(id)
class ViewData(BaseView):
@view_config(route_name='api-produk-vendor-list',
permission="api-produk-vendor-list",
renderer='templates/list.pt')
def view_list(self):
params = {'columns': [dict(title="ID"),
dict(title="Kode"),
dict(title="Internal"),
dict(title="Harga"),
dict(title="Modules"),
],
'column_data': [dict(data="id", width="0px"),
dict(data="kode", width="75px"),
dict(data="internal"),
dict(data="harga"),
dict(data="modules"),
],
'buttons': [
dict(id="btn_add", cls="btn btn btn-success", title="Tambah"),
dict(id="btn_edit", cls="btn btn btn-primary", title="Edit"),
dict(id="btn_delete", cls="btn btn btn-primary", title="Hapus"),
dict(id="btn_close", cls="btn btn-danger", title="Tutup"),
],
'route': "/api/produk/vendor",
'scripts': """
$('#btn_edit').click(function() {
if (mID) window.location = oTableUri + '/' + mID + '/edit';
else
$.SmartMessageBox({
title : "Edit",
content : "Pilih Baris yang akan di lihat...",
buttons : '[Oke]'
});;
});
$('#btn_delete').click(function() {
if (mID) window.location = oTableUri + '/' + mID + '/delete';
else
$.SmartMessageBox({
title : "Delete",
content : "Pilih Baris yang akan di lihat...",
buttons : '[Oke]'
});;
});
$('#btn_add').click(function() {
window.location = oTableUri + '/add';
});
$("#btn_close").click(function() {
window.location = '/api/merchant';
return false;
});
"""}
return dict(params=params)
@view_config(route_name='api-produk-vendor-act', renderer='json',
permission="api-produk-vendor-list"
)
def view_act(self):
request = self.req
url_dict = request.matchdict
act = url_dict['act']
if act == "grid":
columns = [
ColumnDT(PartnerProduk.id, mData='id'),
ColumnDT(PartnerProduk.kode, mData='kode'),
ColumnDT(Produk.kode, mData='internal'),
ColumnDT(PartnerProduk.harga, mData='harga'),
ColumnDT(PartnerProduk.modules, mData='modules'),
]
query = DBSession.query().select_from(PartnerProduk)\
.join(Produk, PartnerProduk.produk_id==Produk.id)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='api-produk-vendor-add',
permission="api-produk-vendor-admin",
renderer='templates/form.pt')
def view_add(self):
request = self.req
form = get_form(request, AddSchema)
# form_params = dict(scripts=None)
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())
row = save_request(request, values)
return route_list(request)
return dict(form=form, params=form_params_edit)
@view_config(route_name='api-produk-vendor-edit',
permission="api-produk-vendor-admin",
renderer='templates/form.pt')
def view_edit(self):
request = self.req
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_edit)
values = dict(c.items())
save_request(request, values, row)
return route_list(request)
values = row.to_dict()
form.render(values)
return dict(form=form, params=form_params_edit)
@view_config(route_name='api-produk-vendor-delete',
renderer='templates/form.pt',
permission="api-produk-vendor-admin")
def view_delete(self):
request = self.req
form = get_form(request, EditSchema, (btn_cancel, btn_delete))
for f in form:
form[f].widget.readonly = True
query = query_id(request)
row = query.first()
if not row:
return id_not_found(request)
if request.POST:
if 'delete' in request.POST:
request.session.flash('Data %s berhasil dihapus' % row.nama)
query.delete()
return route_list(request)
values = row.to_dict()
form.render(values)
return dict(form=form, params={"scripts": None})
<html metal:use-macro="load: opensipkd.base:views/templates/base3.pt">
<ul metal:fill-slot="navs">
<li>
<a href="${request._host}/api/merchant/add">
<a href="${request._host}/api/produk/list">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">Add Merchant Invoice</span>
<span class="menu-item-parent">List Produk</span>
</a>
</li>
<li>
<a href="${request._host}/api/merchant/list">
<a href="${request._host}/api/produk/vendor/list">
<i class="fa fa-lg fa-fw fa-home"></i>
<span class="menu-item-parent">List Merchant Invoice</span>
<span class="menu-item-parent">List Produk Vendor</span>
</a>
</li>
<li>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!