spt_reklame.py 8.6 KB
import math
from sqlalchemy import (
    Column, ForeignKey, Integer, String, Float, Text, between, desc,)

from opensipkd.pjdl.models.pajak import relationship
from dateutil.relativedelta import relativedelta
from . import (
    PAD_TABLE_ARGS, Base, DefaultModel, PjdlPajakTarif,
    PjdlReklameKelasJalan, PjdlReklameLetak, PjdlReklameLokasi,
    PjdlReklameNilaiKelasJalan, PjdlReklameNilaiLokasi, PjdlReklameProduk, PjdlReklameSatuanNilaiStrategis,  PjdlReklameSudutPandang,
    PjdlKecamatan, PjdlKelurahan, PjdlInvoice, PjdlPajak)


def get_lama(masapajak=1, masadari=None, masasd=None):
    lama = 0
    if masapajak == 1:
        # tahunan
        lama = 1
    elif masapajak == 2:
        # smesteran
        diff = relativedelta(dt1=masasd, dt2=masadari)
        lama = math.ceil(diff.months/6)
        if masasd >= masadari+relativedelta(months=lama*6):
            lama += 1
    elif masapajak == 3:
        # triwulanan
        diff = relativedelta(dt1=masasd, dt2=masadari)
        lama = math.ceil(diff.months/3)
        if masasd >= masadari+relativedelta(months=lama*3):
            lama += 1
    elif masapajak == 4:
        # bulanan
        diff = relativedelta(dt1=masasd, dt2=masadari)
        lama = math.ceil(diff.months)
        if masasd >= masadari+relativedelta(months=lama):
            lama += 1
    elif masapajak == 5:
        # Mingguan
        diff = relativedelta(dt1=masasd, dt2=masadari)
        lama = math.ceil(diff.days/7)
        if masasd >= masadari+relativedelta(days=lama*7):
            lama += 1
    elif masapajak == 6:
        # harian
        diff = relativedelta(dt1=masasd, dt2=masadari)
        lama = diff.days+1

    return lama


