ws_sipkd.py 14.3 KB
from pyramid_rpc.jsonrpc import jsonrpc_method
from ..tools import (auth_from_rpc, LIMIT, CODE_OK, CODE_NOT_FOUND, CODE_DATA_INVALID, 
                   CODE_INVALID_LOGIN, CODE_NETWORK_ERROR)
from ..models import SipkdDBSession
from ..models import Skp as SipkdSkp, SkpDet as SipkdSkpDet, DaftUnit as SipkdUnit, RekPdpt as SipkdRek4
from ..models import Tbp as SipkdTbp, TbpDet as SipkdTbpDet, BkuTbp as SipkdBkuTbp

#from ...tools import FixLength
from datetime import datetime
@jsonrpc_method(method='post_ketetapan', endpoint='ws-sipkd')
def post_ketetapan(request, data):
    #Digunakan untuk menerima data ketetapan
    """ 
      Parameter Data
      unit_kd   : kode_unit
      kode      : no_spt/no_kohir,
      npwpd     : npwpd/nopd:
      tgl_tetap : tgl kohir or tgl_spt
      nama      : nama wp/op
      alamat    : alamat wp/op
      rekening_nm: Nama Rekening
      jth_tempo : Tanggal Jatuh Tempo
      pokok     : pokok
      denda     : denda
      bunga     : bunga
      rekening_kd: Kode Rekening 4.1.1.01.01. ditambahkan titik di ujung 
      source    : PBB BPHTB PDL 
      rekening_denda_kd    : Kode Rekening Denda 
      return 
      
      data array(kode:
                        error:0 sukses posting data
                              1 data sudah ada
                              2 Data Gagal Posting)
    """
    resp = {}
    resp['code'] = CODE_OK
    #resp,user = auth_from_rpc(request)
    if resp['code'] != CODE_OK:
        return resp
    
    resp['message'] = 'DATA PROSESSED'
    ret_data =[]
    for row in data:
        try:
        #if 1=1:
            #CHECK DULU DI SIPKD
            row["unit_kd"] = "3.01.01.02."
            keykode = "%s-%s" %(row["source"],get_kode(row["kode"]))
            rows = SipkdDBSession.query(SipkdSkp).\
                      filter(SipkdSkp.unitkey == SipkdUnit.get_key(row["unit_kd"]),
                             SipkdSkp.noskp == keykode,
                             ).first()
            if rows:
                ret_data.append({"kode": row["kode"],
                                 "error":1,
                                 "message":"Data Sudah Ada",
                                 }) # data sudah ada dalam sipkd
                resp['code'] = CODE_DATA_INVALID
                resp['message'] = 'DATA SUDAH ADA'
                continue
                
            row_skp = SipkdSkp()
            row_skp.unitkey  = SipkdUnit.get_key(row["unit_kd"])
            row_skp.noskp    = keykode
            row_skp.kdstatus = '70'
            row_skp.keybend  = '1797_'
            row_skp.idxkode  = '1' #pendapatan
            row_skp.kenaikan = 0
            row_skp.npwpd    = row["npwpd"][-10:]
            row_skp.tglskp   = datetime.strptime(row["tgl_tetap"], "%Y-%m-%d")
            row_skp.penyetor = row["nama"][:100]
            row_skp.alamat   = row["alamat"][:200]
            row_skp.uraiskp  = row["rekening_nm"]
            row_skp.tgltempo = datetime.strptime(row["jth_tempo"], "%Y-%m-%d")
            #row_skp.tglvalid = datetime.now() diset setelah item di post
            row_skp.bunga    = row["denda"]+row["bunga"]
            SipkdDBSession.add(row_skp)
            SipkdDBSession.flush()

            if row["pokok"]>0:
                row_skpdet = SipkdSkpDet()
                row_skpdet.unitkey = row_skp.unitkey
                row_skpdet.noskp   = row_skp.noskp
                row_skpdet.nilai   = row["pokok"]
                row_skpdet.mtgkey  = SipkdRek4.get_key(row["rekening_kd"])
                row_skpdet.nojetra = '11' 
                SipkdDBSession.add(row_skpdet)
                SipkdDBSession.flush()
            if row["denda"]+row["bunga"]>0:
                row_skpdet = SipkdSkpDet()
                row_skpdet.unitkey = row_skp.unitkey
                row_skpdet.noskp   = row_skp.noskp
                row_skpdet.nilai   = row["denda"]+row["bunga"]
                row_skpdet.mtgkey  = SipkdRek4.get_key(row["rekening_denda_kd"])
                row_skpdet.nojetra = '11'
                SipkdDBSession.add(row_skpdet)
                SipkdDBSession.flush()
                

            row_skp.tglvalid = row_skp.tglskp
            SipkdDBSession.add(row_skp)
            SipkdDBSession.flush()
            ret_data.append({"kode": row["kode"],
                             "error":0,
                             "message":'Sukses'}) # data sukses di posting
        except Exception, e:
            ret_data.append({"kode": row["kode"],
                             "error":2,
                             "message":str(e)}) # data tidak berhasil diposting
            resp['code'] = CODE_DATA_INVALID
            resp['message'] = 'INVALID DATA'
            print str(e)

    resp['params'] = dict(data=ret_data)
    return resp
    
