MOON
Server: Apache
System: Linux nserver.cafsindia.com 4.18.0-553.104.1.lve.el8.x86_64 #1 SMP Tue Feb 10 20:07:30 UTC 2026 x86_64
User: cafsindia (1002)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: /home/cafsindia/.trash/application/views/invalid_punch_request/manage.php
<?php 
    $this->load->view("partial/header"); 
    $page_name      = ucwords(str_replace("_"," ",$controller_name));
    $prime_id       = "prime_".$controller_name."_id";
    /* PAGE TITLE AND BUTTONS- START */
    $breadcrumb = "";
    if($link_li_line){
        $breadcrumb .= "<li class='dropdown'>
                            <a class='btn btn-xs btn-primary dropdown-toggle' type='button' id='dropdownMenu2' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>
                                <i class='fa fa-plus-circle' aria-hidden='true'></i> Quick Links
                            </a>
                            <ul class='dropdown-menu dropdown-menu-left' aria-labelledby='dropdownMenu2'>
                                $link_li_line
                            </ul>
                        </li>";
    }
    $breadcrumb  .="<li><a href='$site_url#Home'>Home</a></li>
                    <li><a href='".site_url($controller_name)."#$controller_name'>$page_name</a></li>
                    <li class='active'>List</li>";       
?>
<style>
.tab-content{
    overflow:hidden !important;
    max-height: 10000px !important;
}
.custom-td {
    min-width: 100px;
}
td.dataTables_empty {
    height:40px !important;
    padding: 20px; 
    text-align: center; 
}
.card-body {
    padding: 0px 20px;
}
#track_list th, #track_list td ,#details_list th, #details_list td {
    text-align: center;
}
.btn-link {
    text-decoration: none;
    color: #007bff;
    cursor: pointer;
}
#details_list >tbody>tr>td ,#track_list >tbody>tr>td {
    padding:0px !important;
}
/* Reason color*/
span[name='reason'] {
/*    color: #d9534f; */
    font-weight: bold;
}
.btn-submit {
    margin-right:30px;
    float:right;
    padding: 4px ;
    border-radius: 4px;
    cursor: pointer;
    transition: background-color 0.3s ease;
}
.btn-submit:hover {
    background-color: #870000;
}
form input[readonly] {
    background-color: transparent !important;
    border: none !important;
}
.bootstrap-datetimepicker-widget {
    position: sticky !important;
    top: auto !important;   
}
.glyphicon-chevron-left, .glyphicon-chevron-right {
    color: #FFFFFF !important;
}
</style>
<!-- MODULE TITLE !!! -->
<div class='row title_content'>
    <div class='col-md-2 col-xs-4'>
        <h1 class='page_txt' style="overflow: visible !important;"><?php echo $page_name;?></h1>
    </div>
    <div class='col-md-10 col-xs-8'>
        <ol class="breadcrumb">
            <?php  echo $breadcrumb; ?> 
        </ol>
    </div>
</div>
<div id="toolbar" class="form-inline">
    <div class="col-md-12">
        <?php //echo form_open("$controller_name/invalid_punch_log",array('id'=>'invalid_punch_form')); ?>
        <!-- START DATE -->
        <div class="form-group">
            <?php
                echo form_label('Start Date', 'start_date', array('class' => 'required'));
                echo form_input(array('name' => 'start_date', 'id' => 'start_date', 'class' => 'form-control input-sm datepicker','placeholder' => 'Start Date')); 
            ?>
        </div>
        <!-- END DATE -->
        <div class="form-group">
            <?php
                echo form_label('End Date', 'end_date', array('class' => 'required'));
                echo form_input(array('name' => 'end_date', 'id' => 'end_date', 'class' => 'form-control input-sm datepicker','placeholder' => 'End Date')); 
            ?>
        </div>
    </div>
