pln_pre.py 7.23 KB
from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict

from . import Vendor as VendorClass, vsi_status
from opensipkd.base.tools import log


class Vendor(VendorClass):
    def pars_data(self, data):
        """
        <status>SUCCESS</status>
          <rc>0000</rc>
          <rcm>[0] CEK TAGIHAN SUKSES ke:88888888888 refnum:D0EE65CAB0C04601878612867541EEA5</rcm>
          <text>88888888888
                TestDu''mmyP
                R2/7000 VA
                Token Unsold: 0
                Adm 1.600,00
                *Denom Belum Termasuk
                Admin</text>
          <refnum>D0EE65CAB0C04601878612867541EEA5</refnum>
          <msn>88888888888</msn>
          <idpel>885555555555</idpel>
          <nama>TestDu''mmyPanjang8855555</nama>
          <tarifdaya>R2/7000</tarifdaya>
          <adm>1600</adm>
          <jmltokenunsold>0</jmltokenunsold>
        """
        """
        <status>SUCCESS</status>
          <rc>0000</rc>
          <rcm>[0] PEMBAYARAN SUKSES ke:88888888888 refnum:05062135116139A54A95CCC549DDA94C</rcm>
          <text>08/06/16 11:50
            05062135116139A54A95CCC549DDA94C
            TestDu''mmyP
            88888888888
            881111111111
            R2/6600 VA
            RP 201.600
            KWH352,0
            STROOM/TOKEN 2593 0960 8106 1072 1376
            ADM 1.600,00</text>
          <tanggal>2016-06-08 11:50:22</tanggal>
          <nama>TestDu''mmyPanjang8811111</nama>
          <msn>88888888888</msn>
          <idpel>881111111111</idpel>
          <tarifdaya>R2/6600</tarifdaya>
          <nominal>201600</nominal>
          <jmlkwh>352</jmlkwh>
          <token>2593-0960-8106-1072-51376</token>
          <ppn>0</ppn>
          <ppj>0</ppj>
          <adm>1600</adm>
          <angsuran>24000</angsuran>
          <materai>0</materai>
        """
        power = "tarifdaya" in data and data["tarifdaya"].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)
        harga = int(self.v_produk_kd)
        subtotal = harga + admin
        token = "token" in data and data["token"] or ""
        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

        # code = "rc" in data and data['rc']=='0000' and 0 or int(data["rc"]) or 500
        log.info("VSI Result Code: {} {}".format(code, data))
        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)

        return {
            "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": int(self.v_produk_kd),
                "denda": "denda" in data and int(data["denda"]) or 0,
                "admin": admin,
                "tarif": "tarifdaya" in data and data["tarifdaya"] or "",
                # "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,
                "token": token,
            },
            "subtotal": subtotal,
            "discount": discount,
            "total": subtotal-discount,
        }

    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
        params["nominal"] = self.v_produk_kd
        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:
                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: %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
        params["nominal"] = self.v_produk_kd
        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)
        self.result = data
        self.save_log('payment')
        return data

    def advice(self):
        params = self.get_params(cmd='ADV', modul='PRE')
        params["msn"] = self.id_pel
        params["nominal"] = self.v_produk_kd

        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)