class PjdlSptRkDet(Base, DefaultModel):
    __tablename__ = 'pad_spt_rk_det'
    id = Column(Integer, primary_key=True)
    spt_id = Column(Integer, ForeignKey(PjdlInvoice.id))
    reklame_ke = Column(Integer)
    alamat = Column(String(255))
    kecamatan_id = Column(Integer, ForeignKey(PjdlKecamatan.id))
    kelurahan_id = Column(Integer, ForeignKey(PjdlKelurahan.id))
    pajak_id = Column(Integer, ForeignKey(PjdlPajak.id))
    letak_reklame_id = Column(Integer, ForeignKey(PjdlReklameLetak.id))
    lokasi_id = Column(Integer, ForeignKey(PjdlReklameLokasi.id))
    kelas_jalan_id = Column(Integer, ForeignKey(PjdlReklameKelasJalan.id))
    sudut_pandang_id = Column(Integer, ForeignKey(PjdlReklameSudutPandang.id))
    jenis_produk_reklame_id = Column(
        Integer, ForeignKey(PjdlReklameProduk.id))
    lokasi_nilai = Column(Float)
    kelas_jalan_nilai = Column(Float)
    sudut_pandang_nilai = Column(Float)
    satuan_nilai_strategis = Column(Float)
    panjang = Column(Float)
    lebar = Column(Float)
    tinggi = Column(Float)
    muka = Column(Float)
    banyak = Column(Float)
    luas = Column(Float)
    njopr = Column(Integer)
    nspr = Column(Integer)
    nsr = Column(Integer)
    tinggi_nilai = Column(Float)
    r_nsr = Column(Integer)
    titik_reklame_id = Column(Text)
    nopol = Column(Text)
    __table_args__ = PAD_TABLE_ARGS
    kecamatan = relationship('PjdlKecamatan', backref='pad_spt_rek_dets')
    kelurahan = relationship('PjdlKelurahan', backref='pad_spt_rek_dets')
    letak_reklame = relationship(
        'PjdlReklameLetak', backref='pad_spt_rek_dets')
    lokasi = relationship('PjdlReklameLokasi', backref='pad_spt_rek_dets')
    kelas_jalan = relationship(
        'PjdlReklameKelasJalan', backref='pad_spt_rek_dets')
    sudut_pandang = relationship(
        'PjdlReklameSudutPandang', backref='pad_spt_rek_dets')
    spt = relationship(
        'PjdlInvoice', backref='pad_spt_rek_dets')

    def get_tarif(self):
        masadari = self.spt.masadari
        return PjdlPajakTarif.query_from(
            columns=[
                PjdlPajakTarif.tarif,
                PjdlPajakTarif.minomset,
                PjdlPajakTarif.reklame,
                PjdlPajak.jatuhtempo,
                PjdlPajak.multiple,
                PjdlPajak.masapajak,
                PjdlPajak.rekening_id])\
            .filter(PjdlPajakTarif.pajak_id == self.pajak_id,
                    PjdlPajakTarif.tmt < masadari)\
            .outerjoin(PjdlPajak, PjdlPajak.id == PjdlPajakTarif.pajak_id)\
            .order_by(desc(PjdlPajakTarif.tmt)).first()

    def get_nilai_lokasi(self):
        nilai_lokasi = PjdlReklameNilaiLokasi.query()\
            .filter(PjdlReklameNilaiLokasi.lokasi_id == self.lokasi_id,
                    PjdlReklameNilaiLokasi.pajak_id == self.pajak_id).first()
        return nilai_lokasi and nilai_lokasi.nilai or 0

    def get_nilai_kelas_jalan(self):
        sudut_pandang_id = self.sudut_pandang_id and self.sudut_pandang_id or 0
        nilai_kelas_jalan = PjdlReklameNilaiKelasJalan.query()\
            .filter(PjdlReklameNilaiKelasJalan.kelas_jalan_id == self.kelas_jalan_id,
                    PjdlReklameNilaiKelasJalan.pajak_id == self.pajak_id).first()
        return nilai_kelas_jalan and nilai_kelas_jalan.nilai or 0

    def get_satuan_nilai_strategis(self):
        satuan_nilai_strategis = PjdlReklameSatuanNilaiStrategis.query()\
            .filter(PjdlReklameSatuanNilaiStrategis.pajak_id == self.pajak_id,
                    PjdlReklameSatuanNilaiStrategis.kelas_jalan_id == self.kelas_jalan_id
                    ).first()
        return satuan_nilai_strategis and satuan_nilai_strategis.nilai or 0

    def get_tarif_letak(self):
        letak = PjdlReklameLetak.query_id(self.spt.r_letak_reklame_id).first()
        return letak and letak.tarif or 0

    def get_tarif_produk(self):
        produk = PjdlReklameProduk.query_id(
            self.spt.r_jenis_produk_reklame_id).first()
        return produk and produk.tarif or 0

    def calculate(self):
        masadari = self.spt.masadari
        masasd = self.spt.masasd
        pajak_tarif = self.get_tarif()
        tarif = pajak_tarif.tarif
        multiple = pajak_tarif.multiple
        masa_pajak = pajak_tarif.masapajak  # r_bayar_id
        self.njopr = pajak_tarif.reklame

        tinggi_nilai = 0
        sudut_pandang_nilai = 0

        self.lokasi_nilai = self.get_nilai_lokasi()
        self.kelas_jalan_nilai = self.get_nilai_kelas_jalan()
        self.r_nsr = self.get_satuan_nilai_strategis()

        self.nspr = self.lokasi_nilai + self.kelas_jalan_nilai + self.njopr

        self.sudut_pandang_nilai = 0
        self.tinggi_nilai = 0
        self.luas = self.panjang * self.lebar
        self.r_lama = get_lama(masa_pajak, masadari, masasd)
        self.nsr = (self.r_nsr * self.luas *
                    self.muka * self.banyak * self.r_lama) / tarif  # 0.25

    def get_satuan_nilai_strategis_v3(self):
        pajak = PjdlPajak.query_id(self.spt.pajak_id).first()
        satuan_nilai_strategis = PjdlReklameSatuanNilaiStrategis.query()\
            .filter(PjdlReklameSatuanNilaiStrategis.status_reklame_id == pajak.status_reklame_id,
                    PjdlReklameSatuanNilaiStrategis.jenis_produk_reklame_id == self.spt.r_jenis_produk_reklame_id,
                    between(self.tinggi,
                            PjdlReklameSatuanNilaiStrategis.luas_min, PjdlReklameSatuanNilaiStrategis.luas_max)
                    ).first()
        return satuan_nilai_strategis and satuan_nilai_strategis.satuan_nilai_strategis or 0

    def get_skor_kelas_jalan_v3(self):
        nilai_kelas_jalan = PjdlReklameNilaiKelasJalan.query()\
            .filter(PjdlReklameNilaiKelasJalan.kelas_jalan_id == self.kelas_jalan_id,
                    PjdlReklameNilaiKelasJalan.sudut_pandang_id == self.sudut_pandang_id).first()
        return nilai_kelas_jalan and nilai_kelas_jalan.skor or 0

    def calculatev3(self):
        self.luas = self.panjang*self.lebar*self.muka
        self.tinggi_nilai = 0
        self.lokasi_nilai = self.get_nilai_lokasi()
        self.sudut_pandang_nilai = self.get_skor_kelas_jalan_v3()
        self.tinggi_nilai = self.get_satuan_nilai_strategis_v3()
        pajak_tarif = self.get_tarif()
        tarif = pajak_tarif.tarif
        self.kelas_jalan_nilai = self.lokasi_nilai
        self.satuan_nilai_strategis = 0
        masa_pajak = pajak_tarif.masapajak
        masa_pemasangan = get_lama(
            masa_pajak, self.spt.masadari, self.spt.masasd)
        hdur = pajak_tarif.reklame * masa_pemasangan
        self.njopr = (self.luas * hdur) + (self.tinggi * self.tinggi_nilai)
        self.nspr = self.sudut_pandang_nilai * self.lokasi_nilai
        self.nsr = self.njopr + self.nspr
        self.pajak = tarif * self.nsr
        tarif_produk = self.get_tarif_produk()
        if tarif_produk:
            self.pajak = (1+tarif_produk)*self.pajak

        tarif_letak = self.get_tarif_letak()
        if tarif_letak:
            self.pajak = (1+tarif_letak)*self.pajak
        self.pajak_dibayar = self.pajak * self.banyak