</div>
<div class="row" >
    <div class="col-md-12 loader-container">
        <div class="loader" style="text-align:center">
            <span style="color:#CC3366;font-size:large"><i class="fa fa-spinner fa-spin fa-2x fa-fw"></i><br/>Processing...</span>
        </div>
    </div>
    <div class='col-md-12' id='table_div' style='display: none;'>
        <ul class="nav nav-tabs">
          <li class="active"><a data-toggle="tab" href="#request_punch"> Request punch </a></li>
          <li><a data-toggle="tab" href="#track_status"> Request Status </a></li>
        </ul>
        <div class="tab-content">
            <div id = "request_punch" class = "tab-pane fade in active" > 
                <div class='col-md-12' style='margin:10px;' id="rslt_info"></div>
            </div>
            <div id = "track_status" class = "tab-pane fade">    
                <div class='col-md-12' style='margin:10px;' id="track_info"></div>
            </div>
        </div>
    </div>  
</div>
<script type="text/javascript">
$(document).ready(function(){
    $(".datepicker").datetimepicker({format: 'DD-MM-YYYY'});
    //CALLBACK FUNCTION
    tos_posting_mon_day("4");
    $("#start_date,#end_date").on("dp.change",function(){
        request_punch();
    });
});
//Funtion onload for table display.
function request_punch(){
    var start_date = $("#start_date").val();
    var end_date   = $("#end_date").val();
    $('.loader').show();
    if(start_date && end_date){
        $.ajax({
            type: 'POST',
            url: '<?php echo site_url("$this->control_name/request_punch");?>',
            data: { start_date: start_date, end_date: end_date },
            success: function (response){
                $('.loader').hide();
                var rslt = JSON.parse(response);
                if(rslt.success){
                    $('#table_div').show();
                    $("#rslt_info").html(rslt.table_content);
                    $("#track_info").html(rslt.track_content);
                    $(".datetimepicker").datetimepicker({ format: 'DD-MM-YYYY HH:mm:ss' });
                    $('#details_list').DataTable({
                        "processing": true,
                        "autoWidth" : false,
                        "columnDefs": [
                            { "width": "50%", "targets": 5 }
                        ],
                        language: {
                            lengthMenu: "<span style='margin-top:8px;margin-left:10px;'>Display</span> _MENU_ <span              style='margin-top:8px;'>Records</span>",
                            searchPlaceholder: "Search records",
                            search: "",
                        },
                    });
                    $('#track_list').DataTable({
                        "processing": true,
                        "autoWidth" : false,
                        "columnDefs": [
                            { "width": "35%", "targets": 7 }
                        ],
                        language: {
                            lengthMenu: "<span style='margin-top:8px;margin-left:10px;'>Display</span> _MENU_ <span style='margin-top:8px;'>Records</span>",
                            searchPlaceholder: "Search records",
                            search: "",
                        },
                    });
                }
                $('#details_list').DataTable().draw();
                $('#track_list').DataTable().draw();
                $('input[type=search]').addClass('form-control input-sm select2');
                $("select[name='table_length']").addClass('form-control input-sm');
            },
            complete: function(){
                $('.loader').hide();
            }
        });
    }else{
        toastr.error("Please choose all the fields.!");
    }
}

