import-webr.py 6.81 KB
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 models_webr import (ARInvoice as Invoice, ARSspd as Realisasi, 
                         WebrDBSession as DBSession, Rekening, Pajak, ObjekPajak)
                         
from models_eis import (ArPayment as EisArPayment, 
                        ByPayment as EisByPayment, 
                        Rekening as EisRekening, 
                        Opd as EisOpd, 
                        EisBase, EisDBSession)

from conf import webr_url as url

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
        induk.level_id = row.kode.count('.')
        induk.nama = row.nama.strip()
        EisDBSession.add(induk)
        EisDBSession.flush()
        
def import_ar(all=False):
    query = DBSession.query(func.substring(Invoice.unit_kode,1,8).label('unit_kode'), 
                  Invoice.rek_kode, Invoice.rek_nama, 
                  Rekening.kode.label('denda_kode'),
                  Rekening.nama.label('denda_nama'),
                  func.to_char(Realisasi.tgl_bayar,'YYYY-MM-DD').label('tgl_bayar'), 
                  func.sum(Realisasi.bunga).label('bunga'), 
                  func.sum(Realisasi.bayar).label('bayar'),).\
              join(Realisasi, (Realisasi.arinvoice_id == Invoice.id)).\
              join(ObjekPajak, (Invoice.objek_pajak_id==ObjekPajak.id)).\
              join(Pajak, (ObjekPajak.pajak_id==Pajak.id)).\
              outerjoin(Rekening, (Rekening.id==Pajak.denda_rekening_id)).\
              group_by(func.substring(Invoice.unit_kode,1,8), 
                  Invoice.rek_kode, Invoice.rek_nama,
                  Rekening.kode,
                  Rekening.nama,
                  func.to_char(Realisasi.tgl_bayar,'YYYY-MM-DD'))
    if not all:
        query = query.filter(func.to_char(Realisasi.tgl_bayar,'YYYY-MM-DD') == tanggal.strftime('%Y-%m-%d'))
        
    for row in query.all():
        eis = EisDBSession.query(EisArPayment).\
                      filter_by(tahun = str(tahun),
                         kode = row.rek_kode.strip(),
                         departemen_kd = row.unit_kode.strip(),
                         tanggal = row.tgl_bayar,
                         ).first()
        print(row.unit_kode, row.rek_kode, row.denda_kode, row.bunga, row.bayar)
        unit_nm = EisDBSession.query(EisOpd).\
                      filter_by(tahun = str(tahun),
                         kode = row.unit_kode.strip(),
                         ).first()
        if unit_nm:
            unit_nm = unit_nm.nama.strip()
        if not eis:
            eis = EisArPayment()
            eis.tahun = str(tahun)
            eis.kode = row.rek_kode.strip()
            eis.departemen_kd = row.unit_kode.strip()
            eis.tanggal = row.tgl_bayar
        eis.level_id = row.rek_kode.count('.')
        eis.nama = row.rek_nama
        eis.departemen_nm = unit_nm
        eis.jumlah = row.bayar - row.bunga
        EisDBSession.add(eis)
        validate_parent(EisApPayment, eis.departemen_kd, eis.departemen_nm, eis.kode, eis.tanggal)
        EisDBSession.flush()
        if row.bunga and row.denda_kode:
            # TODO
            eis = EisDBSession.query(EisArPayment).\
                          filter_by(tahun = str(tahun),
                             kode = row.denda_kode and row.denda_kode.strip() or '',
                             departemen_kd = row.unit_kode.strip(),
                             tanggal = row.tgl_bayar,
                             ).first()
            if not eis:
                eis = EisArPayment()
                eis.tahun = str(tahun)
                eis.kode = row.denda_kode.strip()
                eis.departemen_kd = row.unit_kode.strip()
                eis.tanggal = row.tanggal.date()
            eis.level_id = row.denda_kode.count('.')
            eis.nama = row.denda_nama.strip()
            eis.departemen_nm = row.unit_nama.strip()
            eis.jumlah = row.bunga
            EisDBSession.add(eis)
            EisDBSession.flush()
            validate_parent(EisArPayment, eis.departemen_kd, eis.departemen_nm, eis.kode, eis.tanggal)
    EisDBSession.commit()

import_pap(True)
calculate(EisArPayment,True)