posisi.py 10.2 KB
import colander
import os
from opensipkd.tools.report import csv_response, open_rml_pdf, open_rml_row, pdf_response, file_response
from deform import widget
from pyramid.view import view_config
from sqlalchemy import or_
from sqlalchemy.orm import aliased
from opensipkd.tools import get_random_string, date_from_str, dmy
from opensipkd.models import DBSession as PartnerDBSession, DBSession, ResCompany, Departemen, Jabatan, Partner, PartnerDepartemen
from . import widget_os, button_import
from ..views import ColumnDT, DataTables, BaseView
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params

SESS_ADD_FAILED = 'Tambah posisi partner gagal'
SESS_EDIT_FAILED = 'Edit posisi partner gagal'

def get_partner_list():
    """Fungsi untuk mengambil daftar partner"""
    partners = DBSession.query(Partner).order_by(Partner.nama).all()
    return [(str(partner.id), partner.nama) for partner in partners]

class AddSchema(colander.Schema):
    @colander.deferred
    def nama_widget(node, kw):
        values = kw.get('partner_list', [])
        return widget.SelectWidget(values=values, placeholder="Pilih Partner")

    @colander.deferred
    def departemen_widget(node, kw):
        departemen_list = DBSession.query(Departemen.id, Departemen.nama).all()
        choices = [(str(departemen.id), departemen.nama) for departemen in departemen_list]
        return widget.CheckboxChoiceWidget(values=choices, multiple=True)

    @colander.deferred
    def jabatan_widget(node, kw):
        jabatan_list = DBSession.query(Jabatan.id, Jabatan.nama).all()
        choices = [('', '- Pilih Jabatan -')] + [(str(jabatan.id), jabatan.nama) for jabatan in jabatan_list]
        return widget.SelectWidget(values=choices)

    partner_id = colander.SchemaNode(
        colander.Integer(),
        oid="partner_id",
        widget=widget.HiddenWidget(),
        title="Partner ID")
    nama = colander.SchemaNode(
        colander.String(),
        widget=nama_widget,
        oid="partner_nm",
        title="Nama")
    departemen_id = colander.SchemaNode(
        colander.Integer(),
        oid="departemen_id",
        widget=widget.HiddenWidget(),
        missing=colander.drop)
    departemen = colander.SchemaNode(
        colander.Set(),
        widget=departemen_widget,
        oid="departemen_nm",
        title="Departemen *")
    jabatan_id = colander.SchemaNode(
        colander.Integer(),
        oid="jabatan_id",
        widget=jabatan_widget,
        title="Jabatan *",
        missing=colander.drop)
    mulai = colander.SchemaNode(
        colander.String(),
        oid="mulai",
        widget=widget_os.DateInputWidget(css_class="date", format="dd-mm-yyyy"),
        title="Mulai")
    selesai = colander.SchemaNode(
        colander.String(),
        oid="selesai",
        widget=widget_os.DateInputWidget(css_class="date", format="dd-mm-yyyy", style="z-index: 9999 !important;"),
        title="Selesai")

class EditSchema(AddSchema):
    id = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.HiddenWidget())

class ListSchema(colander.Schema):
    id = colander.SchemaNode(colander.Integer(), title="Action")
    nama = colander.SchemaNode(colander.String(), field=Partner.nama)
    mulai = colander.SchemaNode(colander.String())
    selesai = colander.SchemaNode(colander.String())