@jsonrpc_method(method='unpost_ketetapan', endpoint='ws-sipkd')
def unpost_ketetapan(request, data):
    #Digunakan untuk unposting ketetapan pajak/retribusi
    """ 
      Parameter Data
      unit_kd   : kode_unit
      kode      : no_spt/no_kohir,
      source    : no_spt/no_kohir,
    
    return data array(kode:
                      error:0 sukses unposting
                            1 tidak ditemukan)
    """
    
    resp = {}
    resp['code'] = CODE_OK
    #resp,user = auth_from_rpc(request)
    if resp['code'] != CODE_OK:
        return resp
    ret_data=[]
    resp['message'] = 'DATA PROSESSED'
    for row in data:
        try:
        #if 1==1:
            row["unit_kd"] = "3.01.01.02."
            kodekey = "%s-%s" %(row["source"],get_kode(row["kode"]))
            query = SipkdDBSession.query(SipkdSkp).\
                      filter(SipkdSkp.unitkey == SipkdUnit.get_key(row["unit_kd"]),
                             SipkdSkp.noskp == kodekey,
                             )
            rows = query.first()
            if not rows:
                ret_data.append({"kode": row["kode"],
                                 "error":1,
                                 "message":"Data Tidak Ditemukan"}) # data tidak ada dalam sipkd
                resp['code'] = CODE_DATA_INVALID
                resp['message'] = 'DATA INVALID'
                continue
                
            row_skpdet = SipkdDBSession.query(SipkdSkpDet).\
                                     filter_by(unitkey = rows.unitkey,
                                               noskp   = rows.noskp).delete()
            SipkdDBSession.flush()
            row_skp = query.delete()
            ret_data.append({"kode": row["kode"],
                             "error":0,
                             "message":"Sukses"})
        except Exception, e:
            ret_data.append({"kode": row["kode"],
                             "error":2,
                             "message":str(e)}) # data gagal di unpost
            resp['code'] = CODE_DATA_INVALID
            resp['message'] = 'DATA INVALID'
            print str(e)

    resp['params'] = dict(data=ret_data)
    return resp    

def get_kode(kode):
    xs = kode.split('/')
    import re
    xd = ''
    for x in xs:
        if xd:
            xd +='/'
        xd += x[2:]
    return re.sub('-','',xd)


"""
"""
@jsonrpc_method(method='post_realisasi', endpoint='ws-sipkd')
def post_realisasi(request, data):
    #Digunakan untuk memposting data penerimaan
    #paramter 
    """  unit_kd   : kode_unit
      kode      : no_spt/no_kohir,
      tgl_trans : tgl pembayaran
      nama      : nama wp/op
      alamat    : alamat wp/op
      rekening_nm: Nama Rekening
      pokok     : pokok
      denda     : denda
      bunga     : bunga
      rekening_kd: Kode Rekening 4.1.1.01.01. ditambahkan titik di ujung 
      source    : PBB BPHTB PDL 
      rekening_denda_kd    : Kode Rekening Denda 
    """
    resp = {}
    resp['code'] = CODE_OK
    #resp,user = auth_from_rpc(request)
    if resp['code'] != CODE_OK:
        return resp
    ret_data=[]
    resp['message'] = 'DATA PROSESSED'
    for row in data:
        try:
        #if 1==1:
            tanggal = datetime.strptime(row["tgl_trans"], "%Y-%m-%d")
            row["unit_kd"]  = "3.01.01.02."
            unitkey = SipkdUnit.get_key(row["unit_kd"])
            #unitkey = '208_'
            kodekey = "%s-%s-%s" % (row["source"],get_kode(row["kode"]),tanggal.strftime('%d%m'))
            
            rows = SipkdDBSession.query(SipkdTbp).\
                    filter(SipkdTbp.unitkey == SipkdUnit.get_key(row["unit_kd"]),
                           SipkdTbp.notbp == kodekey,
                          ).first()
            keybend = '2084_'
            if rows:
                ret_data.append({"kode": row["kode"],
                                 "error":1,
                                 "message":"Data Sudah Ada"}) # data gagal di post
                resp['code'] = CODE_DATA_INVALID
                resp['message'] = 'DATA SUDAH ADA'
                continue
                
            if kodekey.find("/")>0:
                statuskd = '64' #Penerimaan (Rek.Bend)-Penetapan
            else:
                statuskd = '63' #Penerimaan (Rek.Bend)-Tanpa Penetapan
             
            row_tbp = SipkdTbp()
            row_tbp.unitkey  = unitkey
            row_tbp.notbp    = kodekey 
            row_tbp.keybend1 = keybend

            row_tbp.kdstatus = statuskd
            row_tbp.keybend2 = keybend
            row_tbp.idxkode  = '1' #pendapatan
            row_tbp.tgltbp   = tanggal
            row_tbp.penyetor = row["nama"]
            row_tbp.alamat   = row["alamat"]
            row_tbp.uraitbp  = row["rekening_nm"]
            row_tbp.tglvalid = tanggal
            SipkdDBSession.add(row_tbp)
            SipkdDBSession.flush()
            
            if row["pokok"]>0:  
                row_tbpdet = SipkdTbpDet()
                row_tbpdet.unitkey = unitkey
                row_tbpdet.notbp   = kodekey
                row_tbpdet.nilai   = row["pokok"]
                row_tbpdet.mtgkey  = SipkdRek4.get_key(row["rekening_kd"])
                row_tbpdet.nojetra = '11' #Penerimaan STS/TBP
                SipkdDBSession.add(row_tbpdet)
                SipkdDBSession.flush()
                
            if row["denda"]+row["bunga"]>0:
                row_tbpdet = SipkdTbpDet()
                row_tbpdet.unitkey = unitkey
                row_tbpdet.notbp   = kodekey
                row_tbpdet.nilai   = row["denda"]+row["bunga"]
                row_tbpdet.mtgkey  = SipkdRek4.get_key(row["rekening_denda_kd"])
                row_tbpdet.nojetra = '11' #Penerimaan STS/TBP
                SipkdDBSession.add(row_tbpdet)
                SipkdDBSession.flush()
            
            row_bku = SipkdBkuTbp()
            row_bku.unitkey     = unitkey
            row_bku.nobkuskpd   = kodekey
            row_bku.notbp       = kodekey
            row_bku.idxttd      = keybend
            row_bku.tglbkuskpd  = tanggal
            row_bku.uraian      = row["nama"]
            row_bku.tglvalid    = tanggal
            row_bku.keybend     = keybend
            SipkdDBSession.add(row_bku)
            SipkdDBSession.flush()
            row_bku.tglvalid    = tanggal
            SipkdDBSession.add(row_bku)
            SipkdDBSession.flush()
            ret_data.append({"kode": row["kode"],
                             "error":0,
                             "message":"Sukses"}) # data gagal di unpost
        except Exception, e:
            ret_data.append({"kode": row["kode"],
                             "error":2,
                             "message":str(e)}) # data gagal di unpost
            resp['code'] = CODE_DATA_INVALID
            resp['message'] = 'Data Invalid'
            print str(e)
    resp['params'] = dict(data=ret_data)
    return resp
    
