structure.py 2.06 KB
import colander
from opensipkd.string.row import Row
from .exceptions import InternalError


INQUIRY_RESP_FIELDS = (
    'Response Code',
    'Biller Name',
    'Bill Amount',
    'Bill Ref',  # STAN
    'Notification Message')

PAYMENT_RESP_FIELDS = (
    'Response Code',
    'Transaction ID',  # NTP
    'Bill Ref',  # STAN 
    'Notification Message')


class DataRequest(colander.Schema):
    merchant = colander.SchemaNode(colander.String())
    terminal = colander.SchemaNode(colander.String())
    pwd = colander.SchemaNode(colander.String())
    trx_type = colander.SchemaNode(colander.String())
    msisdn = colander.SchemaNode(colander.String())
    acc_no = colander.SchemaNode(colander.String())
    msg = colander.SchemaNode(colander.String(), missing=colander.drop)
    trx_date = colander.SchemaNode(colander.String())
    amount = colander.SchemaNode(colander.String(), missing=colander.drop)
    # Saat payment dan reversal, diperoleh dari inquiry response
    bill_ref = colander.SchemaNode(colander.String(), missing=colander.drop)
    # Saat payment dan reversal, dibuat saat payment request (NTB)
    trx_id = colander.SchemaNode(colander.String(), missing=colander.drop)


class InquiryResponse(Row):
    def __init__(self):
        super().__init__(INQUIRY_RESP_FIELDS)

    def __setitem__(self, name, value):
        if value.find(':') > -1:
            msg = 'Ada titik dua pada {} yaitu {}'.format(name, value)
            raise InternalError(msg)
        Row.__setitem__(self, name, value)

    def __str__(self):
        return self.to_str()

    def to_str(self):
        return ':'.join(list(self))

    def from_err(self, err):
        self.values['Response Code'] = err.code
        self.values['Notification Message'] = err.message

    def from_raw(self, raw):
        t = raw.split(':')
        i = -1
        for fieldname in self.fieldnames:
            i += 1
            if not t[i:i+1]:
                return
            self.values[fieldname] = t[i]


class PaymentResponse(InquiryResponse):
    def __init__(self):
        Row.__init__(self, PAYMENT_RESP_FIELDS)