pajak.py 4.87 KB
import base64
import json
import logging
import requests
from opensipkd.base import get_settings
from pyramid_rpc.jsonrpc import JsonRpcError
from ..vendor import VendorClass
import urllib3

log = logging.getLogger(__name__)
urllib3.disable_warnings()

"""
PJDL
http://103.66.86.115:8989/interface-tangerang-1.0.0/pjdlJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/pjdlJson/pay

PBB
http://103.66.86.115:8989/interface-tangerang-1.0.0/pbbJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/pbbJson/pay

BPHTB
http://103.66.86.115:8989/interface-tangerang-1.0.0/bphtbJson/inq
http://103.66.86.115:8989/interface-tangerang-1.0.0/bphtbJson/pay


"""


class Vendor(VendorClass):
    def __init__(self, vendor_produk, invoice_det):
        VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det)
        settings = get_settings()
        self.mid = 'tangselpjk_mid' in settings and settings['tangselpjk_mid'] or None
        self.key = 'tangselpjk_key' in settings and settings['tangselpjk_key'] or None
        self.url = 'tangselpjk_url' in settings and settings['tangselpjk_url'] or None
        key = ":".join([self.mid, self.key]).encode()
        self.auth = base64.b64encode(key).decode()
        self.inq_url = None
        self.pay_url = None


    def get_headers(self):
        return {'Content-Type': 'application/json'}

    def get_url(self, url=None):
        return url and self.url + url or self.url

    def inquiry_field(self):
        #Overide Please
        pass

    def inquiry_error(self, resp):
        code = int(resp["responseCode"])
        message = resp["responseDesc"]
        return self.set_response(message=message, code=code)

    def response_field(self):
        #Overide PLease
        pass

    def _inquiry(self):
        if not self.v_produk_kd or not self.id_pel:
            return

        self.request = self.inquiry_field()
        log.info("Inquiry Request: url: {} params {}".format(self.inq_url, self.request))
        self.save_log("inquiry")
        params = json.dumps(self.request)
        try:
            resp = requests.post(self.inq_url, data=params,
                                 verify=False,
                                 headers=self.get_headers(),
                                 timeout=20)
        except:
            log.info("Biller Error")
            return

        if not resp:
            log.info("No Response From Biller")
            return

        try:
            result = json.loads(resp.text)
        except:
            result = resp.text

        self.response = result
        self.save_log("inquiry")
        log.info("Inquiry Response: %s" % self.response)
        return resp

    def inquiry(self):
        resp = self._inquiry()
        if resp is None:
            return self.set_failed(typ="inquiry")

        if resp.status_code != 200:
            return self.set_failed(typ="inquiry")

        if "responseCode" not in self.response:
            return self.set_failed(typ="inquiry")

        if self.response["responseCode"] != "00":
            return self.inquiry_error(self.response)

        parsd = self.response_field()
        return self.set_success(parsd, typ="inquiry")

    def payment(self):
        resp = self._inquiry()
        if not resp:
            return self.set_failed()

        if self.response["responseCode"] != "00":
            return self.inquiry_error(self.response)

        self.response["noRef"] = str(int(self.response["noRef"]) + 1)
        params = json.dumps(self.response)
        log.info("Payment url: {} params: {}".format(self.pay_url, params))
        try:
            resp = requests.post(self.pay_url, data=params, verify=False,
                                 headers=self.get_headers(), timeout=15)
        except Exception as e:
            self.response = e
            resp = None

        if resp is None:
            self.status = 0
            return self.set_pending()

        if resp.status_code != 200:
            result = resp.text
            self.response = result
            log.info("Payment Response: %s" % self.response)
            return self.set_pending()

        try:
            result = json.loads(resp.text)
            self.response = result
            log.info("Payment Response: %s" % self.response)
        except:
            self.response = resp.text
            log.info("Payment Response: %s" % self.response)
            return self.set_pending()

        if self.response["responseCode"] != "00":
            return self.inquiry_error(self.response)

        parsd = self.response_field()

        self.serial_number = 'ntb' in result and result["ntb"].strip() \
                             or self.serial_number
        parsd["rincian"].update(dict(
            ntb=self.serial_number,
            ntp='ntp' in result and result["ntp"].strip() or ''))
        return self.set_success(parsd)

    def advice(self):
        raise JsonRpcError(message="Not Implemented")