sejarah.py 10.8 KB
import colander
from deform import (
    widget,
)
from pyramid.view import (
    view_config,
)
from sqlalchemy import func, and_, literal_column, case

from ..models import (
    Kecamatan,
    Kelurahan,
    Sppt,
    PembayaranSppt, 
    DatObjekPajak, DatSubjekPajak
)
from ..models import PbbmDBSession
from ..tools import FixNop, FixKelurahan
from ..views import (BaseView, ColumnDT, DataTables)
from tangsel.base.models import UserArea, ResDesa
from tangsel.base.widgets.widget_os import BlokKavNoWidget


class AddSchema(colander.Schema):
    jalan_op = colander.SchemaNode(
        colander.String(),
        widget=widget.TextInputWidget(readonly=True),
        oid="jalan_op",
        missing=colander.drop,
        title="Alamat OP",
    )
    rt_op = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        title="RT OP")
    rw_op = colander.SchemaNode(
        colander.String(),
        widget=widget.TextInputWidget(readonly=True),
        missing=colander.drop,
        title="RW OP")
    # blok_kav_no_op = colander.SchemaNode(
    #     colander.String(),
    #     widget=widget.TextInputWidget(readonly=True),
    #     missing=colander.drop,
    #     title="Blok OP")
    
    blok_kav_no = colander.SchemaNode(
        colander.String(),
        widget=BlokKavNoWidget(readonly=True),
        missing=colander.drop,
        oid="blok_kav_no",
        title="Blok RT RW")
    kelurahan = colander.SchemaNode(
        colander.String(),
        widget=widget.TextInputWidget(readonly=True),
        missing=colander.drop,
        title="Kelurahan/Desa")
    kecamatan = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        oid="kecamatan")
    nm_wp = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        oid="nm_wp", 
        title="Nama WP",
        )
    
    subjek_pajak_id = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        oid="subjek_pajak_id", 
        title="NIK",
        )
    
    jalan_wp = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        oid="jalan_wp",
        title="Alamat WP"
        )
    
    blok_kav_nowp = colander.SchemaNode(
        colander.String(),
        widget=BlokKavNoWidget(readonly=True),
        missing=colander.drop,
        oid="blok_kav_nowp",
        title="Blok RT RW")
    
    # rt_wp = colander.SchemaNode(
    #     colander.String(),
    #     missing=colander.drop,
    #     widget=widget.TextInputWidget(readonly=True),
    #     oid="rt_wp",
    #     title="RT WP",
    #     )
    # rw_wp = colander.SchemaNode(
    #     colander.String(),
    #     missing=colander.drop,
    #     widget=widget.TextInputWidget(readonly=True),
    #     oid="rw_wp",
    #     title="RW WP",
    #     )
    # blok_kav_no_wp = colander.SchemaNode(
    #     colander.String(),
    #     missing=colander.drop,
    #     widget=widget.TextInputWidget(readonly=True),
    #     oid="blok_kav_no_wp",
    #     title="Blok WP"
    #     )
    kelurahan_wp = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        oid="kelurahan_wp",
        title="Kelurahan/Desa WP",
        )
    kota_wp = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextInputWidget(readonly=True),
        oid="kota_wp",
        title="Kota WP",
        )


#
# def get_form(request, class_form):
#     schema = class_form()
#     # schema = schema.bind()
#     schema.request = request
#     return Form(schema)  # , buttons=('batal')
#
#
# ########
# # View #
# ########

# def id_not_found(request):
#     msg = 'NOP %s not found.' % request.params['nop']
#     request.session.flash(msg, 'error')
#     return route_list(request)


