vsi_pln_post.py 6.67 KB
import base64
import hashlib
import json
from datetime import datetime

import requests
import xmltodict
from opensipkd.base import get_settings
from opensipkd.pasar.models import Partner, PartnerProduk, Produk
from pyramid_rpc.jsonrpc import JsonRpcError

from .vsi import Vendor as VendorClass


class Vendor(VendorClass):
    # def __init__(self, product_kd, trx_id=None, cid=None):
    #     VendorClass.__init__(self, product_kd, cid)
    def inquiry(self):
        """
        :return:
        :parameter url tobe submitted
            cid = {CLIENTID}
            dt = {DATE}
            hc = {HASHCODE}
            modul = pln
            command = INQ
            idpel = {IDPELANGGAN}
            resp = XML
            trxid = {IDTRANSAKSI}
        :sukses response
            <?xml version="1.0"?>
            <root>
                <status>SUCCESS</status>
                <rc>0000</rc>
                <rcm>
                    [0] CEK TAGIHAN SUKSES ke:532110000060 refnum:33ECE3543E62474AA0C6C3147D94A31D
                </rcm>
                <text>532110000060
                    DU'MMY-VSI-532110000
                    1 BLN
                    JUN16
                    RP TAG PLN RP 887.817
                    ADM RP 1.600
                    TOTAL RP 890.929
                </text>
                <refnum>33ECE3543E62474AA0C6C3147D94A31D</refnum>
                <idpel>532110000060</idpel>
                <nama>DU'MMY-VSI-532110000060</nama>
                <bulan>1 BLN</bulan>
                <blntagihan>JUN16</blntagihan>
                <admin>1600</admin>
                <tagihan>889329</tagihan>
                <total>890929</total>
            </root>

        :error response
            <?xml version = "1.0"?>
            <root>
                <status>ERROR</status>
                <rc>0014</rc>
                <rcm>
                    [14] IDPEL YANG ANDA MASUKKAN SALAH, MOHON TELITI KEMBALI.
                </rcm>
            < / root >
        : notes
            1. cid = identitas mitra, akan diinfokan ke mitra pada saat test
               maupun production.
            2. dt = tanggal jam transaksi (YYYYMMDD).
            3. hc = SHA256(cid+dt+secret key) , secret key dan cid akan
               diinfokan  ke mitra pada saat test maupun production.
            4. Semua info/nilai yang diapit oleh {…} wajib diganti dengan
               nilai yang seharusnya (tanpa mengandung {}).
            5. trxid merupakan unique id dari mitra per transaksi dengan
               panjang maksimum 50 character.
            6. resp merupakan format respon yang diinginkan (XML), secara
               default jika dikosongkan maka responnya merupakan format plaintext.
        """
        params = self.get_params(cmd='INQ', modul='pln')
        params["idpel"] = self.bill_no
        # params["voucherid"] = self.v_produk_kd
        self.request = params
        row = self.save_log('inquiry')
        params['trxid'] =  self.partner_log_id
        result = requests.get(self.url, params=params)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
        else:
            data = dict(error=result.text,
                        code=result.status_code)

        self.response = data
        self.save_log('inquiry', row)
        if "status" in data and data["status"] and data["status"] == "SUCCESS":
            data = {
                "bill_no": "subid" in data and data["subid"] or self.bill_no,
                "nama": "nama" in data and data["nama"] or "NO-NAME",
                "pokok": "tagihan" in data and data["tagihan"] or 0,
                "admin": "admin" in data and data["admin"] or 0,
                "total": "total" in data and data["total"] or 0,
                "trx_id": "trxid" in data and data["trxid"] or row.id,
                "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 "",
            }
        elif "status" in data and data["status"] and data["status"] == "ERROR":
            #todo: apakah data akan dimapping errornya?
            data = dict(error=data["rcm"],
                        code=data["rc"])

        return data

    def payment(self):
        """
        :parameter
            cid = {CLIENTID}
            dt = {DATE}
            hc = {HASHCODE}
            modul = pln
            command = PAY
            idpel = {IDPELANGGAN}
            resp = XML
            trxid = {IDTRANSAKSI}
        :response sukses
            <?xml version="1.0"?>
            <root>
                <status>SUCCESS</status>
                <rc>0000</rc>
                <rcm>[0] PEMBAYARAN SUKSES ke:532110000060 refnum:0506213515100D3399B27293E3DBC535</rcm>
                <text>22/06/16 14:29
                        0506213515100D3399B27293E3DBC535
                        532110000060
                        DU'MMY-VSI-532110000
                        R1/450
                        BLN JUN16
                        RP 887.729
                        ADM RP 1.600
                        TOTAL RP 890.929
                        SUKSES
                </text>
                <date>2016-06-22 14:29:25</date>
                <refnum>0506213515100D3399B27293E3DBC535</refnum>
                <idpel>532110000060</idpel>
                <nama>DU'MMY-VSI-532110000060</nama>
                <segmenpower>R1/450</segmenpower>
                <startend>888800-889900</startend>
                <blntagihan>JUN16</blntagihan>
                <ppn>0</ppn>
                <denda>0</denda>
                <totaltagihanpln>887729</totaltagihanpln>
                <admin>1600</admin>
                <total>890929</total>
                <info1>Informasi Hubungi Call Center: 123 Atau Hub. PLN Terdekat:</info1>
                <info2>Terima Kasih</info2>
            </root>
        :response error
            <?xml version="1.0"?>
            <root>
                <status>ERROR</status>
                <rc>0088</rc>
                <rcm>[88] TAGIHAN SUDAH TERBAYAR</rcm>
            </root>
        """
        params = self.get_params(cmd='PAY', modul='pln')
        params["idpel"] = self.bill_no
        # params["voucherid"] = self.v_produk_kd
        self.request = params
        # todo: apakah harus di cek dulu data inquirynya
        row = self.save_log('payment')
        params['trxid'] = self.partner_log_id
        result = requests.get(self.url, params=params)
        if result.ok:
            data = xmltodict.parse(result.text)["root"]
        else:
            data = dict(error=result.status_code)
        self.response = data
        self.save_log('payment', row)
        return data