pasar.py 8.97 KB
import base64
import json
import re
from time import sleep
from datetime import datetime
import requests
from opensipkd.base import get_settings
from opensipkd.base.tools import get_random_string, get_random_number
from opensipkd.base.tools.api import JsonRpcBillAllreadyPaidError, JsonRpcBillNotFoundError
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid_rpc.jsonrpc import JsonRpcError

from ..vendor import VendorClass

import logging

log = logging.getLogger(__name__)
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 = 'tangselrtr_mid' in settings and settings['tangselrtr_mid'] or None
        self.key = 'tangselrtr_key' in settings and settings['tangselrtr_key'] or None
        self.url = 'tangselrtr_url' in settings and settings['tangselrtr_url'] or None
        key = ":".join([self.mid, self.key]).encode()
        self.auth = base64.b64encode(key).decode()
        self.inq_url = '{0}/inquiry'.format(self.url)
        self.pay_url = '{0}/payment'.format(self.url)

    def get_headers(self):
        return {'Content-Type': 'application/json',
                'x-api-key': self.key}

    def get_url(self, url=None):
        return url and self.url + url or self.url

    def inquiry_field(self):
        return \
            {
                "kode_pedagang": self.id_pel,
            }

    def inquiry_error(self, resp):
        # if resp["response_code"] == "C8111":
        if resp["type"] == "C8111":
            code = 55
            message = "Data tidak dtitemukan"
        elif resp["type"] == "C3077":
            code = 54
            message = "Data sudah dibayar"
        else:
            code = 999
            message = resp["message"]
        return dict(code=code, message=message)

    def response_field(self):
        resp = self.response
        if resp["code"] == 200 and resp["is_error"] == 0 and resp["content"]:
            data = resp["content"]
            pokok = int(data["biaya_tagihan"] or '0')
            denda = 0
            disc_biller = 0
            sub_total = pokok + denda - disc_biller
            result = self.get_price(sub_total)
            admin = int(self.vendor_produk.produk.harga)
            # todo: cek kembali harga apakah wajar atau tidak
            #  adm_biller = int(resp["diskon"] or '0')
            #  jika harga admin biller > dari admin
            #  if self.amt_buy < sub_total+adm_biller:
            #     raise
            #  if admin < adm_biller:
            #     admin = adm_biller

            rincian = dict(
                pokok=pokok,
                denda=denda,
                discount=disc_biller,
                subtotal=sub_total,
                admin=admin,
                total=sub_total + admin,
                npwrd=data["kode_pedagang"],
                nama=data["nama_pemilik"],
                no_hp_wr=data["nomor_hp_pemilik"],
                no_tel_wr=data["nomor_tlp_pemilik"],
                email_wr=data["email_pemilik"],
                nama_toko=data["nama_toko"],
                alamat=data["lokasi_pasar"],
                blok=data["blok_toko"],
                keterangan=data["keterangan_alamat_toko"] or "",
                luas=data["luas_toko"],
                kategori=data["kategori_usaha"],
            )
            result.update(dict(rincian=rincian))
            #self.values = rincian
            return result

        else:
            return self.inquiry_error(resp)

    def _inquiry(self):
        if not self.v_produk_kd or not self.id_pel:
            self.set_response(message='Parameter tidak lengkap')
            return

        self.request = self.inquiry_field()
        log.info("Inquiry Request: url: {} params {}".format(self.inq_url, self.request))
        self.save_log("inquiry")
        params = json.dumps(self.request)
        log.info(params)
        resp = requests.post(self.inq_url, data=params,
                             verify=False,
                             headers=self.get_headers(),
                             timeout=20)
        try:
            pass
        except:
            log.info("Biller Error")
            return

        if not resp:
            log.info("No Response From Biller")
            return

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

        self.response = result
        log.info("Inquiry Response: %s" % self.response)
        return resp

    def inquiry(self):
        resp = self._inquiry()
        if resp is None:
            return self.set_failed(typ="inquiry")

        if resp.status_code == 200:
            parsd = self.response_field()
            #self.values = parsd["rincian"]
            if "code" in parsd and parsd["code"] != 0:
                return self.set_response(code=parsd["code"],
                                         message=parsd["message"],
                                         typ="inquiry")
            return self.set_success(parsd, typ="inquiry")
        else:
            return self.set_failed(typ="inquiry")

    def payment(self):
        resp = self._inquiry()
        typ = "payment"
        if not resp:
            return self.set_failed()

        if self.response["is_error"] != 0:
            parsd = self.inquiry_error(self.response)
            return self.set_response(code=parsd["code"],
                                     message=parsd["message"],
                                     typ=typ)
        data = self.response_field()
        params = self.inquiry_field()
        params.update({"jumlah_retribusi": data['rincian']['subtotal']})
        self.request = params
        self.save_log(typ=typ)
        log.info("Payment url: {} params: {}".format(self.pay_url, json.dumps(params)))
        try:
            resp = requests.post(self.pay_url, data=json.dumps(params), verify=False,
                                 headers=self.get_headers(), timeout=15)
        except:
            resp = None

        if resp is None:
            self.status = 0
            return self.set_pending()
        try:
            result = json.loads(resp.text)
            self.response = result
            log.info("Payment Response: %s" % self.response)
        except:
            result = resp.text
            self.response = result
            log.info("Payment Response: %s" % self.response)
            self.status = 0
            return self.set_pending()

        if self.response["is_error"] != 0:
            parsd = self.inquiry_error(self.response)
            return self.set_response(code=parsd["code"],
                                     message=parsd["message"],
                                     typ=typ)
        elif resp.status_code == 200 or resp.status_code == 201:
            self.status = 1  # sukses
            content = result["content"]
            self.serial_number = 'no_reff' in content and content["no_reff"].strip() \
                                 or self.serial_number
            data["rincian"].update(dict(
                serial_number=self.serial_number))
            return self.set_success(data)

        else:
            self.status = 0
            return self.set_pending()

    def advice(self):
        raise JsonRpcError(message="Not Implemented")
        # 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 = self.get_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
        #     url = self.get_url('/prepaid/purchase-get')
        #
        # self.save_log("advice")
        # try:
        #     resp = requests.get(url, params=params, verify=False,
        #                         headers=self.get_headers(), timeout=15)
        # except:
        #     return self.set_response()
        #
        # try:
        #     result = json.loads(resp.text)
        # except:
        #     result = resp.text
        #
        # self.response = 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
        #     parsd = dict(code=resp.status_code,
        #                  message=resp.text)
        # else:
        #     self.status = -4
        #     parsd = dict(code=500,
        #                  message="Other Error")
        #
        # self.save_log('advice')
        # return parsd