class ViewPartner(BaseView):
    def __init__(self, request):
        super(ViewPartner, self).__init__(request)
        self.list_schema = ListSchema
        self.table = PartnerDepartemen
        self.add_schema = AddSchema
        self.edit_schema = EditSchema
        self.list_route = 'partner-departemen'
        self.list_buttons = self.list_buttons + self.list_report + (button_import,)
        path = os.path.dirname(__file__)
        path = os.path.dirname(path)

    def get_bindings(self, row=None):
        bindings = {
            "partner_list": get_partner_list(),
            "departemen_list": [(str(d.id), d.nama) for d in DBSession.query(Departemen).all()],
            "jabatan_list": [(str(j.id), j.nama) for j in DBSession.query(Jabatan).all()]
        }
        if row:
            bindings["default_values"] = {
                "partner_id": row.partner_id,
                "nama": str(row.partner_id) if row.partner_id else "",
                "departemen": [str(dept_id[0]) for dept_id in DBSession.query(PartnerDepartemen.departemen_id).filter_by(partner_id=row.partner_id, jabatan_id=row.jabatan_id).all()],
                "jabatan_id": str(row.jabatan_id) if row.jabatan_id else "",
                "mulai": dmy(row.mulai) if row.mulai else "",
                "selesai": dmy(row.selesai) if row.selesai else ""
            }
        return bindings

    def form_validator(self, form, value):
        def err_departemen():
            raise colander.Invalid(form, 'Departemen Kerja Belum Dipilih')

        def err_jabatan():
            raise colander.Invalid(form, 'Jabatan Belum Dipilih')

        def err_partner():
            raise colander.Invalid(form, 'Partner Belum Dipilih')

        if not value['partner_id']:
            err_partner()
        if not value['jabatan_id']:
            err_jabatan()
        if not value['departemen'] or value['departemen'] == set():
            err_departemen()

    def save_request(self, values, row=None):
        request = self.req
        if 'id' in request.matchdict:
            values['id'] = request.matchdict['id']
        if 'mulai' in values:
            values['mulai'] = date_from_str(values['mulai']) if values['mulai'] else None
        if 'selesai' in values:
            values['selesai'] = date_from_str(values['selesai']) if values['selesai'] else None

        if 'jabatan_id' in values and values['jabatan_id']:
            values['jabatan_id'] = int(values['jabatan_id'])
        else:
            values['jabatan_id'] = None

        partner_id = values.get('partner_id')
        if not partner_id:
            request.session.flash('Partner ID wajib diisi.', 'error')
            return row if row else PartnerDepartemen()

        if 'departemen' in values and values['departemen']:
            if 'id' in values:
                DBSession.query(PartnerDepartemen).filter_by(
                    partner_id=partner_id,
                    jabatan_id=values['jabatan_id']
                ).delete()

            for dept_id in values['departemen']:
                new_row = PartnerDepartemen(
                    partner_id=partner_id,
                    departemen_id=int(dept_id),
                    jabatan_id=values['jabatan_id'],
                    mulai=values['mulai'],
                    selesai=values['selesai']
                )
                DBSession.add(new_row)
            DBSession.flush()
            request.session.flash('Posisi Partner sudah disimpan.')
            return new_row
        else:
            request.session.flash('Tidak ada departemen yang dipilih.', 'error')
            return row if row else PartnerDepartemen()

    @view_config(route_name='partner-departemen', renderer='templates/table.pt', permission='view')
    def view_list(self):
        return super().view_list()

    def get_module_path(self, module_name):
        a = AssetResolver(module_name)
        resolver = a.resolve('')
        return resolver.abspath()

    def pdf_response(self, **kwargs):
        from opensipkd.base.tools.report import jasper_export
        path = self.get_module_path('opensipkd.base')
        logo = os.path.join(path, 'static', 'img', 'logo.png')
        report_file = os.path.join(path, 'reports', 'partnerdep1.jrxml')
        
        parameters = {
            "judul": get_params('company', "openSIPKD"), 
            "alamat_lengkap": get_params('address', "Bekasi"),
            "logo": logo
        }
        filename = jasper_export(report_file, parameters=parameters)
        return file_response(self.req, filename=filename[0])

    @staticmethod
    def query_register():
        return DBSession.query(PartnerDepartemen.partner_id, PartnerDepartemen.departemen_id, PartnerDepartemen.jabatan_id, PartnerDepartemen.mulai, PartnerDepartemen.selesai).order_by(PartnerDepartemen.partner_id)

    def csv_response(self, **kwargs):
        query = self.query_register()
        row = query.first()
        header = row._mapping.keys()
        rows = [list(item) for item in query.all()]
        filename = f"{get_random_string(16)}.csv"
        value = {'header': header, 'rows': rows}
        return csv_response(self.req, value, filename)

    @view_config(route_name='partner-departemen-act', renderer='json', permission='view')
    def view_act(self):
        # Kode asli view_act tetap sama, tidak diubah untuk pertanyaan ini
        return super().view_act()

    def get_values(self, row, istime=False):
        values = super().get_values(row, istime)
        values['nama'] = row.partner.nama if row.partner else ''
        values['jabatan_id'] = str(row.jabatan_id) if row.jabatan_id else ''
        departemen_ids = DBSession.query(PartnerDepartemen.departemen_id).filter_by(
            partner_id=row.partner_id,
            jabatan_id=row.jabatan_id
        ).all()
        values['departemen'] = [str(dept_id[0]) for dept_id in departemen_ids] if departemen_ids else []
        values['mulai'] = dmy(row.mulai) if row.mulai else ''
        values['selesai'] = dmy(row.selesai) if row.selesai else ''
        return values

    @view_config(route_name='partner-departemen-view', renderer='templates/form.pt', permission='partner-departemen')
    def view_view(self):
        return super().view_view()

    @view_config(route_name='partner-departemen-add', renderer='templates/form.pt', permission='partner-departemen')
    def view_add(self):
        return super().view_add()

    @view_config(route_name='partner-departemen-edit', renderer='templates/form.pt', permission='partner-departemen')
    def view_edt(self):
        return super().view_edit()

    @view_config(route_name='partner-departemen-delete', renderer='templates/form.pt', permission='partner-departemen')
    def view_del(self):
        return super().view_delete()

    @view_config(route_name='partner-departemen-upload', renderer='templates/form.pt', permission='partner-departemen')
    def view_upload(self):
        self.upload_keys = ["mulai"]
        return super().view_upload(exts=(".csv", ".tsv"))