dhkp_report.py 10.5 KB
import logging
import os

from tangsel.base import get_params
#from py3o.template import Template
from pyramid.httpexceptions import HTTPNotFound
from pyramid.response import Response
from pyramid.view import (view_config, )
from sqlalchemy import func, and_

from ..models import (Kecamatan, Kelurahan, Sppt)
from ..models import PbbmDBSession
from ..tools import (
    csv_response, dmy, dMy, date_from_str, thousand, BUKUS, odt_export)
from ..views import (BaseView, )

log = logging.getLogger(__name__)


class ViewRpt(BaseView):
    @view_config(route_name='pbbm-dhkp-rpt', renderer='csv')
    def view_csv(self):
        request = self.req
        ses = request.session
        url_dict = request.matchdict
        if url_dict['rpt'] == 'csv':
            query = self.query_reg()
            row = query.first()
            header = row._mapping.keys()
            # header = []
            # for k, v in row:
            #     header.append(k)
            log.debug(header)
            rows = []
            for item in query.all():
                rows.append(list(item))

            filename = 'dhkp_report.csv'
            value = {
                'header': header,
                'rows': rows,
            }
            return csv_response(request, value, filename)

        elif url_dict['rpt'] == 'pdf':
            class Item(object):
                pass

            row = self.query_reg()
            if not row:
                raise HTTPNotFound
                # return id_not_found(request)
            _here = os.path.dirname(__file__)  # get current folder -> views
            path = os.path.dirname(_here)  # mundur 1 level
            path = os.path.join(path, 'reports/')
            jenis = os.path.splitext('dhkp_report.odt')[0]
            tmp = get_params("temp_dir", '/tmp')
            file = os.path.join(tmp, jenis + '_pbbm')
            template = Template(path + jenis + '.odt', file + '.odt')
            documents = list()
            njop_bumi_jml = 0
            njop_bng_jml = 0
            njoptkp_jml = 0
            pbb_terhutang_jml = 0
            sub_njop_bumi_jml = 0
            sub_njop_bng_jml = 0
            sub_njoptkp_jml = 0
            sub_pbb_terhutang_jml = 0
            i_piutang = 0
            i_subtotal = 0
            p_count = row.count()
            for dt in row:
                i_piutang += 1
                i_subtotal += 1
                document = Item()
                document.nop = dt.nop
                document.nm_wp_sppt = dt.nm_wp_sppt
                document.alamat = dt.alamat
                document.kd_kls_tanah = dt.kd_kls_tanah
                document.kd_kls_bng = dt.kd_kls_bng
                document.luas_bumi_sppt = dt.luas_bumi_sppt
                document.luas_bng_sppt = dt.luas_bng_sppt
                document.njop_bumi_sppt = thousand(dt.njop_bumi_sppt)
                document.njop_bng_sppt = thousand(dt.njop_bng_sppt)
                document.njoptkp_sppt = thousand(dt.njoptkp_sppt)
                document.pbb_yg_harus_dibayar_sppt = thousand(dt.pbb_yg_harus_dibayar_sppt)
                document.tgl_jatuh_tempo_sppt = dmy(dt.tgl_jatuh_tempo_sppt)

                njop_bumi_jml = njop_bumi_jml + dt.njop_bumi_sppt
                njop_bng_jml = njop_bng_jml + dt.njop_bng_sppt
                njoptkp_jml = njoptkp_jml + dt.njoptkp_sppt
                pbb_terhutang_jml = pbb_terhutang_jml + dt.pbb_yg_harus_dibayar_sppt

                sub_njop_bumi_jml = sub_njop_bumi_jml + dt.njop_bumi_sppt
                sub_njop_bng_jml = sub_njop_bng_jml + dt.njop_bng_sppt
                sub_njoptkp_jml = sub_njoptkp_jml + dt.njoptkp_sppt
                sub_pbb_terhutang_jml = sub_pbb_terhutang_jml + dt.pbb_yg_harus_dibayar_sppt

                documents.append(document)
                if (i_piutang == 8):
                    document2 = Item()
                    document2.nop = 'SUBTOTAL'
                    document2.nm_wp_sppt = '1'
                    document2.alamat = ''
                    document2.kd_kls_tanah = ''
                    document2.kd_kls_bng = ''
                    document2.luas_bumi_sppt = ''
                    document2.luas_bng_sppt = ''
                    document2.njop_bumi_sppt = thousand(sub_njop_bumi_jml)
                    document2.njop_bng_sppt = thousand(sub_njop_bng_jml)
                    document2.njoptkp_sppt = thousand(sub_njoptkp_jml)
                    document2.pbb_yg_harus_dibayar_sppt = thousand(sub_pbb_terhutang_jml)
                    document2.tgl_jatuh_tempo_sppt = ''
                    documents.append(document2)

                    sub_njop_bumi_jml = 0
                    sub_njop_bng_jml = 0
                    sub_njoptkp_jml = 0
                    sub_pbb_terhutang_jml = 0
                    i_subtotal = 0

                if (i_subtotal != 0 and i_subtotal % 13 == 0):
                    document3 = Item()
                    document3.nop = 'SUBTOTAL'
                    document3.nm_wp_sppt = ''
                    document3.alamat = ''
                    document3.kd_kls_tanah = ''
                    document3.kd_kls_bng = ''
                    document3.luas_bumi_sppt = ''
                    document3.luas_bng_sppt = ''
                    document3.njop_bumi_sppt = thousand(sub_njop_bumi_jml)
                    document3.njop_bng_sppt = thousand(sub_njop_bng_jml)
                    document3.njoptkp_sppt = thousand(sub_njoptkp_jml)
                    document3.pbb_yg_harus_dibayar_sppt = thousand(sub_pbb_terhutang_jml)
                    document3.tgl_jatuh_tempo_sppt = ''
                    documents.append(document3)

                    sub_njop_bumi_jml = 0
                    sub_njop_bng_jml = 0
                    sub_njoptkp_jml = 0
                    sub_pbb_terhutang_jml = 0
                if (p_count > 8 and i_piutang == p_count):
                    document4 = Item()
                    document4.nop = 'SUBTOTAL'
                    document4.nm_wp_sppt = ''
                    document4.alamat = ''
                    document4.kd_kls_tanah = ''
                    document4.kd_kls_bng = ''
                    document4.luas_bumi_sppt = ''
                    document4.luas_bng_sppt = ''
                    document4.njop_bumi_sppt = thousand(sub_njop_bumi_jml)
                    document4.njop_bng_sppt = thousand(sub_njop_bng_jml)
                    document4.njoptkp_sppt = thousand(sub_njoptkp_jml)
                    document4.pbb_yg_harus_dibayar_sppt = thousand(sub_pbb_terhutang_jml)
                    document4.tgl_jatuh_tempo_sppt = ''
                    documents.append(document4)

            item = Item()
            item.company = request.company
            item.departement = request.departement
            item.address = request.address
            item.tahun = request.session['tahun']
            kecamatan_nm = PbbmDBSession.query(Kecamatan.nm_kecamatan).select_from(Kecamatan). \
                filter(Kecamatan.kd_kecamatan == ses['kd_kecamatan']).first()
            kelurahan_nm = PbbmDBSession.query(Kelurahan.nm_kelurahan).select_from(Kelurahan). \
                filter(Kelurahan.kd_kecamatan == ses['kd_kecamatan'], 
                       Kelurahan.kd_kelurahan == ses['kd_kelurahan']).first()
            item.kd_kecamatan = ses['kd_kecamatan']
            item.kd_kelurahan = ses['kd_kelurahan']
            item.kecamatan = kecamatan_nm
            item.kelurahan = kelurahan_nm
            item.tanggal_awal = dMy(date_from_str(request.session['awal']))
            item.tanggal_akhir = dMy(date_from_str(request.session['akhir']))
            item.jmlnjopbumi = thousand(njop_bumi_jml)
            item.jmlnjopbng = thousand(njop_bng_jml)
            item.jmlnjoptkp = thousand(njoptkp_jml)
            item.pbbterhutang = thousand(pbb_terhutang_jml)

            data = {}
            data['documents'] = documents
            data['item'] = item
            # data['document'] = document
            template.render(data)

            ext = 'pdf'
            odt = odt_export(request, file, ext)
            if not odt or (type(odt) is not Response and "error" in odt):
                if odt:
                    self.ses.flash(odt["error"], "error")
                raise HTTPNotFound
                # id_not_found(request)
            return odt

    def query_reg(self):
        # return PbbmDBSession.query(Sppt)
        ses = self.req.session
        buku_min = BUKUS[self.buku][1]
        buku_max = BUKUS[self.buku][2]
        query = PbbmDBSession.query(
            Sppt.nop,
            Sppt.nm_wp_sppt,
            func.concat(Sppt.jln_wp_sppt,
                        func.concat(' ', func.concat(' ', func.concat(
                            Sppt.blok_kav_no_wp_sppt,
                            func.concat(' RT.', func.concat(
                                func.coalesce(Sppt.rt_wp_sppt, '000'),
                                func.concat(' RW.',
                                            func.concat(
                                                func.coalesce(Sppt.rw_wp_sppt, '00'),
                                                func.concat(
                                                    ' ',
                                                    func.concat(
                                                        Sppt.kelurahan_wp_sppt,
                                                        func.concat(
                                                            ' ',
                                                            Sppt.kota_wp_sppt))))))))))).label(
                "alamat"),
            Sppt.kd_kls_tanah,
            Sppt.kd_kls_bng,
            Sppt.luas_bumi_sppt,
            Sppt.luas_bng_sppt,
            Sppt.njop_bng_sppt,
            Sppt.njop_bumi_sppt,
            Sppt.njoptkp_sppt,
            Sppt.pbb_yg_harus_dibayar_sppt,
            Sppt.tgl_jatuh_tempo_sppt). \
            filter(and_(Sppt.thn_pajak_sppt == str(ses['tahun']),
                        Sppt.pbb_yg_harus_dibayar_sppt.between(buku_min, buku_max),
                        Sppt.status_pembayaran_sppt != '2')). \
            order_by(Sppt.kd_propinsi, Sppt.kd_dati2, Sppt.kd_kecamatan, Sppt.kd_kelurahan,
                     Sppt.kd_blok, Sppt.no_urut)

        if self.kd_kecamatan != '000':
            query = query.filter(Sppt.kd_kecamatan == ses['kd_kecamatan'])
        if self.kd_kelurahan != '000':
            query = query.filter(Sppt.kd_kelurahan == ses['kd_kelurahan'])
        return query