pembayaran_sppt.py 8.05 KB
from datetime import datetime
from datetime import datetime

from sqlalchemy import (
    Column, String, DateTime,
    Integer, BigInteger, func, )

from .sppt import Sppt
from ..models import PbbmBase, PbbmDBSession, PBBM_ARGS, CommonModel
from ..tools import FixNop, hitung_denda, FixBayar


class PembayaranSppt(PbbmBase, CommonModel):
    __tablename__ = 'pembayaran_sppt'
    __table_args__ = (
        # ForeignKeyConstraint(['kd_propinsi','kd_dati2','kd_kecamatan','kd_kelurahan',
        # 'kd_blok', 'no_urut','kd_jns_op', 'thn_pajak_sppt'],
        # ['sppt.kd_propinsi', 'sppt.kd_dati2',
        # 'sppt.kd_kecamatan','sppt.kd_kelurahan',
        # 'sppt.kd_blok', 'sppt.no_urut',
        # 'sppt.kd_jns_op','sppt.thn_pajak_sppt']),
        PBBM_ARGS)
    kd_propinsi = Column(String(2), primary_key=True)
    kd_dati2 = Column(String(2), primary_key=True)
    kd_kecamatan = Column(String(3), primary_key=True)
    kd_kelurahan = Column(String(3), primary_key=True)
    kd_blok = Column(String(3), primary_key=True)
    no_urut = Column(String(4), primary_key=True)
    kd_jns_op = Column(String(1), primary_key=True)
    thn_pajak_sppt = Column(String(4), primary_key=True)
    pembayaran_sppt_ke = Column(Integer, primary_key=True)
    kd_kanwil = Column(String(2))
    kd_kantor = Column(String(2))
    kd_tp = Column(String(2))
    denda_sppt = Column(BigInteger)
    jml_sppt_yg_dibayar = Column(BigInteger)
    tgl_pembayaran_sppt = Column(DateTime(timezone=False))
    tgl_rekam_byr_sppt = Column(DateTime(timezone=False))
    nip_rekam_byr_sppt = Column(String(18))
    posted = Column(Integer)

    @classmethod
    def query(cls):
        return PbbmDBSession.query(cls)

    @classmethod
    def query_id(cls, id):
        fx_bayar = FixBayar(id)
        return cls.query().filter(
            cls.kd_propinsi == fx_bayar["kd_propinsi"],
            cls.kd_dati2 == fx_bayar["kd_dati2"],
            cls.kd_kecamatan == fx_bayar["kd_kecamatan"],
            cls.kd_kelurahan == fx_bayar["kd_kelurahan"],
            cls.kd_blok == fx_bayar["kd_blok"],
            cls.no_urut == fx_bayar["no_urut"],
            cls.kd_jns_op == fx_bayar["kd_jns_op"],
            cls.thn_pajak_sppt == fx_bayar["thn_pajak_sppt"],
            cls.thn_pajak_sppt == fx_bayar["thn_pajak_sppt"],
            cls.kd_kanwil == fx_bayar["kd_kanwil"],
            cls.kd_kantor == fx_bayar["kd_kantor"],
            cls.kd_tp == fx_bayar["kd_tp"],
            cls.pembayaran_sppt_ke == fx_bayar["pembayaran_sppt_ke"], )

    @classmethod
    def query_by_nop(cls, nop):
        fxNop = FixNop(nop)
        return cls.query(). \
            filter(cls.kd_propinsi == fxNop["kd_propinsi"],
                   cls.kd_dati2 == fxNop["kd_dati2"],
                   cls.kd_kecamatan == fxNop["kd_kecamatan"],
                   cls.kd_kelurahan == fxNop["kd_kelurahan"],
                   cls.kd_blok == fxNop["kd_blok"],
                   cls.no_urut == fxNop["no_urut"],
                   cls.kd_jns_op == fxNop["kd_jns_op"])

    @classmethod
    def query_by_nop_thn(cls, nop, thn):
        fxNop = FixNop(nop)
        return cls.query(). \
            filter(cls.kd_propinsi == fxNop["kd_propinsi"],
                   cls.kd_dati2 == fxNop["kd_dati2"],
                   cls.kd_kecamatan == fxNop["kd_kecamatan"],
                   cls.kd_kelurahan == fxNop["kd_kelurahan"],
                   cls.kd_blok == fxNop["kd_blok"],
                   cls.no_urut == fxNop["no_urut"],
                   cls.kd_jns_op == fxNop["kd_jns_op"],
                   cls.thn_pajak_sppt == thn)

    @classmethod
    def query_bayar(cls, nop, tahun):
        fxNop = FixNop(nop)
        q = PbbmDBSession.query(func.sum(cls.denda_sppt).label("denda"),
                                func.sum(cls.jml_sppt_yg_dibayar).label("bayar"),
                                func.max(cls.pembayaran_sppt_ke).label("ke")). \
            filter(cls.kd_propinsi == fxNop["kd_propinsi"],
                   cls.kd_dati2 == fxNop["kd_dati2"],
                   cls.kd_kecamatan == fxNop["kd_kecamatan"],
                   cls.kd_kelurahan == fxNop["kd_kelurahan"],
                   cls.kd_blok == fxNop["kd_blok"],
                   cls.no_urut == fxNop["no_urut"],
                   cls.kd_jns_op == fxNop["kd_jns_op"],
                   cls.thn_pajak_sppt == tahun)
        if not q:
            return
        return q

    @classmethod
    def reversal(cls, id):
        fxBayar = FixBayar(id)
        q = cls.query_id(id)
        row = q.first()
        if row:
            row.denda_sppt = 0
            row.jml_sppt_yg_dibayar = 0
            PbbmDBSession.add(row)
            PbbmDBSession.flush()
            Sppt.set_status(id, 0)

        return row

    @classmethod
    def piutang(cls, nop, tahun, tanggal=datetime.now().date()):
        row = Sppt.query_id(nop + tahun). \
            filter(Sppt.status_pembayaran_sppt < '2').first()
        if not row:
            return
        pokok = row.pbb_yg_harus_dibayar_sppt
        jatuh_tempo = row.tgl_jatuh_tempo_sppt
        bayar = PembayaranSppt.get_bayar(nop, tahun).first()
        ke = 1
        if bayar.bayar or bayar.denda or bayar.ke:
            pokok -= (bayar.bayar - bayar.denda)
            ke = bayar.ke + 1
        denda = hitung_denda(pokok, jatuh_tempo, tanggal)

        return dict(pokok=pokok,
                    denda=denda,
                    jatuh_tempo=jatuh_tempo,
                    ke=ke)

    # @classmethod
    # def get_by_nop(cls, p_nop):
    # pkey = FixLength(NOP)
    # pkey.set_raw(p_nop)
    # query = cls.query_data()
    # return query.filter_by(kd_propinsi = pkey['kd_propinsi'],
    # kd_dati2 = pkey['kd_dati2'],
    # kd_kecamatan = pkey['kd_kecamatan'],
    # kd_kelurahan = pkey['kd_kelurahan'],
    # kd_blok = pkey['kd_blok'],
    # no_urut = pkey['no_urut'],
    # kd_jns_op = pkey['kd_jns_op'],)
    # @classmethod
    # def get_by_nop_thn(cls, p_nop, p_tahun):
    # query = cls.get_by_nop(p_nop)
    # return query.filter_by(thn_pajak_sppt = p_tahun)

    # @classmethod
    # def get_by_kelurahan(cls, p_kode, p_tahun):
    # pkey = FixLength(DESA)
    # pkey.set_raw(p_kode)
    # query = cls.query_data()
    # return query.filter_by(kd_propinsi = pkey['kd_propinsi'],
    # kd_dati2 = pkey['kd_dati2'],
    # kd_kecamatan = pkey['kd_kecamatan'],
    # kd_kelurahan = pkey['kd_kelurahan'],
    # thn_pajak_sppt = p_tahun)

    # @classmethod
    # def get_by_kecamatan(cls, p_kode, p_tahun):
    # pkey = FixLength(KECAMATAN)
    # pkey.set_raw(p_kode)
    # query = cls.query_data()
    # return query.filter_by(kd_propinsi = pkey['kd_propinsi'],
    # kd_dati2 = pkey['kd_dati2'],
    # kd_kecamatan = pkey['kd_kecamatan'],
    # kd_kelurahan = pkey['kd_kelurahan'],
    # thn_pajak_sppt = p_tahun)

    # @classmethod
    # def get_by_tanggal(cls, p_kode, p_tahun):
    # pkey = DateVar
    # p_kode = re.sub("[^0-9]", "", p_kode)
    # pkey.set_raw(p_kode)
    # query = cls.query_data()
    # return query.filter_by(tgl_pembayaran_sppt = pkey.get_value)

    # @classmethod
    # def get_rekap_by_kecamatan(cls, p_kode, p_tahun):
    # pkey = FixLength(KECAMATAN)
    # pkey.set_raw(p_kode)
    # query = PbbmDBSession.query(cls.kd_propinsi, cls.kd_dati2, cls.kd_kecamatan, cls.kd_kelurahan,
    # func.sum(cls.denda_sppt).label('denda'),
    # func.sum(cls.pbb_yg_dibayar_sppt).label('jumlah') ).\
    # group_by(cls.kd_propinsi, cls.kd_dati2, cls.kd_kecamatan, cls.kd_kelurahan)
    # return query.filter_by(kd_propinsi = pkey['kd_propinsi'],
    # kd_dati2 = pkey['kd_dati2'],
    # kd_kecamatan = pkey['kd_kecamatan'],
    # thn_pajak_sppt = p_tahun)

    # @classmethod
    # def get_rekap_by_thn(cls, p_tahun):
    # query = PbbmDBSession.query(cls.kd_propinsi, cls.kd_dati2, cls.kd_kecamatan,
    # func.sum(cls.denda_sppt).label('denda'),
    # func.sum(cls.pbb_yg_dibayar_sppt).label('jumlah')).\
    # group_by(cls.kd_propinsi, cls.kd_dati2, cls.kd_kecamatan)
    # return query.filter_by(thn_pajak_sppt = p_tahun)