realisasi.py 8.62 KB
from sqlalchemy import func
from ..tools import date_from_str #, row2dict
from pyramid.view import (
    view_config,
    )
from ..models import EisDBSession, EisSipkdArPayment, EisSipkdApPayment, EisSipkdPbPayment
from ..views import BaseView    
from datetime import datetime
########
# APP Home #
########
class Realisasi(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-sipkd-realisasi', renderer='templates/realisasi.pt',
                 permission='eis-sipkd-realisasi')
    def view_app(self):
        tahun = self.ses['tahun']
        params = self.params
        kode = 'kode' in params and params['kode'] or ''
        
        ar_qry = EisDBSession.query(EisSipkdArPayment.rekening_kd,
                                  EisSipkdArPayment.rekening_nm,
                                  EisSipkdArPayment.level_id,
                                  func.sum(EisSipkdArPayment.jumlah).label('jumlah')).\
                  group_by(EisSipkdArPayment.rekening_kd,
                           EisSipkdArPayment.rekening_nm,
                           EisSipkdArPayment.level_id,
                           ).\
                  filter(EisSipkdArPayment.tanggal.between(
                           date_from_str('01-01-'+tahun), datetime.now())
                        ).\
                  order_by(EisSipkdArPayment.rekening_kd)
                                    
        ap_qry = EisDBSession.query(EisSipkdApPayment.rekening_kd,
                                  EisSipkdApPayment.rekening_nm,
                                  EisSipkdApPayment.level_id,
                                  func.sum(EisSipkdApPayment.jumlah).label('jumlah')).\
                  group_by(EisSipkdApPayment.rekening_kd,
                           EisSipkdApPayment.rekening_nm,
                           EisSipkdApPayment.level_id).\
                  filter(EisSipkdApPayment.tanggal.between(
                           date_from_str('01-01-'+tahun), datetime.now())
                        ).\
                  order_by(EisSipkdApPayment.rekening_kd)
                  
        pb_qry = EisDBSession.query(EisSipkdPbPayment.rekening_kd,
                                  EisSipkdPbPayment.rekening_nm,
                                  EisSipkdPbPayment.level_id,
                                  func.sum(EisSipkdPbPayment.jumlah).label('jumlah')).\
                  group_by(EisSipkdPbPayment.rekening_kd,
                           EisSipkdPbPayment.rekening_nm,
                           EisSipkdPbPayment.level_id).\
                  filter(EisSipkdPbPayment.tanggal.between(
                           date_from_str('01-01-'+tahun), datetime.now())
                        ).\
                  order_by(EisSipkdPbPayment.rekening_kd)
                  
        level_id = 2
        if not kode:
           ar_qry = ar_qry.filter(EisSipkdArPayment.level_id <= level_id,
                                    EisSipkdArPayment.level_id > level_id-2,)
           ap_qry = ap_qry.filter(EisSipkdApPayment.level_id <= level_id,
                                    EisSipkdApPayment.level_id > level_id-2,)
           pb_qry = pb_qry.filter(EisSipkdPbPayment.level_id <= level_id,
                                    EisSipkdPbPayment.level_id > level_id-2,)
           title = "RINGKASAN REALISASI APBD"
        else:
           level_id = kode.count('.')+2
           ar_qry = ar_qry.filter(EisSipkdArPayment.rekening_kd.like(kode+'%'),
                                    EisSipkdArPayment.level_id <= level_id,
                                    EisSipkdArPayment.level_id > level_id-1,
                                    )
           ap_qry = ap_qry.filter(EisSipkdApPayment.rekening_kd.like(kode+'%'),
                                    EisSipkdApPayment.level_id <= level_id,
                                    EisSipkdApPayment.level_id > level_id-1,
                                    )
           pb_qry = pb_qry.filter(EisSipkdPbPayment.rekening_kd.like(kode+'%'),
                                    EisSipkdPbPayment.level_id <= level_id,
                                    EisSipkdPbPayment.level_id > level_id-1,
                                    )
           title = 'nama' in params and params['nama'] or ''
        jml_ar = jml_ap = jml_pb = 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 += row['jumlah']
        for row in ap_rows:
            if row['level_id'] == level_id:
                jml_ap += row['jumlah']
        
        for row in pb_rows:
            if row['level_id'] == 1:
                jml_pb += row['jumlah']
        
        return dict(ar_rows = ar_rows, 
                    ap_rows = ap_rows, 
                    pb_rows = pb_rows,
                    sd_row  = jml_ar-jml_ap, 
                    sk_row  = jml_ar-jml_ap + jml_pb,
                    title   = title, kode=kode,
                    level_id=level_id, 
                    )

    @view_config(route_name='eis-sipkd-realisasi-act', renderer='json')
    def view_app_act(self):
        tahun = self.ses['tahun']
        req    =  self.req
        params =  req.params
        id = 'id' in params and params['id'] or 0
        json_data = {}
        json_data['success']=False
        
        if req.matchdict['act']=='grid':
            rows = EisDBSession.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 = EisDBSession.query(Chart).filter(Chart.id==id).first()
            if not rows:
                return json_data
            
            json_data['label'] = rows.label.split(',')
            rows = EisDBSession.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 = EisDBSession.query(Chart).filter(Chart.id==id).first()
            if not rows:
                return json_data
            
            json_data['label'] = rows.label.split(',')
            rows = EisDBSession.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

def row2dict(rows):
    return [dict(zip(row.keys(), list(row))) for row in rows]