only_h2h.py 3.63 KB
from opensipkd.waktu import dmyhms
from opensipkd.string import FixLength
from sismiop.services.base import INVOICE_ID
from opensipkd.iso8583.bjb.pbb.structure import (
    PAYMENT_CODE,
    INVOICE_PROFILE,
    )
from opensipkd.iso8583.bjb.pbb.models import Log
from ..common import (
    BaseApp,
    one_day,
    get_channel_name,
    InvalidSource,
    )
from ..models import Pbb


class App(BaseApp):
    conf_name = 'pbb payment last date'
    report_orm = Pbb
    va_product_code = '02'

    def get_before(self, r):
        q = self.rpt_session.query(Pbb).filter_by(
            kd_propinsi=r['kd_propinsi'], kd_dati2=r['kd_dati2'],
            kd_kecamatan=r['kd_kecamatan'], kd_kelurahan=r['kd_kelurahan'],
            kd_blok=r['kd_blok'], no_urut=r['no_urut'],
            kd_jns_op=r['kd_jns_op'], thn_pajak_sppt=r['thn_pajak_sppt'])
        q = q.filter(Pbb.id < r['id'])
        q = q.order_by(Pbb.id.desc())
        return q.first()

    def create_data(self, log_iso):  # Override
        self.invoice_id = log_iso.bit_061
        if log_iso.mti == '0210' and log_iso.bit_039 != '00':
            raise InvalidSource('payment gagal')
        inv_id = FixLength(INVOICE_ID)
        inv_id.set_raw(self.invoice_id)
        channel_nama = get_channel_name(
            log_iso.bit_018, log_iso.bit_032, log_iso.bit_041, log_iso.bit_042,
            log_iso.bit_043)
        channel_kode = log_iso.bit_018 or '0000'
        print(log_iso.id)
        r = dict(
            id=log_iso.id, kd_propinsi=inv_id['Propinsi'],
            kd_dati2=inv_id['Kabupaten'], kd_kecamatan=inv_id['Kecamatan'],
            kd_kelurahan=inv_id['Kelurahan'], kd_blok=inv_id['Blok'],
            no_urut=inv_id['Urut'], kd_jns_op=inv_id['Jenis'],
            thn_pajak_sppt=inv_id['Tahun'], pembayaran_sppt_ke=1,
            stan=log_iso.bit_011, ntb=log_iso.bit_048,
            jml_sppt_yg_dibayar=float(log_iso.bit_004),
            channel_kode=channel_kode, channel_nama=channel_nama,
            bank_id=log_iso.bit_032, user_id=log_iso.bit_107)
        if log_iso.mti == '0210':
            profile = log_iso.bit_062_data
            r.update(dict(
                tgl_pembayaran_sppt=log_iso.created.date(),
                tgl_rekam_byr_sppt=log_iso.created,
                denda_sppt=float(profile['Denda']),
                discount=float(profile['Discount']),
                nm_wp_sppt=profile['Nama'],
                pbb_yg_harus_dibayar_sppt=float(profile['Tagihan'])))
        before = self.get_before(r)
        if before:
            if log_iso.mti == '0210':
                r['pembayaran_sppt_ke'] = before.pembayaran_sppt_ke + 1
            else:  # mti = 0400 = reversal
                r['id'] = before.id
                r['tgl_batal'] = log_iso.created
                r['jml_sppt_yg_dibayar'] = 0
                r['denda_sppt'] = r['discount'] = 0
                r['pbb_yg_harus_dibayar_sppt'] = 0
        elif log_iso.mti == '0400':
            raise InvalidSource(
                f'ID {log_iso.id} tidak ada yang perlu dibatalkan')
        return r

    def get_report(self, log_iso):  # Override
        q = self.rpt_session.query(Pbb).filter_by(id=log_iso.id)
        return q.first()

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

    def get_filter_query(self, q):  # Override
        return q.filter(
            Log.created >= self.tgl_awal,
            Log.created < self.tgl_akhir + one_day,
            Log.bit_003 == PAYMENT_CODE,
            Log.mti.in_(['0210', '0400']))

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