intervention-pages
Version:
91 lines (90 loc) • 3.99 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { convertDate } from '../../../utils/date-utils';
import { property } from '@polymer/decorators';
/**
* @polymer
* @mixinFunction
*/
function GenerateQuarterlyReportingRequirementsMixin(baseClass) {
class GenerateQuarterlyRepReqClass extends baseClass {
constructor() {
super(...arguments);
this.DUE_DATE_DAYS_TO_ADD = 30;
this.datesFormat = 'YYYY-MM-DD';
}
/**
* Used to generate (one time) QPR first dates set.
* Generation method:
* - get pd start date and calculate end date
* - end date = last day of the month where month =
* (start date day <= 15 ? (start date month + 2) : (start date month + 3))
* - calculate due date = end date + 30 days
* - move to next start date = end date + 1 day
* - repeat until entire PD timeline is covered
* - last QPR end date === intervention end date
* @param pdStartDateStr
* @param pdEndDateStr
* @returns {Array}
*/
generateQPRData(pdStartDateStr, pdEndDateStr) {
const qprData = [];
let start = String(pdStartDateStr);
let end = this._generateEndDate(start, pdEndDateStr);
while (this._generatedEndIsBeforePdEnd(end.format(this.datesFormat), pdEndDateStr)) {
// add dates to qpr data list
qprData.push(this._getQPRDatesSet(start, end));
// recalculate next dates set
start = this._getNextStartDateStr(end);
end = this._generateEndDate(start, pdEndDateStr);
}
// add one more to cover entire PD timeline
qprData.push(this._getQPRDatesSet(start, end));
return qprData;
}
_getQPRDatesSet(start, end) {
return {
start_date: start,
end_date: end.format(this.datesFormat),
due_date: this._generateDueDate(end).format(this.datesFormat)
};
}
_generatedEndIsBeforePdEnd(endDateStr, pdEndStr) {
return moment(endDateStr).isBefore(pdEndStr);
}
_generateEndDate(startStr, pdEndStr) {
const d = moment.utc(convertDate(startStr));
let month = d.get('M');
if (d.get('D') <= 15) {
month += 2;
}
else {
month += 3;
}
d.set('M', month);
d.endOf('month');
if (d.isAfter(pdEndStr)) {
return moment.utc(convertDate(pdEndStr));
}
return d;
}
_generateDueDate(momentEndDate) {
return moment(momentEndDate).add(this.DUE_DATE_DAYS_TO_ADD, 'd');
}
_getNextStartDateStr(momentEndDate) {
return moment(momentEndDate).add(1, 'd').format(this.datesFormat);
}
}
__decorate([
property({ type: Number })
], GenerateQuarterlyRepReqClass.prototype, "DUE_DATE_DAYS_TO_ADD", void 0);
__decorate([
property({ type: String })
], GenerateQuarterlyRepReqClass.prototype, "datesFormat", void 0);
return GenerateQuarterlyRepReqClass;
}
export default GenerateQuarterlyReportingRequirementsMixin;