import-pap.py 6.08 KB
#kpusat19_svr
#database dbdapja
#user samsatjb
#pass samsatjb onsoctcp 1526
#v_rtimepap
#tg_pros_bayar
#pap
#den_pajak
#jumlah
#v_rtime

#vsts yesterday 
#tg_pros_bayar
#pkb
#bbnkb1
#bbnkb2
#den_pajak
#jumlah

from models_eis import (ApPayment as EisApPayment, 
                        ByPayment as EisByPayment, 
                        Rekening as EisRekening, 
                        EisBase, EisDBSession)
from conf import pap_url
from sqlalchemy import create_engine, literal_column, func
from datetime import datetime
from datetime import date
try:
   from urllib import quote_plus, quote
except:
    from urllib.parse import quote_plus, quote

from conf import pap_url as url
    
data = url.split('@')
db_name = data[1]

data = data[0].split('//')
data = data[1].split(':')
db_user = data[0]
db_pass = data[1]

engine = OtherEngine(db_name, db_user, db_pass)

now = datetime.now()
tanggal = now.date()
tahun = now.strftime('%Y')

def calculate(tabel, all=None, kode=None):
    query = EisDBSession.query(tabel).filter_by(tahun = str(tahun)).\
            order_by(tabel.departemen_kd, tabel.tanggal, tabel.kode.desc())
    if not all:
        query = query.filter_by(tanggal=tanggal)
    if kode:
        query = query.filter_by(kode=kode)
        
    old_level = 0
    levels = {}
    jumlahs = {}
    key = ""
    for row in query.all():
        if row.level_id > old_level:
            print('Lebih', jumlahs, key)
            old_level = row.level_id
            key = 'a'+str(row.level_id)
            
        #JIKA level sama dengan sebelumnya jumlahkan
        if row.level_id == old_level:
            print('Sama')
            if not key in jumlahs:
                jumlahs[key] = row.jumlah
            else:
                jumlahs[key] += row.jumlah
                
        #JIKA level < sebelumnya update current row
        if row.level_id < old_level:
            print('Kurang', jumlahs, key)
            print('kode: ', row.kode, 'level: ', row.level_id, 'old: ', old_level, 'key: ', key, 'jml: ', row.jumlah, 'jmls: ', jumlahs)
            row.jumlah = jumlahs[key]
            EisDBSession.add(row)
            EisDBSession.flush()
            jumlahs[key] = 0 #key sebelumnya diset jadi 0 
            key = 'a'+str(row.level_id)
            if not key in jumlahs:
                jumlahs[key] = row.jumlah
            else:
                jumlahs[key] += row.jumlah
            old_level = row.level_id
            print('kode: ', row.kode, 'level: ', row.level_id, 'old: ', old_level, 'key: ', key, 'jml: ', row.jumlah, 'jmls: ', jumlahs)
    EisDBSession.commit()
            
def validate_parent(tabel, departemen_kd, departemen_nm, rekening, tanggal):
    kode = rekening.split('.')
    rekening = "\'" + rekening + "\'"
    rows = EisDBSession.query(EisRekening).\
              filter(literal_column(rekening).like(
                          func.concat(EisRekening.kode,'%'))).all()
    for row in rows:
        if not row.kode:
            continue
        induk = EisDBSession.query(tabel).\
                      filter_by(
                         tahun=str(row.tahun),
                         kode=row.kode.strip(),
                         departemen_kd = departemen_kd.strip(),
                         tanggal = tanggal,
                         ).first()
        if not induk:
            induk = tabel()
            induk.tahun = str(tahun)
            induk.kode = row.kode.strip()
            induk.departemen_kd = departemen_kd.strip()
            induk.tanggal = tanggal
        induk.departemen_nm = departemen_nm.strip()
        induk.level_id = row.kode.count('.')
        induk.nama = row.nama.strip()
        EisDBSession.add(induk)
        EisDBSession.flush()

def insert_data(row, kode, nama, dep_kode, dep_nama):
    # TODO
    eis = EisDBSession.query(EisArPayment).\
                  filter_by(tahun = str(tahun),
                     kode = kode,
                     departemen_kd = dep_kode,
                     tanggal = row.tanggal,
                     ).first()
    if not eis:
        eis = EisArPayment()
        eis.tahun = str(tahun)
        eis.kode = kode
        eis.departemen_kd = dep_kode
        eis.tanggal = tanggal
    eis.level_id = kode.count('.')
    eis.nama = nama
    eis.departemen_nm = dep_nama
    eis.jumlah = row.denda
    EisDBSession.add(eis)
    EisDBSession.flush()
    validate_parent(EisArPayment, eis.departemen_kd, eis.departemen_nm, eis.kode, eis.tanggal)

def import_pap(all=False):
    sql = "SELECT tg_pros_bayar as tanggal, pap as pokok, den_pajak as denda FROM v_rtimepap "\
          "WHERE TO_CHAR(tg_pros_bayar, 'YYYY') = '{tahun}' {where} "\
          "ORDER BY tg_pros_bayar"
    if not all:
        sql = sql.format(tahun = tahun,
                         where = '')
    else:
        sql = sql.format(tahun = tahun,
                         where = " tg_pros_bayar = '{tanggal}'".\
                                  format(tanggal = tanggal.strftime('%d-%m-%Y')),)
        
    rows = engine.fetchall(sql)
    
    rek_kode = '4.1.1.06.01.'
    rek_nama = 'PAJAK AIR PERMUKAAN'
    
    denda_kode = '4.1.4.07.03.'
    denda_nama = 'DENDA PAJAK AIR PERMUKAAN'
    
    dep_kode = '3.03.02.'
    dep_nama = 'BADAN PENDAPATAN DAERAH'
    
    for row in query.all():
        eis = EisDBSession.query(EisApPayment).\
                      filter_by(tahun = str(tahun),
                         kode = rek_kode,
                         departemen_kd = dep_kode,
                         tanggal = row.tanggal,
                         ).first()
        if not eis:
            eis = EisApPayment()
            eis.tahun = str(tahun)
            eis.kode = rek_kode
            eis.departemen_kd = dep_kode
            eis.tanggal = row.tanggal
        eis.level_id = rek_kode.count('.')
        eis.nama = rek_nama
        eis.departemen_nm = dep_nama
        eis.jumlah = row.pokok
        EisDBSession.add(eis)
        EisDBSession.flush()
        validate_parent(EisApPayment, eis.departemen_kd, eis.departemen_nm, eis.kode, eis.tanggal)
        if row.denda:
            insert_data(row, denda_kode, denda_nama, dep_kode, dep_nama)
    EisDBSession.commit()

import_pap(True)
calculate(EisArPayment,True)