function submitForm(user_id, row, shift_date, validation_ids, entry_from, entry_to) {
    var form_id = 'formData_' + row;
    var form    = $('#' + form_id);
    var submit  = $('#submit_' + row);
    var previous_out_punch;

    //FIRST INPUNCH SHOULD BE GREATER THAN ENTRY FROM DATE.
    $.validator.addMethod("first_inpunch", function(value, element, entry_from){
        var in_punch      = moment(value, 'DD-MM-YYYY HH:mm:ss', true);
        var first_inpunch = moment(entry_from, 'DD-MM-YYYY HH:mm:ss', true);
        return (in_punch.isSameOrAfter(first_inpunch));
    }, "First Inpunch should be Greater than " + entry_from + ".");

    //FINAL OUTPUNCH SHOULD BE LESS THAN ENTRY TO DATE.
    $.validator.addMethod("final_outpunch", function(value, element, entry_to){
        var in_punch       = moment(entry_to, 'DD-MM-YYYY HH:mm:ss', true);
        var final_outpunch = moment(value, 'DD-MM-YYYY HH:mm:ss', true);
        return (final_outpunch.isSameOrBefore(in_punch));
    }, "Final outpunch should be lesser than " + entry_to + ".");
    

    //CURRENT INPUNCH SHOULD BE GREATER THAN PREVIOUS OUTPUNCH STARTS.
    $.validator.addMethod("inpunch_validation", function(value, element) {
        var in_id  = $(element).attr('id').split('_')[2];
        var out_id = null;
        // Find the previous out_id corresponding to the current in_id
        for(var i  = 1; i < validation_ids.length; i++){
            if(validation_ids[i] === in_id){
                out_id = validation_ids[i - 1];
                break;
            }
        }
        if(out_id){
            var out_punch_str = $('#out_punch_' + out_id).val();
            if(out_punch_str){
                var in_punch  = moment(value, 'DD-MM-YYYY HH:mm:ss', true);
                var out_punch = moment(out_punch_str, 'DD-MM-YYYY HH:mm:ss', true); 
                var diff_sec  = in_punch.diff(out_punch, 'seconds');
                return in_punch.isAfter(out_punch) && diff_sec > '2';
            }
        }
        return true;
    }, "In Punch should be greater than previous Out Punch - Minimum 2 seconds.");


    //CURRENT OUTPUNCH SHOULD BE LESSER THAN NEXT INPUNCH STARTS.
    $.validator.addMethod("outpunch_validation", function(value, element) {
        var out_id = $(element).attr('id').split('_')[2];
        var in_id  = null;
        validation_ids.forEach((id, index) => {
            if(id === out_id && index < validation_ids.length - 1){
                in_id = validation_ids[index + 1];
            }
        });
        if(in_id){
            var in_punch_str  = $('#in_punch_' + in_id).val();
            if(in_punch_str){
                var in_punch  = moment(in_punch_str, 'DD-MM-YYYY HH:mm:ss', true);
                var out_punch = moment(value, 'DD-MM-YYYY HH:mm:ss', true);
                var diff_sec  = out_punch.diff(in_punch, 'seconds');
                return out_punch.isBefore(in_punch) && diff_sec < '2';
            }
        }
        return true;
    }, "Out Punch Should be Less than Next In Punch - Minimum 2 seconds.");

    //VALIDATE THE FORM.
    var firstInpunchAdded  = false; 
    var finalOutpunchAdded = false; 
    var rules = {};
    validation_ids.forEach(function (curr_validation_id, index){
        rules['in_punch_' + curr_validation_id]  = { 
            required            : true, 
            inpunches           : curr_validation_id, 
            inpunch_prev        : curr_validation_id,
            inpunch_validation  : curr_validation_id
        };
        if(!firstInpunchAdded && index === 0){
            rules['in_punch_' + curr_validation_id].first_inpunch = entry_from
            firstInpunchAdded   = true; 
        }
        rules['out_punch_' + curr_validation_id] = { 
            required            : true, 
            outpunches          : curr_validation_id, 
            outpunch_next       : curr_validation_id,
            outpunch_validation : curr_validation_id,
        };
        if(!finalOutpunchAdded && index === (validation_ids.length - 1)){
            rules['out_punch_' + curr_validation_id].final_outpunch = entry_to
            finalOutpunchAdded  = true; 
        }
        rules['remarks_' + curr_validation_id]   = { 
            required            : true 
        };
    });

    form.validate({
        rules: rules,
        errorPlacement: function (error, element) {
            error.insertAfter(element);
        },
    });
    if(form.valid()){
        var formData = form.serializeArray();
        $(submit).html("<i class='fa fa-spinner fa-spin'></i> Processing...").attr('disabled', 'disabled');
        $.ajax({
            type: 'POST',
            url : '<?php echo site_url("$this->control_name/request_entry"); ?>',
            data: { user_id: user_id, row: row, shift_date: shift_date, formData: formData },
            success: function (response){
                var rslt = JSON.parse(response);
                $(submit).attr('disabled', false).html("Submit");
                if(rslt.success){
                    $("#track_info").html(rslt.track_content);
                    toastr.success(rslt.message);
                    $('#row_' + rslt.row_id).remove();
                    request_punch();
                    $('#track_list').DataTable({
                        "autoWidth": false,
                        "columnDefs": [
                            { "width": "50%", "targets": 8 }
                        ],
                        language: {
                            lengthMenu: "<span style='margin-top:8px;margin-left:10px;'>Display</span> _MENU_ <span style='margin-top:8px;'>Records</span>",
                            searchPlaceholder: "Search records",
                            search: "",
                        },
                    });
                }else{
                    toastr.error(rslt.message);
                }
            }
        });
    }
}
//TOS SETTING BASED DAY START AND END GET AND LAST PAYROLL MONTH BASED MIN DATE GET
function tos_posting_mon_day(entry_parameter,min_max_date_set){
    if(entry_parameter){
        var send_url = '<?php echo site_url("$controller_name/tos_posting_mon_day");?>'      
        $.ajax({
            type: 'POST',
            url: send_url,
            data:{entry_parameter:entry_parameter},
            success: function(data){
                var rslt = JSON.parse(data);
                var min_date  = '';
                if(rslt.success){
                    $('#start_date').val(rslt.min_date);
                    $('#end_date').val(rslt.max_date);
                    request_punch();
                }
            }
        });
    }
}
//collapseToggle for request punch.
function toggleAccordion(index){
    $('[id^=collapseOne]').collapse('hide');
    $(`#collapseOne${index}`).collapse('show');
}
//collapseToggle for request status.
function statusAccordion(index){
    $('[id^=statusCollapse]').collapse('hide');
    $(`#statusCollapse${index}`).collapse('show');
}
// Check if in_punch is greater than out_punch.
$.validator.addMethod("inpunches", function (value, element, params) {
    var in_punch_str  = $('#in_punch_'  + params).val();
    var out_punch_str = $('#out_punch_' + params).val();
    var in_punch      = moment(in_punch_str,  'DD-MM-YYYY HH:mm:ss', true);
    var out_punch     = moment(out_punch_str, 'DD-MM-YYYY HH:mm:ss', true);
    return !(in_punch.isValid() && out_punch.isValid() && in_punch.diff(out_punch) >= 0);
}, "In punch should be lesser than out punch.");

