import-sipkd.py 5.38 KB
from sipkd_models import Realisasi, Base, DBSession
from eis_models import (ApPayment as EisApPayment, 
                        ByPayment as EisByPayment, 
                        Rekening as EisRekening, 
                        EisBase, EisDBSession)
from conf import sipkd_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
    

engine = create_engine(sipkd_url)
DBSession.configure(bind=engine)
Base.metadata.bind = engine
Base.metadata.create_all(engine)
now = datetime.now()
tanggal = now.date()
tahun = now.strftime('%Y')

def calculate(tabel, all=False):
    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)
    
    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,
                         departemen_kd = departemen_kd,
                         ).first()
        if not induk:
            induk = tabel()
            induk.tahun = str(tahun)
            induk.kode = row.kode
            induk.departemen_kd = departemen_kd
            induk.tanggal = tanggal
        induk.departemen_nm = departemen_nm
        induk.level_id = row.kode.count('.')
        induk.nama = row.nama
        EisDBSession.add(induk)
        EisDBSession.flush()
        
def import_ap(all=False):
    query = DBSession.query(Realisasi)
    if not all:
        query = query.filter_by(tanggal=tanggal)
    query = query.filter(Realisasi.kd_rekening.like('5.%'))
        
    for row in query.all():
        eis = EisDBSession.query(EisApPayment).\
                      filter_by(tahun = row.tahun,
                         kode = row.kd_rekening,
                         departemen_kd = row.kd_opd,
                         tanggal = row.tanggal,
                         ).first()
        if not eis:
            eis = EisApPayment()
            eis.tahun = row.tahun
            eis.kode = row.kd_rekening
            eis.departemen_kd = row.kd_opd
            eis.tanggal = row.tanggal
        eis.level_id = row.kd_rekening.count('.')
        eis.nama = row.nm_rekening
        eis.departemen_nm = row.nm_opd
        eis.jumlah = row.realisasi
        EisDBSession.add(eis)
        EisDBSession.flush()
        validate_parent(EisApPayment, eis.departemen_kd, eis.departemen_nm, eis.kode, eis.tanggal)
    EisDBSession.commit()

def import_by(all=False):
    query = DBSession.query(Realisasi)
    if not all:
        query = query.filter_by(tanggal=tanggal)
        
    for row in query.filter(Realisasi.kd_rekening.like('6.%')).all():
        eis = EisDBSession.query(EisByPayment).\
                      filter_by(tahun = row.tahun,
                         rekening_kd = row.kd_rekening,
                         departemen_kd = row.kd_opd,
                         tanggal = tanggal,
                         ).first()
        if not eis:
            eis = EisByPayment()
            eis.tahun = row.tahun
            eis.kode = row.kd_rekening
            eis.departemen_kd = row.kd_opd
            eis.tanggal = tanggal
        eis.level_id = row.kd_rekening.count('.')
        eis.nama = row.nm_rekening
        eis.departemen_nm = row.nm_opd
        eis.jumlah = row.realisai
        EisDBSession.add(eis)
        EisDBSession.flush()
        validate_parent(EisByPayment, eis.departemen_kd, eis.departemen_nm, eis.kode)
    EisDBSession.commit()
EisDBSession.commit()
    
import_ap(True)
import_by(True)
calculate(EisApPayment,True)
calculate(EisByPayment,True)