pln_pre.py 6 KB
import re

from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict

from . import Vendor as VendorClass, vsi_status
import logging
log = logging.getLogger(__name__)

class Vendor(VendorClass):
    def pars_data(self, data):
        """"""
        tarif = "tarif" in data and data["tarif"] or ""
        tarif = "tarifdaya" in data and data["tarifdaya"] or tarif
        power = tarif.split("/") or [""]
        power = len(power)>1 and power[-1:][0] or power[0]
        product_id = self.invoice_det.produk.id
        if hasattr(self.invoice_det,"customer_id"):
            partner_id = self.invoice_det.customer_id
        else:
            partner_id = self.invoice_det.h2h_ar_invoice.customer_id

        discount = PartnerProduk.get_discount(partner_id, product_id)
        admin = int(self.vendor_produk.produk.harga)
        nominal = "nominal" in data and data["nominal"] and int(data["nominal"]) or 0
        harga = nominal and int(re.sub("\D","",self.v_produk_kd))*1000 or 0
        subtotal = harga + admin
        if "status" in data and data["status"] and data["status"] == "SUCCESS":
            self.status = 1

        elif "status" in data and data["status"] and data["status"] == "ERROR":
            self.status = -1

        if "rc" in data:
            if data['rc'] == '0000':
                code = 0
            else:
                code = int(data["rc"])
        else:
            code = 500

        if code == 0:
            self.status = 1
            message="SUCCESS"
        else:
            self.status = vsi_status[str(code)]["status"]
            if self.status == -3:
                message = "GAGAL"
            else:
                message = "PENDING"
            return dict(code=code,
                        message=message)
        self.vend_inv_no = str(self.invoice_det.id)
        result = {
            "code": code,
            "status": message,
            "message": "rcm" in data and "Transaksi %s" % message or "No Response From Biller",
            "refno": "refnum" in data and data["refnum"] or "",
            "nopel": "idpel" in data and data["idpel"] or self.id_pel,
            "nama": "nama" in data and data["nama"] or "NO-NAME",
            "rincian": {
                "pokok": harga,
                "denda": "denda" in data and int(data["denda"]) or 0,
                "admin": admin,
                "tarif": tarif,
                # "ppn": "ppn" in data and data["ppn"] or 0,
                # "ref_no": "refnum" in data and data["refnum"] or "",
                "no_meter": "msn" in data and data["msn"] or "",
                "power": power,
                "total": subtotal,
                "token": "token" in data and data["token"] or ""
            },
            "discount": discount,

        }
        return result

    def save_result(self, data, typ="inquiry"):
        self.result = data
        log.info("Result: %s", data)
        self.save_log(typ)
        return data

    def inquiry(self):
        params = self.get_params(cmd='INQ', modul='PRE')
        params["msn"] = self.id_pel
        nominal = int(re.sub("\D","",self.v_produk_kd))*1000
        params["nominal"] = nominal
        self.request = params
        self.save_log('inquiry')
        params['trxid'] =  self.invoice_det.id
        log.info("Request: %s", params)
        try:
            resp = requests.get(self.url, params=params, timeout=15)
            if resp and resp.ok:
                log.info("XML Response: %s" % resp.text)
                data = dict(xmltodict.parse(resp.text)["root"])
                self.response = data

            else:
                data = dict(message=resp.text,
                            code=resp.status_code)
            self.response = data
            log.info("Response as JSON: %s" % data )
        except requests.exceptions.RequestException as e:
            data = dict(message = e.strerror,
                        code = e.errno)
            return self.set_failed()


        data = self.pars_data(data)
        if data["code"]!=0:
            return self.set_failed()

        return self.set_success(data)

    def payment(self):
        params = self.get_params(cmd='PAY', modul='PRE')
        params["msn"] = self.id_pel
        nominal = int(re.sub("\D", "", self.v_produk_kd)) * 1000
        params["nominal"] = nominal
        self.request = params
        # todo: apakah harus di cek dulu data inquirynya
        self.save_log('payment')
        params['trxid'] = self.invoice_det.id
        try:
            resp = requests.get(self.url, params=params, timeout=15)
            if resp.ok:
                data = dict(xmltodict.parse(resp.text)["root"])
            else:
                data = dict(code=resp.status_code,
                            message=resp.text)
            self.response = data

        except:
            data = dict(code=500,
                        message="No Response From Biller")

        data = self.pars_data(data)
        if data["code"]!=0:
            return self.set_pending()

        self.result = data
        self.save_log('payment')
        return self.set_success(data)

    def advice(self):
        params = self.get_params(cmd='ADV', modul='PRE')
        params["msn"] = self.id_pel
        nominal = int(re.sub("\D", "", self.v_produk_kd)) * 1000
        params["nominal"] = nominal

        self.request = params
        # todo: apakah harus di cek dulu data inquirynya
        self.save_log('advice')
        params['trxid'] = self.invoice_det.id
        try:
            resp = requests.get(self.url, params=params, timeout=15)
            if resp.ok:
                data = dict(xmltodict.parse(resp.text)["root"])
            else:
                data = dict(code=resp.status_code,
                            message=resp.text)
            self.response = data

        except:
            data = dict(code=500,
                        message="No Response From Biller")

        data = self.pars_data(data)
        if data["code"] != 0:
            return self.set_failed()

        self.result = data
        return self.set_success(data)