pdl.py 7.2 KB
import base64
import json
import re
from time import sleep
from datetime import datetime
import requests
from opensipkd.base import get_settings
from opensipkd.base.tools import get_random_string, get_random_number
from opensipkd.base.tools.api import JsonRpcBillAllreadyPaidError, JsonRpcBillNotFoundError
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid_rpc.jsonrpc import JsonRpcError

from ..vendor import VendorClass

import logging

log = logging.getLogger(__name__)
import urllib3

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)
        # id_pel, customer_id, cust_trx, row
        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 = '{0}/pjdlJson/inq'.format(self.url)
        self.pay_url = '{0}/pjdlJson/pay'.format(self.url)

    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):
        kini = datetime.now()
        date_settlement = kini.strftime("%m%d")
        no_bayar = self.id_pel

        return \
            {
                "noRef": get_random_number(6),
                "dateSettlement": date_settlement,
                "merchantType": "6014",
                "accountCurrency": "360",
                "terminalId": "02W001",
                "terminalName": "02A001",
                "terminalLoc": "Tangerang Selatan",
                "kodeBayar": no_bayar,

            }

    def inquiry_error(self, resp):
        code = int(resp["responseCode"])
        message = resp["responseDesc"]
        return dict(code=code, message=message)
        # if code == 54:
        #     raise JsonRpcBillAllreadyPaidError()
        # elif code == 55:
        #     raise JsonRpcBillNotFoundError()
        # else:
        #     raise JsonRpcError(code=code, message=message)

    def response_field(self):
        resp = self.response
        if resp["responseCode"] == "00":
            pokok = int(resp["billAmount"] or '0')
            denda = int(resp["chargeAmount"] or '0')
            disc_biller = 0
            sub_total = pokok + denda - disc_biller

            result = self.get_price(sub_total)
            admin = int(self.vendor_produk.produk.harga)
            rincian = dict(
                pokok=pokok,
                denda=denda,
                discount=disc_biller,
                subtotal=sub_total,
                admin=admin,
                total=sub_total + admin,
                npwpd=resp['npwpd'],
                nama=resp['namaWp'],
                masa_awal=resp['masaAwal'],
                masa_akhir=resp['masaAkhir'],
                jns_pajak=resp['jenisPajak'],
                kd_pajak=resp['kodeRekening'],
                nm_pajak=resp['namaRekening'],
                alamat1=resp['alamat1'],
                alamat2=resp['alamat2'],
            )
            result.update(dict(rincian=rincian))
            return result

        else:
            return self.inquiry_error(resp)

    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)
        log.info(params)
        try:
            resp = requests.post(self.inq_url, data=params,
                                 verify=False,
                                 headers=self.get_headers(),
                                 timeout=20)
        except Exception as e:
            self.response = e
            log.info("Biller Error: {}".format(e))
            return

        if not resp:
            msg = "No Response From Biller"
            log.info(msg)
            self.response = msg
            return

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

        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:
            return self.set_pending()

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

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

        self.response = result
        log.info("Payment Response: %s" % self.response)
        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")