pulsa.py 5.25 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):
        """
        <status>SUCCESS</status>
        <rc>0000</rc>
        <rcm>0000</rcm>
        <text>[0] Pembayaran Sukses</text>
        <date>Isi pulsa TN10 berhasil untuk nomor 628527778889 sebesar 10.000, refnum F148919BB5F4093A0F40000000000000 pada tgl 17/04/17 15:32</date>
        <refnum>2017-04-17 15:40:28</refnum>
        <voucherid>4A61D574138A2D6B4B6 </voucherid>
        <destnum>TN10</destnum>
        <nominal>10000</nominal>
        <serial>4A61D574138A2D6B4B6 </serial>
        :return:
        """
        code = "rc" in data and int(data["rc"]) or 0
        self.status = vsi_status[str(code)]["status"]
        status = self.status == -3 and "FAILED" or "PENDING"
        if status == "PENDING":
            code = 68

        if self.status>-3:
            product_id = self.invoice_det.produk.id
            partner_id = self.invoice_det.h2h_ar_invoice.customer_id
            discount = PartnerProduk.get_discount(partner_id, product_id)
            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 inquiry(self):
        params = self.get_params(cmd='INQ', modul='ISI')
        params["tujuan"] = self.id_pel
        params["voucherid"] = self.vendor_produk.kode
        self.request = params
        self.save_log('inquiry')
        log.info("Request: %s %s" % (self.url, self.request))
        try:
            result = requests.get(self.url, params=params, timeout=15)
            if result.ok:
                data = dict(xmltodict.parse(result.text)["root"])
            else:
                data = dict(code=result.status_code,
                            message=result.text)
            self.response = data
            log.info("Response: %s" % (data))

        except requests.exceptions.RequestException as e:
            data = dict(code=e.errno,
                        message=e.strerror)

        self.result = self.pars_data(data)
        log.info("Result: %s" % (self.result))
        self.save_log('inquiry')
        return self.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))
        try:
            result = requests.get(self.url, params=params, timeout=15)
            if result.ok:
                data = dict(xmltodict.parse(result.text)["root"])
            else:
                data = dict(code=result.status_code,
                            message=result.text)
            self.response = data
            log.info("Payment Response: %s" % (data))

        except requests.exceptions.RequestException as e:
            data = dict(code=e.errno,
                        message=e.strerror)

        self.amt_buy = "harga" in data and data["harga"] or self.amt_buy
        self.vend_inv_no = "ref_num" in data and data["ref_num"] or self.vend_inv_no
        self.result = self.pars_data(data)
        log.info("Payment Result: %s" % (self.result))
        self.save_log('payment')
        return 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