Commit b3d77e48 by Ari Agung Prasetiyo

penambahan menu target dan penyesuaian realisasi, target

1 parent 19007dbf
...@@ -292,6 +292,49 @@ class Targets(PCBase, DefaultModel): ...@@ -292,6 +292,49 @@ class Targets(PCBase, DefaultModel):
return query return query
class TargetsBangbadil(PCBase, DefaultModel):
__tablename__ = 'targets_bangbadil'
__table_args__ = {'schema': 'public'}
id = Column(Integer, primary_key=True)
created = Column(Date, nullable=False)
updated = Column(Date, nullable=False)
kode = Column(String(32))
nama = Column(String(128))
tahun = Column(Integer)
jenis = Column(Integer)
t_anggaran = Column(BigInteger)
t_perubahan = Column(BigInteger)
m01 = Column(BigInteger)
m02 = Column(BigInteger)
m03 = Column(BigInteger)
m04 = Column(BigInteger)
m05 = Column(BigInteger)
m06 = Column(BigInteger)
m07 = Column(BigInteger)
m08 = Column(BigInteger)
m09 = Column(BigInteger)
m10 = Column(BigInteger)
m11 = Column(BigInteger)
m12 = Column(BigInteger)
status = Column(SmallInteger)
@classmethod
def query_from(cls, columns=None, filters=None, db_session=PCDBSession):
query = db_session.query().select_from(cls)
if columns:
for c in columns:
query = query.add_columns(c)
if filters:
filter_expressions = []
for d in filters:
field = getattr(cls, d[0])
operator = d[1]
value = d[2]
filter_expressions.append(field.op(operator)(value))
query = query.filter(
*[e for i, e in enumerate(filter_expressions) if e is not None])
return query
class UploadRealisasiOpsen(PCBase, DefaultModel): class UploadRealisasiOpsen(PCBase, DefaultModel):
__tablename__ = 'upload_realisasi_opsen' __tablename__ = 'upload_realisasi_opsen'
__table_args__ = {'schema': 'public'} __table_args__ = {'schema': 'public'}
......
...@@ -52,14 +52,19 @@ eis-slide-act,EIS Slide Act,/eis/slide/{act}/act,1,0 ...@@ -52,14 +52,19 @@ 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
eis-slide-delete,EIS Slide Delete,/eis/slide/{id}/delete,1,0 eis-slide-delete,EIS Slide Delete,/eis/slide/{id}/delete,1,0
eis-pkbbbnkb,EIS PKB BBNKB,/eis/pkbbbnkb,1,0,1,,pkbbbnkb,Views,view_list,eis,form.pt eis-pkbbbnkb,Opsen PKB BBNKB,/eis/pkbbbnkb,1,0,1,,pkbbbnkb,Views,view_list,eis,form.pt
eis-pkbbbnkb-act,EIS PKB BBNKB Act,/eis/pkbbbnkb/{act}/act,1,0,,,pkbbbnkb,Views,,eis eis-pkbbbnkb-act,Opsen PKB BBNKB Act,/eis/pkbbbnkb/{act}/act,1,0,,,pkbbbnkb,Views,,eis
eis-pkbbbnkb-add,EIS PKB BBNKB Add,/eis/pkbbbnkb/add,1,0,,,pkbbbnkb,Views,,eis eis-pkbbbnkb-add,Opsen PKB BBNKB Add,/eis/pkbbbnkb/add,1,0,,,pkbbbnkb,Views,,eis
eis-pkbbbnkb-edit,EIS PKB BBNKB Edit,/eis/pkbbbnkb/{id}/edit,1,0,,,pkbbbnkb,Views,,eis eis-pkbbbnkb-edit,Opsen PKB BBNKB Edit,/eis/pkbbbnkb/{id}/edit,1,0,,,pkbbbnkb,Views,,eis
eis-pkbbbnkb-delete,EIS PKB BBNKB Delete,/eis/pkbbbnkb/{id}/delete,1,0,,,pkbbbnkb,Views,,eis eis-pkbbbnkb-delete,Opsen PKB BBNKB Delete,/eis/pkbbbnkb/{id}/delete,1,0,,,pkbbbnkb,Views,,eis
eis-penerimaan,EIS PKB BBNKB,/eis/penerimaan,1,0,0,,penerimaan,Views,view_list,eis,form.pt eis-penerimaan,EIS penerimaan,/eis/penerimaan,1,0,0,,penerimaan,Views,view_list,eis,form.pt
eis-penerimaan-act,EIS PKB BBNKB Act,/eis/penerimaan/{act}/act,1,0,,,penerimaan,Views,,eis eis-penerimaan-act,EIS penerimaan Act,/eis/penerimaan/{act}/act,1,0,,,penerimaan,Views,,eis
eis-penerimaan-add,EIS PKB BBNKB Add,/eis/penerimaan/add,1,0,,,penerimaan,Views,,eis eis-penerimaan-add,EIS penerimaan Add,/eis/penerimaan/add,1,0,,,penerimaan,Views,,eis
eis-penerimaan-edit,EIS PKB BBNKB Edit,/eis/penerimaan/{id}/edit,1,0,,,penerimaan,Views,,eis eis-penerimaan-edit,EIS penerimaan Edit,/eis/penerimaan/{id}/edit,1,0,,,penerimaan,Views,,eis
eis-penerimaan-delete,EIS PKB BBNKB Delete,/eis/penerimaan/{id}/delete,1,0,,,penerimaan,Views,,eis eis-penerimaan-delete,EIS penerimaan Delete,/eis/penerimaan/{id}/delete,1,0,,,penerimaan,Views,,eis
eis-target,Target,/eis/target,1,0,1,,target,Views,view_list,eis,form.pt
eis-target-act,Target Act,/eis/target/{act}/act,1,0,,,target,Views,,eis
eis-target-add,Target Add,/eis/target/add,1,0,,,target,Views,,eis
eis-target-edit,Target Edit,/eis/target/{id}/edit,1,0,,,target,Views,,eis
eis-target-delete,Target Delete,/eis/target/{id}/delete,1,0,,,target,Views,,eis
...@@ -8,26 +8,25 @@ from ..models.eis import Eis, Chart, ChartItem, Slide ...@@ -8,26 +8,25 @@ from ..models.eis import Eis, Chart, ChartItem, Slide
from datatables import ColumnDT, DataTables from datatables import ColumnDT, DataTables
from sqlalchemy import func, and_, String from sqlalchemy import func, and_, String
from sqlalchemy.sql.expression import cast from sqlalchemy.sql.expression import cast
from ..models.payment import PaymentPBB, PaymentPAD, PaymentBPHTB, PaymentWEBR, Targets, UploadRealisasiOpsen from ..models.payment import PaymentPBB, PaymentPAD, PaymentBPHTB, PaymentWEBR, TargetsBangbadil, UploadRealisasiOpsen
from opensipkd.pbb.monitoring.models import PembayaranSppt, Kecamatan, Kelurahan, Sppt from opensipkd.pbb.monitoring.models import PembayaranSppt, Kecamatan, Kelurahan, Sppt
from opensipkd.pjdl.models import Sspd, Pajak, Usaha
from datetime import timedelta from datetime import timedelta
from ..models.payment import PCDBSession from ..models.payment import PCDBSession
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
PAD_TYP = { PAD_TYP = {
"hotel": ["PBJT - JASA PERHOTELAN"], "hotel": ["1"],
"resto": ["RESTORAN", "PBJT - MAKANAN DAN/ATAU MINUMAN"], "resto": ["2"],
"hiburan": ["PBJT - JASA KESENIAN DAN HIBURAN"], "hiburan": ["3"],
"ppju": ["PBJT - TENAGA LISTRIK"], "ppju": ["7"],
"minerba": ["MINERAL BUKAN LOGAM DAN BATUAN"], "minerba": ["9"],
"opsen_pkb": [ "OPSEN PKB"], "parkir": ["5"],
"opsen_bbnkb": ["OPSEN BBNKB"], "walet": ["10"],
"parkir": ["PBJT - JASA PARKIR"], "atd": ["6"],
"walet": ["PENGELOLAAN SARANG BURUNG WALET DAN SEJENISNYA"], "reklame": ["4"],
"atd": ["AIR TANAH"], "pbb": ["0"],
"reklame": ["REKLAME"],
"pbb": ["PBB", "BPHTB"]
} }
jenis_pajak = { jenis_pajak = {
...@@ -149,9 +148,9 @@ class Views(BaseView): ...@@ -149,9 +148,9 @@ class Views(BaseView):
opsen = ["opsen_pkb", "opsen_bbnkb"] opsen = ["opsen_pkb", "opsen_bbnkb"]
if typ != None and typ not in opsen: if typ != None and typ not in opsen:
if typ == "pajak": if typ == "pajak":
qry = qry.filter(table.jenis_pajak.notin_(PAD_TYP['pbb'])) qry = qry.filter(Usaha.id.notin_(PAD_TYP['pbb']))
else: else:
qry = qry.filter(table.jenis_pajak.in_(PAD_TYP[typ])) qry = qry.filter(Usaha.id.in_(PAD_TYP[typ]))
daily = [] daily = []
dailyTrx = [] dailyTrx = []
...@@ -165,7 +164,7 @@ class Views(BaseView): ...@@ -165,7 +164,7 @@ class Views(BaseView):
step = mapped.get("step","") step = mapped.get("step","")
bayar = mapped.get("bayar", 0) bayar = mapped.get("bayar", 0)
denda = mapped.get("denda", 0) denda = mapped.get("denda", 0)
pokok = bayar - denda pokok = float(bayar) - denda
tx = mapped.get("trx",0) tx = mapped.get("trx",0)
daily.append((step, pokok)) daily.append((step, pokok))
dailyTrx.append((step, tx)) dailyTrx.append((step, tx))
...@@ -179,24 +178,24 @@ class Views(BaseView): ...@@ -179,24 +178,24 @@ class Views(BaseView):
return amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx return amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx
def get_targets(self, kode=None): def get_targets(self, kode=None):
targets = Targets.query_from([ targets = TargetsBangbadil.query_from([
func.sum(Targets.t_anggaran).label("murni"), func.sum(TargetsBangbadil.t_anggaran).label("murni"),
func.sum(Targets.t_perubahan).label("perubahan"),])\ func.sum(TargetsBangbadil.t_perubahan).label("perubahan"),])\
.filter( .filter(
Targets.tahun == self.ses['tahun'], TargetsBangbadil.tahun == self.ses['tahun'],
) )
if kode: if kode:
if kode == "pajak": if kode == "pajak":
return 0 return 0
elif kode == 'opsen_pkb': elif kode == 'opsen_pkb':
targets = targets.filter( targets = targets.filter(
Targets.kode.ilike('4.1.1.10%')) TargetsBangbadil.kode.ilike('4.1.1.10%'))
elif kode == 'opsen_bbnkb': elif kode == 'opsen_bbnkb':
targets = targets.filter( targets = targets.filter(
Targets.kode.ilike('4.1.1.11%')) TargetsBangbadil.kode.ilike('4.1.1.11%'))
else: else:
targets = targets.filter( targets = targets.filter(
Targets.kode.ilike(jenis_pajak[kode]["kode"]+'%')) TargetsBangbadil.kode.ilike(jenis_pajak[kode]["kode"]+'%'))
targets = targets.first() targets = targets.first()
if targets: if targets:
target = targets.perubahan or targets.murni or 0 target = targets.perubahan or targets.murni or 0
...@@ -338,39 +337,39 @@ class Views(BaseView): ...@@ -338,39 +337,39 @@ class Views(BaseView):
} }
def get_pad_data(self, typ=None): def get_pad_data(self, typ=None):
if log.root.level == logging.DEBUG: # if log.root.level == logging.DEBUG:
today = datetime.strptime('2025-06-05', "%Y-%m-%d") # today = datetime.strptime('2025-06-05', "%Y-%m-%d")
else: # else:
today = datetime.now().date() today = datetime.now().date()
filter_ex = [] filter_ex = []
#Harian #Harian
field = func.to_char(PaymentPAD.tgl, 'yyyy-mm-dd') field = func.to_char(Sspd.sspdtgl, 'yyyy-mm-dd')
filter_exp = PaymentPAD.tgl.between(today-timedelta(days=6), today) filter_exp = Sspd.sspdtgl.between(today-timedelta(days=6), today)
amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \ amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
self.get_daily_data(PaymentPAD, field, self.get_daily_data(Sspd, field,
today.strftime("%Y-%m-%d"), filter_exp, typ) today.strftime("%Y-%m-%d"), filter_exp, typ)
#Total Tahun Berjalan #Total Tahun Berjalan
field = func.to_char(PaymentPAD.tgl, 'IYYY') field = func.to_char(Sspd.sspdtgl, 'IYYY')
filter_exp = PaymentPAD.tgl.between( filter_exp = Sspd.sspdtgl.between(
datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today) datetime.strptime(f"{today.year}-01-01", "%Y-%m-%d"), today)
ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \ ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \
self.get_daily_data(PaymentPAD, field, str( self.get_daily_data(Sspd, field, str(
today.year), filter_exp, typ) today.year), filter_exp, typ)
#Bulanan #Bulanan
field = func.to_char(PaymentPAD.tgl, 'MM') field = func.to_char(Sspd.sspdtgl, 'MM')
month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \ month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
self.get_daily_data(PaymentPAD, field, None, filter_exp, typ) self.get_daily_data(Sspd, field, None, filter_exp, typ)
#Mingguan #Mingguan
field = func.to_char(PaymentPAD.tgl, 'WW') field = func.to_char(Sspd.sspdtgl, 'WW')
filter_exp = PaymentPAD.tgl.between( filter_exp = Sspd.sspdtgl.between(
today-timedelta(weeks=6), today) today-timedelta(weeks=6), today)
week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \ week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \
self.get_daily_data(PaymentPAD, field, None, filter_exp, typ) self.get_daily_data(Sspd, field, None, filter_exp, typ)
#Target #Target
ytd_target = float(self.get_targets(typ)) ytd_target = float(self.get_targets(typ))
......
...@@ -14,8 +14,22 @@ from ..models import Targets ...@@ -14,8 +14,22 @@ from ..models import Targets
from ..models.payment import PCDBSession from ..models.payment import PCDBSession
from datetime import timedelta from datetime import timedelta
from sqlalchemy import func, and_, String from sqlalchemy import func, and_, String
from opensipkd.pjdl.models import Sspd, Pajak, Usaha
PAD_TYP = { PAD_TYP = {
"hotel": ["1"],
"resto": ["2"],
"hiburan": ["3"],
"ppju": ["7"],
"minerba": ["9"],
"parkir": ["5"],
"walet": ["10"],
"atd": ["6"],
"reklame": ["4"],
"pbb": ["0"],
}
PAD_TYPX = {
"hotel": ["HOTEL", "PBJT - JASA PERHOTELAN"], "hotel": ["HOTEL", "PBJT - JASA PERHOTELAN"],
"resto": ["RESTORAN", "PBJT - MAKANAN DAN/ATAU MINUMAN"], "resto": ["RESTORAN", "PBJT - MAKANAN DAN/ATAU MINUMAN"],
"hiburan": ["HIBURAN", "PBJT - JASA KESENIAN DAN HIBURAN"], "hiburan": ["HIBURAN", "PBJT - JASA KESENIAN DAN HIBURAN"],
...@@ -207,11 +221,11 @@ class Views(BaseView): ...@@ -207,11 +221,11 @@ class Views(BaseView):
def get_pad_data(self, typ=None, tahun=None): def get_pad_data(self, typ=None, tahun=None):
#Total Tahun Berjalan #Total Tahun Berjalan
field = func.to_char(PaymentPAD.tgl, 'IYYY') field = func.to_char(Sspd.sspdtgl, 'IYYY')
filter_exp = PaymentPAD.tgl.between( filter_exp = Sspd.sspdtgl.between(
datetime.strptime(f"{tahun}-01-01", "%Y-%m-%d"), datetime.strptime(f"{tahun}-12-31", "%Y-%m-%d")) datetime.strptime(f"{tahun}-01-01", "%Y-%m-%d"), datetime.strptime(f"{tahun}-12-31", "%Y-%m-%d"))
ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \ ytd, ytdTrx, yearly, yearlyTrx, yearlyAcc, yearlyAccTrx = \
self.get_daily_data(PaymentPAD, field, str( self.get_daily_data(Sspd, field, str(
tahun), filter_exp, typ) tahun), filter_exp, typ)
return { return {
...@@ -283,9 +297,9 @@ class Views(BaseView): ...@@ -283,9 +297,9 @@ class Views(BaseView):
opsen = ["opsen_pkb", "opsen_bbnkb"] opsen = ["opsen_pkb", "opsen_bbnkb"]
if typ != None and typ not in opsen: if typ != None and typ not in opsen:
if typ == "pajak": if typ == "pajak":
qry = qry.filter(table.jenis_pajak.notin_(PAD_TYP['pbb'])) qry = qry.filter(Usaha.id.notin_(PAD_TYP['pbb']))
else: else:
qry = qry.filter(table.jenis_pajak.in_(PAD_TYP[typ])) qry = qry.filter(Usaha.id.in_(PAD_TYP[typ]))
daily = [] daily = []
dailyTrx = [] dailyTrx = []
......
import colander
from deform import widget
from opensipkd.base.widgets import widget_os
from pyramid.view import view_config
from ..models.payment import UploadRealisasiOpsen, TargetsBangbadil
from . import BaseView
from ..models.payment import PCDBSession
from datetime import date
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.Integer(),
title="Action")
kode = colander.SchemaNode(
colander.String(),
title="Kode Rekening")
nama = colander.SchemaNode(
colander.String(),
title="Nama Pajak")
tahun = colander.SchemaNode(
colander.String(),
title="Tahun")
t_anggaran = colander.SchemaNode(
colander.Integer(),
thousand={"separator":"."},
title="Nilai Anggaran")
t_perubahan = colander.SchemaNode(
colander.Integer(),
thousand={"separator":"."},
title="Nilai Perubahan")
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
title="Kode",
oid="kode",
)
nama = colander.SchemaNode(
colander.String(),
title="Nama Pajak",
oid="nama",
)
tahun = colander.SchemaNode(
colander.String(),
title="tahun")
t_anggaran = colander.SchemaNode(
colander.Integer(),
widget=widget.TextInputWidget(min = 0, attributes={'type':'number','max':max,'min':min}),
validator=colander.Range(min=0),
title="Nilai Anggaran")
t_perubahan = colander.SchemaNode(
colander.Integer(),
widget=widget.TextInputWidget(min = 0, attributes={'type':'number','max':max,'min':min}),
validator=colander.Range(min=0),
title="Nilai Perubahan")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.list_route = 'eis-target'
self.table = TargetsBangbadil
self.db_session = PCDBSession
# def view_list(self):
# return super().view_list()
# def view_act(self):
# return super().view_act()
# def view_view(self):
# return super().view_view()
def form_validator(self, form, value):
exc = colander.Invalid(form, '')
if 'id' in form.request.matchdict:
uid = int(form.request.matchdict['id'])
q = UploadRealisasiOpsen.query_id(uid)
current = q.first()
else:
pass
def view_add(self):
return super().view_add()
# def get_values(self, row, istime=False, null=False):
# d = super().get_values(row, istime, null)
# d["kiri"] = d
# d["kanan"] = d
# return d
# def view_edit(self):
# return super().view_edit()
# def view_delete(self):
# return super().view_delete()
\ No newline at end of file \ No newline at end of file
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
<!-- Main Title --> <!-- Main Title -->
<div class="row"> <div class="row">
<div class="col-md-2"> <div class="col-md-2">
<img src="${home}/eis/static/bapend.png" class="icon-rounded" alt="" style="margin-top:9px; margin-left:80px;" align="left"> <img src="${home}/eis/static/bapend.png" class="icon-rounded" alt="" style="margin-top:9px; margin-left:10px;" align="left">
</div> </div>
<div class="col-md-8"> <div class="col-md-8">
<div class="text-center" style="margin-bottom: 20px; padding: 15px 0;"> <div class="text-center" style="margin-bottom: 20px; padding: 15px 0;">
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<!-- Main Title --> <!-- Main Title -->
<div class="row"> <div class="row">
<div class="col-md-2"> <div class="col-md-2">
<img src="${home}/eis/static/bapend.png" class="icon-rounded" alt="" style="margin-top:9px; margin-left:110px;" align="left"> <img src="${home}/eis/static/bapend.png" class="icon-rounded" alt="" style="margin-top:9px; margin-left:50px;" align="left">
</div> </div>
<div class="col-md-8"> <div class="col-md-8">
<div class="text-center" style="margin-bottom: 20px; padding: 15px 0;"> <div class="text-center" style="margin-bottom: 20px; padding: 15px 0;">
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!