pelayanan.py 7.81 KB
from datetime import datetime
import logging
from tangsel.pbb.monitoring.models.pelayanan import PstDetail, PstPermohonan
from pyramid.view import (view_config)
from ..models import (
    PbbmDBSession, Kecamatan, Kelurahan, PstDetail, JenisPelayanan, LookupItem)
from . import ColumnDT, DataTables, BaseView
from tangsel.base.models import UserArea
from sqlalchemy import func, and_

log = logging.getLogger(__name__)


class View(BaseView):
    def __init__(self, request):
        super().__init__(request)
        self.table = PstDetail

    ########
    # List #
    ########
    @view_config(route_name='pbbm-pelayanan', renderer='templates/list_pelayanan.pt',
                 permission='pbb-monitoring')
    def view_list(self):
        kecamatan = self.ses['kd_kecamatan']
        kelurahan = self.ses['kd_kelurahan']

        data_awal = UserArea.user_desa(self.req.user.id).all()

        if data_awal:
            kdkec = tuple(k.kode[6:9]
                          for k in data_awal if hasattr(k, 'kode') and k.kode)
            kdkel = tuple(k.kode[10:13]
                          for k in data_awal if hasattr(k, 'kode') and k.kode)
            iddesa = tuple(k.desa_id for k in data_awal if hasattr(
                k, 'desa_id') and k.desa_id)

            if hasattr(data_awal[0], 'group_name') and data_awal[0].group_name in ('PBBM UPT'):
                kecamatans = Kecamatan.query(). \
                    filter(Kecamatan.kd_kecamatan.in_(kdkec)). \
                    order_by('kd_kecamatan').all()

                kelurahans = Kelurahan.query(). \
                    filter(Kelurahan.kd_kecamatan == kecamatan). \
                    order_by('kd_kecamatan', 'kd_kelurahan').all()

            elif hasattr(data_awal[0], 'group_name') and data_awal[0].group_name in ('PBBM Kecamatan'):
                self.ses['kd_kecamatan'] = kdkec[0]
                kecamatans = Kecamatan.query(). \
                    filter(Kecamatan.kd_kecamatan.in_(kdkec)). \
                    order_by('kd_kecamatan').all()

                kelurahans = Kelurahan.query(). \
                    filter(Kelurahan.kd_kecamatan.in_(kdkec)). \
                    order_by('kd_kecamatan', 'kd_kelurahan').all()
            else:
                user = UserArea.allow_area(self.req.user.id, iddesa)
                if user:
                    kecamatan = kdkec
                    self.ses['kd_kecamatan'] = kdkec[0]
                    kelurahan = kdkel
                    self.ses['kd_kelurahan'] = kdkel[0]

                    kecamatans = Kecamatan.query(). \
                        filter(Kecamatan.kd_kecamatan.in_(kecamatan)). \
                        order_by('kd_kecamatan').all()
                    kelurahans = Kelurahan.query(). \
                        filter(and_(Kelurahan.kd_kecamatan.in_(kecamatan), Kelurahan.kd_kelurahan.in_(kelurahan))). \
                        order_by('kd_kecamatan', 'kd_kelurahan').all()
        else:
            kecamatans = Kecamatan.query().order_by('kd_kecamatan').all()
            kelurahans = Kelurahan.query(). \
                filter_by(kd_kecamatan=self.ses['kd_kecamatan']). \
                order_by('kd_kelurahan').all()

        return dict(project=self.req.app_name,
                    kecamatans=kecamatans,
                    kelurahans=kelurahans,
                    tahun=datetime.now().year)

    def query_nop(self):
        """Helper function to format NOP in the query."""
        return func.concat(
            self.table.kd_propinsi_pemohon,
            func.concat(
                self.table.kd_dati2_pemohon,
                func.concat(
                    self.table.kd_kecamatan_pemohon,
                    func.concat(
                        self.table.kd_kelurahan_pemohon,
                        func.concat(
                            self.table.kd_blok_pemohon,
                            func.concat(
                                self.table.no_urut_pemohon,
                                self.table.kd_jns_op_pemohon)
                        )
                    )
                )
            )
        ).label('nop')
    ##########
    # Action #
    ##########

    @view_config(route_name='pbbm-pelayanan-act', renderer='json',
                 permission='pbb-monitoring')
    def view_act(self):
        request = self.req
        ses = request.session
        url_dict = request.matchdict
        if url_dict['act'] == 'grid':
            columns = [
                ColumnDT(PstPermohonan.tgl_terima_dokumen_wp, mData='tanggal'),
                ColumnDT(PstPermohonan.thn_pelayanan, mData='tahun'),
                ColumnDT(PstPermohonan.bundel_pelayanan, mData='bundel'),
                ColumnDT(PstPermohonan.no_urut_pelayanan, mData='urut'),
                ColumnDT(PstPermohonan.nama_pemohon, mData='nama'),
                ColumnDT(self.query_nop(), mData="nop"),
                ColumnDT(self.table.thn_pajak_permohonan, mData='tahun'),
                ColumnDT(self.table.catatan_penyerahan,
                         mData='catatan_penyerahan'),
                ColumnDT(LookupItem.nm_lookup_item, mData='status_selesai'),
                # 0 proses 1 selesai 2 diserahkan -1 pending
                ColumnDT(self.table.tgl_selesai, mData='tgl_selesai'),
                ColumnDT(self.table.kd_seksi_berkas,
                         mData='kd_seksi_berkas'),
                ColumnDT(self.table.tgl_penyerahan,
                         mData='tgl_penyerahan'),
                ColumnDT(self.table.nip_penyerah,
                         mData='nip_penyerah'),
                ColumnDT(JenisPelayanan.nm_jenis_pelayanan,
                         mData='jns_pelayanan'),

            ]
            query = PbbmDBSession.query().select_from(self.table) \
                .outerjoin(PstPermohonan, and_(
                    self.table.bundel_pelayanan == PstPermohonan.bundel_pelayanan,
                    self.table.no_urut_pelayanan == PstPermohonan.no_urut_pelayanan,
                    self.table.thn_pelayanan == PstPermohonan.thn_pelayanan,))\
                .outerjoin(
                    JenisPelayanan,
                    self.table.kd_jns_pelayanan == JenisPelayanan.kd_jns_pelayanan)\
                .outerjoin(LookupItem, and_(
                    self.table.status_selesai == LookupItem.kd_lookup_item,
                    LookupItem.kd_lookup_group == '06'))
            if ses['kd_kecamatan'] != '000':
                query = query.filter(
                    self.table.kd_kecamatan_pemohon == ses['kd_kecamatan'])
            if ses['kd_kelurahan'] != '000':
                query = query.filter(
                    self.table.kd_kelurahan_pemohon == ses['kd_kelurahan'])
            if str(ses['tahun']) != '0000':
                query = query.filter(self.table.thn_pelayanan == ses['tahun'])

            query = query.filter(self.table.thn_pelayanan==self.ses.get("tahun"))\
                .order_by(
                self.table.kd_propinsi_pemohon,
                self.table.kd_dati2_pemohon,
                self.table.kd_kecamatan_pemohon,
                self.table.kd_kelurahan_pemohon,
                self.table.kd_blok_pemohon,
                self.table.no_urut_pemohon,
                self.table.kd_jns_op_pemohon,
                self.table.thn_pajak_permohonan,
                self.table.kd_jns_pelayanan,)
            if self.ses.get('kelurahan') != '000':
                query = query.filter(
                    self.table.kd_kelurahan_pemohon == self.ses['kd_kelurahan'])
            if self.ses.get('kecamatan') != '000':
                query = query.filter(
                    self.table.kd_kecamatan_pemohon == self.ses['kd_kecamatan'])

            row_table = DataTables(request.GET, query, columns)
            return row_table.output_result()