payment_list.py 4.67 KB
import colander
from datatables import ColumnDT
from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from sqlalchemy import func

from . import BaseView
from ..models import (DBSession, H2hArInvoice, H2hArInvoiceDet, Partner)
from opensipkd.base.tools import format_json
from opensipkd.base.tools.db import column_concat

status_payment = (
    (-1, '--Semua--'),
    (0, 'Pending'),
    (1, 'Sukses'),
    (2, 'Batal'),
)

invoice_type = (
    (0, '--None--'),
    (1, 'Purchase'),
    (2, 'Register'),
)


def form_validator(form, value):
    pass


class ViewData(BaseView):
    @view_config(route_name='api-payment-list',
                 permission="api-payment-list",
                 renderer='templates/payment/list.pt')
    def view_list(self):
        class ToolbarSchema(colander.Schema):
            inv_type = colander.SchemaNode(
                colander.Integer(),
                default=1,
                oid="inv_type", widget=widget.SelectWidget(values=invoice_type, css_class='form-toolbar')
            )

        toolbar = ToolbarSchema(Validator=form_validator)
        toolbar.request = self.req
        form = Form(schema=toolbar)

        params = {
            'form': form,
            'invoice_type': [k and s or '-' for k, s in invoice_type],
            'columns': [
                dict(title="ID"),
                dict(title="No. Invoice"),
                dict(title="Customer"),
                dict(title="Jenis"),
            ],
            'column_data': [
                dict(data="id", width="0px"),
                dict(data="nomor", width="150px"),
                dict(data="customer"),
                dict(data="inv_type", width="100px"),
            ],
            'buttons': [
                dict(id="btn_view", cls="btn btn btn-primary", title="View"),
                dict(id="btn_close", cls="btn btn-danger", title="Tutup"),
            ],
            'route': "/api/payment",
            'scripts': """
                $("#btn_close").click(function() {
                    window.location = '/api/merchant';
                    return false;
                });
        """}

        return dict(params=params)

    @view_config(route_name='api-payment-act', renderer='json',
                 permission="api-payment-list"
                 )
    def view_act(self):
        request = self.req
        url_dict = request.matchdict
        act = url_dict['act']
        if act == "grid":
            jenis = 'jenis' in request.params and request.params['jenis'] and int(request.params['jenis']) or None

            columns = [
                ColumnDT(H2hArInvoice.id, mData='id'),
                ColumnDT(H2hArInvoice.cust_inv_no, mData='nomor'),
                ColumnDT(Partner.nama, mData='customer'),
                ColumnDT(func.coalesce(H2hArInvoice.cust_inv_type, 0), mData='inv_type'),
            ]
            query = DBSession.query().select_from(H2hArInvoice)\
                .join(Partner, Partner.id == H2hArInvoice.customer_id)
            query = query.filter(H2hArInvoice.cust_inv_type == jenis)
            row_table = DataTables(request.GET, query, columns)
            return row_table.output_result()

    @view_config(route_name='api-payment-view',
                 permission="api-payment-list",
                 renderer='templates/payment/view.pt')
    def view_detail(self):
        request = self.req
        url_dict = request.matchdict
        view_id = url_dict['id']
        data = H2hArInvoice.query_id(id=view_id).first()
        params = dict(
            form=None
        )
        if data:
            form_list = (
                ('inv_no', data.cust_inv_no or '', 'text'),
                ('customer', data.customer.nama, 'text'),

                ('amount', data.amount or 0, 'text'),
                ('inquiry', format_json(data.inquiry), 'textarea'),
                ('payment', format_json(data.payment), 'textarea'),
                ('advice', format_json(data.advice), 'textarea'),
            )

            sm = colander.Schema()
            values = {}

            for f in form_list:
                k = f[0]
                v = f[1]

                wg = f[2] == 'textarea' and widget.TextAreaWidget(style='height:120px') or\
                     widget.TextInputWidget(readonly=True)

                sm.add(colander.SchemaNode(
                    colander.String(),
                    name=k,
                    oid=k,
                    widget=wg
                ))
                values.update({k: v})

            form = Form(sm)
            form.render(values)
            params['form'] = form

        return dict(params=params)