history_transaksi.py 10.6 KB
import colander
from datatables import ColumnDT
from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables
from opensipkd.base.tools.report import csv_response
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, H2hArInvoice, H2hArInvoiceDet, Partner, Produk)
from opensipkd.base.tools import format_json
from datetime import datetime
from sqlalchemy import cast, Time, String, func, Date

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

# invoice_type = (
#     (0, '--Semua--'),
#     (1, 'Payment'),
#     (2, 'Register'),
# )


def query_csv(request, status):
    vendor = aliased(Partner, name='vendor')
    customer = aliased(Partner, name='customer')
    query = DBSession.query(H2hArInvoice.cust_inv_no.label('Nomor_Invoice'),
                            H2hArInvoice.created.label('Tanggal'),
                            H2hArInvoiceDet.id_pel.label('ID.Pel'),
                            customer.nama.label('Nama_Customer'),
                            vendor.nama.label('Nama_Vendor'),
                            Produk.nama.label('Nama_Produk'),
                            H2hArInvoiceDet.amt_buy.label('Harga_Beli'),
                            H2hArInvoiceDet.amt_sell.label('Harga_Jual'),
                            case(
                            [
                                (H2hArInvoiceDet.status <= 0, 0)
                            ],
                            else_=H2hArInvoiceDet.status).label('Status')
                           ).\
                            join(H2hArInvoiceDet, H2hArInvoiceDet.ar_invoice_id == H2hArInvoice.id) \
                            .join(customer, customer.id == H2hArInvoice.customer_id) \
                            .join(vendor, vendor.id == H2hArInvoiceDet.vendor_id) \
                            .join(Produk, Produk.id == H2hArInvoiceDet.produk_id)

    if status != 9999:
        if status <= 0:
            query = query.filter(H2hArInvoiceDet.status <= status)
        else:
            query = query.filter(H2hArInvoiceDet.status == status)

    filter_tanggal(request, query, H2hArInvoice.created)
    
    return query

def form_validator(form, value):
    pass