@jsonrpc_method(method='unpost_realisasi', endpoint='ws-sipkd')
def unpost_realisasi(request, data):
    #Digunakan untuk melakukan unposting pendapatan
    """ 
      Parameter Data
      unit_kd   : kode_unit
      kode      : no_spt/no_kohir,
      source    : no_spt/no_kohir,
    
    return data array(kode:
                      error:0 sukses unposting
                            1 tidak ditemukan)
    """
    
    resp = {}
    resp['code'] = CODE_OK
    #resp,user = auth_from_rpc(request)
    if resp['code'] != CODE_OK:
        return resp
    ret_data=[]
    resp['message'] = 'DATA PROSESSED'
    for row in data:
        try:
        #if 1==1:
            tanggal = datetime.strptime(row["tgl_trans"], "%Y-%m-%d")
            row["unit_kd"] = "3.01.01.02."
            unitkey = SipkdUnit.get_key(row["unit_kd"])
            kodekey = "%s-%s-%s" % (row["source"],get_kode(row["kode"]),tanggal.strftime('%d%m'))
            row_tbp = SipkdDBSession.query(SipkdTbp).\
                    filter_by(unitkey = unitkey,
                            notbp   = kodekey)
            if not row_tbp.first():
                 kodekey = "%s-%s" % (row["source"],row["kode"])

                                                                                                         #kodekey = "%s-%s" % (row["source"],row["kode"])
            row_bku = SipkdDBSession.query(SipkdBkuTbp).\
                                     filter_by(unitkey = unitkey,
                                               notbp   = kodekey,
                                               ).delete()
                                               
            row_tbpdet = SipkdDBSession.query(SipkdTbpDet).\
                                     filter_by(unitkey = unitkey,
                                               notbp   = kodekey).delete()
                                               
            # row_skptbp = SipkdDBSession.query(SipkdSkpTbp).\
                                     # filter_by(unitkey = unitkey,
                                               # notbp   = notbp).delete()
            row_tbp = SipkdDBSession.query(SipkdTbp).\
                                     filter_by(unitkey = unitkey,
                                               notbp   = kodekey).delete()
            SipkdDBSession.flush()
            #SipkdDBSession.commit()
            ret_data.append({"kode": row["kode"],
                             "error":0,
                             "message":'Sukses'}) # data sukses di posting
        except Exception,e:
            #SipkdDBSession.rollback()
            ret_data.append({"kode": row["kode"],
                             "error":2,
                             "message":str(e)}) # data gagal di unpost
            resp['code'] = CODE_DATA_INVALID
            resp['message'] = "DATA INVALID"
            print str(e)

    resp['params'] = dict(data=ret_data)
    return resp