__init__.py 9.12 KB
import locale
import logging
from datetime import datetime, timedelta
from sqlite3 import Date

from tangsel.base.views import base_views
from tangsel.tools.pbb import FixDati2, pbb_pemda
from pyramid.view import (view_config, )
from sqlalchemy import func, and_

from ..models import PbbmDBSession, PembayaranSppt, Kecamatan, Kelurahan, Sppt
from tangsel.base.models import UserArea, ResDesa, UserGroup, Group
from ..tools import BUKUS, date_from_str, ymd, dmy
from tangsel.base.views.base_views import ColumnDT, DataTables
from deform.form import Button
from pyramid.i18n import TranslationStringFactory
_ = TranslationStringFactory('button')
log = logging.getLogger(__name__)


class BaseView(base_views.BaseView):
    def __init__(self, request):
        super(BaseView, self).__init__(request)
        log.debug(f"Tahun: {self.ses['tahun']}")

        pemda = self.settings.get('pbb_pemda', '36.76')
        self.pemda = FixDati2(pemda)
        
        # Manage session wilayah for filtering
        self.kd_kelurahan = self.ses.get('kd_kelurahan', '000')
        self.kd_kelurahan = self.params.get('kd_kelurahan', self.kd_kelurahan)
        self.kd_kecamatan = self.ses.get('kd_kecamatan', '000')
        self.kd_kecamatan = self.params.get('kd_kecamatan', self.kd_kecamatan)

        # Kelurahan di reset kalau kode kecamatan berubah
        if self.ses.get('kd_kecamatan') != self.kd_kecamatan:
            self.kd_kelurahan = '000'
        self.ses['kd_kecamatan'] = self.kd_kecamatan
        self.ses['kd_kelurahan'] = self.kd_kelurahan

        # Manage Session Buku
        self.buku = self.ses.get('buku', '15')
        self.buku = self.params.get('buku', self.buku)
        self.ses['buku'] = self.buku

        # Magage Date Range
        self.now = datetime.now()
        self.awal = None
        self.akhir = None
        self.dt_awal = None
        self.dt_akhir = None
        
        now = datetime.now()
        if log.isEnabledFor(logging.DEBUG):
            self.ses["tahun"] = 2015
            now = date_from_str(f'{self.ses["tahun"]}-10-11')
        awal = self.ses.get('awal', dmy(now))
        self.awal = self.ses.get('awal', dmy(now))
        self.awal = self.params.get('awal', self.awal)
        try:
            self.dt_awal = date_from_str(self.awal)
        except ValueError:
            self.dt_awal = now
            self.awal = dmy(now)

        self.ses["awal"] = self.awal
        self.ses["dt_awal"] = self.dt_awal

        self.akhir = self.ses.get('akhir', dmy(now))
        self.akhir = self.params.get('akhir', self.awal)
        try:
            self.dt_akhir = date_from_str(self.akhir)
        except ValueError:
            self.dt_akhir = now
            self.akhir = dmy(now)
        self.ses["akhir"] = self.akhir
        self.ses["dt_akhir"] = self.dt_akhir


    def filter_area(self, qry):
        if self.ses['kd_kecamatan'] != '000':
            qry = qry.filter_by(kd_kecamatan=self.ses['kd_kecamatan'])
        if self.ses['kd_kelurahan'] != '000':
            qry = qry.filter_by(kd_kelurahan=self.ses['kd_kelurahan'])
        return qry

    def filter_number(self, qry):
        row = self.filter_area(qry).first()
        return (row.bayar or 0), (row.denda or 0)

    def filtered(self, qry):
        bayar, denda = self.filter_number(qry)
        result = bayar #- denda
        return result


class HomeView(BaseView):
    ########                    
    # List #
    ########    
    @view_config(route_name='pbbm', renderer='templates/home.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,
                    bukus=BUKUS)

    @view_config(route_name='pbbm-act', renderer='json',
                 permission='pbb-monitoring')
    def view_act(self):
        query = PbbmDBSession.query(func.sum(PembayaranSppt.jml_sppt_yg_dibayar).label('bayar'),
                                    func.sum(PembayaranSppt.denda_sppt).label('denda'))
        amt_tahun = amt_bulan = amt_minggu = amt_hari = amt_ketetapan = 0
        amt_realisasi = amt_piutang = amt_denda = 0
        # now = datetime.now()
        tgl = ymd(self.now)
        akhir = date_from_str(tgl)

        # hitung ketetapan tahun berjalan
        qry = PbbmDBSession.query(func.sum(Sppt.pbb_yg_harus_dibayar_sppt).label('ketetapan')). \
            filter(Sppt.thn_pajak_sppt == tgl[:4],
                   Sppt.status_pembayaran_sppt != '2')
        row = self.filter_area(qry).first()
        amt_ketetapan = row.ketetapan or 0
        amt_ketetapan = locale.format_string("%d", amt_ketetapan, grouping=True)

        awal = date_from_str("%s-01-01" % tgl[:4])

        # hitung realisasi tahun pajak berjalan
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt.between(awal, akhir),
                           PembayaranSppt.thn_pajak_sppt == tgl[:4])
        amt_realisasi = self.filtered(qry)

        # hitung realisasi piutang tahun pajak lalu
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt.between(awal, akhir),
                           PembayaranSppt.thn_pajak_sppt < tgl[:4])
        amt_piutang = self.filtered(qry)

        # hitung realisasi denda
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt.between(awal, akhir))
        bayar, denda = self.filter_number(qry)
        amt_denda = denda

        # hitung realisasi tahunan
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt.between(awal, akhir))
        amt_tahun = self.filtered(qry)

        # hitung realisasi bulanan
        awal = date_from_str("%s-01" % tgl[:7])
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt.between(awal, akhir))
        amt_bulan = self.filtered(qry)
        # hitung realisasi harian
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt == akhir)
        amt_hari = self.filtered(qry)
        # hitung minggu
        awal = akhir - timedelta(days=akhir.isoweekday())
        qry = query.filter(PembayaranSppt.tgl_pembayaran_sppt.between(awal, akhir))
        amt_minggu = self.filtered(qry)

        return dict(success=True,
                    tahun=amt_tahun,
                    bulan=amt_bulan,
                    minggu=amt_minggu,
                    hari=amt_hari,
                    ketetapan=amt_ketetapan,
                    realisasi=amt_realisasi,
                    piutang=amt_piutang,
                    denda=amt_denda)


btn_tambah = Button('add', title=_('Tambah'), css_class="btn-success")
btn_tutup = Button('close', title=_('Tutup'), css_class="btn-danger")