sukabumi_kota.py 6.01 KB
from ISO8583.ISO8583 import BitNotSet
from sismiop.services.sukabumi_kota import get_id
from sismiop.models.sukabumi_kota import (
    Sppt,
    PembayaranSppt as Psppt,
    )
from opensipkd.waktu import dmyhms
from opensipkd.iso8583.bjb.pbb.default import Doc
from opensipkd.iso8583.bjb.pbb.default.models import Inquiry
from ..models import Pbb
from ..common import (
    get_iso,
    get_channel_info_by_iso,
    get_channel_name_by_row,
    get_channel_name_by_dict,
    one_day,
    InvalidSource,
    )
from .default import (
    App as BaseApp,
    AlternativePayment as Payment,
    to_date,
    )


class App(BaseApp):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.iso_inquiry_orm = Inquiry
        self.iso_payment_orm = Payment
        self.base_q_iso = self.prod_session.query(
            self.iso_payment_orm, self.iso_inquiry_orm).filter(
            self.iso_payment_orm.inquiry_id == self.iso_inquiry_orm.id)
        self.base_q_sppt = self.prod_session.query(Sppt)

    def get_sppt(self, psppt):
        q = self.base_q_sppt.filter_by(
                KD_PROPINSI=psppt.KD_PROPINSI,
                KD_DATI2=psppt.KD_DATI2,
                KD_KECAMATAN=psppt.KD_KECAMATAN,
                KD_KELURAHAN=psppt.KD_KELURAHAN,
                KD_BLOK=psppt.KD_BLOK,
                NO_URUT=psppt.NO_URUT,
                KD_JNS_OP=psppt.KD_JNS_OP,
                THN_PAJAK_SPPT=psppt.THN_PAJAK_SPPT)
        return q.first()

    def get_iso_row(self, psppt):
        iso_inq = self.iso_inquiry_orm
        awal = psppt.TGL_REKAM_BYR_SPPT.date()
        akhir = awal + one_day
        q = self.get_iso_query(psppt)
        q = q.filter(iso_inq.tgl >= awal, iso_inq.tgl < akhir)
        return q.first()

    def get_iso_query(self, psppt):
        iso_inq = self.iso_inquiry_orm
        q = self.base_q_iso.filter_by(
                propinsi=psppt.KD_PROPINSI,
                kabupaten=psppt.KD_DATI2,
                kecamatan=psppt.KD_KECAMATAN,
                kelurahan=psppt.KD_KELURAHAN,
                blok=psppt.KD_BLOK,
                urut=psppt.NO_URUT,
                jenis=psppt.KD_JNS_OP,
                tahun=psppt.THN_PAJAK_SPPT,
                ke=psppt.PEMBAYARAN_SPPT_KE)
        return q.order_by(iso_inq.id.desc())

    def warning_date(self, psppt):
        q = self.get_iso_query(psppt)
        row = q.first()
        if row:
            pay, inq = row
            msg = f'Invoice ID {self.invoice_id} berbeda tanggal dengan '\
                  f'ISO8583 yaitu {psppt.TGL_REKAM_BYR_SPPT.date()} vs '\
                  f'{inq.tgl}'
            self.log.warning(msg)

    def get_iso_v1(self, psppt):
        if self.h2h_session:
            return
        row = self.get_iso_row(psppt)
        if not row:
            self.warning_date(psppt)
            return
        row_pay, row_inq = row
        iso = get_iso(row_pay.iso_request, Doc)
        info = get_channel_info_by_iso(iso)
        try:
            user_id = iso.getBit(107)
        except BitNotSet:
            user_id = None
        try:
            channel_id = iso.get_channel().strip()
        except BitNotSet:
            channel_id = '0000'
        return channel_id, info['channel'], iso.get_stan(), \
            iso.get_ntb(), str(iso.get_bank_id()), user_id, row_inq.tgl

    def get_source(self, psppt):
        source = self.get_iso_v1(psppt)
        if source:
            channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
                tgl_inquiry = source
        else:
            stan = ntb = bank_id = user_id = tgl_inquiry = None
            channel_kode = '0000'
            channel_nama = 'MANUAL'
        return channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
            tgl_inquiry

    def create_data(self, psppt):  # Override
        self.invoice_id = get_id(psppt)
        sppt = self.get_sppt(psppt)
        if not sppt:
            msg = f'Invoice ID {self.invoice_id} tidak ada di tabel sppt'
            raise InvalidSource(msg)
        channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
            tgl_inquiry = self.get_source(psppt)
        bayar = psppt.JML_SPPT_YG_DIBAYAR
        denda = psppt.DENDA_SPPT or 0
        pokok = sppt.PBB_YG_HARUS_DIBAYAR_SPPT
        tgl = to_date(psppt.TGL_PEMBAYARAN_SPPT)
        if ntb:
            ntb = ntb.strip()
        return dict(
            kd_propinsi=psppt.KD_PROPINSI, kd_dati2=psppt.KD_DATI2,
            kd_kecamatan=psppt.KD_KECAMATAN, kd_kelurahan=psppt.KD_KELURAHAN,
            kd_blok=psppt.KD_BLOK, no_urut=psppt.NO_URUT,
            kd_jns_op=psppt.KD_JNS_OP, thn_pajak_sppt=psppt.THN_PAJAK_SPPT,
            pembayaran_sppt_ke=psppt.PEMBAYARAN_SPPT_KE, stan=stan, ntb=ntb,
            jml_sppt_yg_dibayar=bayar, denda_sppt=denda, discount=0,
            tgl_pembayaran_sppt=tgl, tgl_inquiry=tgl_inquiry,
            tgl_rekam_byr_sppt=psppt.TGL_REKAM_BYR_SPPT,
            nm_wp_sppt=sppt.NM_WP_SPPT, channel_kode=channel_kode,
            channel_nama=channel_nama, bank_id=bank_id, user_id=user_id,
            pbb_yg_harus_dibayar_sppt=pokok)

    def get_report(self, psppt):  # Override
        q = self.rpt_session.query(Pbb).filter_by(
                 kd_propinsi=psppt.KD_PROPINSI,
                 kd_dati2=psppt.KD_DATI2,
                 kd_kecamatan=psppt.KD_KECAMATAN,
                 kd_kelurahan=psppt.KD_KELURAHAN,
                 kd_blok=psppt.KD_BLOK,
                 no_urut=psppt.NO_URUT,
                 kd_jns_op=psppt.KD_JNS_OP,
                 thn_pajak_sppt=psppt.THN_PAJAK_SPPT,
                 pembayaran_sppt_ke=psppt.PEMBAYARAN_SPPT_KE)
        return q.first()

    def get_last_time(self):  # Override
        return dmyhms(self.last_pay.TGL_REKAM_BYR_SPPT)

    def get_filter_query(self, q):  # Override
        return q.filter(
            Psppt.TGL_REKAM_BYR_SPPT >= self.tgl_awal,
            Psppt.TGL_REKAM_BYR_SPPT < self.tgl_akhir + one_day)

    def get_payment_query(self):  # Override
        q = self.prod_session.query(Psppt)
        q = self.get_filter_query(q)
        return q.order_by(Psppt.TGL_REKAM_BYR_SPPT)