All files index.js

100% Statements 46/46
93.94% Branches 31/33
100% Functions 2/2
100% Lines 45/45
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86    1x           3x   2x 2x 2x 2x 2x   2x 60x 8x 8x 8x   52x 52x       2x         8x 1x     7x 1x     6x 1x     5x 1x     4x 1x     3x 1x     2x 2x   2x 1x   1x 1x 1x 1x 1x   1x 31x 5x 5x 5x   26x 26x     1x     1x        
 
"use strict";
const moment = require('moment');
/*
 * DateOfTheCurrentMonth is a number e.g 13 for 13th of the current month
 * Get the weekNumber for the current month
 */
function weekNumberOfCurrentMonth(dateOfTheCurrentMonth) {
	if(!dateOfTheCurrentMonth) return undefined;
 
	let endOfMonth = moment().endOf('month');
	let beginningOfMonth = moment().startOf('month').day(); // numeric representation of weekday for the day the month begins
	let totalNumberOfDaysInAMonth = endOfMonth.date();
	let thisMonthTracker = {};
	let weekCounter = 1;
 
	for (let i = 1; i <= totalNumberOfDaysInAMonth; i++) {
		if(beginningOfMonth === 6) {
			thisMonthTracker[i] = weekCounter;
			weekCounter++;
			beginningOfMonth = 0;
		} else {
			thisMonthTracker[i] = weekCounter;
			beginningOfMonth++;
		}
	}
 
	return thisMonthTracker[dateOfTheCurrentMonth.toString()];
}
 
function weekNumberForGivenDate (fullYear, fullMonth, dateOfTheMonth) {
 
	if(!fullYear || !fullMonth || !dateOfTheMonth) {
		return undefined;
	}
 
	if(fullYear.length > 4) {
		return 'full year should be four digits e.g 2017'
	}
 
	if(parseInt(fullMonth) > 12 || parseInt(fullMonth) < 1) {
		return 'Full month should be between 1 and 12'
	}
 
	if(fullMonth.length > 1 && parseInt(fullMonth) < 10) {
		return 'Month should be between 1 and 12 i.e >=1 and <=12 and not 01 or 09';
	}
 
	if(dateOfTheMonth.length > 1 && parseInt(dateOfTheMonth) < 10) {
		return 'dateOfTheMonth should be between 1 and 31 i.e >=1 and <=31 and not 01 or 09';
	}
 
	if(parseInt(dateOfTheMonth) > 31) {
		return 'dateOfTheMonth should be between 1 and 31 i.e >=1 and <=31';
	}
 
	let paddedDayOfTheMonth = parseInt(dateOfTheMonth) > 9 ? dateOfTheMonth : '0' + dateOfTheMonth;
	let paddedMonth = parseInt(fullMonth) > 9 ? fullMonth : '0' + fullMonth;
 
	if(!moment(`${fullYear}-${paddedMonth}-${paddedDayOfTheMonth}`).isValid()) {
		return 'supplied date is not valid';
	}
	let endOfMonth = moment(`${fullYear}-${paddedMonth}-${paddedDayOfTheMonth}`).endOf('month');
	let beginningOfMonth = moment(`${fullYear}-${paddedMonth}-${paddedDayOfTheMonth}`).startOf('month').day(); // numeric representation of weekday for the day the month begins
	let totalNumberOfDaysInAMonth = endOfMonth.date();
	let thisMonthTracker = {};
	let weekCounter = 1;
 
	for (let i = 1; i <= totalNumberOfDaysInAMonth; i++) {
		if(beginningOfMonth === 6) {
			thisMonthTracker[i] = weekCounter;
			weekCounter++;
			beginningOfMonth = 0;
		} else {
			thisMonthTracker[i] = weekCounter;
			beginningOfMonth++;
		}
	}
	return thisMonthTracker[dateOfTheMonth.toString()];
}
 
module.exports = {
	weekNumberOfCurrentMonth,
	weekNumberForGivenDate
};