odeo.py 10.9 KB
import base64
import json

import requests
from opensipkd.base import get_settings

from .vendor import VendorClass

from ..tools import log
import urllib3
urllib3.disable_warnings()


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 = 'odeo_mid' in settings and settings['odeo_mid'] or None
        self.key = 'odeo_key' in settings and settings['odeo_key'] or None
        self.url = 'odeo_url' in settings and settings['odeo_url'] or None
        key = ":".join([self.mid, self.key]).encode()
        self.auth = base64.b64encode(key).decode()


    def request_post(self, params, url=None):
        headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
        data = json.dumps(params)
        self.url = url and self.url + url or self.url
        with requests.session():
            resp = requests.post(self.url, data=data,
                                 verify=False, headers=headers)
        return resp

    def request_get(self, params, url=None):
        headers = {'Authorization': 'Bearer {key}'.format(key=self.auth)}
        self.url = url and self.url + url or self.url
        with requests.session():
            resp = requests.get(self.url, params=params,
                                verify=False, headers=headers)
        return resp

    def inquiry(self):
        if not self.v_produk_kd or not self.id_pel:
            return dict(code=9999,
                        message='Parameter tidak lengkap')

        if self.v_produk_kd[:3] =='PLN' and self.v_produk_kd != 'PLNPASCA':
            params = dict(
                    number=self.id_pel
            )

            self.request = params
            log.info("ODEO Inquiry Request: %s" % params)
            self.save_log("inquiry")
            resp = self.request_get(params, '/prepaid/pln/inquiry')
        else:
            params = dict(
                denom=self.v_produk_kd,
                number=self.id_pel
            )
            self.request = params
            self.save_log("inquiry")
            log.info("ODEO Inquiry Request: %s" % params)
            resp = self.request_get(params, '/postpaid/inquiry')

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

        log.info("ODEO Inquiry Response: %s" % result)

        if resp.ok:
            self.status = 1  # sukses
            data = "data" in result and result["data"] or None
            parsd = self.pars_data(data)

        elif resp.status_code == 400:
            self.status = -3
            message = "data" in result and result["data"] or ""
            message = message and "errors" in message and message["errors"] or message

            parsd = dict(code=resp.status_code,
                         message=message)
        else:
            self.status = -4
            parsd = dict(code=500,
                         message="Other Error")

        self.response = result
        # self.save_log('inquiry')
        return parsd

    def payment(self):
        params = dict(data=dict(
                denom=self.v_produk_kd,
                number=self.id_pel
            )
        )
        self.request = params
        log.info("ODEO Payment Request: %s" % self.request)
        self.save_log("payment")
        resp = self.request_post(params, '/prepaid/purchase')
        try:
            result = json.loads(resp.text)
        except:
            result = resp.text

        self.response = result
        log.info("ODEO Payment Response: %s" % self.response)
        if resp.ok:
            # self.status = 1  # sukses
            data = "data" in result and result["data"] or None
            if data:
                self.vend_trx = "order_id" in data and data["order_id"] or None
                self.amt_buy = "price" in data and data["price"] or 0


            parsd = self.pars_data(data)
            if not parsd:
                self.status = -4
                parsd = dict(code=500,
                             message="Other Error",
                         status="FAILED")


        elif resp.status_code==400: # BAD REQUEST
            self.status = -3
            parsd = dict(code=resp.status_code,
                          message=result,
                         status="FAILED")
        else:
            self.status = -4 # Other Error
            parsd = dict(code=500,
                         message="Other Error",
                         status="FAILED")

        if 'ref_no' in parsd:
            self.vend_inv_no = parsd["ref_no"]

        self.save_log('payment')
        txt = "ODEO PARSING: {d}".format(d=json.dumps(parsd))
        log.info(txt)
        return parsd

    def advice(self):
        if not self.v_produk_kd or not self.id_pel or not self.invoice_det:
            return dict(code=9999,
                        message='Parameter tidak lengkap')

        if self.kategori == 'e-payment':
            order_id = self.invoice_det.vend_inv_no
            url = '/order/{order_id}'.format(order_id=order_id)
            params = None
            self.request = url
        else:
            params = dict(
                data=dict(
                    denom=self.v_produk_kd,
                    number=self.id_pel
                )
            )
            self.request = params
            self.save_log("advice")
            url = '/prepaid/purchase-get'

        self.save_log("advice")
        resp = self.request_get(params, url)
        try:
            result = json.loads(resp.text)
        except:
            result = resp.text

        if resp.ok:
            self.status = 1  # sukses
            data = "data" in result and result["data"] or None
            parsd = self.pars_data(data)

        elif resp.status_code==400:
            self.status = -3
            parsd = dict(code=resp.status_code,
                           message=resp.text)
        else:
            self.status = -4
            parsd = dict(code=500,
                         message="Other Error")

        self.response = result
        self.save_log('advice')
        return parsd

    def pars_data(self, data):
        result = dict()
        # result["trx_id"] = self.partner_log_id
        # result["id_pel"] = self.id_pel
        # result["cust_trx"] = self.cust_trx
        # result["vend_trx"] = self.vend_trx
        # result['harga'] = self.amt_buy

        if not data:
            return result

        if "rc" in data:
            if data["rc"] == "13":
                result["status"] = "FAILED"
                self.status = -2
            elif data["rc"] == "68":
                result["status"] = "PENDING"
                self.status = 0 #pending
            elif data["rc"] == "67":
                result["status"] = "DOUBLE"
                self.status = -1  # Gagal Karena Pernah Transaksi

        else:
            self.status = 1
            result["code"] = 0
            result["status"] = "SUCCESS"
            self.serial_number = 'serial_number' in data and data["serial_numner"] \
                                 or self.serial_number

        if "subscriber_id" in data and data["subscriber_id"]:
            result['id_pel'] = data["subscriber_id"]
        if "name" in data and data["name"]:
            result['nama'] = data["name"]
        if "subscriber_name" in data and data["subscriber_name"]:
            result['nama'] = data["subscriber_name"]
        if "ref_id" in data and data["ref_id"]:
            result['ref_no'] = data["ref_id"]
        if "subtotal" in data and data["subtotal"]:
            result['subtotal'] = data["subtotal"]
        if "discount" in data and data["discount"]:
            result['discount'] = data["discount"]
        if "total" in data and data["total"]:
            result['total'] = data["total"]
        if "tarif" in data and data["tariff"]:
            result['tarif'] = data["tariff"]

        inquiries = 'inquiries' in data and data['inquiries'] \
                or 'inquiry' in data and data['inquiry'] or {}
        if not inquiries:
            return result
        
        if self.v_produk_kd=="PLNPASCA" or self.v_produk_kd[:3]=="PAM":
            pokok = denda = admin = 0
            period = meter = ""
            jml_period = 0
            for inq in inquiries:
                pokok += inq["base_price"]
                denda += inq["fine"]
                admin += inq["admin"]
                period += inq["period"] + " "
                jml_period += 1
                if "meter_changes" in inq:
                    meter += inq["meter_changes"]

            result["pokok"] = pokok
            result["denda"] = denda
            result["admin"] = admin
            result["period"] = period
            result["jml_bulan"] = jml_period
            if meter:
                result["meter"] = meter

        else:
            if "name" in inquiries:
                result['nama'] = inquiries["name"]

            if "tariff" in inquiries:
                result['tarif'] = inquiries["tariff"]

            if "number" in inquiries:
                result['no_meter'] = inquiries["number"]
            if "power" in inquiries:
                result['daya'] = inquiries["power"]

            if "base_price" in inquiries:
                result['pokok'] = inquiries["subscriber_id"]
            if "fine" in inquiries:
                result['fine'] = inquiries["fine"]
            if "coll_fee" in inquiries:
                result['coll_fee'] = inquiries["coll_fee"]
            if "bill_rest" in inquiries:
                result['restitusi'] = inquiries["bill_rest"]
            if "coll_fee" in inquiries:
                result['coll_fee'] = inquiries["coll_fee"]
            if "admin" in inquiries:
                result['admin'] = inquiries["admin"]
            if "admin_fee" in inquiries:
                result['admin'] = inquiries["admin_fee"]
            if "period" in inquiries:
                result['period'] = inquiries["period"]
            if "admin_fee" in inquiries:
                result['admin'] = inquiries["admin_fee"]
            if "meter_changes" in inquiries:
                result['meter'] = inquiries["meter_changes"]
            if "usages" in inquiries:
                result['penggunaan'] = inquiries["usages"]
            if "installment" in inquiries:
                result['periode'] = inquiries["installment"]
            if "due_date" in inquiries:
                result['jth_tempo'] = inquiries["due_date"]
            if "branch_code" in inquiries:
                result['kd_cabang'] = inquiries["branch_code"]
            if "branch_name" in inquiries:
                result['nm_cabang'] = inquiries["branch_name"]
            if "month_counts" in inquiries:
                result['jml_bulan'] = inquiries["month_counts"]
            if "participant_counts" in inquiries:
                result['anggota'] = inquiries["participant_counts"]

        return result