payment.py 8.51 KB
"""
Module proses:
Save
Invoice To Vendor
Invoice To Customer
"""

import hashlib
import json
import logging
import re
from datetime import datetime
from importlib import import_module

import colander
import requests
import xmltodict
from deform import widget, Form, ValidationFailure
# from opensipkd.pasar.models import PartnerLog
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config

from . import BaseView  # , save_file_upload
from ..models import (DBSession, flush_row, Partner, PartnerProduk)
from ..models import (Produk, ProdukKategori)
from ..tools import (btn_next, date_from_str, get_settings, btn_reset,
                     btn_inquiry, btn_advice, btn_payment)

log = logging.getLogger(__name__)

from ..views import deferred_vendor, deferred_customer, deferred_produk


def build_request(typ, values):
    produk_id = values['produk_id']
    vendor_id = values['vendor_id']
    # bill_no = values['destination']
    # customer_id = 'customer_id' in values and values['customer_id'] or None
    # cust_trx_id = 'cust_trx_id' in values and values['cust_trx_id'] or None

    vendor_product = PartnerProduk.query() \
        .join(Produk, PartnerProduk.produk_id == Produk.id) \
        .filter(PartnerProduk.partner_id == vendor_id,
                PartnerProduk.produk_id == produk_id).first()
    if not vendor_product:
        return dict(data=dict(error='Data Tidak Ditemukan'))

    modules = import_module('.' + vendor_product.modules, 'agratek.api.merchant.views')
    cls_module = modules.Vendor(vendor_product, values=values)
    cls = hasattr(cls_module, typ) and getattr(cls_module, typ) or None
    if cls:
        data = cls()
        result = dict(data=data)
        result["f_request"] = cls_module.request
        result["f_response"] = cls_module.response
        result["url"] = cls_module.url
    else:
        result = dict(data=dict(error='Fungsi %s tidak ada' % typ,
                                code=9999))

    return result


class AddSchema(colander.Schema):
    customer_id = colander.SchemaNode(
        colander.Integer(), title='Payment Type',
        oid="customer_id", widget=deferred_customer)

    cust_inv_no = colander.SchemaNode(
        colander.String(), title='No Invoice',
        missing=colander.drop,
        oid="destination")

    produk_id = colander.SchemaNode(
        colander.Integer(), title='Payment Type',
        oid="produk_id", widget=deferred_produk)

    amount = colander.SchemaNode(
        colander.Integer(), title='Jumlah',
        oid="amount")

    vendor_id = colander.SchemaNode(
        colander.Integer(), title='Vendor',
        missing = colander.drop,
        oid="vendor_id", widget=deferred_vendor)

    card_no = colander.SchemaNode(
        colander.String(), title='No. Kartu',
        missing=colander.drop,
        oid="card_no")

    card_exp = colander.SchemaNode(
        colander.String(), title='Expire (YYMM)',
        missing=colander.drop,
        widget = widget.TextInputWidget(min_len=4, max_len=4),
        oid="card_exp")

    card_cvv = colander.SchemaNode(
        colander.String(), title='Valid',
        missing=colander.drop,
        widget=widget.TextInputWidget(min_len=3, max_len=3),
        oid="card_cvv")

    f_result = colander.SchemaNode(
        colander.String(), title='Result to Merchant',
        missing=colander.drop,
        oid="f_result",
        widget=widget.TextAreaWidget(rows=10, css_class="readonly")
    )

    f_request = colander.SchemaNode(
        colander.String(), title='Request',
        missing=colander.drop,
        oid="f_request",
        widget=widget.TextAreaWidget(rows=10, css_class="readonly")
    )

    f_response = colander.SchemaNode(
        colander.String(), title='Response',
        missing=colander.drop,
        oid="f_response",
        widget=widget.TextAreaWidget(rows=10, css_class="readonly")
    )


class EditSchema(AddSchema):
    id = colander.SchemaNode(
        colander.Integer(), title='ID',
        missing=colander.drop,
        oid="id", widget=widget.HiddenWidget())


