integrated.py 7.2 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 opensipkd.pasar.models.views import deferred_payment
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


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='Produk',
        oid="produk_id", widget=deferred_produk)

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

    payment_id = colander.SchemaNode(
        colander.Integer(), title='Payment Type',
        oid="payment_id", widget=deferred_payment)

    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")


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_e_list(),
                         payment=Produk.get_pay_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-integrated-doc',
                 permission="api-integrated",
                 renderer='templates/integrated_doc.pt')
    def view_merchant_doc(self):
        return dict()

    @view_config(route_name='api-integrated-add',
                 permission="api-integrated-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,
                      payment_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

@view_config(route_name='api-payment-notify', renderer='json')
def api_vendor_notify(request):
    vendor_nm = request.matchdict['name']
    if vendor_nm == "nice_pay":
        proses_nice_pay(request)