Commit f6d3e267 by Ari Agung Prasetiyo

update menu realtime realisasi

1 parent 01bc4e2a
......@@ -3,7 +3,7 @@ import sys
from opensipkd.base import models
from sqlalchemy import (Column, Integer, DateTime, String, Float,
BigInteger, SmallInteger, Date, Time,
UniqueConstraint, func, literal_column)
UniqueConstraint, func, literal_column, Text)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import engine_from_config
from opensipkd.tools import get_settings
......@@ -290,6 +290,45 @@ class Targets(PCBase, DefaultModel):
return query
class UploadRealisasiOpsen(PCBase, DefaultModel):
__tablename__ = 'upload_realisasi_opsen'
__table_args__ = {'schema': 'public'}
id = Column(Integer, primary_key=True)
created = Column(DateTime(timezone=True), nullable=False)
updated = Column(DateTime)
no_urut = Column(Integer)
tanggal = Column(Date)
kode_rekening = Column(String(64))
nama_rekening = Column(String(255))
keterangan = Column(Text)
nilai_realisasi = Column(Float)
@classmethod
def qry_sum_pkb(cls, columns=[]):
columns.extend([
func.sum(cls.nilai_realisasi).label('bayar'),
literal_column("0").label('denda'),
func.count(cls.id).label('trx')
])
qry = PCDBSession.query().select_from(cls).where(cls.kode_rekening=='4.1.01.20.01.0001')
for col in columns:
qry = qry.add_columns(col)
return qry
@classmethod
def qry_sum_bbnkb(cls, columns=[]):
columns.extend([
func.sum(cls.nilai_realisasi).label('bayar'),
literal_column("0").label('denda'),
func.count(cls.id).label('trx')
])
qry = PCDBSession.query().select_from(cls).where(cls.kode_rekening=='4.1.01.20.02.0001')
for col in columns:
qry = qry.add_columns(col)
return qry
def get_connection(settings):
url = 'pcpd.url' in settings and settings['pcpd.url'] and 'pcpd.' or 'sqlalchemy.'
......
......@@ -3,9 +3,9 @@ eis-pcpd,PCPD,/eis/pcpd,1,0,0
eis-pcpd-act,PCPD Act,/eis/pcpd/{act}/act,1,0
eis-pajak,Dashboard,#,1,0,1
eis-pajak-kumulatif,Komposisi Penerimaan,/eis/pajak,1,0,1,eis-pajak,pcpd,Views,view_pajak,,pcpd_pajak.pt
eis-pajak-kumulatif2,Realtime Realisasi,/eis/pajak2,1,0,1,eis-pajak,pcpd,Views,view_pajak,,pcpd_pajak2.pt
eis-pajak-kumulatif3,Trend Penerimaan,/eis/pajak3,1,0,1,eis-pajak,pcpd,Views,view_pajak,,pcpd_pajak3.pt
eis-pajak-kumulatif4,Realtime Piutang,/eis/pajak4,1,0,1,eis-pajak,pcpd,Views,view_pajak,,pcpd_pajak4.pt
eis-pajak-kumulatif2,Realtime Realisasi,/eis/realtime-realisasi,1,0,1,eis-pajak,pcpd,Views,view_pajak,,realtime_realisasi.pt
eis-pajak-kumulatif3,Trend Penerimaan,/eis/trend-penerimaan,1,0,1,eis-pajak,pcpd,Views,view_pajak,,trend_penerimaan.pt
eis-pajak-kumulatif4,Realtime Piutang,/eis/realtime-piutang,1,0,1,eis-pajak,pcpd,Views,view_pajak,,realtime_piutang.pt
eis-pbb,PBB,/eis/pbb,0,0,1,eis-pajak,pcpd,Views,view_pbb,,pbb.pt
eis-bphtb,BPHTB,/eis/bphtb,0,0,1,eis-pajak,pcpd,Views,view_bphtb,eis,pcpd.pt
eis-pbjt,PBJT,#,0,0,1,eis-pajak
......
......@@ -8,7 +8,7 @@ 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, Targets
from ..models.payment import PaymentPBB, PaymentPAD, PaymentBPHTB, PaymentWEBR, Targets, UploadRealisasiOpsen
from opensipkd.pbb.monitoring.models import PembayaranSppt, Kecamatan, Kelurahan, Sppt
from datetime import timedelta
from ..models.payment import PCDBSession
......@@ -21,7 +21,8 @@ PAD_TYP = {
"hiburan": ["PBJT - JASA KESENIAN DAN HIBURAN"],
"ppju": ["PBJT - TENAGA LISTRIK"],
"minerba": ["MINERAL BUKAN LOGAM DAN BATUAN"],
"opsen": ["OPSEN BBNKB", "OPSEN PKB"],
"opsen_pkb": [ "OPSEN PKB"],
"opsen_bbnkb": ["OPSEN BBNKB"],
"parkir": ["PBJT - JASA PARKIR"],
"walet": ["PENGELOLAAN SARANG BURUNG WALET DAN SEJENISNYA"],
"atd": ["AIR TANAH"],
......@@ -30,15 +31,16 @@ PAD_TYP = {
}
jenis_pajak = {
"opsen": {
"kode": "41012",
"nama": "Opsen",
"subs": [
{"kode": "4.1.1.10",
"nama": "Opsen PKB"},
{"kode": "4.1.1.11",
"nama": "Opsen BBNKB"},
]},
"opsen_pkb": {
"kode": "4.1.01.20.01.0001",
"nama": "Opsen PKB",
"subs": []
},
"opsen_bbnkb": {
"kode": "4.1.01.20.02.0001",
"nama": "Opsen BBNKB",
"subs": []
},
"pbb": {
"kode": "4.1.1.0",
"nama": "Pajak Bumi & Bangunan",
......@@ -130,12 +132,22 @@ class Views(BaseView):
if PCDBSession.registry().in_transaction():
PCDBSession.rollback()
columns = [field.label("step")]
if typ == 'opsen_pkb':
qry = table.qry_sum_pkb(columns) \
.group_by(field)\
.order_by(field)
elif typ == 'opsen_bbnkb':
qry = table.qry_sum_bbnkb(columns) \
.group_by(field)\
.order_by(field)
else:
qry = table.qry_sum(columns) \
.group_by(field)\
.order_by(field)
qry = qry.filter(*filters)
if typ != None:
opsen = ["opsen_pkb", "opsen_bbnkb"]
if typ != None and typ not in opsen:
if typ == "pajak":
qry = qry.filter(table.jenis_pajak.notin_(PAD_TYP['pbb']))
else:
......@@ -176,6 +188,13 @@ class Views(BaseView):
if kode:
if kode == "pajak":
return 0
elif kode == 'opsen_pkb':
targets = targets.filter(
Targets.kode.ilike('4.1.1.10%'))
elif kode == 'opsen_bbnkb':
targets = targets.filter(
Targets.kode.ilike('4.1.1.11%'))
else:
targets = targets.filter(
Targets.kode.ilike(jenis_pajak[kode]["kode"]+'%'))
targets = targets.first()
......@@ -435,6 +454,136 @@ class Views(BaseView):
"target": 0,
}
def get_pkb_data(self):
if log.root.level == logging.DEBUG:
today = datetime.strptime('2025-06-05', "%Y-%m-%d")
else:
today = datetime.now().date()
# Harian
field = func.to_char(UploadRealisasiOpsen.tanggal, 'yyyy-mm-dd')
filter_exp = UploadRealisasiOpsen.tanggal.between(
today-timedelta(days=6), today)
amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field,
today.strftime("%Y-%m-%d"), filter_exp, 'opsen_pkb')
#Tahunan
field = func.to_char(UploadRealisasiOpsen.tanggal, 'IYYY')
filter_exp = UploadRealisasiOpsen.tanggal.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field,
str(today.year), filter_exp, 'opsen_pkb')
#Bulanan
field = func.to_char(UploadRealisasiOpsen.tanggal, 'YYYY-MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field, None, filter_exp, 'opsen_pkb')
#Mingguan
field = func.to_char(UploadRealisasiOpsen.tanggal, 'YYYY-WW')
filter_exp = UploadRealisasiOpsen.tanggal.between(
today-timedelta(weeks=6), today)
week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field, None, filter_exp, 'opsen_pkb')
try:
ytd_target = self.get_targets("opsen_pkb")
except:
ytd_target = 0
ytd_persen = round(ytd/ytd_target * 100, 2) if ytd_target > 0 else 0
return {"today": amt,
"trx": trx,
"daily": daily,
"dailyTrx": dailyTrx,
"dailyAcc": dailyAcc,
"dailyAccTrx": dailyAccTrx,
"ytd": ytd,
"trxYtd": ytdTrx,
"pie": [("I", 100, '#16a75c'), ("II", 200, '#ffb900'),
("III", 300, '#133132'), ("IV", 200, '#123456'),
("V", 100, '#545355')],
"weekly": weekly,
"weeklyTrx": weeklyTrx,
"weeklyAcc": weeklyAcc,
"weeklyAccTrx": weeklyAccTrx,
"monthly": monthly,
"monthlyTrx": monthlyTrx,
"monthlyAcc": monthlyAcc,
"monthlyAccTrx": monthlyAccTrx,
"ytdTarget": ytd_target,
"ytdPersen": ytd_persen,
}
def get_bbnkb_data(self):
if log.root.level == logging.DEBUG:
today = datetime.strptime('2025-06-05', "%Y-%m-%d")
else:
today = datetime.now().date()
# Harian
field = func.to_char(UploadRealisasiOpsen.tanggal, 'yyyy-mm-dd')
filter_exp = UploadRealisasiOpsen.tanggal.between(
today-timedelta(days=6), today)
amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field,
today.strftime("%Y-%m-%d"), filter_exp, 'opsen_bbnkb')
#Tahunan
field = func.to_char(UploadRealisasiOpsen.tanggal, 'IYYY')
filter_exp = UploadRealisasiOpsen.tanggal.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field,
str(today.year), filter_exp, 'opsen_bbnkb')
#Bulanan
field = func.to_char(UploadRealisasiOpsen.tanggal, 'YYYY-MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field, None, filter_exp, 'opsen_bbnkb')
#Mingguan
field = func.to_char(UploadRealisasiOpsen.tanggal, 'YYYY-WW')
filter_exp = UploadRealisasiOpsen.tanggal.between(
today-timedelta(weeks=6), today)
week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \
self.get_daily_data(UploadRealisasiOpsen, field, None, filter_exp, 'opsen_bbnkb')
try:
ytd_target = self.get_targets("opsen_bbnkb")
except:
ytd_target = 0
ytd_persen = round(ytd/ytd_target * 100, 2) if ytd_target > 0 else 0
return {"today": amt,
"trx": trx,
"daily": daily,
"dailyTrx": dailyTrx,
"dailyAcc": dailyAcc,
"dailyAccTrx": dailyAccTrx,
"ytd": ytd,
"trxYtd": ytdTrx,
"pie": [("I", 100, '#16a75c'), ("II", 200, '#ffb900'),
("III", 300, '#133132'), ("IV", 200, '#123456'),
("V", 100, '#545355')],
"weekly": weekly,
"weeklyTrx": weeklyTrx,
"weeklyAcc": weeklyAcc,
"weeklyAccTrx": weeklyAccTrx,
"monthly": monthly,
"monthlyTrx": monthlyTrx,
"monthlyAcc": monthlyAcc,
"monthlyAccTrx": monthlyAccTrx,
"ytdTarget": ytd_target,
"ytdPersen": ytd_persen,
}
def loop_data(self, src, dst):
for key, val in enumerate(src):
found = False
......@@ -579,6 +728,12 @@ class Views(BaseView):
if jenis == "pbb":
realisasi = self.get_pbb_data()["ytd"]
elif jenis == "opsen_pkb":
realisasi = self.get_pkb_data()["ytd"]
elif jenis == "opsen_bbnkb":
realisasi = self.get_bbnkb_data()["ytd"]
elif jenis == "bphtb":
realisasi = self.get_bphtb_data()["ytd"]
else:
......@@ -617,7 +772,8 @@ class Views(BaseView):
data.update(self.get_grid_pajak("atd"))
data.update(self.get_grid_pajak("pbb"))
data.update(self.get_grid_pajak("bphtb"))
data.update(self.get_grid_pajak("opsen"))
data.update(self.get_grid_pajak("opsen_pkb"))
data.update(self.get_grid_pajak("opsen_bbnkb"))
return [{"kode": data[d]["kode"],
"nama": data[d]["nama"],
"target": data[d]["target"],
......
......@@ -12,9 +12,13 @@
<div metal:fill-slot="content">
<!-- Main Title -->
<div class="row">
<div class="col-md-12">
<div class="col-md-2">
<img src="${home}/eis/static/bapend.png" class="icon-rounded" alt="" align="left">
</div>
<div class="col-md-8">
<div class="text-center" style="margin-bottom: 20px; padding: 15px 0;">
<h2 style="margin: 0; font-weight: bold; color: #333; text-transform: uppercase; letter-spacing: 1px;">
<h2 style="margin: 0; font-weight: bold; color: #333;text-transform: uppercase; letter-spacing: 1px;
background-color:#aca8a8">
LAPORAN REALTIME REALISASI PAJAK DAERAH
</h2>
<h3 style="margin: 5px 0 0; font-weight: bold; color: #cc5200; text-transform: uppercase; letter-spacing: 1px;">
......@@ -23,6 +27,10 @@
<h4 id="tanggalHariIni" style="margin: 5px 0 0; color: #003399; font-weight: bold;"></h4>
</div>
</div>
<div class="col-md-2">
<img src="${home}/eis/static/img_logo.png" class="icon-rounded" alt="" align="left" width="
100">
</div>
</div>
<div class="row hide">
......@@ -88,21 +96,22 @@
<div class="col-md-8">
<div class="panel panel-default">
<div class="panel-heading">
<img src="${home}/eis/static/bapend.png" class="icon-rounded" alt="" align="left">
<h5 class="text-left bold">Target dan Realisasi per Pajak
<i class="fa fa-info-circle pull-right icon-color"></i>
</h5>
</div>
<div class="panel-body">
<table class="table table-bordered table-sm" id="table1">
<thead>
<tr>
<th class="align-middle text-center">Kode</th>
<th class="align-middle text-center">Uraian</th>
<th class="text-center">Target</th>
<th class="text-center">Realisasi</th>
<th class="text-center">Selisih</th>
<th class="text-center">%</th>
<th rowspan="2" style="vertical-align: middle;text-align:center !important;">Kode</th>
<th rowspan="2" style="vertical-align: middle;text-align:center !important;">Uraian</th>
<th rowspan="2" style="vertical-align: middle;text-align:center !important;">Target</th>
<th colspan="2" style="vertical-align: middle;text-align:center !important;">Realisasi Hari Ini</th>
<th rowspan="2" style="vertical-align: middle;text-align:center !important;">Sisa Target<br>(Rp.)</th>
</tr>
<tr>
<th style="vertical-align: middle;text-align:center !important;">(Rp.)</th>
<th style="vertical-align: middle;text-align:center !important;">(%)</th>
</tr>
</thead>
<tbody>
......@@ -119,8 +128,8 @@
<td colspan="2" class="text-right">Jumlah</td>
<td><span id="sum_target"></span></td>
<td><span id="sum_realisasi"></span></td>
<td><span id="sum_sisa"></span></td>
<td><span id="sum_persen"></span></td>
<td><span id="sum_sisa"></span></td>
</tfoot>
</table>
</div>
......@@ -130,16 +139,16 @@
<div class="col-md-4">
<div class="panel panel-default" id="gaugePanel" style="min-height: 500px;">
<div class="panel-heading" style="padding: 10px 15px;">
<h5 class="text-center bold" style="margin: 0;">REALISASI PAJAK DAERAH</h5>
<h5 class="text-center bold" style="margin: 0;border:1px solid">REALISASI PAJAK DAERAH</h5>
<h3><b>Realisasi: Rp.<span id="gaugeRealisasi">0</span></b></h3>
</div>
<div class="panel-body" style="padding: 0; height: calc(100% - 50px); overflow: hidden; display: flex; flex-direction: column;">
<div class="panel-body" style="padding: 0; height: calc(85% - 50px); overflow: hidden; display: flex; flex-direction: column;">
<div id="chartContainer" style="flex: 1; display: flex; align-items: center; justify-content: center; margin: 0; padding: 0;">
<canvas id="gaugeChart" width="100%" height="100%"></canvas>
<canvas id="gaugeChart" width="50%" height="50%"></canvas>
</div>
<div class="text-center" style="padding: 10px; background: rgba(0,0,0,0.02); border-top: 1px solid #ddd;">
<h4 id="gaugePercentage" style="margin: 2px 0; font-weight: bold; color: #333; font-size: 16px;">63.70%</h4>
<p style="margin: 1px 0; font-size: 11px; color: #666;">Realisasi: Rp.<span id="gaugeRealisasi">2.343.460.022.116</span></p>
<p style="margin: 1px 0; font-size: 11px; color: #666;">Target: Rp.<span id="gaugeTarget">3.679.068.431.493</span></p>
<h4 id="gaugePercentage" class="text-center" style="color: #333; font-size: 16px;">63.70%</h4>
<div class="text-left" style="padding: 10px; background: rgba(0,0,0,0.02); border-top: 1px solid #ddd;">
<h3><b>Target: Rp.<span id="gaugeTarget">3.679.068.431.493</span></b></h3>
</div>
</div>
</div>
......@@ -608,13 +617,13 @@
"searching": false,
"info": false,
"autoWidth": false,
"scrollX": true,
"order": [[0, 'asc']],
"ordering": false,
"columnDefs": [
{ className: 'text-center', width: "50px", targets: [0] },
{ className: 'text-left', targets: [1] },
{ className: 'text-right', width: "100px", targets: [2, 3, 4], render: $.fn.dataTable.render.number('.', ',', 0, '') },
{ className: 'text-right', width: "100px", targets: [5], render: $.fn.dataTable.render.number('.', ',', 2, '') },
{ className: 'text-center', width: "10px", targets: [0] },
{ className: 'text-left', width: "150px",targets: [1] },
{ className: 'text-right', width: "50px", targets: [2, 3], render: $.fn.dataTable.render.number('.', ',', 0, '') },
{ className: 'text-right', width: "50px", targets: [4], render: $.fn.dataTable.render.number('.', ',', 2, '') },
{ className: 'text-right', width: "50px", targets: [5], render: $.fn.dataTable.render.number('.', ',', 0, '') },
]
}
);
......@@ -636,8 +645,8 @@
row.nama,
row.target,
row.realisasi,
row.persen.toFixed(2),
row.sisa,
row.persen.toFixed(2)
]);
sum_target += row.target;
sum_realisasi += row.realisasi;
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!