valid_nop.py 11.2 KB
from .my_nop import AddSchema
import logging
import re
import colander
from deform import widget, FileData
# from tangsel.base import get_id_card_folder
from tangsel.base.tools.api import config_pars_rpc_url
from tangsel.models import Partner
from tangsel.tools import mem_tmp_store
from tangsel.pbb.models.tools import get_esppt_folder
from tangsel.tools.api import send_rpc
from tangsel.tools.buttons import btn_cancel, btn_reject, btn_accept
from pyramid.view import view_config
from datatables import ColumnDT

from ..models import PartnerNop
from ..views import BaseView
from .. import SPPT_CLASS
from tangsel.base import BASE_CLASS
log = logging.getLogger(__name__)

btn_accept.title = "Terima"
btn_reject.title = "Tolak"


class ListSchema(colander.Schema):
    id = colander.SchemaNode(
        colander.Integer(),
        title="Action")
    nop_formatted = colander.SchemaNode(
        colander.String(),
        title="NOP")
    thn_awal = colander.SchemaNode(
        colander.String(),
        aligned="text-center",
        title="Thn Kepemilikan", width=100)
    thn_akhir = colander.SchemaNode(
        colander.String(),
        aligned="text-center",
        title="Penetapan Akhir", width=100)
    dokumen = colander.SchemaNode(
        colander.String(),
        oid="dokumen",
        title="Dokumen",
    )
    nama = colander.SchemaNode(
        colander.String(),
        title="Nama",
        field=Partner.nama,
    )
    created = colander.SchemaNode(
        colander.String(),
        aligned="text-center",
        title="Tanggal")
    status_text = colander.SchemaNode(
        colander.String(),
        oid="status_text",
        title="Status",
        width=100)

    def after_bind(self, schema, kw):
        request = kw.get("request")
        self["dokumen"].url = request.static_url(SPPT_CLASS.files_bukti)


class EditSchema(AddSchema):
    id = colander.SchemaNode(
        colander.Integer(),
        missing=colander.drop,
        widget=widget.HiddenWidget(readonly=True)
    )
    nama = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
    )
    npwp = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=32),
        oid="npwp")

    idcard = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(mem_tmp_store),
        missing=colander.drop,
        title="ID Card"
    )
    alamat_1 = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=128),
        oid="alamat_1")
    alamat_2 = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=128),
        oid="alamat_2")
    provinsi = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        title="Provinsi",
    )
    dati2 = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        title="Kab/Kota",
        oid="dati2")
    kecamatan = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        title="Kecamatan",
        oid="kecamatan")
    desa = colander.SchemaNode(
        colander.Integer(),
        missing=colander.drop,
        title="Desa/Kelurahan",
        oid="desa")
    email = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=128),
        oid="email")
    phone = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16),
        missing=colander.drop,
        oid="phone")
    fax = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16),
        missing=colander.drop,
        oid="fax")
    mobile = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16),
        missing=colander.drop,
        oid="mobile")
    website = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=128),
        missing=colander.drop,
        oid="website")


