pdam.py 4.8 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):
        product_id = self.invoice_det.produk.id
        partner_id = self.invoice_det.h2h_ar_invoice.customer_id
        bulan = "totalperiod" in data and data["totalperiod"].split(" ")
        bulan = bulan and bulan[0] or 1

        discount = PartnerProduk.get_discount(partner_id, product_id) * bulan
        admin = self.vendor_produk.produk.harga * bulan
        harga = "transamount" in data and data["transamount"] or 0
        admin_chg = "admincharge" in data and data["admincharge"] or 0
        pokok = harga - admin_chg
        subtotal = pokok + admin
        total = subtotal - discount

        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

        code = "rc" in data and int(data["rc"]) or 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"
        meter = "startend" in data and data["startend"] or ""

        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": "name" in data and data["name"] or "NO-NAME",
            "rincian":{
                "pokok": pokok,
                "denda": 0,
                "admin": admin,
                "period": "billperiod" in data and data["billperiod"] or "",
                "jml_bulan": bulan,
                # "tarif": "tarifdaya" in data and data["tarifdaya"] or "",
                # "no_meter": "msn" in data and data["msn"] or "",
                # "power": power,
                "meter": meter,
            },
            "subtotal": subtotal,
            "discount": discount,
            "total": total,
        }

    def save_response(self, data, typ="inquiry"):
        self.response = data
        log.info("Response: %s", data)
        self.save_log(typ)
        return data

    def inquiry(self):
        params = self.get_params(cmd='INQ', modul='PDAM')
        params["idpel"] = self.id_pel
        params["biller"] = self.vendor_produk.kode
        params['trxid'] =  self.invoice_det.id
        self.request = params
        self.save_log('inquiry')
        log.info("Inquiry 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
                log.info("Inquiry Response: %s", data)
                data = self.pars_data(data)
                if data:
                    self.set_success(data, typ="inquiry")
        except:
            return self.set_failed(typ="inquiry")

        return self.set_failed(typ="inquiry")

    def payment(self):
        params = self.get_params(cmd='PAY', modul='PDAM')
        params["idpel"] = self.id_pel
        self.request = params
        self.save_log('payment')
        try:
            resp = requests.get(self.url, params=params, timeout=15)
            if resp.ok:
                data = dict(xmltodict.parse(resp.text)["root"])
                self.response = data
                data = self.pars_data(data)
                return self.set_success(data)
            else:
                data = dict(code=resp.status_code,
                            message=resp.text)
        except:
            data = dict(code=500,
                        message="No Response From Biller")

        return self.set_failed(data)

    def advice(self):
        params = self.get_params(cmd='ADV', modul='pln')
        params["idpel"] = self.id_pel
        self.request = params
        self.save_log('advice')
        try:
            resp = requests.get(self.url, params=params, timeout=15)
            if resp.ok:
                data = dict(xmltodict.parse(resp.text)["root"])
                self.response = data
            else:
                data = dict(code=resp.status_code,
                            message=resp.text)
                self.response = data

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

        data = self.pars_data(data)
        self.result = data
        self.save_log('advice')
        return data