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()
...
@@ -8,7 +8,8 @@ CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
requires
=
[
requires
=
[
"opensipkd.base"
,
"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
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-merchant,/api/merchant,Api Merchant,1,1
api-vendor-notify,/api/vendor/{name}/notify,Api Vendor Notify,1,0
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
...
@@ -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-view,/api/customer/{id}/view,View Customer,1,0
api-customer-add,/api/customer/add,Add 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-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
\ 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
\ No newline at end of file
src/agratek/api/merchant/views/__init__.py
View file @
a1e5f48
from
opensipkd.base.views
import
(
BaseView
)
from
opensipkd.base.views
import
(
BaseView
)
from
opensipkd.pasar.models.views
import
deferred_vendor
,
deferred_customer
,
deferred_produk
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
importlib
import
import_module
from
opensipkd.base
import
is_devel
from
opensipkd.base.models
import
Partner
,
flush_row
from
opensipkd.base.models
import
Partner
,
flush_row
from
opensipkd.base.tools.api
import
(
auth_from_rpc
,
from
opensipkd.base.tools.api
import
(
auth_from_rpc
,
JsonRpcProdukNotFoundError
,
JsonRpcCustomerNotFoundError
,
JsonRpcProdukNotFoundError
,
JsonRpcCustomerNotFoundError
,
...
@@ -8,8 +7,8 @@ from opensipkd.base.tools.api import (auth_from_rpc,
...
@@ -8,8 +7,8 @@ from opensipkd.base.tools.api import (auth_from_rpc,
from
opensipkd.pasar.models
import
Produk
,
PartnerProduk
from
opensipkd.pasar.models
import
Produk
,
PartnerProduk
from
opensipkd.pasar.models.produk
import
H2hArInvoice
,
H2hArInvoiceDet
,
PartnerLog
from
opensipkd.pasar.models.produk
import
H2hArInvoice
,
H2hArInvoiceDet
,
PartnerLog
from
pyramid_rpc.jsonrpc
import
jsonrpc_method
from
pyramid_rpc.jsonrpc
import
jsonrpc_method
from
opensipkd.base.tools
import
get_settings
from
..tools
import
JsonRpcInvoiceFoundError
,
JsonRpcError
import
logging
log
=
logging
.
getLogger
(
__name__
)
log
=
logging
.
getLogger
(
__name__
)
...
@@ -22,21 +21,21 @@ def build_request(typ, vendor_produk, partner_log=None):
...
@@ -22,21 +21,21 @@ def build_request(typ, vendor_produk, partner_log=None):
pckgs
=
'agratek.api.merchant.views'
pckgs
=
'agratek.api.merchant.views'
moduls
=
vendor_produk
.
modules
.
split
(
'.'
)
moduls
=
vendor_produk
.
modules
.
split
(
'.'
)
if
len
(
moduls
)
>
1
:
if
len
(
moduls
)
>
1
:
pckg
=
"."
.
join
(
moduls
[:
-
1
])
pckg
=
"."
.
join
(
moduls
[:
-
1
])
pckgs
=
"."
.
join
([
pckgs
,
pckg
])
pckgs
=
"."
.
join
([
pckgs
,
pckg
])
moduls
=
moduls
[
-
1
:]
moduls
=
moduls
[
-
1
:]
modul
=
moduls
[
0
]
modul
=
moduls
[
0
]
log
.
info
(
"Module:
%
s Pckgs:
%
s"
%
(
modul
,
pckgs
))
log
.
info
(
"Module:
%
s Pckgs:
%
s"
%
(
modul
,
pckgs
))
modul
=
'.'
+
modul
modul
=
'.'
+
modul
modules
=
import_module
(
modul
,
pckgs
)
modules
=
import_module
(
modul
,
pckgs
)
cls_module
=
modules
.
Vendor
(
vendor_produk
,
partner_log
)
cls_module
=
modules
.
Vendor
(
vendor_produk
,
partner_log
)
cls
=
hasattr
(
cls_module
,
typ
)
and
getattr
(
cls_module
,
typ
)
or
None
cls
=
hasattr
(
cls_module
,
typ
)
and
getattr
(
cls_module
,
typ
)
or
None
if
cls
:
if
cls
:
result
=
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
(
"Request
%
s"
%
cls_module
.
request
)
log
.
info
(
"Response
%
s"
%
cls_module
.
response
)
log
.
info
(
"Response
%
s"
%
cls_module
.
response
)
log
.
info
(
"Result
%
s"
%
cls_module
.
result
)
log
.
info
(
"Result
%
s"
%
cls_module
.
result
)
...
@@ -44,7 +43,7 @@ def build_request(typ, vendor_produk, partner_log=None):
...
@@ -44,7 +43,7 @@ def build_request(typ, vendor_produk, partner_log=None):
result
[
"f_response"
]
=
cls_module
.
response
result
[
"f_response"
]
=
cls_module
.
response
result
[
"f_result"
]
=
cls_module
.
result
result
[
"f_result"
]
=
cls_module
.
result
result
[
"f_request"
]
=
cls_module
.
request
result
[
"f_request"
]
=
cls_module
.
request
# result["url"] = cls_module.url
else
:
else
:
log
.
info
(
"Module
%
s Not Found"
%
vendor_produk
.
modules
)
log
.
info
(
"Module
%
s Not Found"
%
vendor_produk
.
modules
)
...
@@ -55,6 +54,16 @@ def build_request(typ, vendor_produk, partner_log=None):
...
@@ -55,6 +54,16 @@ def build_request(typ, vendor_produk, partner_log=None):
return
result
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
():
def
qry_vendor_produk
():
return
PartnerProduk
.
query
()
\
return
PartnerProduk
.
query
()
\
.
join
(
Partner
,
Partner
.
id
==
PartnerProduk
.
partner_id
)
\
.
join
(
Partner
,
Partner
.
id
==
PartnerProduk
.
partner_id
)
\
...
@@ -65,84 +74,54 @@ def get_vendor_produk(produk_kd, vendor_kd=None, harga=None):
...
@@ -65,84 +74,54 @@ def get_vendor_produk(produk_kd, vendor_kd=None, harga=None):
"""
"""
Fungsi ini digunakan untuk mencari vendor yang paling murah
Fungsi ini digunakan untuk mencari vendor yang paling murah
:param produk_kd: String Kode Produk
:param produk_kd: String Kode Produk
:param level: Digunakan sebagai parameter jika yang paling murah tidak ditemukan
:param vendor_kd: Kode Vendor
:vendor_kd: Kode Vendor
:return: row objek dari Partner Produk
:return: row objek dari Partner Produk
"""
"""
### Jika parameter level tidak disebutkan
qry
=
qry_vendor_produk
()
.
filter
(
Produk
.
kode
==
produk_kd
)
# Jika parameter vendor_kd disebutkan maka secara explisit mengambil dari
settings
=
get_settings
()
# data vendor parameter secara default mengambil dari yang statusnya=1
qry
=
qry_vendor_produk
()
if
vendor_kd
:
if
vendor_kd
:
log
.
info
(
vendor_kd
)
qry
=
qry
.
filter
(
Partner
.
kode
==
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
()
else
:
else
:
result
=
qry
\
qry
=
qry
.
filter
(
PartnerProduk
.
status
==
1
)
.
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
()
return
row
row
=
qry
.
first
()
return
row
@jsonrpc_method
(
method
=
'inquiry'
,
endpoint
=
'api-merchant'
)
@jsonrpc_method
(
method
=
'inquiry'
,
endpoint
=
'api-merchant'
)
def
inquiry
(
request
,
data
,
**
kwargs
):
def
inquiry
(
request
,
data
,
**
kwargs
):
"""
"""
Digunakan untuk mendapatkan daftar produk
Digunakan untuk mendapatkan data tagihan
: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
:param request:
:param request:
:param data:
:param data:
{
{
denom: string,
denom: string,
id_pel:string
id_pel:string
inv_no: string optional
}
}
:param token:
:param token:
user_token
user_token
:return:
{
product_nm:string,
denom: string,
:return:
id_pel:string
{
inv_no: string optional
"data": [{
denom:string,
"nopel": "530678910981",
harga:integer,
"nama": "SUBCRIBER NAME",
admin:integer,
"refno": "25641544",
discount:integer,
"rincian":{
total:integer,
"pokok": 300000,
status:success/pending/failed
"denda": 0,
"admin": 2500,
"tarif": "R1
\
/1300VA",
"no_meter": "530678910012",
"power": "1300VA"
},
"subtotal": 302500,
"discount": 800,
"total": 301700
}]
}
"""
"""
user
=
auth_from_rpc
(
request
)
user
=
auth_from_rpc
(
request
)
i
=
0
i
=
0
...
@@ -160,35 +139,25 @@ def inquiry(request, data, **kwargs):
...
@@ -160,35 +139,25 @@ def inquiry(request, data, **kwargs):
produk_kd
=
'denom'
in
prod
and
prod
[
'denom'
]
or
None
produk_kd
=
'denom'
in
prod
and
prod
[
'denom'
]
or
None
if
not
produk_kd
:
if
not
produk_kd
:
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk harus diisi"
)
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk harus diisi"
)
vendor_kd
=
'vendor_kd'
in
prod
and
prod
[
'vendor_kd'
]
or
None
vendor_produk
=
get_vendor_produk
(
produk_kd
)
vendor_produk
=
get_vendor_produk
(
produk_kd
,
vendor_kd
=
vendor_kd
)
if
not
vendor_produk
:
if
not
vendor_produk
:
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk
%
s tidak ditemukan"
%
produk_kd
)
raise
JsonRpcProdukNotFoundError
(
message
=
"Produk
%
s tidak ditemukan"
%
produk_kd
)
partner_log
=
PartnerLog
()
partner_log
.
vendor_id
=
vendor_produk
.
partner_id
log
.
info
(
"Vendor
%
s Produk
%
s Module
%
s"
%
(
vendor_produk
.
partner
.
kode
,
partner_log
.
customer_id
=
customer
.
id
vendor_produk
.
produk
.
kode
,
partner_log
.
produk_id
=
vendor_produk
.
produk
.
id
vendor_produk
.
modules
))
# partner_log.cust_inv = dat["inv_no"]
values
=
dict
(
customer_id
=
customer
.
id
,
partner_log
.
id_pel
=
prod
[
"id_pel"
]
id_pel
=
prod
[
"id_pel"
])
partner_log
=
save_partner_log
(
values
,
vendor_produk
)
flush_row
(
partner_log
)
result
=
build_request
(
'inquiry'
,
vendor_produk
,
partner_log
)
result
=
build_request
(
'inquiry'
,
vendor_produk
,
partner_log
)
if
result
[
"code"
]
==
0
:
result_code
=
"code"
in
result
[
"f_result"
]
and
result
[
"f_result"
][
"code"
]
or
None
prod
.
update
(
result
)
if
result_code
:
raise
JsonRpcError
(
message
=
result
[
"f_result"
][
"message"
])
# rincian = "rincian" in result and result["rincian"] or []
if
result
[
"f_result"
][
"code"
]
==
0
:
# if rincian:
prod
.
update
(
result
)
# 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))
else
:
else
:
prod
.
update
(
dict
(
status
=
"FAILED"
,
prod
.
update
(
dict
(
status
=
"FAILED"
,
message
=
result
[
"message"
]))
message
=
result
[
"message"
]))
...
@@ -202,9 +171,6 @@ def build_purchase(vendor_produk, partner_log=None):
...
@@ -202,9 +171,6 @@ def build_purchase(vendor_produk, partner_log=None):
return
build_request
(
'payment'
,
vendor_produk
,
partner_log
)
return
build_request
(
'payment'
,
vendor_produk
,
partner_log
)
from
..tools
import
JsonRpcInvoiceFoundError
@jsonrpc_method
(
method
=
'purchase'
,
endpoint
=
'api-merchant'
)
@jsonrpc_method
(
method
=
'purchase'
,
endpoint
=
'api-merchant'
)
def
purchase
(
request
,
data
,
**
kwargs
):
def
purchase
(
request
,
data
,
**
kwargs
):
"""
"""
...
@@ -365,9 +331,9 @@ def advice(request, data):
...
@@ -365,9 +331,9 @@ def advice(request, data):
if
"produk"
in
dat
:
if
"produk"
in
dat
:
prods
=
[]
prods
=
[]
for
p
in
dat
[
"produk"
]:
for
p
in
dat
[
"produk"
]:
row
=
qry
.
join
(
Produk
,
Produk
.
id
==
H2hArInvoiceDet
.
produk_id
)
\
row
=
qry
.
join
(
Produk
,
Produk
.
id
==
H2hArInvoiceDet
.
produk_id
)
\
.
filter
(
Produk
.
kode
==
p
[
"denom"
],
.
filter
(
Produk
.
kode
==
p
[
"denom"
],
H2hArInvoiceDet
.
id_pel
==
p
[
"id_pel"
])
.
first
()
H2hArInvoiceDet
.
id_pel
==
p
[
"id_pel"
])
.
first
()
if
not
row
:
if
not
row
:
status
=
"FAILED"
status
=
"FAILED"
message
=
"Produk tidak ada"
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
...
@@ -9,13 +9,13 @@ from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from
..vendor
import
VendorClass
from
..vendor
import
VendorClass
import
logging
import
logging
log
=
logging
.
getLogger
(
__name__
)
log
=
logging
.
getLogger
(
__name__
)
import
urllib3
import
urllib3
urllib3
.
disable_warnings
()
urllib3
.
disable_warnings
()
class
Vendor
(
VendorClass
):
class
Vendor
(
VendorClass
):
def
__init__
(
self
,
vendor_produk
,
invoice_det
):
def
__init__
(
self
,
vendor_produk
,
invoice_det
):
VendorClass
.
__init__
(
self
,
vendor_produk
,
invoice_det
=
invoice_det
)
VendorClass
.
__init__
(
self
,
vendor_produk
,
invoice_det
=
invoice_det
)
...
@@ -40,11 +40,10 @@ class Vendor(VendorClass):
...
@@ -40,11 +40,10 @@ class Vendor(VendorClass):
# headers=self.get_headers(), timeout=15)
# headers=self.get_headers(), timeout=15)
# # try:
# # try:
# # pass
# # pass
# except requests.exceptions.RequestException as e:
# except requests.exceptions.RequestException as e:
# resp = None
# resp = None
#
#
# return resp
# return resp
def
inquiry
(
self
):
def
inquiry
(
self
):
if
not
self
.
v_produk_kd
or
not
self
.
id_pel
:
if
not
self
.
v_produk_kd
or
not
self
.
id_pel
:
...
@@ -81,7 +80,7 @@ class Vendor(VendorClass):
...
@@ -81,7 +80,7 @@ class Vendor(VendorClass):
self
.
response
=
result
self
.
response
=
result
log
.
info
(
"Inquiry Response:
%
s"
%
self
.
response
)
log
.
info
(
"Inquiry Response:
%
s"
%
self
.
response
)
if
resp
.
status_code
==
200
:
if
resp
.
status_code
==
200
:
self
.
status
=
1
# sukses
self
.
status
=
1
# sukses
data
=
"data"
in
result
and
result
[
"data"
]
or
None
data
=
"data"
in
result
and
result
[
"data"
]
or
None
parsd
=
self
.
pars_data
(
data
)
parsd
=
self
.
pars_data
(
data
)
...
@@ -100,8 +99,7 @@ class Vendor(VendorClass):
...
@@ -100,8 +99,7 @@ class Vendor(VendorClass):
else
:
else
:
self
.
status
=
-
1
self
.
status
=
-
1
parsd
=
None
parsd
=
None
return
self
.
set_response
(
parsd
)
#parsd
return
self
.
set_response
(
parsd
)
# parsd
# def gagal_transaksi(self, inq):
# def gagal_transaksi(self, inq):
# self.status = -2 # Try Other Vendor
# self.status = -2 # Try Other Vendor
...
@@ -130,8 +128,8 @@ class Vendor(VendorClass):
...
@@ -130,8 +128,8 @@ class Vendor(VendorClass):
parsd
=
None
parsd
=
None
if
self
.
vendor_produk
.
produk
.
kategori
.
kode
in
[
"e-payment"
,
"e-voucher"
]:
if
self
.
vendor_produk
.
produk
.
kategori
.
kode
in
[
"e-payment"
,
"e-voucher"
]:
parsd
=
self
.
inquiry
()
parsd
=
self
.
inquiry
()
if
parsd
[
"code"
]
!=
0
:
if
parsd
[
"code"
]
!=
0
:
self
.
status
=
-
3
self
.
status
=
-
3
return
self
.
set_response
(
typ
=
"payment"
,
return
self
.
set_response
(
typ
=
"payment"
,
message
=
"Data Tagihan Tidah ditemukan"
)
message
=
"Data Tagihan Tidah ditemukan"
)
...
@@ -141,15 +139,15 @@ class Vendor(VendorClass):
...
@@ -141,15 +139,15 @@ class Vendor(VendorClass):
url
=
self
.
get_url
(
"/prepaid/purchase"
)
url
=
self
.
get_url
(
"/prepaid/purchase"
)
try
:
try
:
resp
=
requests
.
post
(
url
,
data
=
json
.
dumps
(
params
),
verify
=
False
,
resp
=
requests
.
post
(
url
,
data
=
json
.
dumps
(
params
),
verify
=
False
,
headers
=
self
.
get_headers
(),
timeout
=
15
)
headers
=
self
.
get_headers
(),
timeout
=
15
)
except
:
except
:
resp
=
None
resp
=
None
if
resp
is
None
:
if
resp
is
None
:
self
.
status
=
0
self
.
status
=
0
return
self
.
set_pending
(
parsd
)
return
self
.
set_pending
(
parsd
)
#todo: dibuat seolah menjadi belum di transaksikan
#
todo: dibuat seolah menjadi belum di transaksikan
#todo: membuat cron untuk melakukan pengecekan transaksi
#
todo: membuat cron untuk melakukan pengecekan transaksi
try
:
try
:
result
=
json
.
loads
(
resp
.
text
)
result
=
json
.
loads
(
resp
.
text
)
self
.
response
=
result
self
.
response
=
result
...
@@ -198,19 +196,19 @@ class Vendor(VendorClass):
...
@@ -198,19 +196,19 @@ class Vendor(VendorClass):
if
data
and
"errors"
in
data
:
if
data
and
"errors"
in
data
:
msg
=
data
[
"errors"
][
0
]
msg
=
data
[
"errors"
][
0
]
pos
=
msg
.
find
(
"Sisa saldo"
)
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: "
)
pos
=
message
.
find
(
"SN: "
)
sn
=
""
sn
=
""
if
pos
>
-
1
:
if
pos
>
-
1
:
sn_spl
=
message
[
pos
:]
.
split
(
" "
)
sn_spl
=
message
[
pos
:]
.
split
(
" "
)
sn
=
len
(
sn_spl
)
>
1
and
sn_spl
[
1
]
or
""
sn
=
len
(
sn_spl
)
>
1
and
sn_spl
[
1
]
or
""
parsd
[
"serial_number"
]
=
sn
parsd
[
"serial_number"
]
=
sn
return
self
.
set_failed
(
parsd
,
message
=
message
)
return
self
.
set_failed
(
parsd
,
message
=
message
)
elif
resp
.
status_code
==
401
:
elif
resp
.
status_code
==
401
:
self
.
status
=
-
2
self
.
status
=
-
2
#todo: create cron yang status -2
#
todo: create cron yang status -2
return
self
.
set_pending
(
parsd
)
return
self
.
set_pending
(
parsd
)
def
advice
(
self
):
def
advice
(
self
):
...
@@ -235,8 +233,8 @@ class Vendor(VendorClass):
...
@@ -235,8 +233,8 @@ class Vendor(VendorClass):
self
.
save_log
(
"advice"
)
self
.
save_log
(
"advice"
)
try
:
try
:
resp
=
requests
.
get
(
url
,
params
=
params
,
verify
=
False
,
resp
=
requests
.
get
(
url
,
params
=
params
,
verify
=
False
,
headers
=
self
.
get_headers
(),
timeout
=
15
)
headers
=
self
.
get_headers
(),
timeout
=
15
)
except
:
except
:
return
self
.
set_response
()
return
self
.
set_response
()
...
@@ -314,7 +312,7 @@ class Vendor(VendorClass):
...
@@ -314,7 +312,7 @@ class Vendor(VendorClass):
jml_period
+=
1
jml_period
+=
1
if
"meter_changes"
in
inq
:
if
"meter_changes"
in
inq
:
meter
+=
inq
[
"meter_changes"
]
meter
+=
inq
[
"meter_changes"
]
i
+=
1
i
+=
1
rincian
[
"pokok"
]
=
pokok
rincian
[
"pokok"
]
=
pokok
rincian
[
"denda"
]
=
denda
rincian
[
"denda"
]
=
denda
...
@@ -410,7 +408,7 @@ class Vendor(VendorClass):
...
@@ -410,7 +408,7 @@ class Vendor(VendorClass):
self
.
amt_buy
=
result
[
"total"
]
self
.
amt_buy
=
result
[
"total"
]
harga_pokok
=
result
[
"subtotal"
]
-
rincian
[
"admin"
]
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
rincian
[
"admin"
]
=
admin
result
[
"subtotal"
]
=
int
(
harga_pokok
)
+
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 @@
...
@@ -49,6 +49,12 @@
<span
class=
"menu-item-parent"
>
Customer Invoice
</span>
<span
class=
"menu-item-parent"
>
Customer Invoice
</span>
</a>
</a>
</li>
</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>
</ul>
</html>
</html>
src/agratek/api/merchant/views/templates/home.pt
View file @
a1e5f48
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<div
class=
"col-md-8 col-md-offset-3 col-xs-12 well"
>
<div
class=
"col-md-8 col-md-offset-3 col-xs-12 well"
>
<div
class=
"panel panel-danger"
>
<div
class=
"panel panel-danger"
>
<div
class=
"panel-heading"
>
<div
class=
"panel-heading"
>
<h3
class=
"panel-title"
>
SISTEM INFORMASI KELURAHAN
</h3>
<h3
class=
"panel-title"
>
MERCHANT MANGEMENT
</h3>
</div>
</div>
</div>
</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
json
import
colander
import
colander
from
deform
import
widget
,
Form
,
ValidationFailure
from
deform
import
widget
,
Form
,
ValidationFailure
...
@@ -83,11 +11,13 @@ from pyramid.view import view_config
...
@@ -83,11 +11,13 @@ from pyramid.view import view_config
from
..tools
import
get_settings
,
btn_purchase
from
..tools
import
get_settings
,
btn_purchase
from
..tools
import
btn_inquiry
,
btn_reset
,
btn_payment
,
btn_advice
,
btn_next
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
import
logging
log
=
logging
.
getLogger
(
__name__
)
log
=
logging
.
getLogger
(
__name__
)
class
AddSchema
(
colander
.
Schema
):
class
AddSchema
(
colander
.
Schema
):
customer_id
=
colander
.
SchemaNode
(
customer_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
title
=
'Customer'
,
colander
.
Integer
(),
title
=
'Customer'
,
...
@@ -125,7 +55,6 @@ class AddSchema(colander.Schema):
...
@@ -125,7 +55,6 @@ class AddSchema(colander.Schema):
widget
=
widget
.
TextInputWidget
(
css_class
=
"readonly"
)
widget
=
widget
.
TextInputWidget
(
css_class
=
"readonly"
)
)
)
f_result
=
colander
.
SchemaNode
(
f_result
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
'Result'
,
colander
.
String
(),
title
=
'Result'
,
missing
=
colander
.
drop
,
missing
=
colander
.
drop
,
...
@@ -205,10 +134,12 @@ $(document).ready(function(){
...
@@ -205,10 +134,12 @@ $(document).ready(function(){
});
});
"""
)
"""
)
def
query_id
(
request
):
def
query_id
(
request
):
id
=
request
.
matchdict
[
'id'
]
id
=
request
.
matchdict
[
'id'
]
return
PartnerLog
.
query_id
(
id
)
return
PartnerLog
.
query_id
(
id
)
def
save_ar_invoice
(
values
,
vendor_produk
):
def
save_ar_invoice
(
values
,
vendor_produk
):
invoice
=
H2hArInvoice
.
query
()
\
invoice
=
H2hArInvoice
.
query
()
\
.
filter_by
(
cust_inv_no
=
values
[
'cust_inv_no'
])
.
first
()
.
filter_by
(
cust_inv_no
=
values
[
'cust_inv_no'
])
.
first
()
...
@@ -229,19 +160,6 @@ def save_ar_invoice(values, vendor_produk):
...
@@ -229,19 +160,6 @@ def save_ar_invoice(values, vendor_produk):
flush_row
(
invoice_det
)
flush_row
(
invoice_det
)
return
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
):
class
ViewHome
(
BaseView
):
@view_config
(
route_name
=
'api-vendor-doc'
,
@view_config
(
route_name
=
'api-vendor-doc'
,
permission
=
"api-vendor-doc"
,
permission
=
"api-vendor-doc"
,
...
@@ -279,8 +197,8 @@ class ViewHome(BaseView):
...
@@ -279,8 +197,8 @@ class ViewHome(BaseView):
return
dict
(
form
=
form
,
params
=
form_params_view
)
return
dict
(
form
=
form
,
params
=
form_params_view
)
if
'inquiry'
in
request
.
POST
:
if
'inquiry'
in
request
.
POST
:
invoice_det
=
save_partner_log
(
values
,
vendor_produk
)
partner_log
=
save_partner_log
(
values
,
vendor_produk
)
result
=
build_request
(
'inquiry'
,
vendor_produk
,
invoice_det
)
result
=
build_request
(
'inquiry'
,
vendor_produk
,
partner_log
)
elif
'purchase'
in
request
.
POST
:
elif
'purchase'
in
request
.
POST
:
invoice_det
=
save_ar_invoice
(
values
,
vendor_produk
)
invoice_det
=
save_ar_invoice
(
values
,
vendor_produk
)
...
@@ -290,14 +208,11 @@ class ViewHome(BaseView):
...
@@ -290,14 +208,11 @@ class ViewHome(BaseView):
invoice_det
=
save_ar_invoice
(
values
,
vendor_produk
)
invoice_det
=
save_ar_invoice
(
values
,
vendor_produk
)
result
=
build_request
(
'advice'
,
vendor_produk
,
invoice_det
)
result
=
build_request
(
'advice'
,
vendor_produk
,
invoice_det
)
elif
'
payment
'
in
request
.
POST
:
elif
'
register
'
in
request
.
POST
:
pass
pass
# invoice_det = get_invoice(values, vendor_produk)
# result = build_request('payment', vendor_produk, invoice_det)
# elif 'info' in request.POST:
elif
'payment'
in
request
.
POST
:
# invoice, invoice_det = save_ar_invoice(values, vendor_produk)
pass
# result = build_request('info', vendor_produk, invoice)
if
result
:
if
result
:
values
.
update
(
result
)
values
.
update
(
result
)
...
@@ -319,38 +234,110 @@ class ViewHome(BaseView):
...
@@ -319,38 +234,110 @@ class ViewHome(BaseView):
form
.
render
(
values
)
form
.
render
(
values
)
return
dict
(
form
=
form
,
params
=
form_params_edit
)
return
dict
(
form
=
form
,
params
=
form_params_edit
)
@view_config
(
route_name
=
'api-vendor-view'
,
# @view_config(route_name='api-vendor-view',
permission
=
"api-vendor-view"
,
# permission="api-vendor-view",
renderer
=
'templates/form.pt'
)
# renderer='templates/form.pt')
def
view_edit
(
self
):
# def view_edit(self):
request
=
self
.
req
# request = self.req
session
=
self
.
ses
# session = self.ses
form
=
get_form
(
request
,
AddSchema
)
# form = get_form(request, AddSchema)
row
=
query_id
(
request
)
.
first
()
# row = query_id(request).first()
if
not
row
:
# if not row:
return
id_not_found
(
request
)
# return id_not_found(request)
if
request
.
POST
:
# if request.POST:
controls
=
request
.
POST
.
items
()
# controls = request.POST.items()
try
:
# try:
c
=
form
.
validate
(
controls
)
# c = form.validate(controls)
except
ValidationFailure
as
e
:
# except ValidationFailure as e:
form
.
set_appstruct
(
e
.
cstruct
)
# form.set_appstruct(e.cstruct)
return
dict
(
form
=
form
,
params
=
form_params_detail
)
# 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
):
def
get_row
(
id
):
return
PartnerLog
.
query
()
.
filter_by
(
id
=
id
)
.
first
()
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