// check if in_punch is greater than out_punch.
$.validator.addMethod("outpunches", function (value, element, params) {
    var in_punch_str  = $('#in_punch_'  + params).val();
    var out_punch_str = $('#out_punch_' + params).val();
    var in_punch      = moment(in_punch_str,  'DD-MM-YYYY HH:mm:ss', true);
    var out_punch     = moment(out_punch_str, 'DD-MM-YYYY HH:mm:ss', true);
    return !(in_punch.isValid() && out_punch.isValid() && in_punch.diff(out_punch) >= 0);
}, "Out Punch should be Greater than In Punch.");

// check if in punch is the same day or the previous day.
$.validator.addMethod("inpunch_prev", function (value, element, params) {
    var in_punch_str  = $('#in_punch_'  + params).val();
    var out_punch_str = $('#out_punch_' + params).val();
    var in_punch      = moment(in_punch_str,  'DD-MM-YYYY HH:mm:ss', true);
    var out_punch     = moment(out_punch_str, 'DD-MM-YYYY HH:mm:ss', true);
    return (in_punch.isSame(out_punch, 'day') || in_punch.isSame(out_punch.clone().subtract(1, 'day'),'day'));
}, "In Punch should be the same day of outpunch or the previous day.");

// check if in punch is the same day or the next day.
$.validator.addMethod("outpunch_next", function (value, element, params) {
    var in_punch_str  = $('#in_punch_'  + params).val();
    var out_punch_str = $('#out_punch_' + params).val();
    var in_punch      = moment(in_punch_str,  'DD-MM-YYYY HH:mm:ss', true);
    var out_punch     = moment(out_punch_str, 'DD-MM-YYYY HH:mm:ss', true);
    return (out_punch.isSame(in_punch, 'day') || out_punch.isSame(in_punch.clone().add(1, 'day'),'day'));
}, "Out Punch should be the same day of inpunch or the next day.");

</script>
<?php $this->load->view("partial/footer"); ?>