skp.py 6.25 KB
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm import (
    relationship,
    backref
    )
from sqlalchemy import (Column, Integer, String, SmallInteger, UniqueConstraint, 
                        Date, BigInteger, ForeignKey, func, extract, case, DateTime, Float)
from ..models import SipkdBase, SipkdDBSession, CommonModel
from ..models import DaftUnit, Bendahara, RekPdpt
################
# TRANSAKSI SKP#
################
class Skp(SipkdBase, CommonModel):
    __tablename__  = 'skp'
    __table_args__ = {'extend_existing':True}    
    unitkey     = Column(String(10), primary_key=True)
    noskp       = Column(String(50), primary_key=True)
    kdstatus    = Column(String(3))
    keybend     = Column(String(10)) 
    npwpd       = Column(String(10)) 
    idxkode     = Column(Integer)
    tglskp      = Column(DateTime) 
    penyetor    = Column(String(100)) 
    alamat      = Column(String(200)) 
    uraiskp     = Column(String(254)) 
    tgltempo    = Column(DateTime) 
    bunga       = Column(Float) 
    kenaikan    = Column(Float) 
    tglvalid    = Column(DateTime) 
    
    @classmethod
    def query_kode(cls, unitkey, kode):
        return SipkdDBSession.query(cls).filter_by(unitkey =unitkey,
            noskp = kode)
    @classmethod
    def tambah(cls, values):
        # keybend = '2084_'
        # seharusnya parameter nip dimana keybend diquery dari tabel bendahara
        # seperti unitkey
        unit_kode = values['unit_kode']
        # unit_kode = '3.01.01.02.'
        # UNIT kode harusnya parameter didalam values
        nip = values['nip']
        unitkey = DaftUnit.get_key(unit_kode) 
        keybend = Bendahara.get_key(unitkey,nip)
        mtgkey = RekPdpt.get_key(values['rekening_kd'])
        row_skp = Skp()
        
        values['unitkey']  = unitkey
        values['kdstatus'] = '70'
        values['keybend']  = keybend
        values['idxkode']  = '1'
        values['kenaikan'] = 0
        values['mtgkey']  = mtgkey
        values['nojetra'] = '11'
        
        #row_skp.npwpd    = row.kode[:18][:-10]
        #row_skp.tglvalid = datetime.now()
        
        row_skp.from_dict(values)
        SipkdDBSession.add(row_skp)
        SipkdDBSession.flush()
            
        if values['nilai']<>0:
            row_skpdet = SkpDet()
            row_skpdet.from_dict(values)
            SipkdDBSession.add(row_skpdet)
            SipkdDBSession.flush()
            
        #jurnal SKP dengan stored procedure
        row_skp.tglvalid = row_skp.tglskp
        SipkdDBSession.add(row_skp)
        SipkdDBSession.flush()
        return True
        
    @classmethod
    def hapus(cls, values):
        keybend = '2084_'
        unit_kode = '3.01.01.02.'
        unitkey = DaftUnit.get_key(unit_kode) 
        noskp = values['noskp']
        #hapus detail
        row_skpdet = SipkdDBSession.query(SkpDet).\
                                 filter_by(unitkey = unitkey,
                                           noskp   = noskp).delete()
        SipkdDBSession.flush()
        #Hapus Master
        row_skp = SipkdDBSession.query(Skp).\
                                 filter_by(unitkey = unitkey,
                                           noskp   = noskp).delete()
        SipkdDBSession.flush()
        return True
                
class SkpDet(SipkdBase, CommonModel):
    __tablename__  = 'skpdet'
    __table_args__ = {'extend_existing':True}    
    unitkey     = Column(String(10), primary_key=True)
    noskp       = Column(String(50), primary_key=True)
    mtgkey      = Column(String(10), primary_key=True)
    nojetra     = Column(String(2), primary_key=True)
    nilai       = Column(Float) 
    @classmethod
    def query_kode(cls, unitkey, kode, mtgkey, nojetra):
        return SipkdDBSession.query(cls).filter_by(unitkey =unitkey,
                  noskp = kode, mtgkey=mtgkey, nojetra=nojetra)

def save_skp(data, post=0):
    unitkey  = '_' in data['unit_kd'] and data['unit_kd'] or DaftUnit.get_key(data['unit_kd'])
    keybend  = '_' in data['bendahara_kd'] and data['bendahara_kd'] or Bendahara.get_key(unitkey, data['bendahara_kd'])
    if post:
        row = Skp.query_kode(unitkey, data['noskp']).first()
        if not row:
            row = Skp()
            row.unitkey = unitkey
        row.from_dict(data)
        #row_skp.kdstatus = '70'
        row.idxkode  = '1' #pendapatan
        row.kenaikan = 0
        row.keybend = keybend
        #row_skp.npwpd    = row.npwpd[-10:]
        #row_skp.tglskp   = row.tgl_tetap
        #row_skp.penyetor = row.nama
        #row_skp.alamat   = row.alamat
        #row_skp.uraiskp  = row.rekening_nm
        #row_skp.tgltempo = row.jth_tempo
        #row_skp.tglvalid = datetime.now()
        #row_skp.bunga    = row.denda+row.bunga
        SipkdDBSession.add(row)
        SipkdDBSession.flush()
        for item in data['items']:
            mtgkey  = '_' in item['rekening_kd'] and item['rekening_kd'] or \
                          RekPdpt.get_key(item['rekening_kd'])
            nojetra = item['nojetra']
            rowdet = SkpDet.query_kode(row.unitkey, row.noskp, mtgkey, nojetra).first()
            if not rowdet:
                rowdet = SkpDet()
                rowdet.unitkey = row.unitkey
                rowdet.noskp   = row.noskp
                rowdet.mtgkey  = mtgkey
                rowdet.nojetra = nojetra
            rowdet.nilai   = item['nilai']
            SipkdDBSession.add(rowdet)
            SipkdDBSession.flush()

        #row_skp.tglvalid = row_skp.tglskp
        #SipkdDBSession.add(row_skp)
        #SipkdDBSession.flush()
        #row.posted = 1
        #DBSession.add(row)
        #DBSession.flush()
    # else:
        # unitkey = SipkdUnit.get_key_by_kode(row.unit_kd)
        # noskp = "%s/%s" % (row.kode, row.ref_kode)

        # row_skpdet = SipkdDBSession.query(SipkdSkpDet).\
                                 # filter_by(unitkey = unitkey,
                                           # noskp   = noskp).delete()
        # SipkdDBSession.flush()

        # row_skp = SipkdDBSession.query(SipkdSkp).\
                                 # filter_by(unitkey = unitkey,
                                           # noskp   = noskp).delete()
        # SipkdDBSession.flush()
        # row.posted = 0
        # DBSession.add(row)
        # DBSession.flush()