kinerja.py 8.9 KB
from sqlalchemy import func, literal_column
from sqlalchemy.sql import union
from ..tools import date_from_str #, row2dict
from pyramid.view import (
    view_config,
    )
from ..models import (EisDBSession, EisSipkdArPayment, EisSipkdApPayment, 
                      EisSipkdPbPayment, EisSipkdAnggaran)
from ..views import BaseView    
from datetime import datetime

class Views(BaseView):
    @view_config(route_name='eis-sipkd-kinerja', renderer='templates/kinerja.pt',
                 permission='eis-sipkd-kinerja')
    def view_app(self):
        tahun = self.ses['tahun']
        params = self.params
        kode = 'kode' in params and params['kode'] or ''
        
        ########################################################################
        ang_qry = EisDBSession.query(EisSipkdAnggaran.kode.label('kode'),
                          EisSipkdAnggaran.nama.label('nama'),
                          EisSipkdAnggaran.level_id.label('level_id'),
                          func.sum(EisSipkdAnggaran.murni).label('anggaran'),
                          literal_column('0').label('realisasi'),).\
                      group_by(EisSipkdAnggaran.kode,
                               EisSipkdAnggaran.nama,
                               EisSipkdAnggaran.level_id,).\
                      filter(EisSipkdAnggaran.tahun == tahun)
        ########################################################################
        aar_qry = ang_qry.filter(EisSipkdAnggaran.kode.like('4.%'))
        rar_qry = EisDBSession.query(EisSipkdArPayment.kode,
                          EisSipkdArPayment.nama,
                          EisSipkdArPayment.level_id.label('level_id'),
                          literal_column('0').label('anggaran'),
                          func.sum(EisSipkdArPayment.jumlah).label('realisasi')).\
                      group_by(EisSipkdArPayment.kode,
                          EisSipkdArPayment.nama,
                          EisSipkdArPayment.level_id,).\
                      filter(EisSipkdArPayment.tanggal.\
                          between(date_from_str('01-01-'+tahun), datetime.now()))
                                    
        ########################################################################
        aap_qry = ang_qry.filter(EisSipkdAnggaran.kode.like('5.%'))
        rap_qry = EisDBSession.query(EisSipkdApPayment.kode,
                          EisSipkdApPayment.nama,
                          EisSipkdApPayment.level_id,
                          literal_column('0').label('anggaran'),
                          func.sum(EisSipkdApPayment.jumlah).label('realisasi')).\
                      group_by(EisSipkdApPayment.kode,
                          EisSipkdApPayment.nama,
                          EisSipkdApPayment.level_id).\
                      filter(EisSipkdApPayment.tanggal.between(
                          date_from_str('01-01-'+tahun), datetime.now())).\
                      order_by(EisSipkdApPayment.kode)
                  
        ########################################################################
        apb_qry = ang_qry.filter(EisSipkdAnggaran.kode.like('6.%'))
        rpb_qry = EisDBSession.query(EisSipkdPbPayment.kode,
                          EisSipkdPbPayment.nama,
                          EisSipkdPbPayment.level_id,
                          literal_column('0').label('anggaran'),
                          func.sum(EisSipkdPbPayment.jumlah).label('realisasi')).\
                      group_by(EisSipkdPbPayment.kode,
                          EisSipkdPbPayment.nama,
                          EisSipkdPbPayment.level_id).\
                      filter(EisSipkdPbPayment.tanggal.between(
                          date_from_str('01-01-'+tahun), datetime.now())).\
                      order_by(EisSipkdPbPayment.kode)
        ########################################################################
                  
        if kode:
            level_id = kode.count('.')+2
            title = 'nama' in params and params['nama'] or ''
            aar_qry = aar_qry.filter(EisSipkdAnggaran.kode.like(kode+'%'),)
            rar_qry = rar_qry.filter(EisSipkdArPayment.kode.like(kode+'%'),)
            aap_qry = aap_qry.filter(EisSipkdAnggaran.kode.like(kode+'%'),)
            rap_qry = rap_qry.filter(EisSipkdApPayment.kode.like(kode+'%'),)
            apb_qry = apb_qry.filter(EisSipkdAnggaran.kode.like(kode+'%'),)
            rpb_qry = rpb_qry.filter(EisSipkdPbPayment.kode.like(kode+'%'),)
        else:
            level_id = 2
            title = "RINGKASAN REALISASI APBD"
        print("***************************************************************")
        print(kode, aar_qry)
        ########################################################################
        aar_qry = aar_qry.filter(EisSipkdAnggaran.level_id <= level_id,
                          EisSipkdAnggaran.level_id > level_id-2,)
        rar_qry = rar_qry.filter(EisSipkdArPayment.level_id <= level_id,
                          EisSipkdArPayment.level_id > level_id-2,)
        uar_qry = union(aar_qry, rar_qry).alias('uar_qry')
        ar_qry = EisDBSession.query(uar_qry.c.kode,uar_qry.c.nama,
                                   uar_qry.c.level_id,
                                   func.sum(uar_qry.c.anggaran).label('anggaran'),
                                   func.sum(uar_qry.c.realisasi).label('realisasi'),).\
                             group_by(uar_qry.c.kode,uar_qry.c.nama, 
                                      uar_qry.c.level_id,).\
                             order_by(uar_qry.c.kode)
                                   
        ########################################################################
        aap_qry = aap_qry.filter(EisSipkdAnggaran.level_id <= level_id,
                                EisSipkdAnggaran.level_id > level_id-2,)
        rap_qry = rap_qry.filter(EisSipkdApPayment.level_id <= level_id,
                                EisSipkdApPayment.level_id > level_id-2,) 
        uap_qry = union(aap_qry, rap_qry).alias('uap_qry')
        ap_qry = EisDBSession.query(uap_qry.c.kode, uap_qry.c.nama,
                                   uap_qry.c.level_id,
                                   func.sum(uap_qry.c.anggaran).label('anggaran'),
                                   func.sum(uap_qry.c.realisasi).label('realisasi'),).\
                             group_by(uap_qry.c.kode,uap_qry.c.nama, 
                                      uap_qry.c.level_id,).\
                             order_by(uap_qry.c.kode)
       
        ########################################################################
        apb_qry = apb_qry.filter(EisSipkdAnggaran.level_id <= level_id,
                                EisSipkdAnggaran.level_id > level_id-2,)
        rpb_qry = rpb_qry.filter(EisSipkdPbPayment.level_id <= level_id,
                                EisSipkdPbPayment.level_id > level_id-2,)
        upb_qry = union(apb_qry, rpb_qry).alias('upb_qry')
        pb_qry = EisDBSession.query(upb_qry.c.kode, 
                                   upb_qry.c.nama,
                                   upb_qry.c.level_id,
                                   func.sum(upb_qry.c.anggaran).label('anggaran'),
                                   func.sum(upb_qry.c.realisasi).label('realisasi'),).\
                             group_by(upb_qry.c.kode,
                                      upb_qry.c.nama, 
                                      upb_qry.c.level_id,).\
                             order_by(upb_qry.c.kode)
            
        ########################################################################
        jml_ar = dict(anggaran = 0,
                      realisasi = 0)
        jml_ap = dict(anggaran = 0,
                      realisasi = 0)
        jml_pb = dict(anggaran = 0,
                      realisasi = 0)
                      
        ar_rows = row2dict(ar_qry.all())
        ap_rows = row2dict(ap_qry.all())
        pb_rows = row2dict(pb_qry.all())
        
        for row in ar_rows:
            if row['level_id'] == level_id:
                jml_ar['anggaran'] += row['anggaran']
                jml_ar['realisasi'] += row['realisasi']
                
        for row in ap_rows:
            if row['level_id'] == level_id:
                jml_ap['anggaran'] += row['anggaran']
                jml_ap['realisasi'] += row['realisasi']
                
        for row in pb_rows:
            if row['level_id'] == 1:
                jml_pb['anggaran'] += row['anggaran']
                jml_pb['realisasi'] += row['realisasi']
                
        return dict(ar_rows = ar_rows, ap_rows = ap_rows, pb_rows = pb_rows,
                    sd_row  = dict(anggaran = jml_ar['anggaran']-jml_ap['anggaran'],
                                   realisasi = jml_ar['realisasi']-jml_ap['realisasi'],),
                    title   = title, kode=kode, level_id=level_id, )

    @view_config(route_name='eis-sipkd-kinerja-act', renderer='json')
    def view_app_act(self):
        pass
        
def row2dict(rows):
    return [dict(zip(row.keys(), list(row))) for row in rows]