notify_vendor.py 4.86 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):
    print('purchase_notify >>')
    # Callback to merchant
    if hasattr(order, "customer_id"):
        customer = order.customer
        invoice = order
    else:
        invoice = order.h2h_ar_invoice
        customer = invoice.customer


    print('purchase_notify customer.website >>')
    print(customer.website)
    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)
        log.info("Notify Save: %s" % (data))
        print('purchase_notify order.notify >>')
        print(order.notify)
        order.notify["result"] = data
        flush_row(order)
        js = get_jsonrpc(method="notify", params=dict(data=data))
        log.info("Notify: %s %s" % (url, json.dumps(js)))
        try:
            requests.post(url, data=json.dumps(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
        ))
        params = dict(data=data)
        print('isi payment_notify >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
        print(params)
        js = get_jsonrpc(method="notify", params=params)


        log.info("Notify: %s %s" % (url, json.dumps(js)))
        try:
            requests.post(url, data=json.dumps(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']
    log.info("NOTIFY BEGIN {}".format(vendor_nm))
    try:
        data = json.loads(request.text)
    except:
        data = request.POST and dict(request.POST.items()) or dict(request.GET.items())

    if vendor_nm=="test":
        log.info("NOTIFY TEST {}".format(data))
        return

    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
    log.info("NOTIFY MODULES {} {} {}".format(pckgs, moduls, typ))
    if cls:
        order = cls(data)
        log.info("NOTIFY END")


@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