doc.py 5.06 KB
from opensipkd.string import FixLength
from opensipkd.iso8583.network.doc import Doc as NetworkDoc
from opensipkd.iso8583.bjb.pbb.majalengka import Doc as BaseDoc
from opensipkd.iso8583.bjb.structure import (
    ERR_NOT_AVAILABLE,
    ERR_ALREADY_PAID,
    ERR_INSUFFICIENT_FUND,
    ERR_PAYMENT_NOT_FOUND,
    ERR_INVOICE_OPEN,
    )
from sismiop.services.base import get_nop
from .structure import (
    TRANSACTION_BITS,
    INQUIRY_CODE,
    PAYMENT_CODE,
    INVOICE_PROFILE,
    RC_ALREADY_PAID,
    RC_NOT_AVAILABLE,
    RC_PAYMENT_NOT_FOUND,
    RC_ALREADY_CANCELLED,
    RC_OTHER,
    )
from .models import Log


class Doc(BaseDoc):
    def get_bit_definition(self):  # Override
        return TRANSACTION_BITS

    def get_inquiry_code(self):  # Override
        return INQUIRY_CODE

    def get_payment_code(self):  # Override
        return PAYMENT_CODE

    def get_log_model(self):  # Overrride
        return Log

    def get_inquiry_bits(self):  # Override
        return [4, 48]

    def get_payment_bits(self):  # Override
        return [3, 4, 11, 37, 48]

    def set_invoice_id(self, value):
        self.setBit(48, value)

    def get_invoice_id(self):
        return self.getBit(48).strip().lstrip('0')

    def get_transaction_time(self):
        raw = self.getBit(7)
        self.transaction_time.set_raw(raw)
        return self.transaction_time.get_value()

    def getBit(self, bit):  # Override
        if bit in (18, 41, 42, 43):
            return
        return super().getBit(bit)

    def set_invoice_profile(self, raw):
        self.setBit(48, raw)

    def set_ntb(self, v):  # Override
        self.setBit(37, v)

    def get_ntb(self):  # Override
        return self.get_value(37)

    def set_ntp(self, v):  # Override
        self.invoice_profile['NTP'] = v

    def get_ntp(self):  # Override
        return self.invoice_profile['NTP']

    def copy_inquiry_bits(self):
        self.copy([3, 7, 11, 32, 37, 48])

    def set_all_invoice_profile(self, inq):  # Override
        p = FixLength(INVOICE_PROFILE)
        p.from_dict({
            'Invoice ID': self.get_invoice_id(),
            'Nama': inq.get_nama_wp(),
            'Nama Kecamatan': inq.get_kecamatan_op(),
            'Nama Kelurahan': inq.get_kelurahan_op(),
            'Tagihan': inq.tagihan,
            'Denda': inq.denda,
            'Total Bayar': inq.tagihan + inq.denda})
        self.invoice_profile = p
        self.set_invoice_profile_bit()
        DBSession = self.get_db_session()
        inv = inq.invoice
        nop = get_nop(inv)
        t_inq_id = self.inquiry_sequence.execute(DBSession.bind)
        t_inq = self.iso_inquiry_model(
                    id=t_inq_id, nop=nop, propinsi=inv.kd_propinsi,
                    kabupaten=inv.kd_dati2, kecamatan=inv.kd_kecamatan,
                    kelurahan=inv.kd_kelurahan, blok=inv.kd_blok,
                    urut=inv.no_urut, jenis=inv.kd_jns_op,
                    tahun=inv.thn_pajak_sppt, tgl=inq.tgl_bayar,
                    tagihan=inq.tagihan, denda=inq.denda,
                    persen_denda=inq.persen_denda,
                    jatuh_tempo=inq.get_jatuh_tempo(),
                    bulan_tunggakan=inq.bln_tunggakan,
                    pengirim=self.get_bank_id())
        DBSession.add(t_inq)

    def set_invoice_profile_bit(self):
        self.setBit(48, self.invoice_profile.get_raw())
        self.long_bits[48] = self.invoice_profile.to_dict()

    def do_payment(self, inq):  # Override
        pay = super().do_payment(inq)
        self.set_invoice_profile_bit()
        return pay

    def set_inquiry_request(self, tgl_bayar=None):  # Override
        NetworkDoc.set_inquiry_request(self)
        self.set_bank_id('009')

    def set_payment_request(self, tgl_bayar=None):  # Override
        NetworkDoc.set_payment_request(self)
        self.set_bank_id('009')
        if not tgl_bayar:
            tgl_bayar = datetime.now()
        inq = self.get_inquiry_response()
        if inq:
            self.set_bits_from_inquiry(inq)

    def ack_not_found(self):  # Override
        msg = ERR_NOT_FOUND.format(invoice_id=self.get_invoice_id())
        self.ack(RC_NOT_AVAILABLE, msg)

    def ack_not_available(self):  # Override
        msg = ERR_NOT_AVAILABLE.format(invoice_id=self.get_invoice_id())
        self.ack(RC_NOT_AVAILABLE, msg)

    def ack_already_paid(self):  # Override
        msg = ERR_ALREADY_PAID.format(invoice_id=self.get_invoice_id())
        self.ack(RC_ALREADY_PAID, msg)

    def ack_insufficient_fund(self, total):  # Override
        msg = ERR_INSUFFICIENT_FUND.format(
                invoice_id=self.get_invoice_id(),
                bayar=self.from_iso.get_amount(),
                tagihan=total)
        self.ack(RC_INSUFFICIENT_FUND, msg)

    def ack_payment_not_found(self):  # Override
        msg = ERR_PAYMENT_NOT_FOUND.format(invoice_id=self.get_invoice_id())
        self.ack(RC_PAYMENT_NOT_FOUND, msg)

    def ack_invoice_open(self):  # Override
        msg = ERR_INVOICE_OPEN.format(invoice_id=self.get_invoice_id())
        self.ack(RC_ALREADY_CANCELLED, msg)

    def ack_other(self, msg):  # Override
        self.ack(RC_OTHER, msg)