Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Kunto
/
backoffice
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit a1e5f489
authored
Aug 24, 2019
by
aa.gusti
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
message inqury and add partner form
1 parent
533f0000
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
949 additions
and
252 deletions
setup.py
src/agratek/api/merchant/scripts/data/routes.csv
src/agratek/api/merchant/views/__init__.py
src/agratek/api/merchant/views/merchant.py → src/agratek/api/merchant/views/api_merchant.py
src/agratek/api/merchant/views/odeo/__init__.py
src/agratek/api/merchant/views/partner.py
src/agratek/api/merchant/views/templates/base.pt
src/agratek/api/merchant/views/templates/home.pt
src/agratek/api/merchant/views/templates/partner/add.pt
src/agratek/api/merchant/views/templates/partner/del.pt
src/agratek/api/merchant/views/templates/partner/edt.pt
src/agratek/api/merchant/views/templates/partner/list.pt
src/agratek/api/merchant/views/vendor_trx.py
setup.py
View file @
a1e5f48
...
...
@@ -8,7 +8,8 @@ CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
requires
=
[
"opensipkd.base"
,
"opensipkd.pasar.models"
"opensipkd.pasar.models"
,
"xmltodict"
]
...
...
src/agratek/api/merchant/scripts/data/routes.csv
View file @
a1e5f48
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
src/agratek/api/merchant/views/__init__.py
View file @
a1e5f48
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
()
src/agratek/api/merchant/views/merchant.py
→
src/agratek/api/merchant/views/
api_
merchant.py
View file @
a1e5f48
import
logging
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
,
...
...
@@ -8,8 +7,8 @@ from opensipkd.base.tools.api import (auth_from_rpc,
from
opensipkd.pasar.models
import
Produk
,
PartnerProduk
from
opensipkd.pasar.models.produk
import
H2hArInvoice
,
H2hArInvoiceDet
,
PartnerLog
from
pyramid_rpc.jsonrpc
import
jsonrpc_method
from
opensipkd.base.tools
import
get_settings
import
logging
from
..tools
import
JsonRpcInvoiceFoundError
,
JsonRpcError
log
=
logging
.
getLogger
(
__name__
)
...
...
@@ -22,21 +21,21 @@ def build_request(typ, vendor_produk, partner_log=None):
pckgs
=
'agratek.api.merchant.views'
moduls
=
vendor_produk
.
modules
.
split
(
'.'
)
if
len
(
moduls
)
>
1
:
if
len
(
moduls
)
>
1
:
pckg
=
"."
.
join
(
moduls
[:
-
1
])
pckgs
=
"."
.
join
([
pckgs
,
pckg
])
moduls
=
moduls
[
-
1
:]
modul
=
moduls
[
0
]
log
.
info
(
"Module:
%
s Pckgs:
%
s"
%
(
modul
,
pckgs
))
log
.
info
(
"Module:
%
s Pckgs:
%
s"
%
(
modul
,
pckgs
))
modul
=
'.'
+
modul
modules
=
import_module
(
modul
,
pckgs
)
cls_module
=
modules
.
Vendor
(
vendor_produk
,
partner_log
)
cls
=
hasattr
(
cls_module
,
typ
)
and
getattr
(
cls_module
,
typ
)
or
None
if
cls
:
result
=
cls
()
#log.info("Build Req: mod %s rslt: %s" % (vendor_produk.modules, data))
#
log.info("Build Req: mod %s rslt: %s" % (vendor_produk.modules, data))
log
.
info
(
"Request
%
s"
%
cls_module
.
request
)
log
.
info
(
"Response
%
s"
%
cls_module
.
response
)
log
.
info
(
"Result
%
s"
%
cls_module
.
result
)
...
...
@@ -44,7 +43,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
)
...
...
@@ -55,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
)
\
...
...
@@ -65,84 +74,54 @@ def get_vendor_produk(produk_kd, vendor_kd=None, harga=None):
"""
Fungsi ini digunakan untuk mencari vendor yang paling murah
:param produk_kd: String Kode Produk
:param level: Digunakan sebagai parameter jika yang paling murah tidak ditemukan
:vendor_kd: Kode Vendor
:param vendor_kd: Kode Vendor
:return: row objek dari Partner Produk
"""
### Jika parameter level tidak disebutkan
settings
=
get_settings
()
qry
=
qry_vendor_produk
()
qry
=
qry_vendor_produk
()
.
filter
(
Produk
.
kode
==
produk_kd
)
# Jika parameter vendor_kd disebutkan maka secara explisit mengambil dari
# data vendor parameter secara default mengambil dari yang statusnya=1
if
vendor_kd
:
log
.
info
(
vendor_kd
)
return
qry
\
.
filter
(
Partner
.
kode
==
vendor_kd
)
\
.
filter
(
Produk
.
kode
==
produk_kd
)
.
first
()
if
is_devel
():
settings
=
get_settings
()
vend_kd
=
'dev_vend_kd'
in
settings
and
settings
[
'dev_vend_kd'
]
or
'test'
log
.
info
(
vend_kd
)
return
qry
\
.
filter
(
Partner
.
kode
==
vend_kd
)
\
.
filter
(
Produk
.
kode
==
produk_kd
)
.
first
()
qry
=
qry
.
filter
(
Partner
.
kode
==
vendor_kd
)
else
:
result
=
qry
\
.
filter
(
Produk
.
kode
==
produk_kd
)
.
order_by
(
PartnerProduk
.
harga
)
row
=
result
.
filter
(
PartnerProduk
.
harga
>
harga
)
.
first
()
if
not
row
:
harga
=
0
row
=
result
.
filter
(
PartnerProduk
.
harga
>
harga
)
.
first
()
qry
=
qry
.
filter
(
PartnerProduk
.
status
==
1
)
return
row
row
=
qry
.
first
()
return
row
@jsonrpc_method
(
method
=
'inquiry'
,
endpoint
=
'api-merchant'
)
def
inquiry
(
request
,
data
,
**
kwargs
):
"""
Digunakan untuk mendapatkan daftar produk
:param request:
:param data:
{
product_kd: string, //optional
cid:string //optional
}
:param token:
user_token
:return:
{
product_kd:string,
product_nm:string,
harga:integer,
admin:integer,
discount:integer
}
"""
"""
Digunakan untuk mendapatkan daftar produk
Digunakan untuk mendapatkan data tagihan
:param request:
:param data:
{
denom: string,
id_pel:string
inv_no: string optional
}
:param token:
user_token
:return:
{
product_nm:string,
denom: string,
id_pel:string
inv_no: string optional
denom:string,
harga:integer,
admin:integer,
discount:integer,
total:integer,
status:success/pending/failed
:return:
{
"data": [{
"nopel": "530678910981",
"nama": "SUBCRIBER NAME",
"refno": "25641544",
"rincian":{
"pokok": 300000,
"denda": 0,
"admin": 2500,
"tarif": "R1
\
/1300VA",
"no_meter": "530678910012",
"power": "1300VA"
},
"subtotal": 302500,
"discount": 800,
"total": 301700
}]
}
"""
user
=
auth_from_rpc
(
request
)
i
=
0
...
...
@@ -160,35 +139,25 @@ def inquiry(request, data, **kwargs):
produk_kd
=
'denom'
in
prod
and
prod
[
'denom'
]
or
None
if
not
produk_kd
:
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk harus diisi"
)
vendor_produk
=
get_vendor_produk
(
produk_kd
)
vendor_kd
=
'vendor_kd'
in
prod
and
prod
[
'vendor_kd'
]
or
None
vendor_produk
=
get_vendor_produk
(
produk_kd
,
vendor_kd
=
vendor_kd
)
if
not
vendor_produk
:
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk
%
s tidak ditemukan"
%
produk_kd
)
partner_log
=
PartnerLog
()
partner_log
.
vendor_id
=
vendor_produk
.
partner_id
partner_log
.
customer_id
=
customer
.
id
partner_log
.
produk_id
=
vendor_produk
.
produk
.
id
# partner_log.cust_inv = dat["inv_no"]
partner_log
.
id_pel
=
prod
[
"id_pel"
]
flush_row
(
partner_log
)
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk
%
s tidak ditemukan"
%
produk_kd
)
log
.
info
(
"Vendor
%
s Produk
%
s Module
%
s"
%
(
vendor_produk
.
partner
.
kode
,
vendor_produk
.
produk
.
kode
,
vendor_produk
.
modules
))
values
=
dict
(
customer_id
=
customer
.
id
,
id_pel
=
prod
[
"id_pel"
])
partner_log
=
save_partner_log
(
values
,
vendor_produk
)
result
=
build_request
(
'inquiry'
,
vendor_produk
,
partner_log
)
if
result
[
"code"
]
==
0
:
prod
.
update
(
result
)
result_code
=
"code"
in
result
[
"f_result"
]
and
result
[
"f_result"
][
"code"
]
or
None
if
result_code
:
raise
JsonRpcError
(
message
=
result
[
"f_result"
][
"message"
])
# rincian = "rincian" in result and result["rincian"] or []
# if rincian:
# pokok = "pokok" in rincian and rincian["pokok"] or 0
# admin = result["jml_data"]*vendor_produk.produk.harga
# subtotal = pokok+admin
#
# discount = result["discount"] - result["jml_data"] * vendor_produk.produk.harga
# prod.update(dict(
# subtotal=result["subtotal"],
# discount=discount,
# total=result["subtotal"] - discount))
if
result
[
"f_result"
][
"code"
]
==
0
:
prod
.
update
(
result
)
else
:
prod
.
update
(
dict
(
status
=
"FAILED"
,
message
=
result
[
"message"
]))
...
...
@@ -202,9 +171,6 @@ def build_purchase(vendor_produk, partner_log=None):
return
build_request
(
'payment'
,
vendor_produk
,
partner_log
)
from
..tools
import
JsonRpcInvoiceFoundError
@jsonrpc_method
(
method
=
'purchase'
,
endpoint
=
'api-merchant'
)
def
purchase
(
request
,
data
,
**
kwargs
):
"""
...
...
@@ -365,9 +331,9 @@ def advice(request, data):
if
"produk"
in
dat
:
prods
=
[]
for
p
in
dat
[
"produk"
]:
row
=
qry
.
join
(
Produk
,
Produk
.
id
==
H2hArInvoiceDet
.
produk_id
)
\
.
filter
(
Produk
.
kode
==
p
[
"denom"
],
H2hArInvoiceDet
.
id_pel
==
p
[
"id_pel"
])
.
first
()
row
=
qry
.
join
(
Produk
,
Produk
.
id
==
H2hArInvoiceDet
.
produk_id
)
\
.
filter
(
Produk
.
kode
==
p
[
"denom"
],
H2hArInvoiceDet
.
id_pel
==
p
[
"id_pel"
])
.
first
()
if
not
row
:
status
=
"FAILED"
message
=
"Produk tidak ada"
...
...
src/agratek/api/merchant/views/odeo/__init__.py
View file @
a1e5f48
...
...
@@ -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,7 +80,7 @@ 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
)
...
...
@@ -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
...
...
src/agratek/api/merchant/views/partner.py
0 → 100644
View file @
a1e5f48
from
datetime
import
datetime
from
pyramid.view
import
view_config
from
pyramid.httpexceptions
import
HTTPFound
import
colander
from
deform
import
(
Form
,
widget
,
ValidationFailure
,
Button
)
from
opensipkd.base.views
import
ColumnDT
,
DataTables
,
BaseView
from
..models
import
DBSession
from
..models
import
Partner
,
User
SESS_ADD_FAILED
=
'Tambah partner gagal'
SESS_EDIT_FAILED
=
'Edit partner gagal'
def
form_buttons
():
btn_register
=
Button
(
name
=
'simpan'
,
css_class
=
'btn-success'
,
type
=
"submit"
)
btn_cancel
=
Button
(
name
=
'batal'
,
css_class
=
'btn-warning'
,
type
=
"submit"
)
return
[
btn_cancel
,
btn_register
]
def
user_list
():
return
DBSession
.
query
(
User
.
id
,
User
.
user_name
)
.
all
()
@colander.deferred
def
deferred_user
(
node
,
kw
):
##initialize deffered_status
values
=
kw
.
get
(
'daftar_user'
,
[])
# varible for get value daftar_status
return
widget
.
Select2Widget
(
values
=
values
)
class
AddSchema
(
colander
.
Schema
):
kode
=
colander
.
SchemaNode
(
colander
.
String
(),
validator
=
colander
.
Length
(
max
=
32
),
oid
=
"kode"
,
title
=
"Nomor Identitas"
)
nama
=
colander
.
SchemaNode
(
colander
.
String
(),
oid
=
"nama"
)
alamat_1
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"alamat_1"
)
alamat_2
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"alamat_2"
)
kelurahan
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"kelurahan"
)
kecamatan
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"kecamatan"
)
kota
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"kota"
)
provinsi
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"provinsi"
)
email
=
colander
.
SchemaNode
(
colander
.
String
(),
oid
=
"nik"
)
phone
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"nik"
)
fax
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"nik"
)
mobile
=
colander
.
SchemaNode
(
colander
.
String
(),
oid
=
"nik"
)
website
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
oid
=
"nik"
)
is_vendor
=
colander
.
SchemaNode
(
colander
.
Boolean
(),
oid
=
"is_vendor"
,
title
=
"Vendor"
)
is_customer
=
colander
.
SchemaNode
(
colander
.
Boolean
(),
oid
=
"is_ccustomer"
,
title
=
"Customer"
)
status
=
colander
.
SchemaNode
(
colander
.
Boolean
(),
oid
=
"status"
)
user_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
deferred_user
,
oid
=
"status"
)
class
EditSchema
(
AddSchema
):
id
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
widget
=
widget
.
HiddenWidget
(),
)
class
ViewPartner
(
BaseView
):
########
# List #
########
@view_config
(
route_name
=
'api-partner-list'
,
renderer
=
'templates/partner/list.pt'
,
permission
=
'partner'
)
def
view_list
(
self
):
return
dict
(
a
=
{})
##########
# Action #
##########
@view_config
(
route_name
=
'api-partner-act'
,
renderer
=
'json'
,
permission
=
'partner'
)
def
view_act
(
self
):
request
=
self
.
req
ses
=
request
.
session
params
=
request
.
params
url_dict
=
request
.
matchdict
if
url_dict
[
'act'
]
==
'grid'
:
columns
=
[
ColumnDT
(
Partner
.
id
,
mData
=
'id'
),
ColumnDT
(
Partner
.
kode
,
mData
=
'kode'
),
ColumnDT
(
Partner
.
nama
,
mData
=
'nama'
),
ColumnDT
(
Partner
.
is_vendor
,
mData
=
'is_vendor'
),
ColumnDT
(
Partner
.
is_customer
,
mData
=
'is_customer'
),
ColumnDT
(
Partner
.
status
,
mData
=
'status'
),
]
query
=
DBSession
.
query
()
.
select_from
(
Partner
)
rowTable
=
DataTables
(
request
.
GET
,
query
,
columns
)
return
rowTable
.
output_result
()
elif
url_dict
[
'act'
]
==
'hok'
:
term
=
'term'
in
params
and
params
[
'term'
]
or
''
prefix
=
'prefix'
in
params
and
params
[
'prefix'
]
or
''
q
=
DBSession
.
query
(
Partner
.
id
,
Partner
.
kode
.
label
(
'value'
),
Partner
.
kode
,
Partner
.
nama
)
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
filter
(
Partner
.
is_vendor
==
1
)
.
\
order_by
(
Partner
.
nama
)
row
=
q
.
first
()
r
=
[]
if
row
:
keys
=
row
.
keys
()
for
k
in
q
.
all
():
d
=
dict
(
zip
(
keys
,
k
))
r
.
append
(
d
)
return
r
elif
url_dict
[
'act'
]
==
'hon'
:
term
=
'term'
in
params
and
params
[
'term'
]
or
''
prefix
=
'prefix'
in
params
and
params
[
'prefix'
]
or
''
q
=
DBSession
.
query
(
Partner
.
id
,
Partner
.
nama
.
label
(
'value'
),
Partner
.
kode
,
Partner
.
nama
)
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
order_by
(
Partner
.
nama
)
r
=
[]
row
=
q
.
first
()
if
not
row
:
return
r
keys
=
row
.
keys
()
for
k
in
q
.
all
():
d
=
dict
(
zip
(
keys
,
k
))
r
.
append
(
d
)
return
r
elif
url_dict
[
'act'
]
==
'vendor'
:
# vendor only
term
=
'term'
in
params
and
params
[
'term'
]
or
''
prefix
=
'prefix'
in
params
and
params
[
'prefix'
]
or
''
q
=
DBSession
.
query
(
Partner
.
id
,
Partner
.
nama
.
label
(
'value'
),
Partner
.
kode
,
Partner
.
nama
)
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
filter
(
Partner
.
is_vendor
==
1
)
.
\
order_by
(
Partner
.
nama
)
row
=
q
.
first
()
r
=
[]
if
row
:
keys
=
row
.
keys
()
for
k
in
q
.
all
():
d
=
dict
(
zip
(
keys
,
k
))
r
.
append
(
d
)
return
r
elif
url_dict
[
'act'
]
==
'customer'
:
# customer only
term
=
'term'
in
params
and
params
[
'term'
]
or
''
prefix
=
'prefix'
in
params
and
params
[
'prefix'
]
or
''
q
=
DBSession
.
query
(
Partner
.
id
,
Partner
.
nama
.
label
(
'value'
),
Partner
.
kode
,
Partner
.
nama
)
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
filter
(
Partner
.
is_customer
==
1
)
.
\
order_by
(
Partner
.
nama
)
row
=
q
.
first
()
r
=
[]
if
row
:
keys
=
row
.
keys
()
for
k
in
q
.
all
():
d
=
dict
(
zip
(
keys
,
k
))
r
.
append
(
d
)
return
r
@view_config
(
route_name
=
'api-partner-add'
,
renderer
=
'templates/partner/add.pt'
,
permission
=
'partner-add'
)
def
view_add
(
self
):
request
=
self
.
req
form
=
get_form
(
request
,
AddSchema
,
buttons
=
form_buttons
())
if
request
.
POST
:
if
'simpan'
in
request
.
POST
:
controls
=
request
.
POST
.
items
()
try
:
controls
=
form
.
validate
(
controls
)
except
ValidationFailure
as
e
:
form
.
render
(
appstruct
=
e
.
cstruct
)
return
dict
(
form
=
form
)
save_request
(
request
,
dict
(
controls
))
return
route_list
(
request
)
elif
SESS_ADD_FAILED
in
request
.
session
:
return
self
.
session_failed
(
SESS_ADD_FAILED
)
return
dict
(
form
=
form
)
# return dict(form=form.render())
##########
# Edit #
##########
@view_config
(
route_name
=
'api-partner-edit'
,
renderer
=
'templates/partner/edt.pt'
,
permission
=
'partner-edit'
)
def
view_edt
(
self
):
request
=
self
.
req
q
=
query_id
(
request
)
row
=
q
.
first
()
if
not
row
:
return
id_not_found
(
request
)
uid
=
row
.
id
form
=
get_form
(
request
,
EditSchema
,
buttons
=
form_buttons
())
if
request
.
POST
:
if
'simpan'
in
request
.
POST
:
controls
=
request
.
POST
.
items
()
try
:
controls
=
form
.
validate
(
controls
)
except
ValidationFailure
as
e
:
form
.
render
(
appstruct
=
e
.
cstruct
)
return
dict
(
form
=
form
)
save_request
(
request
,
dict
(
controls
),
row
)
return
route_list
(
request
)
elif
SESS_EDIT_FAILED
in
request
.
session
:
return
self
.
session_failed
(
SESS_EDIT_FAILED
)
val
=
row
.
to_dict
()
values
=
{}
for
v
in
val
:
if
val
[
v
]:
values
[
v
]
=
val
[
v
]
form
.
render
(
appstruct
=
values
)
return
dict
(
form
=
form
)
##########
# Delete #
##########
@view_config
(
route_name
=
'api-partner-delete'
,
renderer
=
'templates/partner/del.pt'
,
permission
=
'partner-del'
)
def
view_del
(
self
):
request
=
self
.
req
q
=
query_id
(
request
)
row
=
q
.
first
()
if
not
row
:
return
id_not_found
(
request
)
form
=
Form
(
colander
.
Schema
(),
buttons
=
(
'hapus'
,
'batal'
))
if
request
.
POST
:
if
'hapus'
in
request
.
POST
:
msg
=
'Partner ID
%
d
%
s sudah dihapus.'
%
(
row
.
id
,
row
.
nama
)
q
.
delete
()
DBSession
.
flush
()
request
.
session
.
flash
(
msg
)
return
route_list
(
request
)
return
dict
(
row
=
row
,
form
=
form
.
render
())
#######
# Add #
#######
def
form_validator
(
form
,
value
):
def
err_kode
():
raise
colander
.
Invalid
(
form
,
'Kode
%
s sudah digunakan oleh
%
s'
%
(
value
[
'kode'
],
found
.
nama
))
# def err_login():
# raise colander.Invalid(form,
# 'Login %s sudah digunakan oleh kode %s' % (
# value['user_nm'], found.row.nama))
if
'id'
in
form
.
request
.
matchdict
:
uid
=
form
.
request
.
matchdict
[
'id'
]
q
=
DBSession
.
query
(
Partner
)
.
filter_by
(
id
=
uid
)
row
=
q
.
first
()
else
:
row
=
None
q
=
Partner
.
query_kode
(
value
[
'kode'
])
# DBSession.query(Partner).filter_by(kode=value['kode'])
found
=
q
.
first
()
if
row
:
if
found
and
found
.
id
!=
row
.
id
:
err_kode
()
elif
found
:
err_kode
()
def
get_form
(
request
,
class_form
,
buttons
=
None
,
row
=
None
):
schema
=
class_form
(
validator
=
form_validator
)
schema
=
schema
.
bind
(
daftar_user
=
user_list
())
schema
.
request
=
request
if
row
:
schema
.
deserialize
(
row
)
if
not
buttons
:
buttons
=
(
'simpan'
,
'batal'
)
return
Form
(
schema
,
buttons
=
buttons
)
def
save
(
values
,
user
,
row
=
None
):
if
not
row
:
row
=
Partner
()
row
.
created
=
datetime
.
now
()
row
.
create_uid
=
user
.
id
values
[
'is_vendor'
]
=
'is_vendor'
in
values
and
values
[
'is_vendor'
]
and
1
or
0
values
[
'is_customer'
]
=
'is_customer'
in
values
and
values
[
'is_customer'
]
and
1
or
0
row
.
from_dict
(
values
)
row
.
updated
=
datetime
.
now
()
row
.
update_uid
=
user
.
id
row
.
status
=
'status'
in
values
and
values
[
'status'
]
and
1
or
0
DBSession
.
add
(
row
)
DBSession
.
flush
()
return
row
def
save_request
(
request
,
values
,
row
=
None
):
if
'id'
in
request
.
matchdict
:
values
[
'id'
]
=
request
.
matchdict
[
'id'
]
row
=
save
(
values
,
request
.
user
,
row
)
request
.
session
.
flash
(
'Partner sudah disimpan.'
)
def
route_list
(
request
):
return
HTTPFound
(
location
=
request
.
route_url
(
'api-partner-list'
))
def
session_failed
(
request
,
session_name
):
r
=
dict
(
form
=
request
.
session
[
session_name
])
del
request
.
session
[
session_name
]
return
r
########
# Edit #
########
def
query_id
(
request
):
return
DBSession
.
query
(
Partner
)
.
filter_by
(
id
=
request
.
matchdict
[
'id'
])
def
id_not_found
(
request
):
msg
=
'Partner ID
%
s Tidak Ditemukan.'
%
request
.
matchdict
[
'id'
]
request
.
session
.
flash
(
msg
,
'error'
)
return
route_list
(
request
)
src/agratek/api/merchant/views/templates/base.pt
View file @
a1e5f48
...
...
@@ -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>
src/agratek/api/merchant/views/templates/home.pt
View file @
a1e5f48
...
...
@@ -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>
...
...
src/agratek/api/merchant/views/templates/partner/add.pt
0 → 100644
View file @
a1e5f48
<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>
src/agratek/api/merchant/views/templates/partner/del.pt
0 → 100644
View file @
a1e5f48
<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>
src/agratek/api/merchant/views/templates/partner/edt.pt
0 → 100644
View file @
a1e5f48
<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>
src/agratek/api/merchant/views/templates/partner/list.pt
0 → 100644
View file @
a1e5f48
<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>'
,
' '
,
'</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>
src/agratek/api/merchant/views/vendor_trx.py
View file @
a1e5f48
#
# 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
()
...
...
@@ -229,19 +160,6 @@ def save_ar_invoice(values, vendor_produk):
flush_row
(
invoice_det
)
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 +197,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 +208,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 +234,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)
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment