payment_list.py 8.41 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 case
from sqlalchemy.orm import aliased

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

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


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):
            status = colander.SchemaNode(
                colander.String(),
                oid="status", widget=widget.SelectWidget(values=status_payment, css_class='form-toolbar')
            )

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

        params = {
            'form': form,
            'status_payment': [s for k, s in status_payment if k != 9999],
            'columns': [
                dict(title="ID"),
                dict(title="No. Invoice"),
                dict(title="Customer"),
                dict(title="Vendor"),
                dict(title="Amount"),
                dict(title="Status"),
            ],
            'column_data': [
                dict(data="id", width="0px"),
                dict(data="nomor", width="150px"),
                dict(data="customer"),
                dict(data="vendor"),
                dict(data="amount", width="100px"),
                dict(data="status", 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":
            status = 9999
            if 'status' in request.params:
                status = int(request.params['status'])

            vendor = aliased(Partner, name='vendor')
            customer = aliased(Partner, name='customer')

            columns = [
                ColumnDT(PartnerPay.id, mData='id'),
                ColumnDT(PartnerPay.cust_inv_no, mData='nomor'),
                ColumnDT(
                    column_concat([
                        PartnerPay.inv_cust_nm,
                        ' - (',
                        customer.nama,
                        ')'
                    ]),
                    mData='customer'
                ),
                ColumnDT(vendor.nama, mData='vendor'),
                ColumnDT(PartnerPay.amt_sell, mData='amount'),
                ColumnDT(case(
                    [
                        (PartnerPay.status <= 0, 0)
                    ],
                    else_=PartnerPay.status
                ), mData='status'),
            ]
            query = DBSession.query().select_from(PartnerPay)\
                .join(vendor, vendor.id == PartnerPay.vendor_id)\
                .join(customer, customer.id == PartnerPay.customer_id)
            if status != 9999:
                if status <= 0:
                    query = query.filter(PartnerPay.status <= status)
                else:
                    query = query.filter(PartnerPay.status == status)
            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 = PartnerPay.query_id(id=view_id).first()
        params = dict(
            form=None
        )
        if data:
            customer = '{cust} - ({merc})'.format(cust=data.inv_cust_nm, merc=data.customer.nama)
            form_list = (
                ('vend_inv_no', data.vend_inv_no or '', 'text'),
                ('cust_inv_no', data.cust_inv_no or '', 'text'),
                ('tx_id', data.tx_id or '', 'text'),
                ('vendor', data.vendor.nama, 'text'),
                ('produk', data.produk.nama, 'text'),
                # ('id_pel', data.id_pel or '', 'text'),

                ('customer', customer, 'text'),
                ('cust_addr', data.inv_cust_addr or '', 'text'),
                ('cust_phone', data.inv_cust_phone or '', 'text'),
                ('cust_email', data.inv_cust_email or '', 'text'),
                ('cust_city', data.inv_cust_city or '', 'text'),
                ('cust_state', data.inv_cust_state or '', 'text'),
                ('cust_pos', data.inv_cust_pos or '', 'text'),
                ('cust_country', data.inv_cust_country or '', 'text'),

                # ('inv_valid_date', data.description, 'text'),
                # ('inv_valid_time', data.description, 'text'),
                # ('inv_time_stamp', data.description, 'text'),
                # ('inv_cust_va', data.description, 'text'),
                #
                # ('delivery_addr', data.description, 'text'),
                # ('delivery_city', data.description, 'text'),
                # ('delivery_country', data.description, 'text'),
                # ('delivery_nm', data.description, 'text'),
                # ('delivery_phone', data.description, 'text'),
                # ('delivery_pos', data.description, 'text'),
                # ('delivery_state', data.description, 'text'),
                # ('delivery_email', data.description, 'text'),

                # ('subtotal', data.subtotal, 'text'),
                # ('discount', data.discount, 'text'),
                # ('amt_sell', data.amt_sell, 'text'),
                ('inquiry', format_json(data.inquiry), 'textarea'),
                ('payment', format_json(data.payment), 'textarea'),
                ('advice', format_json(data.advice), 'textarea'),
                ('notify', format_json(data.notify), 'textarea'),
                ('cancel', format_json(data.cancel), 'textarea'),
                ('cart', format_json(data.cart), 'textarea'),
                # ('notes', data.notes, 'text'),
                # ('description', data.description, 'text'),

                # ('fee', data.description, 'text'),
                # ('instmnt_mon', data.description, 'text'),
                # ('instmnt_type', data.description, 'text'),
                # ('recurr_opt', data.description, 'text'),

                # ('m_ref_no', data.description, 'text'),

                # ('notax_amt', data.description, 'text'),
                # ('pay_valid_dt', data.description, 'text'),
                # ('pay_valid_tm', data.description, 'text'),
                #
                # ('req_dt', data.description, 'text'),
                # ('req_tm', data.description, 'text'),
                #
                # ('vat', data.description, 'text'),

                # ('trans_dt', data.description, 'text'),
                # ('trans_tm', data.description, 'text'),
                # ('card_no', data.description, 'text'),
                # ('callback_url', data.description, 'text'),
            )

            sm = colander.Schema()
            values = {}

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

                wg = f[2] == 'textarea' and widget.TextAreaWidget(rows=5, css_class="readonly") 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)