eis_models.py 4.76 KB
from datetime import datetime
from sqlalchemy import (
    Column,
    Integer,
    BigInteger,
    SmallInteger,
    Text,
    DateTime,
    String,
    UniqueConstraint,
    ForeignKey,
    Index,
    create_engine,
    )

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    relationship, backref
    )

from conf import eis_url    
EisBase = declarative_base()
EisDBSession = scoped_session(sessionmaker())    
engine = create_engine(eis_url, echo=False)
EisDBSession.configure(bind=engine)
EisBase.metadata.bind = engine

TABLE_ARGS = {'extend_existing':True,
              'schema':'eis'
              }
class CommonModel(object):
    def to_dict(self): # Elixir like
        values = {}
        for column in self.__table__.columns:
            values[column.name] = getattr(self, column.name)
        return values
        
    def from_dict(self, values):
        for column in self.__table__.columns:
            if column.name in values:
                setattr(self, column.name, values[column.name])

    def as_timezone(self, fieldname):
        date_ = getattr(self, fieldname)
        return date_ and as_timezone(date_) or None

class DefaultModel(CommonModel):
    id = Column(Integer, primary_key=True)
    
    @classmethod
    def query(cls):
        return EisDBSession.query(cls)

    @classmethod
    def query_id(cls, id):
        return cls.query().filter_by(id=id)
        
    @classmethod
    def delete(cls, id):
        cls.query_id(id).delete()
    @classmethod
    def count(cls):
        return EisDBSession.query(func.count('id')).scalar()
    
class KodeModel(DefaultModel):
    kode = Column(String(32))
    status = Column(SmallInteger, nullable=False, default=0)
    created  = Column(DateTime, nullable=True, default=datetime.utcnow)
    updated  = Column(DateTime, nullable=True)
    create_uid  = Column(Integer, nullable=True, default=1)
    update_uid  = Column(Integer, nullable=True)
    
    @classmethod
    def query_kode(cls,kode):
        return cls.query().filter_by(kode=kode)
        
    @classmethod
    def get_active(cls):
        return cls.query().filter_by(status=1).all()
    
class NamaModel(KodeModel):
    nama = Column(String(128))

    @classmethod
    def query_nama(cls, nama):
        return cls.query().filter_by(nama=nama)

class Anggaran(NamaModel, EisBase):
    __tablename__ = 'sipkd_anggaran'
    tahun = Column(String(4))
    departemen_kd = Column(String(16))
    departemen_nm = Column(String(255))
    jumlah = Column(BigInteger)
    murni = Column(BigInteger)
    perubahan = Column(BigInteger)
    level_id = Column(Integer)
    __table_args__ = (UniqueConstraint('tahun', 'kode', 'departemen_kd'),
                      TABLE_ARGS)

class ArPayment(NamaModel, EisBase):
    __tablename__ = 'sipkd_ar_payment'
    tanggal = Column(DateTime(timezone=False))
    departemen_kd = Column(String(16))
    departemen_nm = Column(String(255))
    jumlah = Column(BigInteger)
    level_id = Column(Integer)
    tahun = Column(String(4))
    __table_args__ = (UniqueConstraint('tanggal', 'departemen_kd', 'kode'),
                      TABLE_ARGS)

class ApPayment(NamaModel, EisBase):
    __tablename__ = 'sipkd_ap_payment'
    tanggal = Column(DateTime(timezone=False))
    tanggal = Column(DateTime(timezone=False))
    departemen_kd = Column(String(16))
    departemen_nm = Column(String(255))
    jumlah = Column(BigInteger)
    level_id = Column(Integer)
    tahun = Column(String(4))
    __table_args__ = (UniqueConstraint('tanggal', 'departemen_kd', 'kode'),
                      TABLE_ARGS)

class ByPayment(NamaModel, EisBase):
    __tablename__ = 'sipkd_pb_payment'
    tanggal = Column(DateTime(timezone=False))
    tanggal = Column(DateTime(timezone=False))
    departemen_kd = Column(String(16))
    departemen_nm = Column(String(255))
    jumlah = Column(BigInteger)
    level_id = Column(Integer)
    tahun = Column(String(4))
    __table_args__ = (UniqueConstraint('tanggal', 'departemen_kd', 'kode'),
                      TABLE_ARGS)
class Rekening(NamaModel, EisBase):
    __tablename__ = 'sipkd_rekening'
    tahun     = Column(Integer)
    level_id  = Column(SmallInteger, default=1)
    parent_id = Column(Integer, ForeignKey('eis.sipkd_rekening.id'),)
    status  = Column(SmallInteger, default=1)
    defsign   = Column(SmallInteger, default=1)
    children  = relationship("Rekening", 
                   backref=backref('parent', remote_side='Rekening.id'))
    __table_args__= (
                      UniqueConstraint('kode', 'tahun', name='rekening_uq'),
                      #ForeignKeyConstraint(['parent_id'], ForeignKey('rekening.id')),
                      TABLE_ARGS
                    )
EisBase.metadata.create_all(engine)