notify_vendor.py 4.23 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:  # for test
    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 = order.notify["result"]
        # tx_id merchant harus dikirim
        tx_id = order.tx_id
        if not tx_id:
            pay_request = 'request' in order.payment and order.payment['request'] or {}
            tx_id = 'tx_id' in pay_request and pay_request['tx_id'] or ""

        data.update(dict(
            invoice_no=order.cust_inv_no,
            signature=signature,
            type=typ,
            tx_id=tx_id
        ))
        # data.update(order.notify["result"])
        # print('>>>', json.dumps(data, indent=4, sort_keys=True))
        js = get_jsonrpc(method="notify", params=dict(data=data))
        log.info("Notify: %s %s" % (url, js))
        try:
            # pass
            requests.post(url, data=js, timeout=20)
        except:
            pass
    return


@view_config(route_name='api-vendor-notify', renderer='json')
def api_vendor_notify(request):
    vendor_nm = request.matchdict['name']

    try:
        data = json.loads(request.text)
    except:
        data = request.POST and dict(request.POST.items()) or dict(request.GET.items())

    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