nhance/app/Views/kyc_docs.php
2026-04-16 15:28:06 +05:30

670 lines
28 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<style>
#table-kyc-docs_wrapper .datatable-search-wrapper{
width: auto !important;
}
#table-kyc-docs_wrapper .dataTables_filter input{
width: 220px !important;
padding-right: 34px !important;
}
#table-kyc-docs_wrapper .datatable-search-icon,
#table-kyc-docs_wrapper .datatable-clear-icon{
right: 11px !important;
}
/* Unset position on datatables filter to fix alignment issues */
#table-kyc-docs_wrapper div.dataTables_filter {
position: unset !important;
}
#kycdocsModal {
padding-right: 0 !important;
z-index: 1060;
}
#kycdocsModal.show {
display: flex !important;
align-items: center;
justify-content: center;
}
.modal-backdrop {
z-index: 1050;
}
</style>
<div class="tab-pane fade" id="branch-tab">
<div class="row float-right" style="padding-bottom: 10px;position: relative;right: 13px;">
<button type="button" id="btnKycDocsAdd" class="btn btn-primary waves-effect waves-light btn-sm"><span class="mdi mdi-plus-box-outline" aria-hidden="true" style="padding: 5px 10px;"></span>Add KYC Docs</button>
</div>
<div class="table-responsive" id="branch_table" >
<table data-custom-table-css="table" class="table table-borderless table-nowrap mb-0" id="table-kyc-docs">
<thead class="">
<tr>
<th>File Name</th>
<th>Action</th>
</tr>
</thead>
<tbody id="kyc_docs_list">
</tbody>
</table>
</div>
<!-- <div class="row" id="add_branch">
<div class="col-12">
<div class="card-body">
<div class="row float-right" style="position: relative; bottom: 20px; right: 13px;">
<button type="button" id="btnBranchBack" class="btn btn-primary waves-effect waves-light btn-sm btnBack"><span class="mdi mdi-format-list-bulleted" aria-hidden="true" style="padding: 5px 10px;"></span>Back To List</button>
</div>
<hr>
<form role="form" class="parsley-examples" method="post" id="kyc_docs_form"
enctype="multipart/form-data">
<input type="hidden" class="form-control" value="<?= csrf_hash() ?>" name="<?= csrf_token() ?>" />
<input type="hidden" name="PrimaryKey" id="kyc_Docs_PrimaryKey" />
<input type="hidden" name="kyc_type_id" id="kyc_type_id" value="<?= isset($kyc['id']) ? $kyc['id'] : '' ?>"/>
<div class="form-group">
<div class="form-row">
<div class="form-group col-md-6">
<label for="file_name">KYC Docs File Name<span
class="text-danger">*</span></label>
<input type="text" class="form-control" id="file_name"
placeholder="Enter File Name" name="file_name" required>
</div>
</div>
<div class="form-group text-right m-b-0">
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
id="btnSubmit">Submit</button>
<button type="button" class="btn btn-secondary waves-effect btnBack"
id="btnBack">Cancel</button>
</div>
</form>
</div>
</div>
</div> end col -->
</div>
<!-- end -->
<div class="modal fade" id="kycdocsModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header flex-column">
<div class="d-flex w-100 justify-content-between align-items-center">
<h4 class="modal-title mb-0" id="modalLabel">KYC Docs</h4>
<button type="button" class="close js-kyc-docs-close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
</div>
<!-- Modal Body -->
<div class="modal-body" style="overflow-y:auto; max-height:80vh;">
<form role="form" class="parsley-examples" method="post" id="kyc_docs_form" enctype="multipart/form-data">
<!-- CSRF + hidden inputs -->
<input type="hidden" class="form-control" value="<?= csrf_hash() ?>" name="<?= csrf_token() ?>" />
<input type="hidden" name="PrimaryKey" id="kyc_Docs_PrimaryKey" />
<input type="hidden" name="kyc_type_id" id="kyc_type_id" value="<?= isset($kyc['id']) ? $kyc['id'] : '' ?>"/>
<!-- Form fields -->
<div class="form-row">
<div class="form-group col-md-12">
<label for="file_name">KYC Docs File Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="file_name" name="file_name" placeholder="Enter File Name" required>
</div>
</div>
<!-- Form Actions -->
<div class="form-group d-flex justify-content-end mb-0" id="hide_smbt_btn">
<button type="button" class="btn app-btn-outline-secondary mr-2 waves-effect js-kyc-docs-cancel" data-bs-dismiss="modal">
Cancel
</button>
<button type="submit" class="btn app-btn-secondary waves-effect waves-light" id="btnSubmit">
Submit
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
var kyc_Docs_PrimaryKey = $('#kyc_General_PrimaryKey').val();
var kyc_docs_form_action = '';
var kycDocsTable = null;
var kycDocsDebugPrefix = '[KYCDocs]';
function resetKYCDocsForm() {
console.log(kycDocsDebugPrefix + ' resetKYCDocsForm() called.');
var $form = $('#kyc_docs_form');
// Reset the form fields
if ($form.length && typeof $form[0].reset === 'function') {
$form[0].reset();
}
// Reset Parsley validation state
if ($form.length && typeof $form.parsley === 'function') {
try {
$form.parsley().reset();
} catch (e) {
console.warn(kycDocsDebugPrefix + ' Could not reset parsley form.', e);
}
}
// Explicitly clear fields just in case .reset() fails or they are not part of the form
$('#file_name').val('');
$('#kyc_Docs_PrimaryKey').val('');
}
function normalizeKYCDocsRows(response) {
if (!response) return [];
if (Array.isArray(response)) return response;
if (Array.isArray(response.kyc_docs)) return response.kyc_docs;
if (Array.isArray(response.data)) return response.data;
if (response.data && Array.isArray(response.data.kyc_docs)) return response.data.kyc_docs;
return [];
}
function renderKYCDocsTableRows(rows) {
var html = '';
$.each(rows || [], function(index, item) {
var fileName = (item && (item.file_name || item.fileName || item.document_name || item.name)) || '';
var rowId = (item && (item.id || item.primarykey || item.PrimaryKey)) || '';
html += `
<tr>
<td>${fileName}</td>
<td>
<a class="btnBranchEdit" data-id="${rowId}" href="#"><i data-id="${rowId}" class="mdi mdi-lead-pencil btnBranchEdit" style="font-size:18px;"></i></a>
<a style="color:#02a8b5" data-id="${rowId}" onclick="removeKYCDocs(this)"><i data-id="${rowId}" class="mdi mdi-delete" style="font-size:18px;"></i></a>
</td>
</tr>
`;
});
$('#kyc_docs_list').html(html);
}
window.forceHideKYCDocsModal = function () {
console.log(kycDocsDebugPrefix + ' forceHideKYCDocsModal() called.');
var modalEl = document.getElementById('kycdocsModal');
if (modalEl) {
modalEl.classList.remove('show');
modalEl.classList.remove('in');
modalEl.style.display = 'none';
modalEl.setAttribute('aria-hidden', 'true');
modalEl.removeAttribute('aria-modal');
}
document.body.classList.remove('modal-open');
document.body.style.removeProperty('padding-right');
$('.modal-backdrop').remove();
console.log(kycDocsDebugPrefix + ' forceHideKYCDocsModal() finished.');
};
window.forceShowKYCDocsModal = function () {
console.log(kycDocsDebugPrefix + ' forceShowKYCDocsModal() called.');
var modalEl = document.getElementById('kycdocsModal');
if (!modalEl) {
console.log(kycDocsDebugPrefix + ' Modal element not found. Aborting.');
return;
}
console.log(kycDocsDebugPrefix + ' Displaying modal element.');
modalEl.style.display = 'block';
modalEl.classList.add('show');
modalEl.removeAttribute('aria-hidden');
modalEl.setAttribute('aria-modal', 'true');
document.body.classList.add('modal-open');
if (!document.querySelector('.modal-backdrop')) {
console.log(kycDocsDebugPrefix + ' Creating and appending modal-backdrop.');
var backdrop = document.createElement('div');
backdrop.className = 'modal-backdrop fade show';
document.body.appendChild(backdrop);
} else {
console.log(kycDocsDebugPrefix + ' Modal-backdrop already exists.');
}
console.log(kycDocsDebugPrefix + ' forceShowKYCDocsModal() finished.');
};
window.showKYCDocsModal = function () {
console.log(kycDocsDebugPrefix + ' showKYCDocsModal() called.');
var $modal = $('#kycdocsModal');
var modalEl = document.getElementById('kycdocsModal');
try {
console.log(kycDocsDebugPrefix + ' Trying to show modal using jQuery/Bootstrap.');
if (typeof jQuery !== 'undefined' && jQuery.fn && typeof jQuery.fn.modal === 'function') {
console.log(kycDocsDebugPrefix + ' Using jQuery modal("show").');
$modal.modal('show');
console.log(kycDocsDebugPrefix + ' Setting timeout to check if modal is visible.');
setTimeout(function () {
console.log(kycDocsDebugPrefix + ' Timeout check: Modal has "show" class:', $modal.hasClass('show'), 'Is visible:', $modal.is(':visible'));
if (!$modal.hasClass('show') || !$modal.is(':visible')) {
console.log(kycDocsDebugPrefix + ' Modal not visible after timeout, forcing show.');
window.forceShowKYCDocsModal();
}
}, 120);
console.log(kycDocsDebugPrefix + ' showKYCDocsModal() finished via jQuery path.');
return;
}
console.log(kycDocsDebugPrefix + ' jQuery modal not available. Checking for Bootstrap 5 API.');
if (window.bootstrap && bootstrap.Modal && modalEl) {
if (typeof bootstrap.Modal.getOrCreateInstance === 'function') {
console.log(kycDocsDebugPrefix + ' Using bootstrap.Modal.getOrCreateInstance().show().');
bootstrap.Modal.getOrCreateInstance(modalEl).show();
console.log(kycDocsDebugPrefix + ' showKYCDocsModal() finished via BS5 getOrCreateInstance.');
return;
}
if (typeof bootstrap.Modal.getInstance === 'function') {
console.log(kycDocsDebugPrefix + ' Using bootstrap.Modal.getInstance().');
var existing = bootstrap.Modal.getInstance(modalEl);
if (existing) {
console.log(kycDocsDebugPrefix + ' Existing BS5 instance found, calling show().');
existing.show();
console.log(kycDocsDebugPrefix + ' showKYCDocsModal() finished via existing BS5 instance.');
return;
}
}
console.log(kycDocsDebugPrefix + ' Using new bootstrap.Modal().show().');
(new bootstrap.Modal(modalEl)).show();
console.log(kycDocsDebugPrefix + ' showKYCDocsModal() finished via new BS5 instance.');
return;
}
} catch (e) {
console.error('[KYCDocs] Failed to show modal:', e);
console.log(kycDocsDebugPrefix + ' Falling back to forceShowKYCDocsModal().');
window.forceShowKYCDocsModal();
return;
}
console.log(kycDocsDebugPrefix + ' No standard modal methods found, falling back to forceShowKYCDocsModal().');
window.forceShowKYCDocsModal();
};
window.hideKYCDocsModal = function () {
console.log(kycDocsDebugPrefix + ' hideKYCDocsModal() called.');
var $modal = $('#kycdocsModal');
var modalEl = document.getElementById('kycdocsModal');
if (!modalEl) {
console.log(kycDocsDebugPrefix + ' Modal element not found. Aborting.');
return;
}
var closed = false;
try {
console.log(kycDocsDebugPrefix + ' Trying to hide modal using jQuery/Bootstrap.');
if (typeof jQuery !== 'undefined' && jQuery.fn && typeof jQuery.fn.modal === 'function') {
console.log(kycDocsDebugPrefix + ' Using jQuery modal("hide").');
$modal.modal('hide');
closed = true;
}
if (!closed && window.bootstrap && bootstrap.Modal && modalEl) {
console.log(kycDocsDebugPrefix + ' jQuery modal not available/failed. Checking for Bootstrap 5 API.');
if (typeof bootstrap.Modal.getOrCreateInstance === 'function') {
console.log(kycDocsDebugPrefix + ' Using bootstrap.Modal.getOrCreateInstance().hide().');
bootstrap.Modal.getOrCreateInstance(modalEl).hide();
closed = true;
}
if (!closed && typeof bootstrap.Modal.getInstance === 'function') {
console.log(kycDocsDebugPrefix + ' Using bootstrap.Modal.getInstance().');
var existing = bootstrap.Modal.getInstance(modalEl);
if (existing) {
console.log(kycDocsDebugPrefix + ' Existing BS5 instance found, calling hide().');
existing.hide();
closed = true;
}
}
if (!closed) {
console.log(kycDocsDebugPrefix + ' Using new bootstrap.Modal().hide().');
(new bootstrap.Modal(modalEl)).hide();
closed = true;
}
}
} catch (e) {
console.error('[KYCDocs] Failed to hide modal, using fallback:', e);
}
// In mixed Bootstrap environments, plugin hide() can return without visually closing.
// Validate with class and visibility checks, then force cleanup if needed.
setTimeout(function () {
var stillVisible = $modal.is(':visible');
var stillOpen = modalEl.classList.contains('show') || modalEl.classList.contains('in');
if (!closed || stillVisible || stillOpen) {
console.log(kycDocsDebugPrefix + ' Modal still open after hide attempt, forcing close.');
window.forceHideKYCDocsModal();
}
}, 120);
};
// $('#add_branch').hide();
// $('.btnBack').hide();
loadKYCDocsList();
$('#btnKycDocsAdd').click(function(){
console.log(kycDocsDebugPrefix + ' #btnKycDocsAdd clicked.');
kyc_docs_form_action = '<?= base_url("master/kyc/kycdocs/createpost"); ?>';
console.log(kycDocsDebugPrefix + ' Set form action to:', kyc_docs_form_action);
// Reset form before showing to ensure it's clean
resetKYCDocsForm();
console.log(kycDocsDebugPrefix + ' Calling showKYCDocsModal().');
window.showKYCDocsModal();
console.log(kycDocsDebugPrefix + ' #btnKycDocsAdd click handler finished.');
});
// When the modal is completely hidden, reset the form.
// This is the recommended Bootstrap way to handle cleanup.
$('#kycdocsModal').on('hidden.bs.modal', function () {
console.log(kycDocsDebugPrefix + ' #kycdocsModal hidden.bs.modal event fired.');
resetKYCDocsForm();
});
// Add explicit click handlers for close/cancel buttons as data-bs-dismiss might be unreliable.
// This makes it consistent with the working insurer_branch.php modal.
$(document).on('click', '.js-kyc-docs-close, .js-kyc-docs-cancel', function (e) {
e.preventDefault();
window.hideKYCDocsModal();
});
if(kyc_Docs_PrimaryKey !== ''){
var data = <?= isset($insurer_branch) ? json_encode($insurer_branch) : '[]' ?>;
renderKYCDocsTableRows(data);
}
$("#kyc_docs_form").submit(function(events) {
events.preventDefault();
var isValid = $('#kyc_docs_form').parsley().validate();
if (isValid) {
var formData = new FormData($('#kyc_docs_form')[0]);
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
console.log("kyc_docs_form_action");
console.log(kyc_docs_form_action);
$.ajax({
data: formData,
url: kyc_docs_form_action,
type: "POST",
dataType: 'json',
processData: false,
contentType: false,
success: function(res) {
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, 1000);
console.log(res);
var rows = normalizeKYCDocsRows(res);
if (rows.length) {
renderKYCDocsTableRows(rows);
} else {
// Edit API may return only status/message; refresh from list endpoint.
loadKYCDocsList();
}
window.hideKYCDocsModal();
// $('#add_branch').hide();
// $('#branch_table').show();
// $('.btnBack').hide();
// $('#btnBranchAdd').show();
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
if (xhr.status === 400) {
let response = JSON.parse(xhr.responseText);
let errorMessages = "";
let seenMessages = []; // Array to store unique messages
if (response.errors) {
$.each(response.errors, function (field, message) {
if (!seenMessages.includes(message)) {
errorMessages += `• ${message}<br>`;
seenMessages.push(message); // Mark this message as "seen"
}
});
toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
} else {
toastr.warning(response.message || 'Validation failed', 'Warning');
}
}else if (xhr.status === 403) {
let response = JSON.parse(xhr.responseText);
toastr.error(response.message, 'Security Policy');
} else {
toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
}, 1000);
}
});
}
});
$('body').on('click', '.btnBranchEdit', function () {
var branch_id = $(this).attr('data-id');
kyc_docs_form_action = '<?= base_url("master/kyc/kycdocs/edit"); ?>';
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
$.ajax({
url: '<?php echo base_url('master/kyc/kycdocs/editget/');?>'+branch_id,
type: "GET",
dataType: 'json',
success: function (res) {
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, 1000);
console.log("right.........");
window.showKYCDocsModal();
// $('#add_branch').show();
// $('#branch_table').hide();
// $('.btnBack').show();
// $('#btnBranchAdd').hide();
$('#file_name').val(res.policies.file_name);
$('#kyc_Docs_PrimaryKey').val(res.policies.id);
// $('#kyc_docs_list').html(" ");
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
if (xhr.status === 400) {
let response = JSON.parse(xhr.responseText);
let errorMessages = "";
let seenMessages = []; // Array to store unique messages
if (response.errors) {
$.each(response.errors, function (field, message) {
if (!seenMessages.includes(message)) {
errorMessages += `• ${message}<br>`;
seenMessages.push(message); // Mark this message as "seen"
}
});
toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
} else {
toastr.warning(response.message || 'Validation failed', 'Warning');
}
}else if (xhr.status === 403) {
let response = JSON.parse(xhr.responseText);
toastr.error(response.message, 'Security Policy');
} else {
toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
}, 1000);
}
});
});
function loadKYCDocsList() {
var base_url = '<?= base_url("master/kyc/kycdocs/list/"); ?>';
var kyc_Docs_PrimaryKey_1 = $('#kyc_General_PrimaryKey').val();
// console.log("kyc_Docs_PrimaryKey_1");
// console.log(kyc_Docs_PrimaryKey_1);
var kyc_docs_action = base_url + kyc_Docs_PrimaryKey_1;
// console.log(kyc_docs_action);
if (kyc_Docs_PrimaryKey != '') {
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
$.ajax({
url: kyc_docs_action,
type: "GET",
dataType: 'json',
processData: false,
contentType: false,
success: function(res) {
console.log("response in", res);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, 1000);
var rows = normalizeKYCDocsRows(res);
renderKYCDocsTableRows(rows);
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
console.log('Something Wrong!', 'warning'); }, 1000);
}
});
}
}
setTimeout(() => {
kycDocsTable = $('#table-kyc-docs').DataTable({
paging: true,
searching: true,
autoWidth: false,
scrollX: false,
responsive: false,
columnDefs: [
{ targets: 0, width: '50%' },
{ targets: 1, width: '50%' }
],
initComplete: function () {
var $wrapper = $('#table-kyc-docs_wrapper');
$wrapper.find('.dataTables_scrollHeadInner').css({
'box-sizing': 'content-box',
'padding-right': '0px',
'width': '100%'
});
this.api().columns.adjust();
},
dom: "<'datatable-top-section'f>" +
"tr" +
"<'datatable-bottom-section d-flex justify-content-between align-items-center mt-2'<'datatable-info'i><'datatable-controls d-flex align-items-center'<'me-2'l>p>>",
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon" style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon" style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No data available</div>'
}
});
// Table is inside a tab-pane; adjust once visible to keep th/td aligned.
$('a[data-toggle="tab"][href="#branch-tab"], a[data-bs-toggle="tab"][href="#branch-tab"]').on('shown.bs.tab', function () {
if (kycDocsTable) {
kycDocsTable.columns.adjust().draw(false);
}
});
if ($('#branch-tab').hasClass('active') || $('#branch-tab').hasClass('show')) {
kycDocsTable.columns.adjust().draw(false);
}
}, 2000);
});
function removeKYCDocs(element) {
Swal.fire({
title: "Are you sure?",
text: "You need to remove this!.",
icon: "info",
showCancelButton: true,
confirmButtonColor: "#3085d6",
confirmButtonText: "Yes",
}).then((result) => {
if (result.isConfirmed) {
var kyc_docs_id_for_reload = $('#kyc_type_id').val();
var id = element.getAttribute('data-id');
var form_action = '<?= base_url("master/kyc/kycdocs/remove/") ?>' + id;
$.ajax({
url: form_action,
type: "GET",
dataType: 'json',
processData: false,
contentType: false,
success: function(res) {
// console.log(res.status == true);
if(res){
if (res.status == true) {
toastr.success('KYC docs removed successfully');
// location.reload();
window.location.href = '<?= base_url("master/kyc/list/") ?>' + kyc_docs_id_for_reload;
} else {
toastr.warning('Failed to remove KYC docs', 'Warning');
}
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.warning('Failed to remove KYC docs', 'Warning');
}
});
}
});
}
</script>