notify_vendor.py 3.73 KB
import json
import logging
from datetime import datetime
from importlib import import_module

import requests
import xmltodict
from agratek.api.merchant.views.vendor import sha256
from opensipkd.base.models import Partner, flush_row
from opensipkd.pasar.models import PartnerProduk, H2hArInvoiceDet
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config

from ..tools import get_settings, get_jsonrpc

log = logging.getLogger(__name__)


def update_harga(p, k, v):
    row = PartnerProduk.query() \
        .filter_by(kode=k, partner_id=p.id).first()
    if not row:
        row = PartnerProduk()
        row.kode = k
        row.partner_id = p.id
        row.created = datetime.now()
    else:
        row.updated = datetime.now()

    row.harga = v
    flush_row(row)
    return True


def purchase_notify(order):
    # Callback to merchant
    if hasattr(order, "customer_id"):
        customer = order.customer
    else:
        invoice = order.invoice
        customer = invoice.customer

    if customer and customer.website:
        url = customer.website
        users = customer.users
        status = order.status == 1 and "SUCCESS" \
                 or order.status < -2 and "FAILED" \
                 or "PENDING"
        key = invoice.cust_inv_no + users.user_name + users.api_key + status
        signature = sha256(key)
        data = []
        produk = []
        dat = dict(
            invoice_no=invoice.cust_inv_no,
            signature=signature)

        discount = order.discount and order.discount or 0
        produk.append(dict(
            denom=order.produk.kode,
            id_pel=order.id_pel,
            subtotal=order.amt_sell + discount,
            discount=discount,
            total=order.amt_sell,
            status=status,
            serial_number=order.serial_number
        ))
        dat.update(produk=produk)
        data.append(dat)
        js = get_jsonrpc(method="notify", params=dict(data=data))
        log.info("Notify: %s %s" % (url, js))
        try:
            requests.post(url, data=js, timeout=10)
        except:
            pass


def payment_notify(order):
    customer = order.customer
    if customer and customer.website:
        url = customer.website
        users = customer.users
        typ = "PAYMENT"
        key = order.cust_inv_no + users.user_name + users.api_key + typ
        signature = sha256(key)
        data = dict(
            invoice_no=order.cust_inv_no,
            signature=signature,
            type=typ
        )
        data.update(order.notify["result"])
        js = get_jsonrpc(method="notify", params=dict(data=data))
        log.info("Notify: %s %s" % (url, js))
        try:
            requests.post(url, data=js, timeout=20)
        except:
            pass
    return

def proses_np(data):
    # todo:
    pass


@view_config(route_name='api-vendor-notify', renderer='json')
def api_vendor_notify(request):
    vendor_nm = request.matchdict['name']
    data = json.loads(request.text)
    modul = '.notify'
    pckgs = 'agratek.api.merchant.views.{}'.format(vendor_nm)
    moduls = import_module(modul, pckgs)
    typ = 'proses'
    cls = hasattr(moduls, typ) and getattr(moduls, typ) or None
    if cls:
        order = cls(data)


@view_config(route_name='api-vendor-test', renderer="string")
def vendor_test(request):
    params = request.params
    vendor = request.matchdict['vendor']
    result = dict(a=1)
    request.response.content_type = "text / xml"
    if vendor == "vsi":
        controls = request.GET.items()
        params = dict(controls)
        params["status"] = "SUCCESS"
        result = dict(root=params)
        result = xmltodict.unparse(result)

    elif vendor == "odeo":
        params = json.loads(request.text)
        result = request.text
    return result