pajak.py 4.55 KB
from sqlalchemy import (
    Column, Integer, DateTime, ForeignKey, UniqueConstraint, String, SmallInteger,
    Index, Float, func)
from sqlalchemy.orm import (
    relationship
)
from sqlalchemy.schema import FetchedValue

from . import PAD_TABLE_ARGS, DefaultModel, Base
from . import (PjdlUsaha, PjdlRekening)
from . import (DBSession)


class PjdlPajak(Base, DefaultModel):
    __tablename__ = 'pad_pajak'
    __table_args__ = (
        UniqueConstraint('rekening_id', 'rekeningkdsub'),
        Index('pad_pajak_rekening_id_usaha_id_rekdenda_id_idx', 'rekening_id', 'usaha_id',
              'rekdenda_id'),
        PAD_TABLE_ARGS
    )

    id = Column(Integer, primary_key=True)
    usaha_id = Column(ForeignKey(PjdlUsaha.id, onupdate='CASCADE'), nullable=False,
                      server_default=FetchedValue())
    pajaknm = Column(String(100))
    rekening_id = Column(ForeignKey(
        PjdlRekening.id, onupdate='CASCADE'), nullable=False)
    rekeningkdsub = Column(String(5), server_default=FetchedValue())
    rekdenda_id = Column(Integer)
    masapajak = Column(SmallInteger, nullable=False,
                       server_default=FetchedValue())
    jatuhtempo = Column(SmallInteger, server_default=FetchedValue())
    multiple = Column(SmallInteger, server_default=FetchedValue())
    jalan_klas_id = Column(Integer)
    tmt = Column(DateTime)
    enabled = Column(SmallInteger)
    create_date = Column(DateTime)
    create_uid = Column(Integer)
    write_date = Column(DateTime)
    write_uid = Column(Integer)
    status_reklame_id = Column(Integer)
    bahan_komponen = Column(String(255))
    satuan_ukuran = Column(String(50))
    biaya_pembuatan = Column(Float(53))
    batas_min_masa_pajak = Column(String(50))

    rekening = relationship('PjdlRekening', primaryjoin='PjdlPajak.rekening_id == PjdlRekening.id',
                            backref='pad_pajaks')
    usaha = relationship('PjdlUsaha', primaryjoin='PjdlPajak.usaha_id == PjdlUsaha.id',
                         backref='pad_pajaks')

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

    @classmethod
    def query_register(cls, order_field="pajaknm"):
        return cls.query_from(columns=[cls.pajaknm.label('Nama Pajak'),
                                       PjdlUsaha.usahanm.label('Nama Usaha'),
                                       cls.enabled.label('Aktif')]). \
            outerjoin(PjdlUsaha, PjdlUsaha.id == cls.usaha_id). \
            order_by(getattr(cls, order_field))

    @classmethod
    def get_list(cls):
        r = []
        q = cls.query().order_by(cls.pajaknm)
        for row in q:
            g = (str(row.id), f"{row.pajaknm}")
            r.append(g)
        return r

    @classmethod
    def query_id(cls, id):
        return cls.query().filter(cls.id == id)

    @classmethod
    def get_jatuhtempo(cls, usaha_id=None):
        result = DBSession.query(func.max(cls.jatuhtempo)).\
            filter_by(enabled=1).\
            filter_by(usaha_id=usaha_id).scalar()
        return result


class PjdlPajakTarif(Base, DefaultModel):
    __tablename__ = 'pad_pajak_tarif'
    __table_args__ = PAD_TABLE_ARGS

    id = Column(Integer, primary_key=True)
    pajak_id = Column(ForeignKey(PjdlPajak.id, ondelete=u'CASCADE', onupdate=u'CASCADE'),
                      nullable=False)
    tarif = Column(Float(53))
    opsen_tarif = Column(Float(53))
    reklame = Column(Float(53), nullable=False, server_default=FetchedValue())
    minomset = Column(Float(53), server_default=FetchedValue())
    tmt = Column(DateTime)
    enabled = Column(SmallInteger)
    create_date = Column(DateTime)
    create_uid = Column(Integer)
    write_date = Column(DateTime)
    write_uid = Column(Integer)

    pajak = relationship('PjdlPajak', primaryjoin='PjdlPajakTarif.pajak_id == PjdlPajak.id',
                         backref='padpajak_pad_pajak_tarifs')

    @classmethod
    def query_register(cls, order_field="pajak_id"):
        return cls.query_from(columns=[PjdlPajak.pajaknm.label('Nama Pajak'),
                                       cls.tarif, cls.minomset, cls.tmt,
                                       cls.enabled.label('Status')]). \
            outerjoin(PjdlPajak, PjdlPajak.id == cls.pajak_id). \
            order_by(getattr(cls, order_field))

    @classmethod
    def get_list(cls, kecamatan_id=None):
        r = []
        q = cls.query(cls).order_by(cls.kelurahannm)
        if kecamatan_id:
            q.filter(cls.kecamatan_id == kecamatan_id)
        for row in q:
            g = (str(row.id), f"{row.kode}/ {row.nama}")
            r.append(g)
        return r