eis.py 7.2 KB
import json
from pyramid.view import (
    view_config,
    )
from pyramid.httpexceptions import (
    HTTPFound,
    )
from ..views import BaseView
from ..models import EisDBSession
from ..models.eis import Eis, Chart, ChartItem, Slide
from datatables import ColumnDT, DataTables
from sqlalchemy import not_, func, literal_column, and_, or_, String
from sqlalchemy.sql.expression import cast
#from ..tools import row2dict
########
# APP Home #
########
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 = EisDBSession.query(Slide).filter(Slide.status==1).order_by(Slide.order_id) or {}
            
        tab_datas = EisDBSession.query(Slide).filter(Slide.source_type=='grid').order_by(Slide.order_id) or {}
        line_datas = EisDBSession.query(Slide).filter(Slide.source_type=='chart-line').order_by(Slide.order_id)or {}
        bar_datas = EisDBSession.query(Slide).filter(Slide.source_type=='chart-bar').order_by(Slide.order_id)or {}
        pie_datas = EisDBSession.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
        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


        elif req.matchdict['act']=='dasboard':
            columns = [
              ColumnDT(subq.nama, mData="jenis_pajak"),
              ColumnDT(subq.target, mData="target"),
              ColumnDT(subq.amt_bulan, mData="realisasi_bulan_ini"),
              ColumnDT(subq.amt_tahun, mData="realisasi_sampai_dengan"),
              ColumnDT(subq.sisa_target, mData="sisa_target"),
              ColumnDT(subq.persen, mData="persen"),
            ]
            max_tahun = EisDBSession.query(func.max(Eis.tahun)).scalar()
            subq = EisDBSession.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(Eis.amt_tahun - 
                        (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('sisa_target'),
                    (func.sum((Eis.amt_tahun - 
                        (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)*100).label('persen')).\
                    join(ChartItem, func.trim(ChartItem.rekening_kd)==func.trim(Eis.kode)).\
                    join(Chart, Chart.id == ChartItem.chart_id).\
                    filter(Eis.tahun==max_tahun, Eis.chart_type == 'line').\
                    group_by(Eis.kode,Eis.nama).order_by(Eis.kode)
            query = EisDBSession.query().select_from(subq.subquery())
            rowTable = DataTables(req.GET, query, columns)
            return rowTable.output_result()