query_tangsel.py 3.81 KB
from datetime import date

from .query import CalculateInvoice as BaseCalculateInvoice

# DISKON POKOK JAN-JUN 2021
DISC_TAHUN_PAJAK = '2021'
DISC_POKOK_JAN_JUN = {
    2021: {
        1: 0.15,
        2: 0.15,
        3: 0.15,
        4: 0.1,
        5: 0.05,
        6: 0.05,
    },
}

# DISKON JUL-DES 2021 @20210625
# 1. TAHUN PAJAK < 2014 DISKON POKOK 75%
# 2. TAHUN PAJAK 2014-2020 DISKON POKOK 40%
# 3. TAHUN PAJAK < 2021 DISKON DENDA 100%
# 4. BERLAKU MULAI 1 JULI 2021 sd 31 DES 2021
BERLAKU_MIN = date(2021, 7, 1)
BERLAKU_MAX = date(2021, 12, 31)
THN_PAJAK_MIN = 2014
THN_PAJAK_MAX = 2021
DISC_DENDA_JUL_DES = 1.0
DISC_POKOK_JUL_DES = {
    2014: 0.75,
    2021: 0.4,
}


def not_null(invoice):
    if invoice.pbb_terhutang_sppt is None:
        invoice.pbb_terhutang_sppt = 0
    if invoice.faktor_pengurang_sppt is None:
        invoice.faktor_pengurang_sppt = 0


class CalculateInvoice(BaseCalculateInvoice):
    def hitung_discount(self):  # Override
        self.discount_denda = self.hitung_discount_denda()
        self.discount_pokok = self.hitung_discount_pokok()
        self.discount = self.discount_denda + self.discount_pokok

    def hitung_discount_denda(self):
        if self.denda > 0 and int(self.tahun) < THN_PAJAK_MAX \
                and BERLAKU_MIN <= self.tgl_bayar.date() <= BERLAKU_MAX:
            self.denda_sblm_diskon = self.denda
            return int(self.denda * DISC_DENDA_JUL_DES)
        return 0

    def hitung_discount_pokok(self):
        faktor_pengurang = self.invoice.faktor_pengurang_sppt or 0
        if faktor_pengurang > 0:
            return 0
        return self.hitung_discount_pokok2()

    def hitung_discount_pokok2(self):
        if BERLAKU_MIN <= self.tgl_bayar.date() <= BERLAKU_MAX:
            if int(self.tahun) < THN_PAJAK_MIN:
                disc = DISC_POKOK_JUL_DES.get(THN_PAJAK_MIN)
                return int(self.tagihan * disc)
            elif THN_PAJAK_MIN <= int(self.tahun) < THN_PAJAK_MAX:
                disc = DISC_POKOK_JUL_DES.get(THN_PAJAK_MAX)
                return int(self.tagihan * disc)

        if self.invoice.thn_pajak_sppt == DISC_TAHUN_PAJAK:
            bulan_disc = DISC_POKOK_JAN_JUN.get(self.tgl_bayar.year)
            if bulan_disc:
                disc = bulan_disc.get(self.tgl_bayar.month)
                if disc:
                    return int(self.tagihan * disc)
        return 0

    def set_faktor_pengurang_sppt(self, payment):
        if not payment.discount_pokok:
            return
        not_null(self.invoice)
        self.invoice.faktor_pengurang_sppt += payment.discount_pokok
        self.invoice.pbb_yg_harus_dibayar_sppt = \
            self.invoice.pbb_terhutang_sppt - \
            self.invoice.faktor_pengurang_sppt

    def before_save(self, bayar):  # Override
        bayar.denda_sblm_diskon = self.denda_sblm_diskon
        bayar.discount = self.discount_pokok + self.discount_denda
        bayar.discount_pokok = self.discount_pokok
        bayar.discount_denda = self.discount_denda

        tagihan_netto = self.tagihan - self.discount_pokok
        denda_netto = self.denda - self.discount_denda
        bayar.jml_sppt_yg_dibayar = tagihan_netto + denda_netto
        bayar.denda_sppt = denda_netto

        self.set_faktor_pengurang_sppt(bayar)

    def belum_lunas_di_periode_discount(self):
        Sppt = self.models.Invoice
        q = self.DBSession.query(Sppt)
        q = self.get_filter_op(q)
        q = q.filter(
            Sppt.thn_pajak_sppt.in_(THN_DISC),
            Sppt.status_pembayaran_sppt != '1')
        return q.first()

    def get_filter_op(self, q):
        return q.filter_by(
            kd_propinsi=self.propinsi,
            kd_dati2=self.kabupaten,
            kd_kecamatan=self.kecamatan,
            kd_kelurahan=self.kelurahan,
            kd_blok=self.blok,
            no_urut=self.urut,
            kd_jns_op=self.jenis)