class view(BaseView):
    def query_id(self):
        data = []
        return  DatObjekPajak.query_id(id=self.req.params['nop'])

    @view_config(route_name='pbbm-sejarah', renderer='templates/list_sejarah.pt',
                 permission='pbb-monitoring')
    def view_edit(self):
        request = self.req
        params = request.params
        form = self.get_form(AddSchema)
        nop = ""
        e = colander.Invalid(form, "Error message on Form")
        error = {}
        if request.POST:
            controls = request.POST.items()
            values = {}
            row = None
            if 'nop' in params and params['nop']:
                row = self.query_id().first()
                nop = params['nop']
                
            if row:
                desa = FixKelurahan(nop)
                user = UserArea.allow_area(self.req.user.id, desa.get_raw_dotted())
                if not user:
                    self.ses.flash("Anda tidak punya akses melihat NOP ini !!", 'error')
                else:
                    values = row.to_dict()
                    qry = PbbmDBSession.query(Kelurahan.nm_kelurahan, Kecamatan.nm_kecamatan). \
                        join(Kecamatan, and_(
                        Kelurahan.kd_propinsi == Kecamatan.kd_propinsi,
                        Kelurahan.kd_dati2 == Kecamatan.kd_dati2,
                        Kelurahan.kd_kecamatan == Kecamatan.kd_kecamatan,
                    )). \
                        filter(
                        row.kd_propinsi == Kelurahan.kd_propinsi,
                        row.kd_dati2 == Kelurahan.kd_dati2,
                        row.kd_kecamatan == Kelurahan.kd_kecamatan,
                        row.kd_kelurahan == Kelurahan.kd_kelurahan,
                    ).first()
                    values['kelurahan'] = qry.nm_kelurahan
                    values['kecamatan'] = qry.nm_kecamatan
                    values['blok_kav_no_op'] = row.blok_kav_no_op and row.blok_kav_no_op or ""
                    values['blok_kav_no'] = '|'.join([values['blok_kav_no_op'], row.rt_op, row.rw_op])
                    
                    wp = DatSubjekPajak.query_id(row.subjek_pajak_id).first()
                    values['nm_wp'] = wp.nm_wp
                    values['subjek_pajak_id'] = wp.subjek_pajak_id
                    values['jalan_wp'] = wp.jalan_wp
                    
                    values['rt_wp'] = wp.rt_wp and wp.rt_wp or "000"
                    values['rw_wp'] = wp.rw_wp and wp.rw_wp or "00"
                    values['blok_kav_no_wp'] = wp.blok_kav_no_wp and wp.blok_kav_no_wp or ""
                    values['blok_kav_nowp'] = '|'.join([values['blok_kav_no_wp'],
                                                         values['rt_wp'], values['rw_wp']])
                    values['kelurahan_wp'] = wp.kelurahan_wp and wp.kelurahan_wp or ""
                    values['kota_wp'] = wp.kota_wp and wp.kota_wp or ""
            else:
                self.ses.flash("Data Tidak Ditemukan", 'error')
            form.set_appstruct(values)
        return dict(form=form, nop=nop)

    ##########
    # Action #
    ##########    
    @view_config(route_name='pbbm-sejarah-act', renderer='json',
                 permission='pbb-monitoring')
    def view_act(self):
        req = self.req
        params = req.params
        url_dict = req.matchdict
        if url_dict['act'] == 'grid':
            columns = [
                ColumnDT(Sppt.thn_pajak_sppt, mData='tahun'),
                ColumnDT(Sppt.nm_wp_sppt, mData='nama'),
                ColumnDT(Sppt.jln_wp_sppt, mData='alamat'),
                ColumnDT(func.max(Sppt.tgl_jatuh_tempo_sppt), mData='tgl_jatuhtempo'),
                ColumnDT(Sppt.pbb_yg_harus_dibayar_sppt, mData='pokok'),
                ColumnDT(func.coalesce(
                    func.sum(PembayaranSppt.jml_sppt_yg_dibayar), 0).label("bayar"),
                    mData='bayar', global_search=False),
                ColumnDT(func.coalesce(func.sum(PembayaranSppt.denda_sppt), 0).label("denda"), mData='denda',
                         global_search=False),
                ColumnDT(literal_column("'0'").label("total"), mData='total', global_search=False),
                ColumnDT(func.max(PembayaranSppt.tgl_pembayaran_sppt), mData='tgl_bayar'),       
                # case([(orderline.c.qty <= 0, 0)], else_=item.c.regularprice),
                ColumnDT((case((Sppt.pbb_yg_harus_dibayar_sppt - 
                    func.coalesce(func.sum(PembayaranSppt.jml_sppt_yg_dibayar), 0) <= 0, 0), 
                               else_=Sppt.pbb_yg_harus_dibayar_sppt - 
                    func.coalesce(func.sum(PembayaranSppt.jml_sppt_yg_dibayar), 0))). \
                    label('piutang'), mData='piutang', global_search=False),
            ]
            nop = FixNop(params['nop'])
            desa = FixKelurahan(params['nop'])
            user = UserArea.allow_area(self.req.user.id, '', desa.get_raw_dotted())
            if not user:
                nop = FixNop('00.00.000.000.000.0000.0')
            query = PbbmDBSession.query().select_from(Sppt).order_by(Sppt.thn_pajak_sppt.desc()). \
                outerjoin(PembayaranSppt,
                          and_(
                              Sppt.kd_propinsi == PembayaranSppt.kd_propinsi,
                              Sppt.kd_dati2 == PembayaranSppt.kd_dati2,
                              Sppt.kd_kecamatan == PembayaranSppt.kd_kecamatan,
                              Sppt.kd_kelurahan == PembayaranSppt.kd_kelurahan,
                              Sppt.kd_blok == PembayaranSppt.kd_blok,
                              Sppt.no_urut == PembayaranSppt.no_urut,
                              Sppt.kd_jns_op == PembayaranSppt.kd_jns_op,
                              Sppt.thn_pajak_sppt == PembayaranSppt.thn_pajak_sppt,
                          )). \
                group_by(Sppt.thn_pajak_sppt, Sppt.nm_wp_sppt,
                         Sppt.jln_wp_sppt, Sppt.pbb_yg_harus_dibayar_sppt). \
                filter(Sppt.kd_propinsi == nop['kd_propinsi'],
                       Sppt.kd_dati2 == nop['kd_dati2'],
                       Sppt.kd_kecamatan == nop['kd_kecamatan'],
                       Sppt.kd_kelurahan == nop['kd_kelurahan'],
                       Sppt.kd_blok == nop['kd_blok'],
                       Sppt.no_urut == nop['no_urut'],
                       Sppt.kd_jns_op == nop['kd_jns_op'], 
                       Sppt.status_pembayaran_sppt !="2")
            row_table = DataTables(req.GET, query, columns)
            return row_table.output_result()