def form_validator(form, value):
    pass


def get_form(request, class_form, buttons=None, row=None):
    schema = class_form(validator=form_validator)
    schema = schema.bind(vendor=Produk.get_vendor_payment_list(),
                         produk=Produk.get_payment_list(),
                         customer=Partner.get_customer_list())
    schema.request = request
    if row:
        schema.deserialize(row)
    if not buttons:
        buttons = (btn_inquiry, btn_reset)
    return Form(schema, buttons=buttons)


def route_list(request):
    return HTTPFound(location=request.route_url('simkel-permohonan'))


def save(values, row):
    if not row:
        row = PartnerLog()
        row.create_uid = values['uid']
        row.created = datetime.now()
    else:
        row.update_uid = values['uid']
        row.updated = datetime.now()

    row.from_dict(values)
    flush_row(row)
    return row


def save_request(request, values, row=None):
    values['tgl_lahir'] = date_from_str(values['tgl_lahir'])
    values['uid'] = request.user.id
    row = save(values, row)
    request.session.flash('Data %s Berhasil disimpan' % values['nama'])
    return row


form_params_edit = dict(scripts="""
$(document).ready(function(){
    $(".tanggal").datepicker({format:"dd-mm-yyyy"});
    $(".tanggal").attr("readonly", true);
    $(".readonly").attr("readonly", true);
});
""")

form_params_view = dict(scripts="""
$(document).ready(function(){
    $("#nip_penerima, #nopel").attr("readonly", true);
    $(".readonly").attr("readonly", true);
});
""")


def query_id(request):
    id = request.matchdict['id']
    return PartnerProduk.query_id(id)


class ViewHome(BaseView):
    @view_config(route_name='api-payment-doc',
                 permission="api-payment",
                 renderer='templates/payment_doc.pt')
    def view_merchant_doc(self):
        return dict()

    @view_config(route_name='api-payment-add',
                 permission="api-payment-add",
                 renderer='templates/form.pt')
    def view_home(self):
        request = self.req
        session = self.ses
        form = get_form(request, AddSchema, (btn_inquiry, btn_payment, btn_advice, btn_next))
        settings = get_settings()
        if request.POST:
            controls = request.POST.items()
            try:
                c = form.validate(controls)
            except ValidationFailure as e:
                form.set_appstruct(e.cstruct)
                return dict(form=form, params=form_params_edit)

            values = dict(c.items())
            result = None
            if 'inquiry' in request.POST:
                result = build_request('inquiry', values)
                # if product_kd == "crc" or product_kd[:3]=="EWL":
                #     return HTTPFound('api-cc-form', params=result["params"])
            elif 'payment' in request.POST:
                result = build_request('payment', values)
            elif 'advice' in request.POST:
                result = build_request('advice', values)
            elif 'info' in request.POST:
                result = build_request('info', values)

            if result and 'data' in result and result["data"]:
                data = result['data']
                values['f_request'] = 'f_request' in result \
                                      and json.dumps(result['f_request'], indent=4) or ''
                values['f_response'] = 'f_response' in result \
                                       and json.dumps(result['f_response'], indent=4) or ''

                values['f_result'] = 'data' in result \
                                     and json.dumps(result['data'], indent=4) or ''
                values['ref_no'] = 'ref_no' in data and data["ref_no"] or ""
                values['trx_id'] = 'trx_id' in data and data['trx_id'] or ""
                values['vend_trx'] = 'vend_trx' in data and data['vend_trx'] or ""
                if 'error' in data and data['error']:
                    session.flash(data['error'], 'error')
            else:
                session.flash("No Result Data")
            form.render(values)
            return dict(form=form, params=form_params_view)
        values = dict(card_no="5409120028181901",
                      card_exp="2012",
                      card_cvv="111",
                      amount=1000,
                      produk_id=51,
                      cust_inv_no="123456789")
        form.render(values)
        return dict(form=form, params=form_params_edit)


def sha256(hash_string):
    return hashlib.sha256(hash_string.encode()).hexdigest()

def proses_nice_pay(request):
    pass