here is my code which i am using to find out the month difference, please help me out.
loan disbursement date = 05-12-2023,
loan collection day = 1st saturday of each month
current date
so we need to find out how many 1st saturday falls in between the disbursement date and current date. because on each month 1 saturday they will collect emi
$(document).ready(function () {
initializeDateInputs();
// Function to calculate attendance percentage
function calculateAttendancePercentage() {
var checkedCount = $('input[name="pstatus[]"]:checked').length; // Count of checked checkboxes
var totalRowCount = $('#lcount').val(); // Total row count
// Calculate the percentage of checked checkboxes
var checkedPercentage = (checkedCount / totalRowCount) * 100;
return checkedPercentage;
}
// Function to update submit button state based on attendance percentage
function updateSubmitButton() {
var attendancePercentage = calculateAttendancePercentage();
if (attendancePercentage >= 50) {
$('#submit').prop('disabled', false);
} else {
$('#submit').prop('disabled', true);
}
}
// Initial calculation and button state update
updateSubmitButton();
// Event listener for attendance checkboxes change
$('input[name="pstatus[]"]').change(function () {
updateSubmitButton();
var checkedPercentage = calculateAttendancePercentage();
// Show toast messages based on attendance percentage
if (checkedPercentage >= 50) {
Swal.fire({
toast: true,
position: 'top-right',
showConfirmButton: false,
timer: 5000,
icon: 'success',
title: 'Scheduled Meeting',
text: 'You have reached 50% attendance requirement. You can now submit the form.',
customClass: {
background: 'bg-green', // Apply bg-green class for success
},
});
} else {
Swal.fire({
toast: true,
position: 'top-right',
showConfirmButton: false,
timer: 5000,
icon: 'error',
title: 'Scheduled Meeting',
text: 'Please ensure at least 50% attendance to submit the form!',
customClass: {
background: 'bg-danger', // Apply bg-green class for success
},
});
}
});
// Calculate arrear demand when EMI date changes
calculateArrearDemand();
async function calculateArrearDemand() {
const disdateValue = $("#disdate").val();
const lrddateValue = $("#lrd").val();
if (!disdateValue) {
console.error("Disbursement date is not defined");
return;
}
if (!lrddateValue) {
console.error("Loan repayment day is not defined");
return;
}
const disbursementDate = parseDate(disdateValue);
const currentDate = new Date();
if (!disbursementDate || !currentDate) {
console.error("Invalid disbursement date or current date");
return;
}
const monthDifference = calculateMonthsDifference(disbursementDate, currentDate, lrddateValue);
console.log("Month difference:", monthDifference);
}
// Calculate the difference in months based on disbursement date, current date, and loan repayment day
function calculateMonthsDifference(disdate, currentDate, lrddate) {
let monthDifference = 0;
let currentMonth = disdate.getMonth();
let currentYear = disdate.getFullYear();
while (currentYear < currentDate.getFullYear() || (currentYear === currentDate.getFullYear() && currentMonth <= currentDate.getMonth())) {
if (containsNthDayOfMonth(currentYear, currentMonth, lrddate)) {
monthDifference++;
}
currentMonth++;
if (currentMonth > 11) {
currentMonth = 0; // January
currentYear++;
}
}
return monthDifference;
}
// Check if the specified month contains the nth occurrence of the specified day
function containsNthDayOfMonth(year, month, lrddate) {
const [occurrenceStr, dayOfWeekStr] = lrddate.split(' ');
const occurrence = parseInt(occurrenceStr[0], 10); // e.g., "1st" -> 1
const dayOfWeek = getDayIndex(dayOfWeekStr); // e.g., "Saturday" -> 6
if (isNaN(occurrence) || dayOfWeek === -1) {
console.error("Invalid occurrence or day of week");
return false;
}
let count = 0;
for (let day = 1; day <= 31; day++) {
const date = new Date(year, month, day);
if (date.getMonth() !== month) break; // Stop if we've moved to the next month
if (date.getDay() === dayOfWeek) {
count++;
if (count === occurrence) return true;
}
}
return false;
}
function parseDate(dateStr) {
if (!dateStr) {
console.error("Invalid date string:", dateStr);
return null;
}
const parts = dateStr.split('-');
if (parts.length !== 3) {
console.error("Invalid date format:", dateStr);
return null;
}
return new Date(parts[2], parts[1] - 1, parts[0]);
}
function getDayIndex(dayName) {
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
return days.indexOf(dayName);
}
// Function to initialize date inputs
function initializeDateInputs() {
const disdateInput = document.getElementById('disdate');
const lrddateInput = document.getElementById('lrd');
if (!disdateInput || !lrddateInput) {
console.error("One or more date input elements are missing");
return;
}
const currentDate = new Date();
console.log("Current date:", formatDate(currentDate));
}
function formatDate(date) {
if (!date) return null;
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${day}-${month}-${year}`;
}
// Form submission handling
$('#formScheduled').on('submit', function (e) {
e.preventDefault();
var form = $(this);
var gid = $("#gid").val();
if (gid == "") {
$("#gid").closest('.form-control form-control-sm').addClass('has-error');
$("#gid").after('<p class="text-danger">Please enter group name!<br></p>');
} else {
$("#gid").closest('.form-control form-control-sm').removeClass('has-error').addClass('has-success');
}
if (gid) {
$.ajax({
url: "AppController/addScheduledMeeting",
method: "POST",
data: new FormData(this),
contentType: false,
cache: false,
processData: false,
dataType: 'json',
success: function (response) {
$(".form-control form-control-sm").removeClass("has-error has-success");
if (response.success == true) {
Swal.fire({
icon: "success",
title: "Good Job!",
text: "Meeting scheduled Successfully",
showConfirmButton: false,
timer: 5000,
});
window.location.reload();
} else {
Swal.fire({
icon: "error",
title: "Oops...",
text: "An error occurred. Please try again later.",
showConfirmButton: false,
timer: 5000,
});
}
},
error: function () {
Swal.fire({
icon: "error",
title: "Oops...",
text: "An error occurred. Please try again later.",
showConfirmButton: false,
timer: 5000,
});
}
});
}
return false;
});
});