vendor_trx.py 12.4 KB
import logging

import colander
from deform import widget, Form, ValidationFailure
from opensipkd.base.models import Partner, flush_row
from opensipkd.base.views import BaseView
from opensipkd.pasar.models import Produk, PartnerLog, H2hArInvoice, H2hArInvoiceDet
from opensipkd.pasar.models.views import (deferred_produk, deferred_vendor,
                                          deferred_customer)
from pyramid.view import view_config

from .api_merchant import build_request, qry_vendor_produk, save_partner_log
from ..tools import btn_inquiry, btn_payment, btn_advice, btn_next
from ..tools import get_settings, btn_purchase

log = logging.getLogger(__name__)


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

    cust_inv_no = colander.SchemaNode(
        colander.String(), title='TRX Customer',
        oid="cust_inv_no",
        widget=widget.TextInputWidget()
    )

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

    id_pel = colander.SchemaNode(
        colander.String(), title='No.Tujuan/ID Pelanggan',
        oid="id_pel", widget=widget.TextInputWidget())

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

    vend_inv_no = colander.SchemaNode(
        colander.String(), title='TRX Vendor',
        missing=colander.drop,
        oid="vend_inv_no",
        widget=widget.TextInputWidget(css_class="readonly")
    )

    serial = colander.SchemaNode(
        colander.String(), title='Serial',
        missing=colander.drop,
        oid="serial",
        widget=widget.TextInputWidget(css_class="readonly")
    )

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

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

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


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


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=Partner.get_vendor_list(),
                         produk=Produk.get_e_list(),
                         customer=Partner.get_customer_list())
    schema.request = request
    if row:
        schema.deserialize(row)
    if not buttons:
        # buttons = (btn_inquiry, btn_reset)
        buttons = ()
    return Form(schema, buttons=buttons)


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


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

form_params_detail = dict(scripts="""
$(document).ready(function(){
    $(".tanggal").datepicker({format:"dd-mm-yyyy"});
    $(".tanggal").attr("readonly", true);
    $(".readonly").attr("readonly", true);
    $("#customer_id").attr("readonly", true);
    $("#cust_inv_no").attr("readonly", true);
    $("#id_pel").attr("readonly", true);
    $("#produk_id").attr("disabled", true);
    $("#vendor_id").attr("disabled", true);
});
""")


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