class ViewData(BaseView):
    @view_config(route_name='history-transaksi-list',
                 permission="history-transaksi-list",
                 renderer='templates/history_transaksi/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'),
            #     title="Jenis"
            # )
            status = colander.SchemaNode(
                colander.String(),
                oid="status",
                widget=widget.SelectWidget(values=status_purchase, css_class='form-toolbar'),
                title="Status"
            )
            awal = colander.SchemaNode(
                colander.String(),
                oid = "awal",
                title = "Tgl."
            )
            akhir = colander.SchemaNode(
                colander.String(),
                oid = "akhir",
                title = "-"
            )

        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],
            'status_purchase': [s for k, s in status_purchase if k != 9999],
            'columns': [
                dict(title="ID"),
                dict(title="No.Invoice"),
                dict(title = "Tanggal"),
                dict(title="ID.Pel"),
                dict(title="Produk"),
                dict(title="Harga"),
                dict(title="Status"),
            ],
            'column_data': [
                dict(data="id", width="0px"),
                dict(data="nomor", width="150px"),
                dict(data = "created"),
                dict(data="id_pel", width="150px"),
                dict(data="produk"),
                dict(data="harga", 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"),
                # dict(id="btn_csv", cls="btn btn-primary", title="CSV"),
            ],
            'route': "/api/purchase",
            'scripts': """
                $("#btn_close").click(function() {
                    window.location = '/api/merchant';
                    return false;
                });
        """}

        return dict(params=params)

    @view_config(route_name='history-transaksi-act', renderer='json',
                 permission="history-transaksi-list"
                 )
    def view_act(self):
        request = self.req
        url_dict = request.matchdict
        act = url_dict['act']

        def filter_tanggal(request, query, field):
            awal  = request.session['awal'] + ' 00:00:00' #None
            akhir = request.session['akhir'] + ' 23:59:59'#None
            
            if awal and akhir:
                tglawal    = datetime.strptime(awal, '%d-%m-%Y %H:%M:%S')
                tglakhir   = datetime.strptime(akhir, '%d-%m-%Y %H:%M:%S')
                query = query.filter(field.between(tglawal, tglakhir))

            return query

        if act == "grid":
            # jenis = 'jenis' in request.params and request.params['jenis'] and int(request.params['jenis']) or None
            status = 9999
            if 'status' in request.params:
                status = int(request.params['status'])

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

            columns = [
                ColumnDT(H2hArInvoiceDet.id, mData='id'),
                ColumnDT(H2hArInvoice.cust_inv_no, mData='nomor'),
                # ColumnDT(func.concat_ws(' ', func.to_char(cast(H2hArInvoice.created, Date), ), func.left(cast(cast(H2hArInvoice.created, Time), String), 5)), mData = 'created'),
                ColumnDT(func.to_char(H2hArInvoice.created, 'dd-mm-yyyy HH24:MI'), mData = 'created'),
                ColumnDT(H2hArInvoiceDet.id_pel, mData='id_pel'),
                ColumnDT(customer.nama, mData='customer'),
                ColumnDT(vendor.nama, mData='vendor'),
                ColumnDT(Produk.nama, mData='produk'),
                ColumnDT(H2hArInvoiceDet.amt_buy, mData='harga_beli'),
                ColumnDT(H2hArInvoiceDet.amt_sell, mData='harga'),
                ColumnDT(case(
                    [
                        (H2hArInvoiceDet.status <= 0, 0)
                    ],
                    else_=H2hArInvoiceDet.status
                ), mData='status'),
            ]
            query = DBSession.query().select_from(H2hArInvoice) \
                .join(H2hArInvoiceDet, H2hArInvoiceDet.ar_invoice_id == H2hArInvoice.id) \
                .join(customer, customer.id == H2hArInvoice.customer_id) \
                .join(vendor, vendor.id == H2hArInvoiceDet.vendor_id) \
                .join(Produk, Produk.id == H2hArInvoiceDet.produk_id)
            # query = query.filter(H2hArInvoice.cust_inv_type == jenis)
            if status != 9999:
                if status <= 0:
                    query = query.filter(H2hArInvoiceDet.status <= status)
                else:
                    query = query.filter(H2hArInvoiceDet.status == status)
            query = filter_tanggal(request, query, H2hArInvoice.created)
            row_table = DataTables(request.GET, query, columns)
            return row_table.output_result()
        elif act == "csv":
            status = 9999
            if 'status' in request.params:
                status = int(request.params['status'])

            query = query_csv(request, status)
            row = query.first()

            if row == None:
                header = [
                    'Nomor_Invoice',
                    'Tanggal',
                    'ID.Pel',
                    'Nama_Customer',
                    'Nama_Produk',
                    'Harga_Beli',
                    'Harga_Jual',
                    'Status'
                ]
            else:
                header = row.keys()
            rows = []
            for item in query.all():
                rows.append(list(item))

            filename = 'list_purchase.csv'
            value = {
                  'header': header,
                  'rows'  : rows,
                }
            return csv_response(request, value, filename)


    @view_config(route_name='history-transaksi-view',
                 permission="history-transaksi-list",
                 renderer='templates/history_transaksi/view.pt')
    def view_detail(self):
        request = self.req
        url_dict = request.matchdict
        view_id = url_dict['id']
        data = H2hArInvoiceDet.query_id(id=view_id).first()
        params = dict(
            form=None
        )
        if data:
            invoice = data.h2h_ar_invoice
            customer = invoice.customer
            produk = data.produk
            form_list = (
                ('invoice_no', invoice.cust_inv_no or '', 'text'),
                ('customer', customer.nama, 'text'),
                ('vendor', data.vendor.nama, 'text'),
                ('denom', produk.kode, 'text'),
                ('produk', produk.nama, 'text'),
                ('id_pel', data.id_pel, 'text'),
                ('harga', data.amt_sell or 0, 'text'),
                ('inquiry', format_json(data.inquiry), 'textarea'),
                ('purchase', format_json(data.payment), 'textarea'),
                ('advice', format_json(data.advice), 'textarea'),
                ('notify', format_json(data.notify), 'textarea'),
            )

            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)