odeo.py 9.61 KB
import base64
import json

import requests
from opensipkd.base import get_settings

from .vendor import VendorClass


import urllib3
urllib3.disable_warnings()
class Vendor(VendorClass):
    def __init__(self, vendor_produk, bill_no, customer_id=None,
                 cust_trx=None, row=None):
        VendorClass.__init__(self, vendor_produk, bill_no, 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
        resp = None
        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.bill_no:
            return dict(code=9999,
                        message='Parameter tidak lengkap')

        if self.v_produk_kd[:3] =='PLN' and self.v_produk_kd != 'PLNPASCA':
            params = dict(
                data=dict(
                    number=self.bill_no
                )
            )
            self.request = params
            self.save_log("inquiry")
            resp = self.request_get(params, '/prepaid/pln/inquiry')
        else:
            params = dict(
                denom=self.v_produk_kd,
                number=self.bill_no
            )
            self.request = params
            self.save_log("inquiry")
            resp = self.request_get(params, '/postpaid/inquiry')

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

        if resp.ok:
            self.status = 1  # sukses
            result = json.loads(content)
            parsd = self.pars_data(result)
        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 = content
        self.save_log('inquiry')
        return parsd

    def payment(self):
        if not self.v_produk_kd or not self.bill_no:
            return dict(code=9999,
                          message='Parameter tidak lengkap')
        params = dict(data=dict(
                denom=self.v_produk_kd,
                number=self.bill_no
            )
        )
        self.request = params
        self.save_log("payment")
        resp = self.request_post(params, '/prepaid/purchase')
        try:
            content = json.loads(resp.text)
        except:
            content = resp.text

        if resp.ok:
            self.status = 1  # sukses
            result = json.loads(content)
            parsd = self.pars_data(result)
        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 = content
        self.save_log('payment')
        return parsd

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

        if self.kategori == 'e-payment':

            order_id = self.partner_log.vend_trx
            url = '/order/{order_id}'.format(order_id=order_id)
            params = None
            self.save_log("advice")
            resp = self.request_get(params, url)
        else:
            params = dict(
                data=dict(
                    denom=self.v_produk_kd,
                    number=self.bill_no
                )
            )
            self.request = params
            self.save_log("advice")
            resp = self.request_get(params, '/prepaid/purchase-get')
            content = None

        content = resp.text
        if resp.ok:
            self.status = 1  # sukses
            result = json.loads(content)
            parsd = self.pars_data(result)
        elif resp.status_code==400:
            self.status = -3
            result = dict(code=resp.status_code,
                           message=resp.text)
        else:
            self.status = -4
            parsd = dict(code=500,
                         message="Other Error")

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

    def pars_data(self, params):
        result = {}
        result["trx_id"] = self.partner_log_id
        result["bill_no"] = self.bill_no
        result["cust_trx"] = self.cust_trx
        data = 'data' in params and params['data'] or None
        if not data:
            return result

        if data:
            self.vend_trx = 'order_id' in data and data['order_id'] \
                            or self.partner_log_id

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

        if "order_id" in data:
            result["vend_trx"] = data["order_id"] or self.partner_log_id

        if "subscriber_id" in data and data["subscriber_id"]:
            result['nopel'] = data["subscriber_id"]

        if "subscriber_id" in data and data["subscriber_id"]:
            result['nopel'] = 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 "tariff" in data and data["tariff"]:
            result['tarif'] = data["tariff"]
        if "number" in data and data["number"]:
            result['no_meter'] = data["number"]
        if "power" in data and data["power"]:
            result['daya'] = data["power"]

        if "inquiries" not in data:
            return result

        inquiries = data['inquiries']
        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 "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