odeo.py 11.8 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 =='PLN' and self.v_produk_kd != 'PLNPASCA':
            params = dict(
                data=dict(
                    number=self.bill_no
                )
            )
            self.request = json.dumps(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 = json.dumps(params)
            self.save_log("inquiry")
            resp = self.request_get(params, '/postpaid/inquiry')

        content = resp.text

        if resp.ok:
            result = json.loads(content)
        else:
            result = dict(code=resp.status_code,
                          message=resp.text)
        self.response = content
        self.save_log('inquiry')
        return self.pars_data(result)

    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 = json.dumps(params)
        self.save_log("payment")
        resp = self.request_post(params, '/prepaid/purchase')
        content = resp.text
        if resp.ok:
            result = json.loads(content)
        else:
            result = dict(code=resp.status_code,
                          message=resp.text)

        self.response = content
        self.save_log('payment')
        return self.pars_data(result)

    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:
            result = json.loads(content)
        else:
            result = dict(code=resp.status_code,
                          message=resp.text)
        data = 'data' in result and result['data'] or None
        if data:
            self.vend_trx = 'order_id' in data and data['order_id'] or self.vend_trx
        self.response = content
        self.save_log('advice')
        return self.pars_data(result)

    def pars_data(self, data):
        # https://api.odeo.co.id/v1/affiliate/prepaid/purchase
        """
          {
            "data": {
              "denom": "TSEL5",
              "number": "0812121212"
            }
          }
        Response
        {
          "status": "SUCCESS",
          "data": {
            "order_id": 1,
            "price": 5675
          },
          "message": ""
        }
        {
          "status": "BAD_REQUEST",
          "data": {
            "errors": [
              "ERROR_MESSAGE_1",
              "ERROR_MESSAGE_2",
              "ERROR_MESSAGE_ETC"
            ]
          },
          "message": ""
        }
        {
          "status": "UNAUTHORIZED",
          "data": {
            "errors": [
              "Unauthorized"
            ]
          },
          "message": ""
        }
        """

        # GET https://api.odeo.co.id/v1/affiliate/prepaid/pln/inquiry
        """
        Request
          {
            "data": {
              "number": "0812121212"
            }
          }
          
        Response
        {
          "status": "SUCCESS",
          "data": {
            "number": "XXX",
            "subscriber_id": "XXX",
            "name": "XXX",
            "tariff": "XXX",
            "power": "XXX"
          },
          "message": ""
        }
        """

        # GET  https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=BPJSKES1&number=XXXX
        """
        {
          "status": "SUCCESS",
          "data": {
            "subscriber_id": "XXX",
            "subscriber_name": "XXX",
            "ref_id": "XXX",
            "inquiries": {
              "branch_code": "-",
              "branch_name": "XXX",
              "month_counts": 1,
              "participant_counts": 3,
              "base_price": 154200,
              "bill_rest": 0,
              "admin": 2500
            },
            "subtotal": 156700,
            "discount": 600,
            "total": 156100
          },
          "message": ""
        }
        """

        # GET  https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=PLNPASCA&number=XXXX
        """
        {
          "status": "SUCCESS",
          "data": {
            "subscriber_id": "XXX",
            "subscriber_name": "XXX",
            "ref_id": "XXX",
            "tariff": "R1/1300VA",
            "inquiries": [
              {
                "period": "2016-08",
                "base_price": 300000,
                "fine": 0,
                "admin_fee": 2500
              }
            ],
            "subtotal": 302500,
            "discount": 900,
            "total": 301600
          },
          "message": ""
        }
        """
        # GET  https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=PAM...&number=XXXX
        """
        {
          "status": "SUCCESS",
          "data": {
            "subscriber_id": "XXX",
            "subscriber_name": "XXX",
            "ref_id": "XXX",
            "inquiries": [
              {
                "period": "XXX",
                "base_price": 300000,
                "fine": 0,
                "admin_fee": 2500,
                "meter_changes": "XXX"
              }
            ],
            "subtotal": 302500,
            "discount": 900,
            "total": 301600
          },
          "message": ""
        }
        """
        # GET https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=PGN&number=XXXX
        """
        {
          "status": "SUCCESS",
          "data": {
            "subscriber_id": "XXX",
            "subscriber_name": "XXX",
            "ref_id": "XXX",
            "inquiries": {
              "period": "XXX",
              "meter_changes": "XXX",
              "usages": "XXX",
              "base_price": 300000,
              "admin_fee": 2500
            },
            "subtotal": 302500,
            "discount": 900,
            "total": 301600
          },
          "message": ""
        }
        """
        # Multi Finance
        # GET  https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=XXX&number=XXXX
        """
        {
          "status": "SUCCESS",
          "data": {
            "subscriber_id": "XXX",
            "subscriber_name": "XXX",
            "ref_id": "XXX",
            "inquiries": {
              "installment": "XXX",
              "due_date": "XXX",
              "platform": "XXX",
              "base_price": 300000,
              "coll_fee": 0,
              "fine": 75000,
              "admin": 2000
            },
            "subtotal": 377000,
            "discount": 900,
            "total": 376100
          },
          "message": ""
        }
        """
        # PLN Pasca
        # GET  https://api.odeo.co.id/v1/affiliate/postpaid/inquiry?denom=XXXX&number=XXXX
        """
        {
          "status": "SUCCESS",
          "data": {
            "subscriber_id": "XXX",
            "subscriber_name": "XXX",
            "ref_id": "XXX",
            "inquiries": {
              "period": "XXX",
              "base_price": 300000,
              "admin_fee": 1500
            },
            "subtotal": 301500,
            "discount": 900,
            "total": 300600
          },
          "message": ""
        }
        """

        """
        POST https://api.odeo.co.id/affiliate_url
        {
                "order_id": 1,
                "status": "COMPLETED",
                "message": "XXX"
                "signature": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        }
        
        sha256({order_id} + {MID} + {SECRET_KEY} + {status}) [COMPLETED/REFUNDED]
        sha256({MID} + {SECRET_KEY} + {status}) [BROADCAST_NEW_PRICE]
        {
          "new_prices": {
            "TSEL5": 5000
          },
          "status": "BROADCAST_NEW_PRICE",
          "message": "XXX",
          "signature": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        }
        """

        # GET  https://api.odeo.co.id/v1/affiliate/order/order_id  (Cek status)
        """
        {
          "order_id": 123,
          "name": "Telkomsel 5",
          "msisdn": "08xx",
          "serial_number": "XXX",
          "status": "COMPLETED",
          "price": 5000
        }
        """

        return {
                "trx_id": self.partner_log_id,
                "bill_no": self.bill_no,
                "cust_trx": self.cust_trx,
                "vend_trx": "order_id" in data and data["order_id"] or self.vend_trx,

                "nama": "nama" in data and data["nama"] or "NO-NAME",
                "pokok": "tagihan" in data and data["tagihan"] or 0,
                "denda": "denda" in data and data["denda"] or 0,
                "admin": "admin" in data and data["admin"] or 0,
                "total": "total" in data and data["total"] or 0,
                "ppn": "ppn" in data and data["ppn"] or 0,
                "ref_no": "refnum" in data and data["refnum"] or "",
                "jml_bulan": "bulan" in data and data["bulan"] or "",
                "tgh_bulan": "blth" in data and data["blth"] or "",
                "tarif": "tarif" in data and data["tarif"] or "",
                "tgl_bayar" : "date" in data and data["date"] or "",
                "info" : "info1" in data and data["info1"] or "",
                "stand_meter" : "standmeter" in data and data["standmeter"] or "",
            }