function allReadyEdit() {
var mstform = Ext.getCmp('p_form0000700102_m');
var dgrid = Ext.getCmp('p_form0000700102_dgrid');
var dstore = dgrid.store;
var Toolbar = Ext.getCmp('toolbar');
dgrid.hideColumn('xlbz', true);
dgrid.hideColumn('checkboxcol_1', true);
dgrid.hideColumn('ykkt_name', true);
dgrid.hideColumn('numericcol_1', true);
dgrid.hideColumn('sydw1', true);
const holidayRanges = [
{ start: '2025-04-03', end: '2025-04-06' },
{ start: '2025-04-30', end: '2025-05-05' },
{ start: '2025-05-30', end: '2025-06-02' }
];
const workWeekends = [
'2025-04-27',
'2023-10-08'
];
Toolbar.insert(5, { itemId: "jc", text: "基础数据获取", width: this.itemWidth, iconCls: "icon-refuse" });
Toolbar.insert(6, { itemId: "ts", text: "考勤天数设置", width: this.itemWidth, iconCls: "icon-New" });
Toolbar.insert(8, { itemId: "js", text: "薪资计算", width: this.itemWidth, iconCls: "icon-New" });
Toolbar.get('js').on('click', function () {
Ext.Msg.wait("正在处理数据...", "请稍候");
var storeData = dgrid.getStore().getRange();
var totalCount = storeData.length;
var batchSize = 50;
function processBatch(index) {
var end = Math.min(index + batchSize, totalCount);
for (; index < end; index++) {
var record = storeData[index];
if (record.get('checkboxcol_2') != 1) continue;
var fields = {
gzbz: record.get('gzbz') || 0,
byts: record.get('byts') || 0,
jxts: record.get('jxts') || 1,
u_jxbl: record.get('u_jxbl') || 0,
zcbz: record.get('zcbz') || 0,
zwbz: record.get('zwbz') || 0,
qtbz: record.get('qtbz') || 0,
jj: record.get('jj') || 0,
qjkk: record.get('qjkk') || 0,
grhj: record.get('grhj') || 0,
gjjgr: record.get('gjjgr') || 0,
u_grsdr: record.get('u_grsdr') || 0,
u_qtkk: record.get('u_qtkk') || 0,
numericcol_4: record.get('numericcol_4') || 0,
pc: record.get('zz') || 0,
jxbckk:record.get('numericcol_5') || 0,
ghhyf:record.get('numericcol_2') || 0
};
var qjgz = fields.gzbz * 0.3 * fields.numericcol_4 / fields.jxts;
var ratio = fields.byts / fields.jxts;
var jbgz = fields.gzbz * 0.3 * ratio + qjgz;
var gwgz = fields.gzbz * (0.7 - fields.u_jxbl) * ratio;
var jxgz = fields.gzbz * fields.u_jxbl * ratio;
var bzhj = fields.zcbz + fields.zwbz + fields.qtbz;
var yfhj = jbgz + gwgz + jxgz + bzhj + fields.jj - fields.qjkk;
var ynshj = yfhj - fields.grhj - fields.gjjgr;
var jxgskk = jxgz+fields.jxbckk;
if ( fields.pc == '537200313000030' || fields.pc == '537200315000048' || fields.pc == '806221125062004' || fields.pc == '537200315000008'
|| fields.pc == '537200315000070' || fields.pc == '537200313000037' || fields.pc == '537200315000019'|| fields.pc == '614000000000034'|| fields.pc == '614000000000007'
|| fields.pc == '537200313000036') {
var ghhyf = 0;
} else if(fields.pc == '537200313000049') {var ghhyf = fields.ghhyf; } else { var ghhyf = jbgz * 0.005; }
record.set({
'jbgz': jbgz,
'gwgz': gwgz,
'jxgz': jxgz,
'bzhj': bzhj,
'yfhj': yfhj,
'ynshj': ynshj,
'u_jxgskk': jxgskk,
'numericcol_2': ghhyf,
'u_sfhj': ynshj - fields.u_grsdr - jxgskk - fields.u_qtkk - ghhyf
});
}
if (index < totalCount) {
requestAnimationFrame(() => processBatch(index));
} else {
dgrid.getView().refresh();
Ext.Msg.hide();
}
}
setTimeout(() => processBatch(0), 50);
});
var toolMenu = Ext.create('Ext.menu.Menu', {
items: [{
text: '一键选择/取消',
itemId: 'xzqx',
handler: function () {
processBatchUpdate('checkboxcol_2');
}
}, {
text: '一键赋值系数',
itemId: 'fzxs',
handler: function () {
processBatchUpdate('numericcol_3');
}
}]
});
var assignBtn = Ext.create('Ext.button.Button', {
itemId: "xz",
text: "一键赋值",
width: this.itemWidth,
iconCls: "icon-New",
menu: toolMenu
});
Toolbar.insert(9, assignBtn);
function processBatchUpdate(field) {
var store = dgrid.getStore();
var records = store.getRange();
var value = records[0].get(field);
Ext.Msg.wait("处理中...", "请稍候");
store.suspendEvents();
Ext.Array.each(records, function (record) {
record.set(field, field == 'checkboxcol_2' ? (value == '0' ? 1 : 0) : value);
});
store.resumeEvents();
dgrid.getView().refresh();
Ext.Msg.hide();
}
if (otype == $Otype.ADD) {
mstform.getItem('yf').addListener('change', function () {
var b = mstform.getItem('yf').getValue();
var a = mstform.getItem('nd').getValue();
if (b) {
var pc = mstform.getItem('ocode').getValue()
callServer('pc', [{ 'pc': pc }],
function (res) {
if (res) {
mstform.getItem('title').setValue(res.record[0].oname + '人员2025年' + b + '月工资表');
}
});
}
if (a && b) {
var firstDay = new Date(a, +b - 1, 1);
var nextMonthFirstDay = new Date(a, +b, 1);
var lastDay = new Date(nextMonthFirstDay - 1);
mstform.getItem('datetimecol_1').setValue(firstDay);
mstform.getItem('datetimecol_2').setValue(lastDay);
}
});
mstform.getItem('nd').addListener('change', function () {
var b = mstform.getItem('yf').getValue();
var a = mstform.getItem('nd').getValue();
if (b) {
var pc = mstform.getItem('ocode').getValue()
callServer('pc', [{ 'pc': pc }],
function (res) {
if (res) {
mstform.getItem('title').setValue(res.record[0].oname + '人员2025年' + b + '月工资表');
}
});
}
if (a && b) {
var firstDay = new Date(a, +b - 1, 1);
var nextMonthFirstDay = new Date(a, +b, 1);
var lastDay = new Date(nextMonthFirstDay - 1);
mstform.getItem('datetimecol_1').setValue(firstDay);
mstform.getItem('datetimecol_2').setValue(lastDay);
}
});
}
Toolbar.get('ts').on('click', function () {
var nd = mstform.getItem('nd').getValue();
var yf = mstform.getItem('yf').getValue();
var date = timestampToTime(mstform.getItem('datetimecol_2').getValue());
var dt = timestampToTime(mstform.getItem('datetimecol_1').getValue());
if (Ext.isEmpty(nd)) {
Ext.Msg.alert('提示', '请先选择年度!');
return false;
};
if (Ext.isEmpty(Ext.getCmp('yf').getValue())) {
Ext.Msg.alert('提示', '请先输入月份!');
return false;
};
Ext.Msg.wait("正在处理数据...", "请稍候");
var map_lzrq = new Map();
var map_kqtstj = new Map();
var map_qjrqpd = new Map();
var fzts_tmp = 0;
var kqfz2 = 0;
Promise.all([
new Promise((resolve) => {
callServer('lzrq', [{ 'appdt': dt, 'date': date }], function (res) {
res.record.forEach(element => {
var arr = [element.appdtt, element.chgtype, element.phiddept, element.dept];
map_lzrq.set(element.phid, arr);
});
resolve();
});
}),
new Promise((resolve) => {
callServer('qijqpd', [{ 'nd': nd, 'yf': yf }], function (res) {
if (res.record.length > 0) {
res.record.forEach(element => {
map_qjrqpd.set(element.ry, [element.factbdt, element.factend, element.holitype]);
});
}
resolve();
});
}),
new Promise((resolve) => {
callServer('kqtstj', [{ 'nd': nd, 'yf': yf }], function (res) {
if (res.record.length > 0) {
res.record.forEach(element => {
map_kqtstj.set(element.ry, [element.aa, element.kgts, element.qjts]);
});
}
resolve();
});
}),
new Promise((resolve) => {
callServer('kqfz', [{ 'nd': nd, 'yf': yf }], function (res) {
if (res.record.length > 0) {
fzts_tmp = res.record[0].numericcol_1;
}
resolve();
});
})
]).then(() => {
var a = dgrid.getStore().getRange(0, dstore.getCount() - 1);
var index = 0;
var batchSize = 10;
function processBatch() {
var end = Math.min(index + batchSize, dstore.getCount());
for (; index < end; index++) {
if (a[index].get('checkboxcol_2') == 1) {
var id = a[index].get('checkboxcol_1');
var ry = a[index].get('empid');
var rymb = ry + a[index].get('deptid');
var sfz = a[index].get('textcol_1');
var cdt = a[index].get('datetimecol_1');
var syqygzt = a[index].get('u_ygzt');
if (id == '') {
var ts1, ts2, qjts, ts3, ts4, fzts = 0, ts5, fztsf = 0;
if (map_kqtstj.get(rymb) && syqygzt != '试用') {
ts1 = map_kqtstj.get(rymb)[0];
ts2 = map_kqtstj.get(rymb)[1];
qjts = map_kqtstj.get(rymb)[2];
} else {
callServer('syqyglx', [{ 'rymb': rymb, 'nd': nd, 'yf': yf }], function (res) {
if (res) {
ts1 = res.record[0].aa;
ts2 = res.record[0].kgts;
qjts = res.record[0].qjts;
}
});
}
if (map_qjrqpd.get(ry)) {
ts3 = new Date(map_qjrqpd.get(ry)[0]);
ts4 = new Date(map_qjrqpd.get(ry)[1]);
ts5 = map_qjrqpd.get(ry)[2];
}
if (cdt > timestampToTime(dt)) {
fzts = countMonthSpecialDays(timestampToTime(cdt), holidayRanges, workWeekends, "after");
kqfz2 = 0;
} else if (map_lzrq.get(ry)) {
if (map_lzrq.get(ry)[1] == 6 || map_lzrq.get(ry)[2] == a[index].get('deptid')) {
fzts = countMonthSpecialDays(map_lzrq.get(ry)[0], holidayRanges, workWeekends, "before");
} else if (map_lzrq.get(ry)[3] == a[index].get('deptid')) {
fzts = countMonthSpecialDays(map_lzrq.get(ry)[0], holidayRanges, workWeekends, "after");
}
if (map_lzrq.get(ry)[1] != 6) {
if ((ts1 || 0) - kqfz2 + fzts < a[index].get('jxts') / 2) {
a[index].set('yldw', 0);
a[index].set('ylgr', 0);
a[index].set('sydw', 0);
a[index].set('sygr', 0);
a[index].set('yldw1', 0);
a[index].set('ylgr1', 0);
a[index].set('gsdw', 0);
a[index].set('sydw1', 0);
a[index].set('dedw', 0);
a[index].set('degr', 0);
a[index].set('dwhj', 0);
a[index].set('grhj', 0);
a[index].set('qtbz', 0);
a[index].set('u_grsdr', 0);
a[index].set('zcbz', 0);
a[index].set('gjjdw', 0);
a[index].set('gjjgr', 0);
}
}
kqfz2 = 0;
} else {
if ((!ts3 && !ts4) || ts5 == 8 || ts5 == 5) {
fzts = countMonthSpecialDays(dt, holidayRanges, workWeekends, "all");
} else if (timestampToTime(ts3) < dt && timestampToTime(ts4) > date) {
fzts = 0;
} else if (timestampToTime(ts3) > dt && timestampToTime(ts4) > date) {
fzts = countMonthSpecialDays(formatDate(ts3), holidayRanges, workWeekends, "before");
} else if (timestampToTime(ts3) > dt && timestampToTime(ts4) < date) {
fzts = countMonthSpecialDays(formatDate(ts4), holidayRanges, workWeekends, "after") + countMonthSpecialDays(formatDate(ts3), holidayRanges, workWeekends, "before");
}
else {
fzts = countMonthSpecialDays(formatDate(ts4), holidayRanges, workWeekends, "after");
}
if (ts5 == 8 || ts5 == 5) {
fztsf = countMonthSpecialDays(formatDate(ts3), holidayRanges, workWeekends, "all", formatDate(ts4))
}
kqfz2 = 0;
}
a[index].set('byts', (ts1 || 0) - kqfz2 + fzts - fztsf);
a[index].set('numericcol_4', qjts || 0);
a[index].set('numericcol_1', (ts1 || 0));
ts3 = ''; ts4 = '', ts5 = ''
}
}
}
if (index < dstore.getCount()) {
setTimeout(processBatch, 0);
} else {
dgrid.getView().refresh();
Ext.Msg.hide();
}
}
processBatch();
}).catch((error) => {
Ext.Msg.hide();
Ext.Msg.alert('错误', '数据处理过程中发生错误: ' + error.message);
});
});
mstform.getItem('empidmul').addListener('helpselected', async function () {
var intArray = mstform.getItem('empidmul').getValue();
var date = mstform.getItem('datetimecol_2').getValue();
var array = intArray.split(",");
function callServerPromise(service, params) {
return new Promise((resolve) => {
callServer(service, params, function (res) {
resolve(res);
});
});
}
for (let i = 0; i < array.length; i++) {
var hr_phid = array[i];
var res1 = await callServerPromise('ryxx', [{ 'phid': hr_phid }]);
if (res1.record.length > 0) {
var arr2 = [];
for (let j = 0; j < res1.record.length; j++) {
arr2.push({
empid: res1.record[j].phid,
empid_name: res1.record[j].cname,
textcol_1: res1.record[j].cardno,
datetimecol_1: res1.record[j].cdt
});
}
dstore.insert(dstore.getCount(), arr2);
}
}
mstform.getItem('empidmul').setValue('');
});
mstform.getItem('userhelp_char_1').on('beforetriggerclick', function (eOp, ignoreBeforeEvent) {
var a = mstform.getItem('ocode').getValue();
mstform.getItem('userhelp_char_1').setClientSqlFilter('ocode = ' + a);
});
mstform.getItem('userhelp_char_1').addListener('helpselected', async function () {
try {
Ext.Msg.wait("正在处理数据...", "请稍候");
var nd = mstform.getItem('nd').getValue();
var yf = mstform.getItem('yf').getValue();
var pc = mstform.getItem('ocode').getValue();
if (Ext.isEmpty(nd)) {
Ext.Msg.hide();
Ext.Msg.alert('提示', '请先选择年度!');
return false;
}
if (Ext.isEmpty(Ext.getCmp('yf').getValue())) {
Ext.Msg.hide();
Ext.Msg.alert('提示', '请先输入月份!');
return false;
}
var intArray = mstform.getItem('userhelp_char_1').getValue();
var date = mstform.getItem('datetimecol_2').getValue();
function callServerPromise(service, params) {
return new Promise((resolve) => {
callServer(service, params, function (res) {
resolve(res);
});
});
}
var fxryRes = await callServerPromise('fxry', [{ 'phid': intArray }]);
const batchSize = 5;
let currentIndex = 0;
async function processBatch() {
const endIndex = Math.min(currentIndex + batchSize, fxryRes.record.length);
for (let i = currentIndex; i < endIndex; i++) {
var hr_phid = fxryRes.record[i].empid;
var ryxxRes = await callServerPromise('ryxx', [{ 'phid': hr_phid, 'nd': nd, 'yf': yf }]);
if (ryxxRes.record.length > 0) {
var arr2 = [];
for (let j = 0; j < ryxxRes.record.length; j++) {
if (ryxxRes.record[j].cboo == pc) {
arr2.push({
empid: ryxxRes.record[j].phid,
empid_name: ryxxRes.record[j].cname,
textcol_1: ryxxRes.record[j].cardno,
datetimecol_1: ryxxRes.record[j].cdt,
zz: ryxxRes.record[j].cboo,
zz_name: ryxxRes.record[j].cbooname,
deptid: ryxxRes.record[j].dept,
deptid_name: ryxxRes.record[j].dpname,
gw: ryxxRes.record[j].gw,
checkboxcol_2: 1,
numericcol_3: 1.0,
u_ygzt: ryxxRes.record[j].ygzt,
});
}
}
dstore.insert(dstore.getCount(), arr2);
await new Promise(resolve => setTimeout(resolve, 0));
}
}
currentIndex = endIndex;
if (currentIndex < fxryRes.record.length) {
setTimeout(processBatch, 0);
} else {
mstform.getItem('empidmul').setValue('');
Ext.Msg.hide();
dgrid.getView().refresh();
}
}
await processBatch();
} catch (error) {
Ext.Msg.hide();
Ext.Msg.alert('提示', '请检查没有出现组织和部门的员工企业员工库任职信息是否勾选发薪');
console.error('处理过程中发生错误:', error);
}
});
Toolbar.items.get('jc').on('click', async function () {
try {
Ext.Msg.wait("正在处理数据...", "请稍候");
var nd = mstform.getItem('nd').getValue();
var yf = mstform.getItem('yf').getValue();
var date = timestampToTime(mstform.getItem('datetimecol_2').getValue());
var date1 = timestampToTime(mstform.getItem('datetimecol_1').getValue());
if (Ext.isEmpty(nd)) {
Ext.Msg.hide();
Ext.Msg.alert('提示', '请先选择年度!');
return false;
}
if (Ext.isEmpty(Ext.getCmp('yf').getValue())) {
Ext.Msg.hide();
Ext.Msg.alert('提示', '请先输入月份!');
return false;
}
var map_lzrq = new Map();
var map_yglx = new Map();
var map_gzbz = new Map();
var map_sbxx = new Map();
var map_gjjxx = new Map();
var map_gskk = new Map();
var map_zcbz = new Map();
var map_cbtj = new Map();
var map_zgdn = new Map();
function callServerPromise(service, params) {
return new Promise((resolve) => {
callServer(service, params, function (res) {
resolve(res);
});
});
}
await Promise.all([
callServerPromise('gzbz', [{}]).then(res => {
res.record.forEach(element => {
map_gzbz.set(element.must_phid, element.salary);
});
}),
callServerPromise('cbtj', [{ 'nd': nd, 'yf': yf }]).then(res => {
res.record.forEach(element => {
map_cbtj.set(element.ry, element.cb);
});
}),
callServerPromise('yglx', [{}]).then(res => {
res.record.forEach(element => {
map_yglx.set(element.phid, element.emptype);
});
}),
callServerPromise('sbxx', [{ 'nd': nd, 'yf': yf }]).then(res => {
res.record.forEach(element => {
const normalizedSfz = element.sfz.replace(/x$/i, 'X');
map_sbxx.set(normalizedSfz, [
element.numericcol_1,
element.numericcol_2,
element.numericcol_3,
element.numericcol_4,
element.numericcol_5,
element.numericcol_6,
element.numericcol_7,
element.numericcol_8,
element.numericcol_9,
element.numericcol_10
]);
});
}),
callServerPromise('gjjxx', [{ 'nd': nd, 'yf': yf }]).then(res => {
res.record.forEach(element => {
const normalizedSfz = element.sfz.replace(/x$/i, 'X');
map_gjjxx.set(normalizedSfz, [
element.numericcol_9,
element.numericcol_10
]);
});
}),
callServerPromise('gskk', [{ 'nd': nd, 'yf': yf }]).then(res => {
res.record.forEach(element => {
const normalizedSfz = element.sfz.replace(/x$/i, 'X');
map_gskk.set(normalizedSfz, element.numericcol_1);
});
}),
callServerPromise('zcbz', [{}]).then(res => {
res.record.forEach(element => {
const normalizedSfz = element.sfz.replace(/x$/i, 'X');
map_zcbz.set(normalizedSfz, element.amt);
});
}),
callServerPromise('zgbt', [{}]).then(res => {
res.record.forEach(element => {
map_zgdn.set(element.userhelp_1, element.textcol_1);
});
})
]);
var a = dgrid.getStore().getRange(0, dstore.getCount() - 1);
var batchSize = 30;
var currentIndex = 0;
var dt = mstform.getItem('datetimecol_1').getValue();
function processBatch() {
var endIndex = Math.min(currentIndex + batchSize, dstore.getCount());
for (; currentIndex < endIndex; currentIndex++) {
if (a[currentIndex].get('checkboxcol_2') == 1) {
var id = a[currentIndex].get('empid');
var sfz = a[currentIndex].get('textcol_1');
var ryxx = id + a[currentIndex].get('deptid');
var gz = map_gzbz.get(id);
a[currentIndex].set('gzbz', gz * a[currentIndex].get('numericcol_3'));
var jx;
if ((map_yglx.get(id) == '806200805000002' || map_yglx.get(id) == '806200805000003') && a[currentIndex].get('u_ygzt') != '试用') {
jx = 0.2;
} else if (a[currentIndex].get('u_ygzt') != '试用') {
jx = 0.1;
} else {
jx = 0;
}
a[currentIndex].set('u_jxbl', jx);
if (map_sbxx.get(sfz)) {
var sb = map_sbxx.get(sfz);
a[currentIndex].set('yldw', sb[0]);
a[currentIndex].set('ylgr', sb[1]);
a[currentIndex].set('sydw', sb[2]);
a[currentIndex].set('sygr', sb[3]);
a[currentIndex].set('yldw1', sb[4]);
a[currentIndex].set('ylgr1', sb[5]);
a[currentIndex].set('gsdw', sb[6]);
a[currentIndex].set('sydw1', sb[7]);
a[currentIndex].set('dedw', sb[8]);
a[currentIndex].set('degr', sb[9]);
a[currentIndex].set('dwhj', sb[0] + sb[2] + sb[4] + sb[6] + sb[8]);
a[currentIndex].set('grhj', sb[1] + sb[3] + sb[5] + sb[9]);
}
if (map_cbtj.get(ryxx)) {
a[currentIndex].set('qtbz', map_cbtj.get(ryxx));
} else {
a[currentIndex].set('qtbz', 0);
}
if (map_zgdn.get(id)) {
a[currentIndex].set('qtbz', (a[currentIndex].get('qtbz') || 0) + 70);
}
a[currentIndex].set('jxts', getDaysInMonth(dt));
if (map_gskk.get(sfz)) {
a[currentIndex].set('u_grsdr', map_gskk.get(sfz));
}
if (map_zcbz.get(sfz)) {
a[currentIndex].set('zcbz', map_zcbz.get(sfz));
}
if (map_gjjxx.get(sfz)) {
var gjj = map_gjjxx.get(sfz);
a[currentIndex].set('gjjdw', gjj[0]);
a[currentIndex].set('gjjgr', gjj[1]);
}
}
}
if (currentIndex < dstore.getCount()) {
setTimeout(processBatch, 0);
} else {
dgrid.getView().refresh();
Ext.Msg.hide();
}
}
processBatch();
} catch (error) {
Ext.Msg.hide();
Ext.Msg.alert('错误', '数据处理过程中发生错误: ' + error.message);
console.error(error);
}
});
dgrid.addListener('beforeedit', function (editor, e) {
if (e.field == 'gzbz') {
var a;
var record = e.record;
callServer('yglxbz', [{ 'phid': record.get('empid') }], function (res) { if (res) { a = res.record[0].emptype } });
if (record.get('u_ygzt') == '正式' && record.get('empid') != '306200221000013' && record.get('empid') != '306200221000003' && a != '806210410000001') {
Ext.Msg.alert('提示', '正式员工不允许修改薪资!');
return false;
}
}
return true;
});
}
function timestampToTime(timestamp) {
var date = new Date(timestamp);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
var minute = date.getMinutes();
minute = minute < 10 ? ('0' + minute) : minute;
return y + '-' + m + '-' + d
}
function getDaysLeftInMonth(dateStr) {
var date = new Date(dateStr);
var currentMonth = date.getMonth();
var currentYear = date.getFullYear();
var nextMonthFirstDay = new Date(currentYear, currentMonth + 1, 1);
var currentDay = date.getDate();
var daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
var daysLeft = daysInMonth - currentDay;
return daysLeft;
}
function getDaysIncludingGivenDate(dateStr) {
var date = new Date(dateStr);
var currentDay = date.getDate();
var daysIncluding = currentDay;
return daysIncluding;
}
function getDaysInMonth(dateStr) {
const date = new Date(dateStr);
const year = date.getFullYear();
const month = date.getMonth();
const daysInMonth = new Date(year, month + 1, 0).getDate();
return daysInMonth;
}
function countMonthSpecialDays(date, holidayRanges = [], workWeekends = [], range = "all", endDateParam = null) {
const inputDate = typeof date === 'string' ? new Date(date) : new Date(date);
if (isNaN(inputDate.getTime())) {
throw new Error('Invalid date input');
}
let firstDay, lastDay;
if (endDateParam) {
firstDay = new Date(inputDate);
lastDay = typeof endDateParam === 'string' ? new Date(endDateParam) : new Date(endDateParam);
if (isNaN(lastDay.getTime())) {
throw new Error('Invalid end date input');
}
if (firstDay > lastDay) {
throw new Error('Start date must be before or equal to end date');
}
} else {
const year = inputDate.getFullYear();
const month = inputDate.getMonth();
firstDay = new Date(year, month, 1);
lastDay = new Date(year, month + 1, 0);
}
const currentDay = inputDate.getDate();
let count = 0;
for (let day = new Date(firstDay); day <= lastDay; day.setDate(day.getDate() + 1)) {
const dayOfMonth = day.getDate();
const dayOfWeek = day.getDay();
const formattedDate = formatDate(day);
let isInRange = false;
if (range === "before" && dayOfMonth < currentDay) {
isInRange = true;
} else if (range === "after" && dayOfMonth > currentDay) {
isInRange = true;
} else if (range === "all") {
isInRange = true;
}
if (isInRange) {
const isWorkWeekend = workWeekends.includes(formattedDate);
if (!isWorkWeekend) {
const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;
const isHoliday = isDateInHolidayRanges(day, holidayRanges);
if (isHoliday) {
count += 1;
} else if (isWeekend) {
if (dayOfWeek === 0) {
count += 1;
} else if (dayOfWeek === 6) {
count += 0.5;
}
}
}
}
}
return count;
}
function isDateInHolidayRanges(date, holidayRanges) {
const checkDate = new Date(date);
for (const range of holidayRanges) {
const startDate = new Date(range.start);
const endDate = new Date(range.end);
if (checkDate >= startDate && checkDate <= endDate) {
return true;
}
}
return false;
}
function formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
console