def save_ar_invoice(values, vendor_produk):
    invoice = H2hArInvoice.query() \
        .filter_by(cust_inv_no=values['cust_inv_no']).first()
    if not invoice:
        invoice = H2hArInvoice()
        invoice.from_dict(values)
        flush_row(invoice)
    invoice_det = H2hArInvoiceDet.query() \
        .filter_by(ar_invoice_id=invoice.id, produk_id=values['produk_id'],
                   id_pel=values["id_pel"]).first()
    if not invoice_det:
        invoice_det = H2hArInvoiceDet()
        invoice_det.ar_invoice_id = invoice.id
        invoice_det.vendor_id = values["vendor_id"]
        invoice_det.produk_id = values["produk_id"]
        invoice_det.id_pel = values["id_pel"]
        invoice_det.amt_sell = vendor_produk.produk.harga
        flush_row(invoice_det)
    return invoice_det


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

    @view_config(route_name='api-vendor-add',
                 permission="api-vendor-add",
                 renderer='templates/form.pt')
    def view_home(self):
        request = self.req
        session = self.ses
        form = get_form(request, AddSchema, (btn_inquiry, btn_purchase,
                                             btn_payment, btn_advice, btn_next))
        settings = get_settings()
        if request.POST:
            form = get_form(request, EditSchema, (btn_inquiry, btn_purchase,
                                                 btn_payment, btn_advice, btn_next))

            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

            vendor_produk = qry_vendor_produk() \
                .filter(Partner.id == values['vendor_id']) \
                .filter(Produk.id == values['produk_id']).first()

            if not vendor_produk:
                session.flash("Produk tidak ditemukan")
                form.render(values)
                return dict(form=form, params=form_params_view)

            if 'inquiry' in request.POST:
                invoice_det = save_partner_log(values, vendor_produk)
                result = build_request('inquiry', vendor_produk, invoice_det)

            elif 'purchase' in request.POST:
                form = get_form(request, AddSchema, (btn_inquiry, btn_purchase,
                                                      btn_payment, btn_advice, btn_next))

                invoice_det = save_ar_invoice(values, vendor_produk)
                result = build_request('payment', vendor_produk, invoice_det)

            elif 'advice' in request.POST:
                id = 'id' in values and values['id'] or None
                if not id:
                    session.flash('Belum ada Invoice', 'error')
                    form = get_form(request, EditSchema, (btn_inquiry, btn_purchase,
                                                          btn_payment, btn_advice, btn_next))
                    form.render(values)
                    return dict(form=form, params=form_params_view)

                invoice_det = query_id(id).first()
                if not invoice_det :
                    session.flash('Data Tidak Ditemukan', 'error')
                    form = get_form(request, EditSchema, (btn_inquiry, btn_purchase,
                                                          btn_payment, btn_advice, btn_next))
                    form.render(values)
                    return dict(form=form, params=form_params_view)

                result = build_request('advice', vendor_produk, invoice_det)

            elif 'register' in request.POST:
                pass

            elif 'payment' in request.POST:
                pass

            if result:
                values.update(result)
                values["id"] = invoice_det.id
                if result["f_result"]["code"] == 0:
                    session.flash(result["f_result"]["message"])
                else:
                    session.flash(result["f_result"]["message"], "error")
            else:
                session.flash("No Result Found", "error")

            form = get_form(request, EditSchema, (btn_inquiry, btn_purchase,
                                          btn_payment, btn_advice, btn_next))
            form.render(values)
            return dict(form=form, params=form_params_view)
        values = dict(
            vendor_id=3,
            id_pel=1234567890,
            cust_inv_no="C-iNV-123",

        )
        form.render(values)
        return dict(form=form, params=form_params_edit)

    # @view_config(route_name='api-vendor-view',
    #              permission="api-vendor-view",
    #              renderer='templates/form.pt')
    # def view_edit(self):
    #     request = self.req
    #     session = self.ses
    #     form = get_form(request, AddSchema)
    #     row = query_id(request).first()
    #     if not row:
    #         return id_not_found(request)
    #     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_detail)
    #
    #         values = dict(c.items())
    #         save_request(request, values, row)
    #         return route_list(request)
    #     valus = row.to_dict()
    #     values = {}
    #
    #     for val in valus:
    #         if valus[val] != None:
    #             values[val] = valus[val]
    #     # values['npwpd']= get_npwpd(row.customer_id)
    #     values['id_pel'] = row.id_pel
    #     form.render(values)
    #     return dict(form=form, params=form_params_detail)


def get_row(id):
    return PartnerLog.query().filter_by(id=id).first()

#
# def vendor():
#     return DBSession.query(Partner.id, Partner.nama) \
#         .filter(Partner.is_vendor == 1).all()
#
#
# def customer():
#     return DBSession.query(Partner.id, Partner.nama) \
#         .filter(Partner.is_customer == 1).all()
#
#
# def produk():
#     return DBSession.query(Produk.id, Produk.nama) \
#         .join(ProdukKategori, Produk.kategori_id == ProdukKategori.id) \
#         .filter(ProdukKategori.kode.in_(['e-pulsa', 'e-voucher', 'e-payment'])).all()
#
#
# 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'))
#
#     row = None
#     if "trx_id" in values and values['trx_id']:
#         trx_id = int(values['trx_id'])
#         row = PartnerLog.query().filter_by(id=trx_id).first()
#
#     modules = import_module('.' + vendor_product.modules, 'agratek.api.backoffice.views')
#
#     cls_module = modules.Vendor(vendor_product, bill_no, customer_id,
#                                 cust_trx_id, row)
#
#     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
#
#
#
# @colander.deferred
# def deferred_vendor(node, kw):
#     values = kw.get('vendor', [])
#     return widget.SelectWidget(values=values)
#
#
# @colander.deferred
# def deferred_customer(node, kw):
#     values = kw.get('customer', [])
#     return widget.SelectWidget(values=values)
#
#
# @colander.deferred
# def deferred_produk(node, kw):
#     values = kw.get('produk', [])
#     return widget.SelectWidget(values=values)