Based on user selection date i need to calculcate days

gillerlaraj
Tera Contributor

HI,

 

i have start date (date/time) and end date (date/time) and Days as check boxs.

 

if user choose start date and end date and choose days like monday and wednesday means, it will calculate how many mondays & wednedays and set the value in number of days.

 

gillerlaraj_0-1744963039863.png

this is the script i written , but i am not able to move the logic

 

client script

--------------------

var fri = g_form.getValue(' friday');
    var sat = g_form.getValue('saturday');
    var sun = g_form.getValue('sunday');

    var ajax = new GlideAjax('x_892649_medicals.daysCalculation');
    ajax.addParam('sysparm_name', 'days');
    ajax.addParam('sysparm_sdate', sdate);
    ajax.addParam('sysparm_edate', edate);

    ajax.addParam('sysparm_mon',mon);
    ajax.addParam('sysparm_tue',tue);
    ajax.addParam('sysparm_wed',wed);
    ajax.addParam('sysparm_thurs',thurs);
    ajax.addParam('sysparm_fri',fri);
    ajax.addParam('sysparm_sat',sat);
    ajax.addParam('sysparm_sun',sun);
    ajax.getXMLAnswer(response);

    function response(result) {
        alert(result);
        g_form.setValue('number_of_days',result);
    }
 

 

script include

--------------


    days: function() {
        var sdate = this.getParameter('sysparm_sdate');
        var edate = this.getParameter('sysparm_edate');

        var mon=this.getParameter('sysparm_mon');
        var tue=this.getParameter('sysparm_tue');
        var wed=this.getParameter('sysparm_wed');
        var thurs=this.getParameter('sysparm_thurs');
        var fri=this.getParameter('sysparm_fri');
        var sat=this.getParameter('sysparm_sat');
        var sun=this.getParameter('sysparm_sun');

        var startdate = new GlideDateTime(sdate);
        var enddate = new GlideDateTime(edate);


        if(mon==true){
           
        }

 

 

Regards,

Rajesh.

2 REPLIES 2

J Siva
Tera Sage

Hi @gillerlaraj 
Try the below scripts.

Fields/Variables:

JSiva_0-1744973246318.png

 

Script include:

JSiva_1-1744973285245.png

var SJ_CatalogUtils = Class.create();
SJ_CatalogUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    getDays: function() {
        var startDate = new GlideDateTime(this.getParameter('start'));
        var endDate = new GlideDateTime(this.getParameter('end'));
        var count = {
            'monday': 0,
            'tuesday': 0,
            'wednesday': 0,
            'thursday': 0,
            'friday': 0,
            'saturday': 0,
            'sunday': 0
        };

        while (startDate.compareTo(endDate) <= 0) {
            var dayOfWeek = startDate.getDayOfWeek();
            if (dayOfWeek === 1) count.monday++;
            if (dayOfWeek === 2) count.tuesday++;
            if (dayOfWeek === 3) count.wednesday++;
            if (dayOfWeek === 4) count.thursday++;
            if (dayOfWeek === 5) count.friday++;
            if (dayOfWeek === 6) count.saturday++;
            if (dayOfWeek === 7) count.sunday++;

            startDate.addDays(1); // Move to the next day
        }
        gs.info("Monday: " + count.monday.toString());
        gs.info("Tuesday: " + count.tuesday.toString());
        gs.info("Wednesday: " + count.wednesday.toString());
        gs.info("Thursday: " + count.thursday.toString());
        gs.info("Friday: " + count.friday.toString());
        gs.info("Saturday: " + count.saturday.toString());
        gs.info("Sunday: " + count.sunday.toString());

        return JSON.stringify(count);

    },

    type: 'SJ_CatalogUtils'
});

Client scripts (On change):
Note: You have to create 7 client scripts for each day (7 days). Script logic remains same. So just do insert & stay by selecting the day.

 

JSiva_2-1744973386469.png

 

JSiva_3-1744973602070.png

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }

    var mon = g_form.getValue('mon');
    var tue = g_form.getValue('tue');
    var wed = g_form.getValue('wed');
    var thu = g_form.getValue('thu');
    var fri = g_form.getValue('fri');
    var sat = g_form.getValue('sat');
    var sun = g_form.getValue('sun');
    var total = 0;

    var script = new GlideAjax('SJ_CatalogUtils');
    script.addParam('sysparm_name', 'getDays');
    script.addParam('start', g_form.getDisplayValue('start_date'));
    script.addParam('end', g_form.getDisplayValue('end_date'));
    script.getXMLAnswer(function(response) {

        var count1 = JSON.parse(response);
        if (mon == 'true')
            total += parseInt(count1.monday);
        if (tue == 'true')
            total += parseInt(count1.tuesday);
        if (wed == 'true')
            total += parseInt(count1.wednesday);
        if (thu == 'true')
            total += parseInt(count1.thursday);
        if (fri == 'true')
            total += parseInt(count1.friday);
        if (sat == 'true')
            total += parseInt(count1.saturday);
        if (sun == 'true')
            total += parseInt(count1.sunday);

        g_form.setValue('total_days', total.toString());
    });


}

Result:

JSiva_4-1744973667204.png

 

Regards,
Siva

 

sunil maddheshi
Tera Guru

@gillerlaraj Please try with below updated code

var daysCalculation = Class.create();
daysCalculation.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    days: function () {
        var sdate = this.getParameter('sysparm_sdate');
        var edate = this.getParameter('sysparm_edate');

        var selectedDays = {
            1: this.getParameter('sysparm_mon') == 'true',   // Monday
            2: this.getParameter('sysparm_tue') == 'true',   // Tuesday
            3: this.getParameter('sysparm_wed') == 'true',   // Wednesday
            4: this.getParameter('sysparm_thurs') == 'true', // Thursday
            5: this.getParameter('sysparm_fri') == 'true',   // Friday
            6: this.getParameter('sysparm_sat') == 'true',   // Saturday
            0: this.getParameter('sysparm_sun') == 'true'    // Sunday (GlideDateTime considers Sunday as 0)
        };

        var count = 0;
        var start = new GlideDateTime(sdate);
        var end = new GlideDateTime(edate);

        // Loop from start to end date
        while (start.getDate().getNumericValue() <= end.getDate().getNumericValue()) {
            var dayOfWeek = start.getDayOfWeekLocalTime(); // Returns 1=Monday to 7=Sunday

            // Convert 7 (Sunday) to 0 to match JavaScript days
            var jsDay = (dayOfWeek == 7) ? 0 : dayOfWeek;

            if (selectedDays[jsDay]) {
                count++;
            }

            // Move to next day
            start.addDaysLocalTime(1);
        }

        return count.toString();
    }
});

Please mark/correct helpful if this helps you!