Using Sequelize, you can do the following. I re-wrote the code for easier implementation -
const { Op } = require("sequelize");
const Quarter = (sequelize, DataTypes) => {
const Quarter = sequelize.define("Quarter", {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
startDate: {
type: DataTypes.DATE,
allowNull: false,
},
endDate: {
type: DataTypes.DATE,
allowNull: false,
},
});
Quarter.calculateQuarters = async (startDate, endDate) => {
const quarters = [];
for (let year = startDate.getFullYear(); year <= endDate.getFullYear(); year++) {
for (let quarter = 1; quarter <= 4; quarter++) {
const quarterStartDate = new Date(year, (quarter - 1) * 3, 1);
const quarterEndDate = new Date(year, (quarter * 3), 0);
if (quarterStartDate >= startDate && quarterStartDate <= endDate) {
quarters.push({
startDate: quarterStartDate,
endDate: quarterEndDate,
});
}
}
}
return quarters;
};
return Quarter;
};
module.exports = Quarter;
This should give you the output you require.