pcpd.py 15.5 KB
from types import NoneType
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
from datetime import timedelta
logger = logging.getLogger(__name__)

class Views(BaseView):
    @view_config(route_name='eis-pcpd', renderer='templates/pcpd.pt',
                 permission='eis')
    def view_app(self):
        return {"module": "pad",
                "title": "Realisasi Pajak dan Retribusi Daerah"}

    def get_dummy_data(self):
        return {"today": 1000,
                "trx": 155,
                "ytd": 10000,
                "trxYtd": 1550,
                "pie": [("I", 100, '#16a75c'), ("II", 200, '#ffb900'),
                        ("III", 300, '#133132'), ("IV", 200, '#123456'),
                        ("V", 100, '#545355')],
                "daily": [("I", 100), ("II", 200), ("III", 300), ("IV", 200), ("V", 100), ("VI", 100), ("VII", 700)],
                "dailyTrx": [("I", 50), ("II", 25), ("III", 10), ("IV", 10), ("V", 50), ("VI", 34), ("VII", 35)],
                "dailyAcc": [("I", 100), ("II", 200), ("III", 300), ("IV", 200), ("V", 100), ("VI", 100), ("VII", 700)],
                "dailyAccTrx": [("I", 100), ("II", 200), ("III", 300), ("IV", 200), ("V", 100), ("VI", 100), ("VII", 700)],
                "weekly": [("1", 100), ("2", 200), ("3", 300), ("4", 200), ("5", 100), ("6", 100), ("7", 700)],
                "weeklyTrx": [("1", 100), ("2", 200), ("3", 300), ("4", 200), ("5", 100), ("6", 100), ("7", 700)],
                "weeklyAcc": [("1", 100), ("2", 200), ("3", 300), ("4", 200), ("5", 100), ("6", 100), ("7", 700)],
                "weeklyAccTrx": [("1", 100), ("2", 200), ("3", 300), ("4", 200), ("5", 100), ("6", 100), ("7", 700)],
                "monthly": [("JAN", 100), ("FEB", 200), ("MAR", 300), ("APR", 200), ("MAY", 100), ("JUN", 100), ("JUL", 700)],
                "monthlyTrx": [("JAN", 100), ("FEB", 200), ("MAR", 300), ("APR", 400), ("MAY", 500), ("JUN", 600), ("JUL", 700)],
                "monthlyAcc": [("JAN", 100), ("FEB", 200), ("MAR", 300), ("APR", 200), ("MAY", 100), ("JUN", 100), ("JUL", 700)],
                "monthtrAccTrx": [("JAN", 100), ("FEB", 200), ("MAR", 300), ("APR", 200), ("MAY", 100), ("JUN", 100), ("JUL", 700)],
                }

    def get_daily_data(self, table, filter, field=None, today=None):
        columns = [field.label("step")]
        qry = table.qry_sum(columns) \
            .group_by(field)\
            .order_by(field)
        qry = qry.filter(filter)
        daily = []
        dailyTrx = []
        dailyAcc = []
        dailyAccTrx = []
        amt = trx = acc = accTrx = 0
        for r in qry:
            step = r[3]
            bayar = r[0] or 0
            denda = r[1] or 0
            pokok = bayar - denda
            tx=r[2] or 0
            daily.append((step, pokok))
            dailyTrx.append((step, tx))
            acc += pokok
            accTrx += tx
            dailyAcc.append((step, acc))
            dailyAccTrx.append((step, accTrx))
            if step == today:
                amt = pokok
                trx = tx
        return amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx

    def get_pbb_data(self):
        log.debug("YYYYY")
        logger.debug("XXXX")
        if log.root.level == logging.DEBUG:
            today = datetime.strptime('2025-06-05', "%Y-%m-%d")
        else:
            today = datetime.now().date()
        field = func.to_char(PaymentPBB.tgl_pembayaran_sppt, 'yyyy-mm-dd')
        filter = PaymentPBB.tgl_pembayaran_sppt.between(
            today-timedelta(6), today)
        amt, trx, daily, dailyTrx, dailyAcc, dailyAccTrx = \
            self.get_daily_data(PaymentPBB, filter, field,
                                today.strftime("%Y-%m-%d"))
        filter = PaymentPBB.tgl_pembayaran_sppt.between(
            today-timedelta(days=6), today)

        field = func.to_char(PaymentPBB.tgl_pembayaran_sppt, 'IYYY')
        filter = PaymentPBB.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(PaymentPBB, filter, field,str(today.year))

        field = func.to_char(PaymentPBB.tgl_pembayaran_sppt, 'IYYY-IM')
        month, monthTrx, monthly, monthlyTrx, monthlyAcc, monthlyAccTrx = \
            self.get_daily_data(PaymentPBB, filter, field)

        filter = PaymentPBB.tgl_pembayaran_sppt.between(
            today-timedelta(weeks=6), today)
        week, weekTrx, weekly, weeklyTrx, weeklyAcc, weeklyAccTrx = \
            self.get_daily_data(PaymentPBB, filter, field)

        field = func.to_char(PaymentPBB.tgl_pembayaran_sppt, 'YYYY-MM')

        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,
                "monthtrAccTrx": monthlyAccTrx,
                }

    @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':
            resp = self.get_pbb_data()
        else:
            resp = self.get_dummy_data()
        resp["time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        return resp

    def view_pajak(self):
        return {"module": 'pajak',
                "title": "Realisasi Pajak Daerah"}

    def view_pbb(self):
        return {"module": 'pbb',
                "title": "Realisasi Pajak Bumi dan Bangunan P2"}

    def view_bphtb(self):
        return {"module": 'bphtb',
                "title": "Realisasi BPHTB"}

    def view_hotel(self):
        return {"module": 'hotel',
                "title": "Realisasi Pajak Hotel"}

    def view_resto(self):
        return {"module": 'resto',
                "title": "Realisasi Pajak Restoran"}

    def view_parkir(self):
        return {"module": 'parkir',
                "title": "Realisasi Pajak Parkir"}

    def view_hiburan(self):
        return {"module": 'hiburan',
                "title": "Realisasi Pajak Hiburan"}

    def view_ppju(self):
        return {"module": 'ppju',
                "title": "Realisasi Pajak Penerangan Jalan Umum"}

    def view_minerba(self):
        return {"module": 'minerba',
                "title": "Realisasi Pajak Minerba"}

    def view_reklame(self):
        return {"module": 'reklame',
                "title": "Realisasi Pajak Reklame"}

    def view_atd(self):
        return {"module": 'atd',
                "title": "Realisasi Pajak Air Tanah"}

    def view_webr(self):
        return {"module": 'webr'}

    def view_opsen(self):
        return {"module": 'opsen',
                "title": "Opsen Pajak PKB dan BBNKB"}

# 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()