pulsa.py 4.76 KB
from opensipkd.pasar.models import PartnerProduk
import requests
import xmltodict
from agratek.api.merchant.tools import JsonRpcError
from agratek.api.merchant.views.vsi import Vendor as VendorClass, vsi_status

import logging
log = logging.getLogger(__name__)

# todo: result harus distandarisasi
class Vendor(VendorClass):
    def pars_data(self, data):
        if "rc" in data:
            if data["rc"]=="0000":
                code = 0
            else:
                code = int(data["rc"])
        else:
            code = -1
        if code == 0: #  sukses
            product_id = self.invoice_det.produk.id
            partner_id = self.invoice_det.h2h_ar_invoice.customer_id
            self.discount = int(PartnerProduk.get_discount(partner_id, product_id))
            harga = int(self.vendor_produk.produk.harga)
            self.amt_buy = data["harga"]
            self.amt_sell = harga - self.discount
            result = dict(
                serial_number="serialnumber" in data and data["serialnumber"] or "",
                subtotal=self.amt_sell,
                discount=self.discount,
                total=self.amt_sell)
            return result
        else:
            self.status = code and vsi_status[str(code)]["status"] or 1
            status = self.status == -3 and "FAILED" or "PENDING"
            if status == "PENDING":
                code = 68

            if self.status>-3:
                harga = self.vendor_produk.produk.harga
                self.status = 1
                status = "status" in data and data["status"] or ""
                if not harga:
                    raise JsonRpcError()
            else:
                discount = 0
                harga = 0

        result = dict(
            status=status,
            code=code,
            message="rcm" in data\
                    and (data["rcm"] == "00000" and "SUCCESS" or data["rcm"])\
                    or status,
            serial_number="serialnumber" in data and data["serialnumber"] or "",
            subtotal=int(harga),
            discount=int(discount),
            total=int(harga-discount)
        )
        return result

    def payment(self):
        params = self.get_params(cmd='PAY', modul='ISI')
        params["tujuan"] = self.id_pel
        params["voucherid"] = self.vendor_produk.kode

        self.request = params
        log.info("Payment Request: %s" % (params))
        data = self.get_price()
        try:
            result = requests.get(self.url, params=params, timeout=15)
            if result.ok:
                self.response = dict(xmltodict.parse(result.text)["root"])
                log.info("Payment Response: %s" % (self.response ))
            else:
                self.status = 0
                self.response = dict(code=result.status_code, message=result.text)
                log.info("Payment Response: %s" % (self.response))
                return self.set_pending(data, message=result.text)

        except requests.exceptions.Timeout as errt:
            message = "Biller Timeout Transaksi will be retry"
            self.status = -1
            return self.set_pending(data, message=message)
        except requests.exceptions.RequestException as e:
            message = "Biller Error Transaksi will be retry"
            self.status = -2
            return self.set_pending(data, message=message)

        # self.amt_buy = "harga" in data and data["harga"] or self.amt_buy
        self.vend_inv_no = str(self.invoice_det.id)
        data = self.pars_data(self.response)
        return self.set_success(data)

    def advice(self):
        params = self.get_params(cmd='ADV', modul='ISI')
        params["tujuan"] = self.id_pel
        params["voucherid"] = self.vendor_produk.kode
        self.request = params
        log.info("Advice Request: %s" % (self.request))
        try:
            result = requests.get(self.url, params=params, timeout=15)
            if result.ok:
                data = xmltodict.parse(result.text)["root"]
            else:
                data = dict(code=result.status_code,
                            message=result.text)
            self.response = data
            log.info("Advice Response: %s" % (self.response))
        except:
            data = dict(code=999,
                        message="No Response From Biller")
        self.result = data
        log.info("Advice Result: %s" % (self.result))
        self.save_log('advice')
        return data

    def info(self):
        params = self.get_params(cmd='info', modul='ISI')
        self.request = params
        result = requests.get(self.url, params=params, timeout=15)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
            self.response = data
        else:
            data = dict(error=result.status_code)
        self.save_log('info')
        return data