UNPKG

@oxog/kairos

Version:

Revolutionary zero-dependency JavaScript date/time library with modular architecture and dynamic holiday system

250 lines 11.1 kB
export class FiscalYearCalculator { constructor(config) { this.config = config; } getStartMonth() { if (typeof this.config.start === 'number') { return this.config.start; } const monthNames = [ 'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december', ]; const index = monthNames.indexOf(this.config.start.toLowerCase()); return index === -1 ? 1 : index + 1; } getFiscalYear(date) { const startMonth = this.getStartMonth(); const year = date.getFullYear(); const month = date.getMonth() + 1; if (month >= startMonth) { return year; } else { return year - 1; } } getFiscalYearStart(fiscalYear) { const startMonth = this.getStartMonth(); return new Date(fiscalYear, startMonth - 1, 1); } getFiscalYearEnd(fiscalYear) { const startMonth = this.getStartMonth(); const endMonth = startMonth === 1 ? 12 : startMonth - 1; const endYear = startMonth === 1 ? fiscalYear : fiscalYear + 1; const lastDay = new Date(endYear, endMonth, 0).getDate(); return new Date(endYear, endMonth - 1, lastDay); } getFiscalQuarter(date) { const startMonth = this.getStartMonth(); const month = date.getMonth() + 1; let monthsFromStart = month - startMonth; if (monthsFromStart < 0) { monthsFromStart += 12; } return Math.floor(monthsFromStart / 3) + 1; } getFiscalQuarterStart(fiscalYear, quarter) { const startMonth = this.getStartMonth(); const quarterStartMonth = (startMonth - 1 + (quarter - 1) * 3) % 12; const quarterStartYear = quarter === 1 ? fiscalYear : startMonth + (quarter - 1) * 3 > 12 ? fiscalYear + 1 : fiscalYear; return new Date(quarterStartYear, quarterStartMonth, 1); } getFiscalQuarterEnd(fiscalYear, quarter) { const startMonth = this.getStartMonth(); const quarterEndMonth = (startMonth - 1 + quarter * 3 - 1) % 12; const quarterEndYear = quarter === 1 ? fiscalYear : startMonth + quarter * 3 - 1 > 12 ? fiscalYear + 1 : fiscalYear; const lastDay = new Date(quarterEndYear, quarterEndMonth + 1, 0).getDate(); return new Date(quarterEndYear, quarterEndMonth, lastDay); } getDaysInFiscalYear(fiscalYear) { const start = this.getFiscalYearStart(fiscalYear); const end = this.getFiscalYearEnd(fiscalYear); return Math.floor((end.getTime() - start.getTime()) / (24 * 60 * 60 * 1000)) + 1; } getDaysInFiscalQuarter(fiscalYear, quarter) { const start = this.getFiscalQuarterStart(fiscalYear, quarter); const end = this.getFiscalQuarterEnd(fiscalYear, quarter); return Math.floor((end.getTime() - start.getTime()) / (24 * 60 * 60 * 1000)) + 1; } getFiscalWeek(date) { const fiscalYear = this.getFiscalYear(date); const fiscalYearStart = this.getFiscalYearStart(fiscalYear); const diffTime = date.getTime() - fiscalYearStart.getTime(); const diffDays = Math.floor(diffTime / (24 * 60 * 60 * 1000)); return Math.floor(diffDays / 7) + 1; } static getCommonConfigs() { return { US: { start: 10 }, UK: { start: 4 }, Canada: { start: 4 }, Australia: { start: 7 }, India: { start: 4 }, Japan: { start: 4 }, Germany: { start: 1 }, France: { start: 1 }, China: { start: 1 }, Brazil: { start: 1 }, Russia: { start: 1 }, 'South Korea': { start: 1 }, Singapore: { start: 4 }, 'Hong Kong': { start: 4 }, 'New Zealand': { start: 4 }, Mexico: { start: 1 }, 'South Africa': { start: 3 }, Turkey: { start: 1 }, Israel: { start: 1 }, 'Saudi Arabia': { start: 1 }, UAE: { start: 1 }, Egypt: { start: 7 }, Nigeria: { start: 1 }, Kenya: { start: 7 }, 'Corporate-Q1': { start: 1 }, 'Corporate-Q2': { start: 4 }, 'Corporate-Q3': { start: 7 }, 'Corporate-Q4': { start: 10 }, 'Academic-US': { start: 8 }, 'Academic-UK': { start: 9 }, 'Retail-US': { start: 2 }, 'Retail-4-5-4': { start: 2 }, }; } } export default { name: 'business-fiscal', version: '1.0.0', size: 1536, dependencies: ['business-workday'], install(kairos, _utils) { kairos.extend({ fiscalYear(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); return calculator.getFiscalYear(this.toDate()); }, fiscalYearStart(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const start = calculator.getFiscalYearStart(fiscalYear); return kairos(start); }, fiscalYearEnd(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const end = calculator.getFiscalYearEnd(fiscalYear); return kairos(end); }, fiscalQuarter(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); return calculator.getFiscalQuarter(this.toDate()); }, fiscalQuarterStart(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const quarter = calculator.getFiscalQuarter(this.toDate()); const start = calculator.getFiscalQuarterStart(fiscalYear, quarter); return kairos(start); }, fiscalQuarterEnd(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const quarter = calculator.getFiscalQuarter(this.toDate()); const end = calculator.getFiscalQuarterEnd(fiscalYear, quarter); return kairos(end); }, fiscalWeek(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); return calculator.getFiscalWeek(this.toDate()); }, isFiscalYearStart(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const start = calculator.getFiscalYearStart(fiscalYear); return this.isSame(kairos(start)); }, isFiscalYearEnd(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const end = calculator.getFiscalYearEnd(fiscalYear); return this.isSame(kairos(end)); }, isFiscalQuarterStart(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const quarter = calculator.getFiscalQuarter(this.toDate()); const start = calculator.getFiscalQuarterStart(fiscalYear, quarter); return this.isSame(kairos(start)); }, isFiscalQuarterEnd(config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const fiscalYear = calculator.getFiscalYear(this.toDate()); const quarter = calculator.getFiscalQuarter(this.toDate()); const end = calculator.getFiscalQuarterEnd(fiscalYear, quarter); return this.isSame(kairos(end)); }, }); kairos.addStatic?.({ fiscalYearCalculator: FiscalYearCalculator, getFiscalYearConfig(country) { const configs = FiscalYearCalculator.getCommonConfigs(); return configs[country] || null; }, getAvailableFiscalConfigs() { return Object.keys(FiscalYearCalculator.getCommonConfigs()); }, createFiscalCalculator(config) { return new FiscalYearCalculator(config); }, getFiscalYearInfo(fiscalYear, config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); return { fiscalYear, start: kairos(calculator.getFiscalYearStart(fiscalYear)), end: kairos(calculator.getFiscalYearEnd(fiscalYear)), days: calculator.getDaysInFiscalYear(fiscalYear), quarters: [1, 2, 3, 4].map((q) => ({ quarter: q, start: kairos(calculator.getFiscalQuarterStart(fiscalYear, q)), end: kairos(calculator.getFiscalQuarterEnd(fiscalYear, q)), days: calculator.getDaysInFiscalQuarter(fiscalYear, q), })), }; }, getBusinessDaysInFiscalYear(fiscalYear, config) { const fiscalConfig = config || { start: 1 }; const calculator = new FiscalYearCalculator(fiscalConfig); const start = calculator.getFiscalYearStart(fiscalYear); const end = calculator.getFiscalYearEnd(fiscalYear); const businessCalc = kairos.businessDayCalculator; return (businessCalc.businessDaysBetween(start, end) + (businessCalc.isBusinessDay(start) ? 1 : 0)); }, }); }, }; //# sourceMappingURL=fiscal.js.map