perbaikan data

1 parent 552233ea
Eksekutif Summary
\ No newline at end of file \ No newline at end of file
Eksekutif Summary Pajak Daerah
Template
Realisasi Harian
Total REalisasi
Grafik Jml Transaksi
Filter Graphic
7 Hari Terakhir
7 mInggu Terakhir
7 Bulan Terakhir
Trend Nilai
Trend Quantity
Trend Kumulatif
Tren Kumulatif Unit
Rincian Realisasi Kecamatan (Jika Ada)
Menu
Pendapatan Daerah
Pajak Daerah
Retribusi Daerah
Rincian Mata Pajak
PBB
BPHTB
Hotel
Restoran
Hiburan
Wallet
Minerba
Parkir
PJU
Air Tanah
Reklame
Opsen
from datetime import timedelta, datetime
import sys
from opensipkd.base.models import (
Base, DBSession, CommonModel, DefaultModel, NamaModel, KodeModel, DBSession,
TABLE_ARGS
)
from sqlalchemy import (Column, Integer, DateTime, String, Text, ForeignKey, Float,
Boolean, BigInteger, SmallInteger, desc, asc, Date, Time,
UniqueConstraint, func)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import engine_from_config
from opensipkd.tools import get_settings
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from ..tools import create_now
PCDBSession = scoped_session(sessionmaker())
PCBase = declarative_base()
class PaymentPBB(PCBase, DefaultModel):
__tablename__ = 'pbb_report'
__table_args__ = {'schema': 'public'}
id = Column(BigInteger, primary_key=True)
stan = Column(String(6), nullable=False)
ntb = Column(String(32), nullable=False)
kd_propinsi = Column(String(2))
kd_dati2 = Column(String(2))
kd_kecamatan = Column(String(3))
kd_kelurahan = Column(String(3))
kd_blok = Column(String(3))
no_urut = Column(String(4))
kd_jns_op = Column(String(1))
thn_pajak_sppt = Column(String(4))
pembayaran_sppt_ke = Column(SmallInteger)
nm_wp_sppt = Column(String(30))
tgl_pembayaran_sppt = Column(DateTime)
tgl_rekam_byr_sppt = Column(DateTime)
tgl_inquiry = Column(DateTime)
pbb_yg_harus_dibayar_sppt = Column(Integer)
denda_sppt = Column(Integer)
jml_sppt_yg_dibayar = Column(Integer)
channel_kode = Column(String(6))
channel_nama = Column(String(256))
user_id = Column(String(128))
iso_request = Column(String(2048))
discount = Column(BigInteger)
bank_id = Column(String(4))
tgl_batal = Column(DateTime(timezone=True))
__table_args__ = (
UniqueConstraint('stan', 'ntb'),
)
@classmethod
def sum_data(cls):
return DBSession.query(
func.to_char(cls.tgl_pembayaran_sppt,
'yyyy-mm-dd').label('tanggal'),
func.sum(cls.jml_sppt_yg_dibayar).label('bayar'),
func.sum(cls.denda_sppt).label('denda'))\
.group_by(func.to_char(cls.tgl_pembayaran_sppt, 'yyyy-mm-dd'))
@classmethod
def sum_daily(cls, length=0):
now = datetime.now()
tod = now.date
tom = tod + timedelta(days=1)
if length:
tod = tod-timedelta(days=length)
return cls.sum_data().filter(cls.tgl_pembayaran_sppt.between(tod, tom))
# baru dari db BPHTB
class PaymentBPHTB(PCBase, CommonModel):
__tablename__ = 'bphtb_report'
__table_args__ = {'schema': 'public'}
id = Column(Integer, primary_key=True)
stan = Column(String(6), nullable=False)
ntb = Column(String(32), nullable=False)
tgl = Column(Date, nullable=False)
jam = Column(Time, nullable=False)
invoice_id = Column(String(24), nullable=False)
nop = Column(String(24), nullable=False)
wp_nama = Column(String(50), nullable=False)
wp_alamat = Column(String(100), nullable=False)
op_alamat = Column(String(100), nullable=False)
npop = Column(BigInteger)
bumi_luas = Column(BigInteger)
bng_luas = Column(BigInteger)
nilai_bphtb = Column(BigInteger)
channel_id = Column(String(6))
channel_nama = Column(String(256), nullable=False)
# user_id = Column(String(128), nullable=False)
jenis_perolehan = Column(String(123), nullable=False)
ppat = Column(String(256), nullable=False)
tgl_batal = Column(DateTime(timezone=True))
__table_args__ = (
UniqueConstraint('stan', 'ntb'),
)
@classmethod
def sum_data(cls):
return DBSession.query(func.sum(cls.nilai_bphtb).label('bayar'),
func.sum('0').label('denda'))
@classmethod
def sum_today(cls):
now = datetime.now()
tom = timedelta(now.date, days=1)
qry = cls.sum_data().filter(cls.tgl.between(now.date, tom))
return qry.first()
# baru PAD
class PaymentPAD(PCBase, CommonModel):
__tablename__ = 'pad_report'
__table_args__ = {'schema': 'public'}
id = Column(Integer, primary_key=True)
stan = Column(String(6), nullable=False)
ntb = Column(String(32), nullable=False)
# pad.pad_sspd.create_date
tgl = Column(Date, nullable=False)
# pad.pad_sspd.sspdjam
jam = Column(Time, nullable=False)
# pad.pad_sspd.id
sspd_id = Column(Integer, nullable=False)
# Bit 61
nomor_bayar = Column(String(16), nullable=False)
# Pad.Usahanm
jenis_pajak = Column(String(32), nullable=False)
# pad.pad_spt.masadari
masa_pajak = Column(Date, nullable=False)
# pad.pad_customer
npwpd = Column(String(17), nullable=False)
# pad.pad_customer.customernm
nama_wp = Column(String(150), nullable=False)
# pad.pad_sspd.jml_bayar - pad.pad_sspd.denda
pokok = Column(Float, nullable=False)
# pad.pad_sspd.denda
denda = Column(Float, nullable=False)
# pad.pad_sspd.bunga
bunga = Column(Float, nullable=False)
# pad.pad_sspd.jml_bayar
jml_bayar = Column(Float, nullable=False)
# Bit 18
channel_id = Column(String(4), nullable=False)
# Bit 41 / 42 / 43
channel_name = Column(String(32), nullable=False)
# Dari pad_reversal
tgl_batal = Column(DateTime(timezone=True))
# pad.kecamatan.kecamatannm
kecamatan_nm = Column(String(50), nullable=False)
__table_args__ = (
UniqueConstraint('stan', 'ntb'),
)
@classmethod
def sum_data(cls):
return DBSession.query(func.sum(cls.jml_bayar).label('bayar'),
func.sum(cls.denda+cls.bunga).label('denda'))
@classmethod
def sum_today(cls):
now = datetime.now()
tom = timedelta(now.date, days=1)
qry = cls.sum_data().filter(cls.tgl.between(now.date, tom))
return qry.first()
# baru PAD
class PaymentWEBR(PCBase, CommonModel):
__tablename__ = 'webr_report'
__table_args__ = {'schema': 'public'}
id = Column(Integer, primary_key=True)
stan = Column(String(6), nullable=False)
ntb = Column(String(32), nullable=False)
tgl = Column(Date, nullable=False)
jam = Column(Time, nullable=False)
payment_id = Column(Integer, nullable=False)
nomor_bayar = Column(String(16), nullable=False)
nama_wp = Column(String(150), nullable=False)
# webr.payment.jml_bayar - webr.payment.denda
pokok = Column(Float, nullable=False)
# webr.payment.denda
denda = Column(Float, nullable=False)
# webr.payment.jml_bayar
jml_bayar = Column(Float, nullable=False)
# Bit 18
channel_id = Column(String(4), nullable=False)
# Bit 41 / 42 / 43
channel_name = Column(String(32), nullable=False)
# Dari pad_reversal
tgl_batal = Column(DateTime(timezone=True))
# webr.payment.status
status = Column(String(2), nullable=False)
__table_args__ = (
UniqueConstraint('stan', 'ntb'),
)
@classmethod
def sum_data(cls):
return DBSession.query(func.sum(cls.jml_bayar).label('bayar'),
func.sum(cls.denda).label('denda'))
@classmethod
def sum_today(cls):
now = datetime.now()
tom = timedelta(now.date, days=1)
qry = cls.sum_data().filter(cls.tgl.between(now.date, tom))
return qry.first()
def get_connection(settings):
url = 'pcpd.url' in settings and settings['pcpd.url'] and 'pcpd.' or 'sqlalchemy.'
engine = engine_from_config(settings, url)
PCDBSession.configure(bind=engine)
PCBase.metadata.bind = engine
return engine
def includeme(config):
settings = get_settings()
get_connection(settings)
def init_db(argv=sys.argv):
config_uri = argv[1]
setup_logging(config_uri)
settings = get_appsettings(config_uri)
engine = get_connection(settings)
PCBase.metadata.bind = engine
PCBase.metadata.create_all(bind=engine)
kode,nama,path,status,type kode,nama,path,status,type,is_menu,parent_id,file_name,class_name,func_name,permission,template
eis,EIS,/eis,1,0 eis-pcpd,PCPD,/eis/pcpd,1,0,1
eis-carousel,Carousel,/eis/carousel,1,0 eis-pcpd-act,PCPD Act,/eis/pcpd/{act}/act,1,0
eis-pajak,Pajak,#,1,0,1
eis-pajak-kumulatif,Pajak,/eis/pajak,1,0,1,eis-pajak,pcpd,Views,view_pajak,eis,pcpd.pt
eis-pbb,PBB,/eis/pbb,1,0,1,eis-pajak,pcpd,Views,view_pbb,eis,pcpd.pt
eis-bphtb,BPHTB,/eis/bphtb,1,0,1,eis-pajak,pcpd,Views,view_bphtb,eis,pcpd.pt
eis-hotel,Hotel,/eis/hotel,1,0,1,eis-pajak
eis-resto,Restoran,/eis/resto,1,0,1,eis-pajak
eis-hiburan,Hiburan,/eis/hiburan,1,0,1,eis-pajak
eis-parkir,Parkir,/eis/parkir,1,0,1,eis-pajak
eis-ppju,PPJU,/eis/ppju,1,0,1,eis-pajak
eis-minerba,Minerba,/eis/minerba,1,0,1,eis-pajak
eis-reklame,Reklame,/eis/parkir,1,0,1,eis-pajak
eis-atd,Air Tanah,/eis/atd,1,0,1,eis-pajak
eis-retribusi,EIS-Retribusi,/eis/retribusi,1,0,1,pcpd,Views,view_webr,eis,pcpd.pt
eis,EIS,/eis,1,0,1
eis-carousel,Carousel,/eis/carousel,1,0,1
eis-carousel-act,Carousel Action,/eis/carousel/{act}/act,1,0 eis-carousel-act,Carousel Action,/eis/carousel/{act}/act,1,0
eis-carousel-add,Carousel Add,/eis/carousel/add,1,0 eis-carousel-add,Carousel Add,/eis/carousel/add,1,0
eis-carousel-edit,Carousel Edit,/eis/carousel/{id}/edit,1,0 eis-carousel-edit,Carousel Edit,/eis/carousel/{id}/edit,1,0
eis-carousel-delete,Carousel Delete,/eis/carousel/{id}/delete,1,0 eis-carousel-delete,Carousel Delete,/eis/carousel/{id}/delete,1,0
eis-dashboard,EIS,/eis/dashboard,1,0 eis-dashboard,EIS,/eis/dashboard,1,0,1
eis-dashboard-act,EIS Act,/eis/dashboard/{act}/act,1,0 eis-dashboard-act,EIS Act,/eis/dashboard/{act}/act,1,0
eis-dashboard-calc-all,EIS Calc ALL,/eis/dashboad/calc/all,1,0 eis-dashboard-calc-all,EIS Calc ALL,/eis/dashboad/calc/all,1,0
eis-home,EIS Home,/eis/home,1,0 eis-home,EIS Home,/eis/home,1,0,1
eis-act,EIS Home Act,/eis/{act}/act,1,0 eis-act,EIS Home Act,/eis/{act}/act,1,0
eis-calc-all,EIS Calc ALL,/eis/calc/all,1,0 eis-calc-all,EIS Calc ALL,/eis/calc/all,1,0
eis-chart,Chart,/eis/chart,1,0 eis-chart,Chart,/eis/chart,1,0,1
eis-chart-act,EIS Chart Action,/eis/chart/{act}/act,1,0 eis-chart-act,EIS Chart Action,/eis/chart/{act}/act,1,0
eis-chart-add,EIS Chart Add,/eis/chart/add,1,0 eis-chart-add,EIS Chart Add,/eis/chart/add,1,0
eis-chart-edit,EIS Chart Edit,/eis/chart/{id}/edit,1,0 eis-chart-edit,EIS Chart Edit,/eis/chart/{id}/edit,1,0
...@@ -21,12 +36,12 @@ eis-chart-item-act,EIS Chart Item Action,/eis/chart/item/{chart_id}/{act}/act,1, ...@@ -21,12 +36,12 @@ eis-chart-item-act,EIS Chart Item Action,/eis/chart/item/{chart_id}/{act}/act,1,
eis-chart-item-add,EIS Chart Item Add,/eis/chart/item/{chart_id}/add,1,0 eis-chart-item-add,EIS Chart Item Add,/eis/chart/item/{chart_id}/add,1,0
eis-chart-item-edit,EIS Chart Item Edit,/eis/chart/item/{chart_id}/{id}/edit,1,0 eis-chart-item-edit,EIS Chart Item Edit,/eis/chart/item/{chart_id}/{id}/edit,1,0
eis-chart-item-delete,EIS Chart Item Delet,/eis/chart/item/{chart_id}/{id}/delete,1,0 eis-chart-item-delete,EIS Chart Item Delet,/eis/chart/item/{chart_id}/{id}/delete,1,0
eis-item,EIS Item,/eis/item,1,0 eis-item,EIS Item,/eis/item,1,0,1
eis-item-act,EIS Item Action,/eis/item/{act}/act,1,0 eis-item-act,EIS Item Action,/eis/item/{act}/act,1,0
eis-item-add,EIS Item Add,/eis/item/add,1,0 eis-item-add,EIS Item Add,/eis/item/add,1,0
eis-item-edit,EIS Item Edit,/eis/item/{id}/edit,1,0 eis-item-edit,EIS Item Edit,/eis/item/{id}/edit,1,0
eis-item-delete,EIS Item Delete,/eis/item/{id}/delete,1,0 eis-item-delete,EIS Item Delete,/eis/item/{id}/delete,1,0
eis-slide,EIS Slide,/eis/slide,1,0 eis-slide,EIS Slide,/eis/slide,1,0,1
eis-slide-act,EIS Slide Act,/eis/slide/{act}/act,1,0 eis-slide-act,EIS Slide Act,/eis/slide/{act}/act,1,0
eis-slide-add,EIS Slide Add,/eis/slide/add,1,0 eis-slide-add,EIS Slide Add,/eis/slide/add,1,0
eis-slide-edit,EIS Slide Edit,/eis/slide/{id}/edit,1,0 eis-slide-edit,EIS Slide Edit,/eis/slide/{id}/edit,1,0
......
from pyramid.view import (
view_config,
)
from ..views import BaseView
from ..models import *
from ..models.eis import Eis, Chart, ChartItem, Slide
from datatables import ColumnDT, DataTables
from sqlalchemy import func, and_, String
from sqlalchemy.sql.expression import cast
from ..models.payment import PaymentPBB, PaymentPAD, PaymentBPHTB, PaymentWEBR
class Views(BaseView):
@view_config(route_name='eis-pcpd', renderer='templates/pcpd.pt',
permission='eis')
def view_app(self):
return{"module":"pad"}
@view_config(route_name='eis-pcpd-act', renderer='json')
def view_app_act(self):
tahun = self.ses['tahun']
req = self.req
ses = req.session
params = req.params
id = 'id' in params and params['id'] or 0
json_data = {}
json_data['success']=False
act = req.matchdict['act']
if act =='grid':
rows = DBSession.query(Eis).filter(Eis.id==id)
if not rows:
return json_data
elif act=='pbb':
qry = PaymentPBB.sum_daily()
data = {r.tanggal:r.bayar-r.denda for r in qry}
return dict(data=data)
# return dict(project='EIS', datas=datas, tab_datas=tab_datas,
# line_datas=line_datas, bar_datas=bar_datas,
# pie_datas=pie_datas, )#, datas=Eis.sum_order_id('2014'))
def view_pajak(self):
return {"module": 'pajak'}
def view_pbb(self):
return {"module":'pbb'}
def view_bphtb(self):
return {"module": 'bphtb'}
def view_pjdl(self):
return {"module": 'pjdl'}
def view_webr(self):
return {"module": 'webr'}
# class eis(BaseView):
# def cek_value(self,value,devider,simbol):
# if value<devider:
# return "{0:,.0f}".format(value)
# else:
# return "{0:,.0f} {1}".format(value/devider,simbol)
# @view_config(route_name='eis', renderer='templates/eis.pt',
# permission='eis')
# def view_app(self):
# tahun = self.ses['tahun']
# datas = DBSession.query(Slide).filter(Slide.status==1).order_by(Slide.order_id) or {}
# tab_datas = DBSession.query(Slide).filter(Slide.source_type=='grid').order_by(Slide.order_id) or {}
# line_datas = DBSession.query(Slide).filter(Slide.source_type=='chart-line').order_by(Slide.order_id)or {}
# bar_datas = DBSession.query(Slide).filter(Slide.source_type=='chart-bar').order_by(Slide.order_id)or {}
# pie_datas = DBSession.query(Slide).filter(Slide.source_type=='chart-pie').order_by(Slide.order_id)or {}
# return dict(project='EIS', datas=datas, tab_datas=tab_datas,
# line_datas=line_datas, bar_datas=bar_datas,
# pie_datas=pie_datas, )#, datas=Eis.sum_order_id('2014'))
# @view_config(route_name='eis-act', renderer='json')
# def view_app_act(self):
# tahun = self.ses['tahun']
# req = self.req
# ses = req.session
# params = req.params
# id = 'id' in params and params['id'] or 0
# json_data = {}
# json_data['success']=False
# if req.matchdict['act']=='grid':
# rows = DBSession.query(Eis).filter(Eis.id==id)
# if not rows:
# return json_data
# for row in rows:
# row_dicted = row.to_dict()
# amt_hari = float(row_dicted['amt_hari'])
# amt_minggu = float(row_dicted['amt_minggu']) #+amt_hari
# amt_bulan = float(row_dicted['amt_bulan']) #+amt_hari
# amt_tahun = float(row_dicted['amt_tahun']) #+amt_bulan
# json_data['success']= True
# json_data['tahun'] = self.cek_value(amt_tahun,1, '')
# json_data['bulan'] = self.cek_value(amt_bulan,1, '')
# json_data['minggu'] = self.cek_value(amt_minggu,1, '')
# json_data['hari'] = self.cek_value(amt_hari,1, '')
# return json_data
# #######################################################################
# # GRAFIK LINE/BAR
# #######################################################################
# elif req.matchdict['act']=='linebar':
# rows = DBSession.query(Chart).filter(Chart.id==id).first()
# if not rows:
# return json_data
# json_data['label'] = rows.label.split(',')
# rows = DBSession.query(ChartItem).filter(ChartItem.chart_id==id).\
# order_by(ChartItem.id)
# for row in rows:
# json_data[row.source_type] = [row.value_1/row.chart.devider,row.value_2/row.chart.devider,row.value_3/row.chart.devider,
# row.value_4/row.chart.devider,row.value_5/row.chart.devider,row.value_6/row.chart.devider,
# row.value_7/row.chart.devider,row.value_8/row.chart.devider,row.value_9/row.chart.devider,
# row.value10/row.chart.devider,row.value11/row.chart.devider,row.value12/row.chart.devider,]
# json_data['success']= True
# return json_data
# #######################################################################
# # GRAFIK LINGKARAN
# #######################################################################
# elif req.matchdict['act']=='pie':
# rows = DBSession.query(Chart).filter(Chart.id==id).first()
# if not rows:
# return json_data
# json_data['label'] = rows.label.split(',')
# rows = DBSession.query(ChartItem).filter(ChartItem.chart_id==id).\
# order_by(ChartItem.id)
# json_data['rows'] = {}
# for row in rows:
# anama = {}
# anama['nama'] = row.nama
# anama['color'] = row.color
# anama ['highlight'] = row.highlight
# anama ['value'] = row.value_1/row.chart.devider
# json_data['rows'][row.nama] =anama
# json_data['success']= True
# return json_data
# elif req.matchdict['act']=='dasboard':
# # max_tahun = DBSession.query(func.max(Eis.tahun)).scalar()
# max_tahun = ses['tahun']
# subqx = DBSession.query(
# func.max(Eis.nama).label('nama'),
# func.sum(ChartItem.value_1+ChartItem.value_2+ChartItem.value_3+ChartItem.value_4+\
# ChartItem.value_5+ChartItem.value_6+ChartItem.value_7+ChartItem.value_8+ChartItem.value_9+\
# ChartItem.value10+ChartItem.value11+ChartItem.value12).label('target'),
# func.sum(Eis.amt_bulan).label('amt_bulan'),
# func.sum(Eis.amt_tahun).label('amt_tahun'),
# func.sum(
# (ChartItem.value_1+ChartItem.value_2+ChartItem.value_3+ChartItem.value_4+ChartItem.value_5+\
# ChartItem.value_6+ChartItem.value_7+ChartItem.value_8+ChartItem.value_9+ChartItem.value10+\
# ChartItem.value11+ChartItem.value12) - Eis.amt_tahun).label('sisa_target'),
# cast(func.round((func.sum(Eis.amt_tahun)/
# func.sum(ChartItem.value_1+ChartItem.value_2+ChartItem.value_3+ChartItem.value_4+\
# ChartItem.value_5+ChartItem.value_6+ChartItem.value_7+ChartItem.value_8+ChartItem.value_9+\
# ChartItem.value10+ChartItem.value11+ChartItem.value12))*100,2),String).label('persen')).\
# join(ChartItem, and_(func.trim(ChartItem.rekening_kd)==func.trim(Eis.kode),ChartItem.source_type=='target')).\
# join(Chart, and_(Chart.id == ChartItem.chart_id, Chart.chart_type == 'line')).\
# filter(Eis.tahun==max_tahun).\
# group_by(Eis.kode,Eis.nama,Eis.tahun).order_by(Eis.kode).subquery()
# subq = DBSession.query(
# (Eis.nama).label('nama'),
# (ChartItem.value_1*12).label('target'),
# (Eis.amt_bulan).label('amt_bulan'),
# (Eis.amt_tahun).label('amt_tahun'),
# ((ChartItem.value_1*12) - Eis.amt_tahun).label('sisa_target'),
# cast(func.round(((Eis.amt_tahun)/
# (ChartItem.value_1*12))*100,2),String).label('persen')).\
# join(ChartItem, and_(func.trim(ChartItem.rekening_kd)==func.trim(Eis.kode),ChartItem.source_type=='target')).\
# join(Chart, and_(Chart.id == ChartItem.chart_id, Chart.chart_type == 'line')).\
# filter(Eis.tahun==max_tahun).\
# order_by(Eis.kode).subquery()
# query = DBSession.query().select_from(subq)
# columns = [
# ColumnDT(subq.c.nama, mData="jenis_pajak"),
# ColumnDT(subq.c.target, mData="target"),
# ColumnDT(subq.c.amt_bulan, mData="realisasi_bulan_ini"),
# ColumnDT(subq.c.amt_tahun, mData="realisasi_sampai_dengan"),
# ColumnDT(subq.c.sisa_target, mData="sisa_target"),
# ColumnDT(subq.c.persen, mData="persen"),
# ]
# rowTable = DataTables(req.GET, query, columns)
# return rowTable.output_result()
<html metal:use-macro="load: base.pt"> <html metal:use-macro="load: eis-base.pt">
<div metal:fill-slot="left-menu"> <div metal:fill-slot="left-menu">
<link href="/static/css/navbar-fixed-left.css" rel="stylesheet"> <link href="/static/css/navbar-fixed-left.css" rel="stylesheet">
<div class="nav-side-menu"> <div class="nav-side-menu">
......
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
<!-- We recommend you use "your_style.css" to override SmartAdmin <!-- We recommend you use "your_style.css" to override SmartAdmin
specific styles this will also ensure you retrain your customization with each SmartAdmin update. --> specific styles this will also ensure you retrain your customization with each SmartAdmin update. -->
<link rel="stylesheet" href="${home}/deform_static/css/form.css" > <link rel="stylesheet" href="${home}/deform_static/css/form.css">
<link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/osipkd.css"> <!--link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/osipkd.css"-->
<!-- LOOP FORM CSS INCLUDED--> <!-- LOOP FORM CSS INCLUDED-->
<tal:loop tal:repeat="css_resource css"> <tal:loop tal:repeat="css_resource css">
<link rel="stylesheet" href="${home}${request.static_path(css_resource)}" type="text/css" <link rel="stylesheet" href="${home}${request.static_path(css_resource)}" type="text/css"
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
</tal:loop> </tal:loop>
<!-- USE THIS SLOT TO INHSERT NEW CSS--> <!-- USE THIS SLOT TO INHSERT NEW CSS-->
<metal:css define-slot="css_files"></metal:css> <metal:css define-slot="css_files"></metal:css>
<style metal:define-slot="styles"></style>
</head> </head>
<body class="fixed-header"> <body class="fixed-header">
...@@ -93,13 +95,13 @@ ...@@ -93,13 +95,13 @@
</span> </span>
<i class="fa fa-angle-down"></i> </a> <i class="fa fa-angle-down"></i> </a>
<ul class="dropdown-menu pull-right"> <ul class="dropdown-menu pull-right">
<li><a style="text-transform:capitalize" href="${request.route_url('base-profile')}">Profile</a> <li><a style="text-transform:capitalize" href="${request.route_url('profile')}">Profile</a>
</li> </li>
<li tal:condition="not request.user.external"> <li tal:condition="not request.user.external">
<a style="text-transform:capitalize" href="${request.route_url('base-password')}">Ubah <a style="text-transform:capitalize" href="${request.route_url('password')}">Ubah
password</a> password</a>
</li> </li>
<li><a style="text-transform:capitalize" href="${request.route_url('base-logout')}">Logout</a> <li><a style="text-transform:capitalize" href="${request.route_url('logout')}">Logout</a>
</li> </li>
<li tal:condition="request.user.api_key"><a style="text-transform:capitalize" <li tal:condition="request.user.api_key"><a style="text-transform:capitalize"
href="${home}/recreate-api-key">API Key</a></li> href="${home}/recreate-api-key">API Key</a></li>
...@@ -124,6 +126,46 @@ ...@@ -124,6 +126,46 @@
<!-- NAVIGATION : This navigation is also responsive--> <!-- NAVIGATION : This navigation is also responsive-->
<nav class="smart-menu" id="menu"> <nav class="smart-menu" id="menu">
<!-- Modul Menu --> <!-- Modul Menu -->
<ul style="margin-top: 0; padding-top: 0;">
<li tal:repeat="menu get_eis_menus()"
tal:attributes="class route_name in menu['route_name'] and 'active'">
<a tal:condition="python: not menu['children'] and (not menu['permission'] or has_permission(request, menu['permission']))"
href="${home}${menu['path']}">
<i tal:condition="menu['icon']" class="fa fa-lg fa-fw ${menu['icon']}"></i>
<span>${menu['nama']}</span>
</a>
<a tal:condition="python:menu['children'] and (not menu['permission'] or has_permission(request, menu['permission']))"
href="#">
<i tal:condition="menu['icon']" class="fa fa-lg fa-fw ${menu['icon']}"></i>
<span class="menu-item-parent">${menu['nama']}</span>
</a>
<ul
tal:condition="python:menu['children'] and (not menu['permission'] or has_permission(request, menu['permission']))">
<li tal:repeat="submenu menu['children']"
tal:attributes="class route_name in submenu['route_name'] and 'active'">
<a tal:condition="python:not submenu['children'] and (not menu['permission'] or has_permission(request, submenu['permission']))"
href="${home}${submenu['path']}">
<i tal:condition="submenu['icon']" class="fa fa-lg fa-fw ${submenu['icon']}"></i>
<span>${submenu['nama']}</span>
</a>
<a tal:condition="submenu['children']" href="#">
<i tal:condition="submenu['icon']" class="fa fa-lg fa-fw ${submenu['icon']}"></i>
<span class="menu-item-parent">${submenu['nama']}</span>
</a>
<ul tal:condition="submenu['children']">
<li tal:repeat="submenu2 submenu['children']"
tal:attributes="class route_name in submenu2['route_name'] and 'active'">
<a href="${home}${submenu2['path']}">${submenu2['nama']}</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul metal:define-slot="navs"></ul> <ul metal:define-slot="navs"></ul>
<ul style="margin-top: 0; padding-top: 0;"> <ul style="margin-top: 0; padding-top: 0;">
<li tal:repeat="menu get_base_menus()" <li tal:repeat="menu get_base_menus()"
......
<html metal:use-macro="load: eis-base.pt">
<metal:css fill-slot="css_files">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/odometer@0.4.8/themes/odometer-theme-plaza.css">
</metal:css>
<style metal:fill-slot="styles">
div.col-md-6 {
padding-left: 7px !important;
padding-right: 7px !important;
}
.main-panel {
--tw-text-opacity: 1 !important;
color: rgb(255 255 255 / var(--tw-text-opacity, 1)) !important;
font-weight: bold;
--tw-bg-opacity: 1 !important;
background: #00D4FF;
background: linear-gradient(90deg, rgba(0, 212, 255, 1) 0%, rgba(23, 115, 207, 1) 53%, rgba(0, 212, 255, 1) 100%);
border-radius: 10px;
}
.primary {
color: #1976d2;
}
.bold {
font-weight: bold;
}
.panel-default>.panel-heading {
color: #333;
background-color: white;
border-color: white;
}
.icon-color {
color: transparent;
-webkit-text-stroke-width: 0.5px;
-webkit-text-stroke-color: #444a69;
}
.top-0 {
top: 68px !important;
}
.left-0 {
left: 8px !important;
}
.z-0 {
z-index: 0 !important;
}
.absolute {
position: absolute !important;
}
.bottom-0 {
bottom: 0 !important;
}
.right-0 {
right: 0 !important;
}
.chart-container {
position: relative;
height: 20vh;
}
</style>
<div metal:fill-slot="content">
<div class="row ">
<div class="col-md-12">
<div class="panel panel-default text-center main-panel">
<div class="panel-body">
<h4><b>Realisasi Pajak dan Retribusi Daerah</b></h4>
<div>
<h5 id="current">Rab, 4 Jun 2025 - 14:11:05</h5>
</div>
<h4>
<b>Rp.
<h4 class="odometer bold" id="odometer"></h4>
</b>
</h4>
<h5>1.067 KBM</h5>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-default text-center">
<div class="panel-heading">
<h5 class="text-left bold">Total Realisasi s.d Hari Ini
<i class="fa fa-info-circle pull-right icon-color"></i>
</h5>
</div>
<div class="panel-body">
<div class="chart-container">
<h4 class="primary">
<b>Rp. <h4 class="odometer bold primary" id="odometer2">0</h4></b>
</h4>
<h4></h4>
<h5 class="primary bold">1.067 KBM</h5>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="text-left bold">Jumlah Transaksi
<i class="fa fa-info-circle pull-right icon-color"></i>
</h5>
</div>
<div class="panel-body">
<div class="chart-container text-center">
<canvas id="chartPie"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="row ">
<div class="col-md-6">
<select class="form-control">
<option value="1">Harian</option>
<option value="2">Mingguan</option>
<option value="3">Bulanan</option>
</select>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3>Tren Realiasi(Rp)</h3>
</div>
<div class="panel-body">
<div class="chart-container text-center" style="position: relative; height:20vh; width: auto;">
<canvas id="chartRealisasi"></canvas>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3>Tren Realiasi Transaksi</h3>
</div>
<div class="panel-body">
<div class="chart-container text-center" style="position: relative; height:20vh; width: auto;">
<canvas id="chartRealisasiCnt"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3>Tren Realiasi Kumulatif (Rp)</h3>
</div>
<div class="panel-body">
<div class="chart-container text-center" style="position: relative; height:20vh; width: auto;">
<canvas id="chartKumulatif" width="200" height="200"></canvas>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3>Tren Realiasi Kumulatif Transaksi</h3>
</div>
<div class="panel-body">
<div class="chart-container text-center" style="position: relative; height:20vh; width: auto;">
<canvas id="chartKumulatifCnt" width="200" height="200"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-body">
Basic panel example
</div>
</div>
</div>
</div>
</div>
<metal:js fill-slot="js_files">
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns/dist/chartjs-adapter-date-fns.bundle.min.js"></script>
<script src="https://github.hubspot.com/odometer/odometer.js"></script>
</metal:js>
<script metal:fill-slot="scripts">
$(document).ready(function () {
var ctx = document.getElementById('chartPie').getContext('2d');
const pie_data = {
labels: [
'Pajak',
'Retribusi',
],
datasets: [{
data: [300, 100],
backgroundColor: [
'rgb(255, 99, 132)',
'rgb(54, 162, 235)'
],
hoverOffset: 4
}]
};
const myChart = new Chart(ctx,
{
type: 'pie',
data: pie_data,
});
var ctx = document.getElementById('chartRealisasi').getContext('2d');
var realisasi_data = {
labels: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7',],
datasets: [{
data: [100, 50, 300, 250, 100, 150, 200],
borderColor: 'rgb(75, 192, 192)',
fill: true,
tension: 0.1
}]
};
const realisasi_chart = new Chart(ctx, {
type: 'line',
data: realisasi_data,
});
var ctx = document.getElementById('chartRealisasiCnt').getContext('2d');
const realisasicnt_chart = new Chart(ctx, {
type: 'line',
data: realisasi_data,
});
var ctx = document.getElementById('chartKumulatif').getContext('2d');
var kumulatif_data = {
labels: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7',],
datasets: [{
data: [100, 150, 400, 650, 900, 950, 1100],
borderColor: 'rgb(75, 192, 192)',
fill: true,
tension: 0.1
}]
};
const kumulatif_chart = new Chart(ctx, {
type: 'line',
data: kumulatif_data,
});
var ctx = document.getElementById('chartKumulatifCnt').getContext('2d');
const kumulatifcnt_chart = new Chart(ctx, {
type: 'line',
data: kumulatif_data,
});
// $().datarefresh();
});
$.fn.datarefresh = function () {
console.log("data_refresh");
// $().get_realisasi();
// $().get_harian();
// $().get_tabel();
// $().get_series();
odometer.innerHTML = 190647300;
odometer2.innerHTML = 190647500;
d = new Date();
current.innerHTML = d.toLocaleString();
}
setTimeout(function () {
console.log("timeout");
$().datarefresh();
}, 1);
</script>
</html>
\ No newline at end of file \ No newline at end of file
...@@ -50,3 +50,4 @@ classifiers = [ ...@@ -50,3 +50,4 @@ classifiers = [
[project.scripts] [project.scripts]
eispajak-init-db = "eispajak.scripts.initializedb:main" eispajak-init-db = "eispajak.scripts.initializedb:main"
pcpd-ini-db = "eispajak.models.payment:init_db"
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!