Add webr.py to import Webr models

1 parent d8e4d127
......@@ -12,7 +12,7 @@ from ..models.payment import PaymentPBB, PaymentPAD, PaymentBPHTB, PaymentWEBR,
from opensipkd.pbb.monitoring.models import PembayaranSppt, Kecamatan, Kelurahan, Sppt
from datetime import timedelta
from ..models.payment import PCDBSession
from opensipkd.webr.models import WebrAnggaran, WebrArPayment
log = logging.getLogger(__name__)
PAD_TYP = {
......@@ -155,11 +155,11 @@ class Views(BaseView):
}
def get_daily_data(self, table, field, today, filters, typ=None):
#todo ada kemungkinan menyebabkan error ke transaksi yang lain
# todo ada kemungkinan menyebabkan error ke transaksi yang lain
if type(filters) is not list:
filters = [filters]
if PCDBSession.registry().in_transaction():
PCDBSession.rollback()
PCDBSession.rollback()
columns = [field.label("step")]
qry = table.qry_sum(columns) \
.group_by(field)\
......@@ -177,15 +177,14 @@ class Views(BaseView):
dailyAcc = []
dailyAccTrx = []
amt = trx = acc = accTrx = 0
for r in qry:
mapped = r._mapping
step = mapped.get("step","")
step = mapped.get("step", "")
bayar = mapped.get("bayar", 0)
denda = mapped.get("denda", 0)
pokok = bayar - denda
tx = mapped.get("trx",0)
tx = mapped.get("trx", 0)
daily.append((step, pokok))
dailyTrx.append((step, tx))
acc += pokok
......@@ -219,25 +218,25 @@ class Views(BaseView):
def get_pbb_data(self):
today = datetime.now().date()
#Piutang
# Piutang
#Harian
# Harian
field = func.to_char(PembayaranSppt.tgl_pembayaran_sppt, 'yyyy-mm-dd')
filter_exp = PembayaranSppt.tgl_pembayaran_sppt.between(
today-timedelta(days=6), today)
amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
self.get_daily_data(PembayaranSppt, field,
today.strftime("%Y-%m-%d"), filter_exp)
#Total Setahun
# Total Setahun
field = func.to_char(PembayaranSppt.tgl_pembayaran_sppt, 'IYYY')
filter_exp = PembayaranSppt.tgl_pembayaran_sppt.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \
self.get_daily_data(PembayaranSppt, field,
str(today.year), filter_exp)
#Piutang
# Piutang
filter_exp = [PembayaranSppt.tgl_pembayaran_sppt.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today),
PembayaranSppt.thn_pajak_sppt < today.year]
......@@ -245,12 +244,12 @@ class Views(BaseView):
self.get_daily_data(PembayaranSppt, field,
str(today.year), filter_exp)
#Bulanan
# Bulanan
field = func.to_char(PembayaranSppt.tgl_pembayaran_sppt, 'MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(PembayaranSppt, field, None, filter_exp)
#Mingguan
# Mingguan
field = func.to_char(PembayaranSppt.tgl_pembayaran_sppt, 'WW')
filter_exp = PembayaranSppt.tgl_pembayaran_sppt.between(
today-timedelta(weeks=6), today)
......@@ -296,15 +295,15 @@ class Views(BaseView):
else:
today = datetime.now().date()
#Harian
# Harian
field = func.to_char(PaymentBPHTB.tgl, 'yyyy-mm-dd')
filter_exp = PaymentBPHTB.tgl.between(
today-timedelta(days=6), today)
amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
self.get_daily_data(PaymentBPHTB, field,
today.strftime("%Y-%m-%d"), filter_exp)
#Total Tahunan
# Total Tahunan
field = func.to_char(PaymentBPHTB.tgl, 'IYYY')
filter_exp = PaymentBPHTB.tgl.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
......@@ -312,18 +311,18 @@ class Views(BaseView):
self.get_daily_data(PaymentBPHTB, field,
str(today.year), filter_exp)
#Bulanan
# Bulanan
field = func.to_char(PaymentBPHTB.tgl, 'MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(PaymentBPHTB, field, None, filter_exp)
#Mingguan
# Mingguan
field = func.to_char(PaymentBPHTB.tgl, 'WW')
filter_exp = PaymentBPHTB.tgl.between(
today-timedelta(weeks=6), today)
week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \
self.get_daily_data(PaymentBPHTB, field, None, filter_exp)
ytd_target = float(self.get_targets("bphtb"))
ytd_persen = round(ytd/ytd_target * 100, 2) if ytd_target > 0 else 0
return {"today": amt,
......@@ -356,15 +355,14 @@ class Views(BaseView):
today = datetime.now().date()
filter_ex = []
#Harian
# Harian
field = func.to_char(PaymentPAD.tgl, 'yyyy-mm-dd')
filter_exp = PaymentPAD.tgl.between(today-timedelta(days=6), today)
amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
self.get_daily_data(PaymentPAD, field,
today.strftime("%Y-%m-%d"), filter_exp, typ)
#Total Tahun Berjalan
# Total Tahun Berjalan
field = func.to_char(PaymentPAD.tgl, 'IYYY')
filter_exp = PaymentPAD.tgl.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
......@@ -372,19 +370,19 @@ class Views(BaseView):
self.get_daily_data(PaymentPAD, field, str(
today.year), filter_exp, typ)
#Bulanan
# Bulanan
field = func.to_char(PaymentPAD.tgl, 'MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(PaymentPAD, field, None, filter_exp, typ)
#Mingguan
# Mingguan
field = func.to_char(PaymentPAD.tgl, 'WW')
filter_exp = PaymentPAD.tgl.between(
today-timedelta(weeks=6), today)
week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \
self.get_daily_data(PaymentPAD, field, None, filter_exp, typ)
#Target
# Target
ytd_target = float(self.get_targets(typ))
ytd_persen = round(ytd/ytd_target * 100, 2) if ytd_target > 0 else 0
return {"today": amt,
......@@ -424,7 +422,7 @@ class Views(BaseView):
self.get_daily_data(PaymentWEBR, field,
today.strftime("%Y-%m-%d"), filter_exp)
#Tahunan
# Tahunan
field = func.to_char(PaymentWEBR.tgl, 'IYYY')
filter_exp = PaymentWEBR.tgl.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
......@@ -432,12 +430,12 @@ class Views(BaseView):
self.get_daily_data(PaymentWEBR, field,
str(today.year), filter_exp)
#Bulanan
# Bulanan
field = func.to_char(PaymentWEBR.tgl, 'YYYY-MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(PaymentWEBR, field, None, filter_exp)
#Mingguan
# Mingguan
field = func.to_char(PaymentWEBR.tgl, 'YYYY-WW')
filter_exp = PaymentWEBR.tgl.between(
today-timedelta(weeks=6), today)
......@@ -625,6 +623,78 @@ class Views(BaseView):
"persen": round(realisasi/target * 100, 2) if target > 0 else 0}
}
def get_ret_dinas_data(self):
today = datetime.now().date()
result = []
tahun = today.year
anggaran = WebrAnggaran.sum_departemen(tahun)
for dept in anggaran:
d = dept._asdict()
result.append({"kode": d["departemen_kode"],
"nama": d["departemen_nama"],
"target": float(d["total_perubahan"]) or float(d["total_murni"]) or 0,
"realisasi": 0,
}
)
realisasi = WebrArPayment.sum_departemen(tahun)
for dept in realisasi:
found = False
d = dept._asdict()
for res in result:
if d["departemen_kode"] == res["kode"]:
found = True
res["realisasi"] = float(d["total_pokok"]) or 0
res["sisa"] = res["target"] - res["realisasi"]
res["persen"] = round(
res["realisasi"]/res["target"] * 100, 2) if res["target"] > 0 else 0
if not found:
result.append({"kode": d["departemen_kode"],
"nama": d["departemen_nama"],
"target": 0,
"realisasi": float(dept.total_pokok) or 0,
"sisa": 0 - (float(dept.total_pokok) or 0),
"persen": 0,
}
)
return result
def get_ret_jenis_data(self):
today = datetime.now().date()
result = []
tahun = today.year
anggaran = WebrAnggaran.sum_rekening(tahun)
for dept in anggaran:
result.append({"kode": dept.rekening_kode,
"nama": dept.rekening_nama,
"target": dept.total_perubahan or dept.total_murni or 0,
"realisasi": 0,
}
)
realisasi = WebrArPayment.sum_rekening(tahun)
for dept in realisasi:
found = False
for res in result:
if dept.rekening_kode == res["kode"]:
found = True
res["realisasi"] = float(dept.total_pokok) or 0
res["sisa"] = res["target"] - res["realisasi"]
res["persen"] = round(
res["realisasi"]/res["target"] * 100, 2) if res["target"] > 0 else 0
if not found:
result.append({"kode": dept.rekening_kode,
"nama": dept.rekening_nama,
"target": 0,
"realisasi": float(dept.total_pokok) or 0,
"sisa": 0 - (float(dept.total_pokok) or 0),
"persen": 0,
}
)
return result
@view_config(route_name='eis-pcpd-act', renderer='json')
def view_app_act(self):
tahun = self.ses['tahun']
......@@ -675,8 +745,14 @@ class Views(BaseView):
resp = self.get_webr_data()
elif act == 'pajak':
resp = self.get_pajak_data()
elif act == 'rdinas':
return self.get_ret_dinas_data()
elif act == 'rjenis':
return self.get_ret_jenis_data()
else:
resp = self.get_pad_data(act)
resp["time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return resp
......
......@@ -41,14 +41,18 @@
<metal:css define-slot="css_files"></metal:css>
<style metal:define-slot="styles"></style>
<style>
#logo {margin: 0 !important;}
#logo {
margin: 0 !important;
}
#logo img {
height: 44px;
width: auto;
margin: 0;
margin-left: 10px;
}
.project-context .title-page{
.project-context .title-page {
font-size: 19px;
line-height: 40px;
color: #474544;
......@@ -108,19 +112,19 @@
</span>
<i class="fa fa-angle-down"></i> </a>
<ul class="dropdown-menu pull-right">
<li><a style="text-transform:capitalize" href="${request.route_url('profile')}">Profile</a>
<li><a style="text-transform:capitalize" href="${request.route_url('base-profile')}">Profile</a>
</li>
<li tal:condition="not request.user.external">
<a style="text-transform:capitalize" href="${request.route_url('password')}">Ubah
<a style="text-transform:capitalize" href="${request.route_url('base-password')}">Ubah
password</a>
</li>
<li><a style="text-transform:capitalize" href="${request.route_url('logout')}">Logout</a>
<li><a style="text-transform:capitalize" href="${request.route_url('base-logout')}">Logout</a>
</li>
<li tal:condition="request.user.api_key"><a style="text-transform:capitalize"
href="${home}/recreate-api-key">API Key</a></li>
<!-- <li talcondition="'core' in request.modules and change_unit(request)">-->
<!-- <a style="text-transform:capitalize" href="${home}/departemen/chg">Ubah-->
<!-- Organisasi</a>-->
<!-- <a style="text-transform:capitalize" href="${home}/departemen/chg">Ubah-->
<!-- Organisasi</a>-->
<!-- </li> -->
</ul>
</li>
......@@ -336,4 +340,4 @@
<script metal:define-slot="scripts"></script>
</body>
</html>
</html>
\ No newline at end of file
......@@ -134,12 +134,102 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<img src="${home}/eis/static/42x42-statistics.png" class="icon-rounded" alt="" align="left">
<h5 class="text-left bold">Target dan Realisasi per Dinas
<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="tableDinas">
<thead>
<tr>
<th class="align-middle text-center">Kode</th>
<th class="align-middle text-center">Instansi</th>
<th class="text-center">Target</th>
<th class="text-center">Realisasi</th>
<th class="text-center">Selisih</th>
<th class="text-center">%</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td class=""></td>
<td class=""></td>
<td class="right">0</td>
<td class="right">0</td>
<td class="right">0</td>
<td class="right">0</td>
</tr>
</tbody>
<tfoot>
<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>
</tfoot>
</table>
</div>
</div>
</div>
<hr>
</div>
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<img src="${home}/eis/static/42x42-statistics.png" class="icon-rounded" alt="" align="left">
<h5 class="text-left bold">Target dan Realisasi per Jenis
<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="tableJenis">
<thead>
<tr>
<th class="align-middle text-center">Kode</th>
<th class="align-middle text-center">Jenis</th>
<th class="text-center">Target</th>
<th class="text-center">Realisasi</th>
<th class="text-center">Selisih</th>
<th class="text-center">%</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td class=""></td>
<td class=""></td>
<td class="right">0</td>
<td class="right">0</td>
<td class="right">0</td>
<td class="right">0</td>
</tr>
</tbody>
<tfoot>
<td colspan="2" class="text-right">Jumlah</td>
<td><span id="jns_target"></span></td>
<td><span id="jns_realisasi"></span></td>
<td><span id="jns_sisa"></span></td>
<td><span id="jns_persen"></span></td>
</tfoot>
</table>
</div>
</div>
</div>
<hr>
</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="${home}/eis/static/js/chart.js"></script>
<script src="${home}/eis/static/js/chartjs-adapter-date-fns.bundle.min.js"></script>
<script src="${home}/eis/static/js/odometer.js"></script>
<script src="${home}/static/v3/plugin/datatables/1.10/media/js/jquery.dataTables.min.js"></script>
<script src="${home}/static/v3/plugin/datatables/1.10/media/js/jquery.dataTables.ext.js"></script>
</metal:js>
......@@ -349,7 +439,134 @@
value: 0,
format: '(.ddd)',
});
//Ditambahkan atas permintaan 2025-10-28
//grid per dinas
var tableDinas = $('#tableDinas').DataTable(
{
"destroy": true,
"paging": false,
"searching": false,
"info": false,
"autoWidth": false,
"scrollX": true,
"order": [[0, 'asc']],
"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, '') },
]
}
);
var dinasRefresh = function () {
tableDinas.clear();
var dinasUrl = "${url}".replace("/webr/", "/rdinas/");
$.get(dinasUrl, {}, function (data, status) {
if (status === "success") {
console.log("Data:", data);
var sum_target = 0;
var sum_realisasi = 0;
var sum_sisa = 0;
var sum_persen = 0;
data.forEach(function (row) {
console.log(row);
tableDinas.row.add([
row.kode,
row.nama,
row.target,
row.realisasi,
row.sisa,
row.persen.toFixed(2)
]);
sum_target += row.target;
sum_realisasi += row.realisasi;
sum_sisa += row.sisa;
sum_persen += row.persen;
});
$('#sum_target').html(sum_target.toLocaleString("id-ID"));
$('#sum_realisasi').html(sum_realisasi.toLocaleString("id-ID"));
$('#sum_sisa').html(sum_sisa.toLocaleString("id-ID"));
if (sum_target > 0)
$('#sum_persen').html((sum_realisasi / sum_target * 100).toFixed(2));
else
$('#sum_persen').html("0.00");
tableDinas.draw();
} else {
console.log("Request failed.");
tableDinas.draw();
}
}).fail(function () {
console.log("Request failed.");
tableDinas.draw();
});
}
//grid per jenis
var tableJenis = $('#tableJenis').DataTable(
{
"destroy": true,
"paging": false,
"searching": false,
"info": false,
"autoWidth": false,
"scrollX": true,
"order": [[0, 'asc']],
"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, '') },
]
}
);
var jenisRefresh = function () {
tableJenis.clear();
var jenisUrl = "${url}".replace("/webr/", "/rjenis/");
$.get(jenisUrl, {}, function (data, status) {
if (status === "success") {
console.log(data);
var jns_target = 0;
var jns_realisasi = 0;
var jns_sisa = 0;
var jns_persen = 0;
data.forEach(function (row) {
console.log(row);
tableJenis.row.add([
row.kode,
row.nama,
row.target,
row.realisasi,
row.sisa,
row.persen.toFixed(2)
]);
jns_target += row.target;
jns_realisasi += row.realisasi;
jns_sisa += row.sisa;
jns_persen += row.persen;
});
$('#jns_target').html(jns_target.toLocaleString("id-ID"));
$('#jns_realisasi').html(jns_realisasi.toLocaleString("id-ID"));
$('#jns_sisa').html(jns_sisa.toLocaleString("id-ID"));
if (jns_target > 0)
$('#jns_persen').html((jns_realisasi / jns_target * 100).toFixed(2));
else
$('#jns_persen').html("0.00");
tableJenis.draw();
} else {
console.log("Request failed.");
tableJenis.draw();
}
}).fail(function () {
console.log("Request failed.");
tableJenis.draw();
});
}
$.fn.datarefresh = function () {
console.log("data_refresh");
console.log("${url}");
......@@ -367,6 +584,8 @@
time.style.fontWeight = 'bold';
addData(pieChart, newData.pie);
trendChart();
dinasRefresh();
jenisRefresh();
} else {
console.log("Request failed.");
}
......
from opensipkd.webr.models import (
WebrAnggaran,
WebrProduk,
WebrArInvoice,
Departemen
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!