rekening_detail.py 5.71 KB
import sys
import re
import logging
import os
import qrcode
import base64
from email.utils import parseaddr
from sqlalchemy import not_, func, or_, desc
from datetime import datetime
from time import gmtime, strftime, strptime
from pyramid.view import (
    view_config,
    )
from pyramid.httpexceptions import (
    HTTPFound,
    )
import colander
from deform import (
    Form,
    widget,
    ValidationFailure,
    )
from ..tools import (
    _DTnumberformat,
    multi_dict_values,
    odt_export,
    terbilang,
    thousand,
    dmy,
    BULANS,
    get_settings
    )
from ..models import DBSession
from ..models.isipkd import(
      Pegawai, ObjekPajak, SubjekPajak, ARInvoice,
      Unit, UserUnit,Wilayah, Pajak, Rekening, 
      ARSts, ARStsItem, ARSspd, ARTbp
      )

from datatables import (
    ColumnDT, DataTables)
    
from ..security import group_finder,group_in

from daftar import (STATUS, deferred_status,
                    daftar_subjekpajak, deferred_subjekpajak,
                    daftar_objekpajak, deferred_objekpajak,
                    daftar_wilayah, deferred_wilayah,
                    daftar_unit, deferred_unit,
                    daftar_pajak, deferred_pajak,
                    auto_op_nm, auto_unit_nm, auto_wp_nm, auto_wp_nm3
                    )


SESS_ADD_FAILED = 'Gagal tambah Tagihan'
SESS_EDIT_FAILED = 'Gagal edit Tagihan'
log = logging.getLogger(__name__)
                    
    
@view_config(route_name='rek-det', renderer='templates/rekening/rekening_det.pt')
def view_detail(request):
    params = request.params
    kd = ''
    unit = ''
    no = ''

    rekening = Rekening.query().filter(func.trim(Rekening.kode)==params['kode'].strip()).first()
    level = DBSession.query(Rekening.level_id).filter(Rekening.kode==params['kode']).scalar()
    rek_a = Rekening.query().filter(Rekening.level_id==(level), Rekening.kode.ilike(params['kode']+'%')).order_by(Rekening.kode).all()
    rek = Rekening.query().filter(Rekening.level_id==(level+1), Rekening.kode.ilike(params['kode']+'%')).order_by(Rekening.kode).all()
    kd = rekening.kode.strip()
    unit = rekening.nama.strip()
    no = rekening.kode.strip()[-2]
    reks = []
    reks_a = []
    for r in rek:
        reks.append(dict(kode=r.kode.strip(), nama=r.nama.strip(), target=0, realisasi=0, persen=0))
    for r in rek_a:
        reks_a.append(dict(kode=r.kode.strip(), nama=r.nama.strip(), target=0, realisasi=0, persen=0))
    
    payments = DBSession.query(
                    ARSspd.tgl_bayar.label('tanggal'),
                    ARSspd.bayar.label('jumlah'),
                    ARInvoice.rek_kode.label('rek_kode'),
                    Unit.kode.label('kode'),
                    Unit.nama.label('nama'),
            ).join(ARInvoice, ARInvoice.id == ARSspd.arinvoice_id).\
              join(Unit, func.trim(Unit.kode) == func.trim(ARInvoice.unit_kode)).\
            filter(ARSspd.tahun_id==params['year']).order_by(ARInvoice.unit_kode)
    payments = payments.all()
    for p in payments:
        ## JIKA ADA FILTER DEPARTEMEN
        if 'unit' in params and params['unit']:
            if p.kode.strip().startswith(params['unit'].strip()):
                ## REKENING
                for r in reks:
                    if p.rek_kode.strip().startswith(r['kode']):
                        r['realisasi'] += int(p.jumlah)
                for r in reks_a:
                    if p.rek_kode.strip().startswith(r['kode']):
                        r['realisasi'] += int(p.jumlah)
                        
        ## JIKA TIDAK ADA FILTER DEPARTEMEN
        elif not 'unit' in params or not params['unit']:
            ## REKENING
            for r in reks:
                if p.rek_kode.strip().startswith(r['kode']):
                    r['realisasi'] += int(p.jumlah)
            for r in reks_a:
                if p.rek_kode.strip().startswith(r['kode']):
                    r['realisasi'] += int(p.jumlah)

    invoices = DBSession.query(
                    ARInvoice.tgl_tetap.label('tanggal'),
                    ARInvoice.jumlah.label('jumlah'),
                    ARInvoice.rek_kode.label('rek_kode'),
                    Unit.kode.label('kode'),
                    Unit.nama.label('nama'),
            ).join(Unit, func.trim(Unit.kode) == func.trim(ARInvoice.unit_kode)).\
            filter(ARInvoice.tahun_id==params['year']).order_by(ARInvoice.unit_kode)
    invoices = invoices.all()
    for i in invoices:
        ## JIKA ADA FILTER DEPARTEMEN
        if 'unit' in params and params['unit']:
            if i.kode.strip().startswith(params['unit'].strip()):
                ## REKENING
                for r in reks:
                    if i.rek_kode.strip().startswith(r['kode']):
                        r['target'] += int(i.jumlah)
                for r in reks_a:
                    if i.rek_kode.strip().startswith(r['kode']):
                        r['target'] += int(i.jumlah)
        ## JIKA TIDAK ADA FILTER DEPARTEMEN
        elif not 'unit' in params or not params['unit']:
            ## REKENING
            for r in reks:
                if i.rek_kode.strip().startswith(r['kode']):
                    r['target'] += int(i.jumlah)
            for r in reks_a:
                if i.rek_kode.strip().startswith(r['kode']):
                    r['target'] += int(i.jumlah)
                    
    ## Hitung Persen
    for r in reks:
        r['persen'] = r['target']>0 and str(round((float(r['realisasi'])/float(r['target']))*100,2)) or '0'
    for r in reks_a:
        r['persen'] = r['target']>0 and str(round((float(r['realisasi'])/float(r['target']))*100,2)) or '0'
    
    if len(reks)==0:
        raise HTTPFound(location=request.route_url('home'))
    count_rek = len(reks) > 3 and 3 or 4

    return dict(data=reks, data_a=reks_a, count_rek=count_rek, no=no, kd=kd, unit=unit)