class Views(BaseView):
    def __init__(self, request):
        super().__init__(request)
        self.list_schema = ListSchema
        self.add_schema = AddSchema
        self.edit_schema = EditSchema
        self.list_route = "esppt-nop-valid"
        self.table = PartnerNop
        self.list_buttons = ()
        self.allow_add=False
        self.allow_edit = False
        self.allow_delete = False

    def form_validator(self, form, values):
        exc = colander.Invalid(form, "")

        def err_nop():
            exc["nop"] = "NOP tidak ditemukan"
            raise exc

        nop = re.sub("\D", "", values["nop"])
        values["nop"] = nop
        data = {'where':
                [{
                    "key": "nop",
                    "val": nop},
                 ]}

        # if type(values["dokumen"]["upload"]) == bytes:
        #     log.debug("No Dokumen Uploaded")

        auth = config_pars_rpc_url("rpc_pbb_mirror.url", "get_nop")
        resp = send_rpc(auth, data)
        if not resp or "error" in resp:
            err_nop()
        values.update(resp["result"]["data"])

    # @view_config(route_name='esppt-nop-valid',
    #              renderer='templates/form_list.pt',
    #              permission='esppt-tetap')
    # def view_list(self):
    #     return super().view_list(allow_add=False,
    #                              allow_edit=False,
    #                              allow_delete=False)

    # @view_config(route_name='esppt-nop-valid-act', renderer='json',
    #              permission='esppt-tetap')
    # def view_act(self):
    #     self.columns = [
    #         ColumnDT(PartnerNop.id, mData="id", global_search=False),
    #         ColumnDT(PartnerNop.nop_formatted, mData="nop_formatted"),
    #         ColumnDT(PartnerNop.thn_awal, mData="thn_awal"),
    #         ColumnDT(PartnerNop.thn_akhir, mData="thn_akhir"),
    #         ColumnDT(PartnerNop.dokumen, mData="dokumen"),
    #         ColumnDT(Partner.nama, mData="nama"),
    #         ColumnDT(PartnerNop.created, mData="created"),
    #         ColumnDT(PartnerNop.status_text, mData="status_text"),
    #     ]
    #     return super().view_act()

    # @view_config(route_name='esppt-nop-valid-view',
    #              renderer='templates/form.pt',
    #              permission='esppt-tetap')
    def view_buttons(self, row):
        return (btn_accept, btn_reject, btn_cancel)
    
    def next_view(self, form=None, **kwargs):
        # return super().next_view(form, **kwargs)
                # if request.POST:
        row = kwargs.get("row")
        request = self.req
        if "accept" in request.POST:
            row.status = 1
        elif "reject" in request.POST:
            row.status = -1
        self.db_session.add(row)
        self.db_session.flush()
        return self.route_list()

    
    # def view_view(self):
    #     self.buttons
        # request = self.req
        # row = self.query_id().first()
        # if not row:
        #     return self.id_not_found()
        # bindings = self.get_bindings(row)
        # form = self.get_form(self.edit_schema,
        #                      buttons=(btn_accept, btn_reject, btn_cancel),
        #                      bindings=bindings)
        # if request.POST:
        #     if "accept" in request.POST:
        #         row.status = 1
        #     elif "reject" in request.POST:
        #         row.status = -1
        #     self.db_session.add(row)
        #     self.db_session.flush()
        #     return self.route_list()

        # form.set_appstruct(self.get_values(row))
        # table = self.get_item_table(row)
        # return dict(form=form.render(readonly=True),
        #             table=table and table.render() or None,
        #             scripts=self.form_scripts)

    def list_join(self, query):
        return query.join(Partner, Partner.id == PartnerNop.partner_id)

    def list_filter(self, query):
        query = query.filter(self.table.status == 0)
        return query.order_by(self.table.created, self.table.nop)

    def save_request(self, values, row=None):
        if "dokumen" in values and values["dokumen"]:
            del values["dokumen"]
        row = super().save_request(values, row)
        return row

    def get_values(self, row, istime=False):
        d = super().get_values(row, istime)
        if "dokumen" in d and d["dokumen"]:
            filename = d["dokumen"]
            # bukti_folder = get_esppt_folder("/bukti/")
            bukti_folder = SPPT_CLASS.files_bukti
            log.debug(f"Bukti Folder: {bukti_folder}")
            url = self.req.static_url(bukti_folder)
            preview_url = "/".join(
                [url, filename])
            d["dokumen"] = {"uid": filename.split(".")[0],
                            "filename": filename,
                            "preview_url": preview_url
                            }
        partner = Partner.query_id(row.partner_id).first()
        if partner:
            d.update(dict(
                nama=partner.nama,
                alamat=partner.alamat_1,
                idcard=partner.idcard,
                alamat_1=partner.alamat_1,
                alamat_2=partner.alamat_2,
                provinsi=partner.res_provinsi and partner.res_provinsi.nama or "",
                dati2=partner.res_dati2 and partner.res_dati2.nama or "",
                kecamatan=partner.res_kecamatan and partner.res_kecamatan.nama or "",
                desa_id=partner.res_desa and partner.res_desa.nama or "",
                email=partner.email,
                phone=partner.phone,
                fax=partner.fax,
                mobile=partner.mobile,
                website=partner.website
            ))
            if partner.idcard:
                filename = d["idcard"]
                url = self.req.static_url(BASE_CLASS.partner_doc)
                preview_url = "/".join(
                    [url, filename])
                d["idcard"] = {"uid": filename.split(".")[0],
                               "filename": filename,
                               "preview_url": preview_url
                               }
        if not d.get('idcard', None):
            del d['idcard']
        return d
    
# def nop_from_dict(self, d):
#     nop = FixNop("")
#     nop.from_dict(d)
#     return nop.get_formatted()

# def get_values(self, row, istime=False):
#     values = get_sppt(row.nop, row.tahun)
#     if not values:
#         return self.id_not_found()
#     values["nop"] = self.nop_from_dict(values)
#     values["blok_kav_no_wp"] = "|".join(
#         [values["blok_kav_no_wp_sppt"], values["rt_wp_sppt"],
#          values["rw_wp_sppt"]])
#     status_bayar = int(values["status_pembayaran_sppt"])
#     values["status"] = status_bayar and "Lunas" or "Terhutang"
#     values["njop"] = values["njop_bumi_sppt"] + values["njop_bng_sppt"]
#     for k, v in values.items():
#         if type(v) in [float, int]:
#             values[k] = thousand(v)
#     if row.file_name:
#         filename = row.file_name
#         preview_url = "/".join(
#             [self.req.static_url(get_esppt_folder('/')), filename])
#         values["file_name"] = {"uid": filename.split(".")[0],
#                                "filename": filename,
#                                "preview_url": preview_url
#                                }
#
#     return values