{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./wwwroot/calc/js/datelib.js","webpack:///./wwwroot/calc/calc_npd/calc.js","webpack:///(webpack)/buildin/global.js","webpack:///./wwwroot/lib/utils/api.js","webpack:///./wwwroot/calc/common/datetime_fields.js","webpack:///./node_modules/whatwg-fetch/fetch.js","webpack:///./node_modules/isomorphic-fetch/fetch-npm-browserify.js","webpack:///./wwwroot/calc/common/calculator/utils.js","webpack:///./wwwroot/calc/common/basic_fields.js","webpack:///./wwwroot/calc/common/calculator/calc_complex.js","webpack:///./wwwroot/calc/common/calculator/calc_interface.js","webpack:///./wwwroot/calc/common/calculator/output_fields.js","webpack:///./wwwroot/calc/common/calculator/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","calendarRes","loadResource","DatePoint","stringOrDate","silent","_this$date","_classCallCheck","replace","straight","exec","this","date","Date","parseInt","inverse","Error","concat","setHours","_createClass","undefined","getDate","getFullYear","getMonth","toInt","toLocaleFormat","other","valid","day","month","year","result","copy","setFullYear","setMonth","setDate","otherPoint","dateFrom","dateTo","DateSpan","span","getDayCount","inc","count","getWorkingDayCount","isDayOff","includeEnd","arguments","length","Math","floor","getTheFirstOfJanuary","firstJan","ceil","getDay","amount","toLocaleDateString","tools","appLocale","params","addWeekDay","addYear","getDayName","monthIsolation","maxDate","getDaysInMonth","months","monthSum","addYears","newMonth","currentDay","setYear","setDateGently","indexOf","loading","predictIsDayOff","calendar","content","daysOff","v","_dateFrom","_dateTo","_typeof","_boundsSet","isEqualTo","_dayCount","_workingDayCount","set","iterDays","fromDays","fromWorkingDays","distanceTo","verboseCountingValue","subtractDayCount","fixedDayTo","addDays","goesBefore","monthes","days","residPoint","inDays","reason","callback","start","index","checkParams","keypoints","sort","a","b","point","endPoint","subtractionUsed","add","from","to","leftKey","rightKey","push","type","subtract","instanceIndex","instance","addPeriod","end","map","some","addWithSubtractions","keypoint","datePoint","daysWorking","makeDateSegmentWorker","segments","_segments","checkDay","includeOffDays","contains","countSegment","from_","to_","self","checkIntersection","dateFrom_","dateTo_","intersects","nextDateAfterWorkingDay","additionalHolidayFunc","checker","isWorkingDay","emptyFunc","makeDateFromAlertWorker","_ref","_ref$slideUpDuration","slideUpDuration","_ref$dateFromSelector","dateFromSelector","_ref$submitForm","submitForm","_ref$dateFromAlertSel","dateFromAlertSelector","_ref$alertAcceptSelec","alertAcceptSelector","_ref$isDynamicSubmit","isDynamicSubmit","_ref$minCheckDate","minCheckDate","_ref$maxCheckDate","maxCheckDate","_ref$crownPeriods","crownPeriods","_ref$isDayBeforeWeeke","isDayBeforeWeekend","_ref$isDayCrownHolida","isDayCrownHoliday","_ref$isWeekend","isWeekend","_ref$calculator","calculator","elem","$","alertAcceptElem","shown","config","tmp","frozen","prevDate","nextPrevDateFrom","nextDateFrom","prevDate_","nextDateFrom_","dec","freeze","forEach","x","data","on","e","target","tagName","close","classList","addClass","each","remove","parent","parentElement","find","slideUp","slideDown","updateVariant","newDate","oldDate","dateFromPoint","html","crownSegmWorker","sendStatisticMessage","isCrown","checkCrown","equalityCheck","hideCovidInfo","prevDatePoint","nextDateFromPoint","nextPrevDateFromPoint","show","hide","reset","getElem","getState","getFrozenDateFrom","isVisible","is","isAccepted","isAcceptedCrown","isClosed","isDayCrown","isDayOffCrown","render","check","previousDatePoint","currDate","previousDateBeforeWeekend","workingDateFromPoint","makeDateInFutureAlertWorker","_ref2","_ref2$slideUpDuration","_ref2$submitForm","_ref2$isDynamicSubmit","_ref2$dateToFutureAle","dateToFutureAlertSelector","_ref2$calculator","preventDefault","distinctDates","dates","toString","filter","distinct","holidayChecker","NPDCalculator","_Calculator","_callSuper","_inherits","patchFieldTypes","ShareField","DateIntervalField","DateField","DateIntervalIgnoreEmptyField","setupStatistic","calcName","ratesObj","getJSON","DataVersionSalt","json","crownNovember395Holidays","setTemplate","$clone","blockPiece","$comment","change","focus","selectAllText","val","blur","removeClass","keyup","$rubbleIcon","processDetalization","groupPeriods","detalizationDiv","isMainDetalization","penaltyLimit","renderHeader","inner","rateType","ratePeriodType","isLimitation","renderRow","period","_self$limitationType","_self$limitationType2","localeLoanSum","getLocaleSum","loanSum","title","percentRateType","getLocaleNumber","percentRate","daysInYear","fixedAmount","bankRateType","multiplicity","rate","share","text","penalyLimitValue","limitationType","percentLimitation","rubbleLimitation","penaltyResult","max","min","totalPenalty","penalty","renderDecreaseIncreaseRow","isIncrease","getLocaleSumInRubbles","comment","renderSubRow","getPeriodDuration","renderExcessSum","groupPeriod","k","headerParams","applyYears","table","document","createElement","console","log","innerHTML","append","_crownAlertHelper","holidays","otherHoliday","holidaysPeriod","holidayNoteIsShowed","dateFromAlertWorker","mainPeriod","otherHolidayNoteIsShowed","_alertHelper","futureAlertState","cn","printOnly","todayDate","click","$detalization","shareField","setValue","jQuery","clearErrors","debtSumField","addInputField","options","maxVal","errors","selector","mainPeriodField","showErrorWay","ShowErrorWay","SHOW_FIRST","rateTypeField","percentRateField","precision","fixedAmountField","bankRateTypeField","multiplicityField","ratePeriodTypeField","isError","rateDateField","percentLimitationField","rubbleLimitationField","ignore","addGroup","decreaseIncreaseDateCheck","parentPeriod","parentSum","loanSumField","baseDateIntervalCheck","dynamic","appendButtonSelector","removeSelector","keepOne","prepareTemplate","block","ignoreForEmpty","fields","sum","alertOptions","artifacts","increaseDateAlertWorker","addDynamicField","addOutputField","outerHTML","detalizations","detalizationsDiv","penaltyAccum","detalizationObj","j","_self$limitationType3","_groupPeriods$0$filte","_groupPeriods$0$filte2","_groupPeriods$0$filte3","arr","detalization","slice","detalizationInfoDiv","debtSum","el","at","crownBasicHolidays","crownMayHolidays","crownParadeHolidays","crownElectionHolidays","crownRegionalHolidays","dateFutureAlertWorker","rateFutureAlertWorker","crownHolidays","rateAlertOptions","loadDescription","submitOnClick","addResetButton","$percentRateInput","$bankRateTypeInput","$fixedAmountInput","$multiplicityInput","$shareInput","$ratePeriodInput","$ratePeriodTypeInput","$limitationInputDiv","$percentLimitationInput","$rubbleLimitationInput","attr","_self$rateType","_self$bankRateType","_self$share","_self$limitationType4","_self$rateType2","_self$ratePeriodType","_get","_getPrototypeOf","resultPeriodString","resultPeriodDurationString","groupedDetalization","deepcopy","extraDetalizations","finalLoanSum","excessSum","hasDebtDecrease","hasDebtIncrease","debtClosureHasExcess","isClosure","isEarlyClosure","totalDebt","rateInfo","formula","showBankRate","notes","increaseDateNotes","$noteBlockList","activeNotesCount","hasClass","args","message","sender","autoValidation","$elem","$rateTypeInput","$bankRateTypeInputDiv","$limitationCheckbox","$limitationInput","group","decreaseIncreaseGroups","dateField","getValue","alertWorker","id","_this$rateType","getPeriodDates","applyRates","rates","rates_395","getDaysInYear","fixDayMonthYear","getRate","fixPeriod","subtractionPeriodsDays","subtractionPeriods","sub","reduce","result_","getSpan","duration","uniqueDecreaseIncreaseDates","splitSubtractionPeriods","filteredDates","_toConsumableArray","_subDate","isExcessType","hasSubtractionPeriods","finalSubtractionPeriods","loanSumDynamic","debtSumDynamic","exceedingDecreases","decreaseComment","dtFrom","shift","dtTo","sumField","isActive","roundNumber","newDebtSum","resultDateTo","ignoreLoanSum","resultPeriod","getDateSegments","segment","multiplier","rateDate","bankRate","bankRateRender","segmentSpan","totalDuration","resultSpans","lastSegment","_this","fullDebtSum","mainPeriodString","calculateDetalization","decreaseGroups","increaseGroups","limitPenalty","detalizationDate","limit","partialPeriod","excessDecreaseGroups","detalizationDebtSum","limitVal","_this2","prop","verboseNumber","increaseDateNotesHtmlString","$increaseDateAlert","convertElemToTextWithLinksForExport","ratePeriodInfo","minPrecision","maxPrecision","debtInfo","decreaseFields","tree","debtDecrease","increaseFields","debtIncrease","field","$error","closest","sumElem","Calculator","_Field","Number","window","array","split","divident","divider","floatNum","parseLocaleFloat","fn","shareFilter","simpleVal","keyCode","lastSymbol","croppedVal","focusin","$field","Field","g","Function","__fetch","require","polyFetch","apply","buildApi","generator","sendRequest","_ref$host","host","method","path","_ref$headers","headers","body","_blob","url","search","URLSearchParams","then","res","ok","Promise","resolve","error","reject","props","_objectSpread","post","loaded","promise","resp","test","arrayBuffer","Array","selectorOrElem","f","keepValue","defaultValue","keepErrors","getClearValue","_DateField","elemFrom","elemTo","nameVal","nameElem","removeExtraSpace","raw","escapeTags","_getDateFrom","_getDateTo","pair","errorPeriodElem","errorFromElem","errorToElem","errorFromBound","errorToBound","errorFromBoundMax","errorToBoundMax","includeEndDate","include","_getDateFix","binaryMap","resetErrors","phase","processBoundElem","errorElem","hadError","filled","_this$options","_this$options2","hadFromError","hadToError","maxYearFrom","limitMax","maxYearTo","_DateIntervalField","isFilled","leftDays","info","bullet","active","outside","equality","showError","className","toggleErrorHighlight","every","globalThis","global","support","Blob","viewClasses","isArrayBufferView","ArrayBuffer","isView","obj","normalizeName","String","TypeError","toLowerCase","normalizeValue","iteratorFor","items","iterator","next","done","Headers","isArray","header","getOwnPropertyNames","consumed","_noBody","bodyUsed","fileReaderReady","reader","onload","onerror","readBlobAsArrayBuffer","blob","FileReader","readAsArrayBuffer","bufferClone","buf","view","Uint8Array","byteLength","buffer","Body","_initBody","_bodyInit","_bodyText","isPrototypeOf","_bodyBlob","FormData","_bodyFormData","DataView","_bodyArrayBuffer","rejected","isConsumed","byteOffset","match","encoding","readAsText","chars","fromCharCode","join","readArrayBufferAsText","formData","decode","JSON","parse","oldValue","has","thisArg","keys","values","entries","methods","Request","input","upcased","credentials","signal","toUpperCase","AbortController","referrer","cache","reParamSearch","getTime","form","trim","bytes","decodeURIComponent","Response","bodyInit","status","RangeError","statusText","clone","response","redirectStatuses","redirect","location","DOMException","err","stack","constructor","fetch","init","request","aborted","xhr","XMLHttpRequest","abortXhr","abort","rawHeaders","getAllResponseHeaders","substr","line","parts","warn","responseURL","responseText","setTimeout","ontimeout","onabort","open","href","fixUrl","withCredentials","responseType","names","setRequestHeader","addEventListener","onreadystatechange","readyState","removeEventListener","send","polyfill","SHOW_ALL","defaultGetValue","deleted","isDynamic","_ignore","params_","errClassElem","loud","handler","documentMode","css","_BaseObjectField","clearValue","NumberField","_Field2","isFloat","disableProps","keyName","inputFilter","CountField","_NumberField","parseLocaleInt","setupNumberInput","YearField","_NumberField2","allowSpaces","maxLength","PeriodField","_NumberField3","FloatField","_NumberField4","MoneyField","_FloatField","SelectField","_Field3","itemText","RadioField","_Field4","checkedElem","CheckboxField","_Field5","control","checked","TextField","_Field6","_Field7","LinkField","selectedLink","event","CalculatorComplex","_CalculatorInterface","htmlNode","calc_","$node","scopeEvalFunc","underscore","script","parseNameType","paramString","item","splitPos","varName","parseFloat","checkClass","class_","getAttribute","autoKey","clickOptions","_clickOptions$options","submit","autoSubmit","toggleClasses","toArray","classesObj","toggle","inputs","_parseNameType","outputs","_parseNameType2","renderCode","checkHash","gentle","writePath","part","id_","clearPart","__id","fetchRootElem","findExternalOnly","$table","$dataExpandableDiv","elements","createClone","$template","$lastRow","last","querySelector","cloneNode","_id","genUniqueId","removed","beforeRemoval","afterRemoval","getFieldsFlat","getElements","removeFirstEvent","dontSubmitOnRemove","_submitOnChange","fetchFields","_slicedToArray","fieldParams","disabledSubmitting","first","anchor","_params$prepareTempla","insertAdjacentElement","removePathId","$this","$expandableDiv","keepTable","bp","delete","ignoredEmptyFields","setCount","_ref3","_ref3$removeStrategy","removeStrategy","currentCount","_dynamicFields","nameOrNames","fieldGroups","getFields","resList","inputFields","__tmpIgnore","isPathInside","checkField","df","newOptions","_this3","newValues","irregularValueNames","acc","clearPath","_exportObject","ignoreList","accum","defaultFilled","enableResetButton","hasValueChanges","fieldsToParse","ignoreCouseEmpty","showReset","resetValuesOnIgnore","unsilence","senderField","errorIsVisible","getExportValue","afterFirstPhaseCheck","newValuesString","stringify","lastValuesString","processGroup","afterParse","forceRender","skipValueChangesCheck","beforeSubmit","parsing","resetButtons","_statistic","startedSent","isReady","calculateForValidOnly","toggleCustomClasses","calcValid","calculate","beforeRender","_exportObjectFinal","generateExportObject","showResults","hideResults","renderError","afterSubmit","CalculatorInterface","debug","_fieldTypes","outputFields","forceOutputs","_inputFieldsTree","hash","newFieldTypes","string_or_object","hideOnDefault","random","srcPath","BaseOutputField","container","setup","paramName","renderFunc","compose","renderMethod","compose_","exportObject","RenderRequiredOutputField","_BaseOutputField","HtmlOutputField","_BaseOutputField2","_HtmlOutputField","LocaleNumOutputField","_BaseOutputField3","LocaleSumOutputField","_BaseOutputField4","MoneyRubleOutputField","_HtmlOutputField2","MoneyTextOutputField","_BaseOutputField5","MoneyRoundedRubleField","_HtmlOutputField3","getRoundedNumberInRubbles","MoneyRoundedRubleOutputField","_HtmlOutputField4","PeriodOutputField","_BaseOutputField6","DateOutputField","_BaseOutputField7","DayOutputField","_BaseOutputField8","PercentOutputField","_HtmlOutputField5","NoteOutputField","_RenderRequiredOutput","ExportVisibleOutputField","_BaseOutputField9","htmlObject","ToggleOutputField","_RenderRequiredOutput2","slideUpTime","slideDownTime","ConditionalBlockOutputField","_RenderRequiredOutput3","alternativeBlockSelector","alternativeBlock","ShareOutputField","_HtmlOutputField6","MoneyLocalRoundedOutField","_HtmlOutputField7","getRoundedNumber","createOutputField","_CalculatorComplex","basicFields","showVersionBanner","ShowVersionBanner","setupVersionBanner","setupHandlers","autoAddFields","initialize","_console","_$","_$2","_$3","_$4","print","printMessage","ajax","ExportWordHost","processData","contentType","onloadstart","ev","success","textStatus","jQxhr","decodeURI","getResponseHeader","navigator","msSaveOrOpenBlob","link","download","URL","createObjectURL","exportMessage","history","pushState","pathname","getHash","RegExp","substring","feedbackBottom","load","code","initSmartLink","setWarningMessage","IsAuthEnabled","mailSubject","prepend","isStartedEventIgnore","prefix","ym","ymId","ymReachGoal","resetInputFields","ftype","_detectFieldType","_makeFieldObject","disableAutoCheck","onChange","preInit","ft","detect","fieldType","onReset","forced","orderedFields","priorities","renderExport","customClass"],"mappings":"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","file":"calc/calc_npd/calc.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1164);\n","import {loadResource} from \"@lib/utils/api\";\r\nconst calendarRes = loadResource(\"/conf/calc/calendar.json\");\r\n\r\nconst MILLISECONDS_TO_DAYS_CONSTANT = 24 * 60 * 60 * 1000;\r\n\r\nclass DatePoint {\r\n /**\r\n * @param {any} stringOrDate string, Date, DatePoint or non-string falsy value for new Date() \r\n * @param {boolean} silent - disable printing errors in the console\r\n * string can be in straight (dd.mm.yyyy) or inverse (yyyy.mm.dd) format\r\n */\r\n constructor(stringOrDate, silent) {\r\n silent = silent || false;\r\n if (typeof (stringOrDate) === \"string\") {\r\n stringOrDate = stringOrDate.replace(/[^\\d.]/g, \"\");\r\n const straight = /^(\\d\\d)[.](\\d\\d)[.](\\d{4})$/.exec(stringOrDate);\r\n if (straight) {\r\n this.date = new Date(parseInt(straight[3], 10), parseInt(straight[2], 10) - 1, parseInt(straight[1]));\r\n } else {\r\n const inverse = /^(\\d{4})[.](\\d\\d)[.](\\d\\d)$/.exec(stringOrDate);\r\n if (inverse !== null) {\r\n this.date = new Date(parseInt(inverse[1], 10), parseInt(inverse[2], 10) - 1, parseInt(inverse[3]));\r\n } else {\r\n if (!silent)\r\n throw new Error(`Wrong format of date in string: ${stringOrDate}`);\r\n\r\n }\r\n }\r\n }\r\n else if (stringOrDate instanceof Date) {\r\n this.date = new Date(stringOrDate);\r\n }\r\n else if (stringOrDate instanceof DatePoint) {\r\n this.date = new Date(stringOrDate.date);\r\n }\r\n else if (!stringOrDate)\r\n this.date = new Date();\r\n else {\r\n if (!silent)\r\n throw new Error(\"Wrong argument type in DatePoint contructor.\");\r\n }\r\n\r\n this.date?.setHours(12,0,0,0);\r\n }\r\n\r\n get valid() {\r\n return !!(this.date !== undefined && this.date instanceof Date && this.date.getDate());\r\n }\r\n\r\n toInt() {\r\n return 384 * this.date.getFullYear() + 32 * this.date.getMonth() + this.date.getDate();\r\n }\r\n\r\n static fromInt(v) {\r\n const year = parseInt(v / 384);\r\n const month = parseInt((v % 384) / 32);\r\n const day = v % 32;\r\n return new DatePoint(`${day}.${month + 1}.${year}`);\r\n }\r\n\r\n valueOf() {\r\n return this.toInt();\r\n }\r\n\r\n toString() {\r\n return this.toLocaleFormat();\r\n }\r\n\r\n copy() {\r\n return new DatePoint(this.date);\r\n }\r\n\r\n isEqualTo(other) {\r\n if (!(other instanceof DatePoint)) {\r\n other = new DatePoint(other);\r\n }\r\n return (this.valid && other.valid && this.toInt() == other.toInt());\r\n }\r\n\r\n fixDayMonthYear(day, month, year) {\r\n const result = this.copy();\r\n if (year != null) {\r\n result.date.setFullYear(year);\r\n }\r\n if (month != null) {\r\n result.date.setMonth(month - 1);\r\n }\r\n if (day != null) {\r\n result.date.setDate(day);\r\n }\r\n return result;\r\n }\r\n\r\n getSpan(otherPoint) {\r\n var dateFrom = this.date <= otherPoint.date ? this : otherPoint;\r\n var dateTo = this.date <= otherPoint.date ? otherPoint : this;\r\n return new DateSpan(dateFrom, dateTo);\r\n }\r\n\r\n addSpan(span) {\r\n var result = this.copy();\r\n if (span.getDayCount() != undefined) {\r\n result.inc(span.getDayCount());\r\n } else {\r\n var count = span.getWorkingDayCount();\r\n var inc = (count > 0 ? 1 : -1);\r\n count *= inc;\r\n for (let i = 0; i < count; ++i) {\r\n result.inc(inc);\r\n while (result.isDayOff())\r\n result.inc(inc);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n goesBefore(other) {\r\n if (!(other instanceof DatePoint)) {\r\n other = new DatePoint(other);\r\n }\r\n return this.date < other.date;\r\n }\r\n\r\n distanceTo(other, includeEnd = true) {\r\n const result = Math.floor((other.date - this.date) / MILLISECONDS_TO_DAYS_CONSTANT + 0.5);\r\n return includeEnd ? result + 1 : result;\r\n }\r\n\r\n getDayNumberOfYear() {\r\n return Math.floor((this.date - getTheFirstOfJanuary(this.date)) / MILLISECONDS_TO_DAYS_CONSTANT);\r\n }\r\n\r\n getWeekNumberOfYear() {\r\n const firstJan = getTheFirstOfJanuary(this.date);\r\n return Math.ceil((((this.date - firstJan) / MILLISECONDS_TO_DAYS_CONSTANT) + firstJan.getDay()) / 7);\r\n }\r\n\r\n addDays(amount) {\r\n var result = this.copy();\r\n result.date.setDate(this.date.getDate() + amount);\r\n return result;\r\n }\r\n\r\n inc(amount) {\r\n this.date.setDate(this.date.getDate() + (amount ?? 1));\r\n return this;\r\n }\r\n\r\n dec() { return this.inc(-1); }\r\n\r\n toLocaleFormat() {\r\n return this.date.toLocaleDateString(tools.appLocale); //dd.mm.yyyy\r\n }\r\n\r\n getDayName() {\r\n var days = [\"воскресенье\", \"понедельник\", \"вторник\", \"среда\", \"четверг\", \"пятница\", \"суббота\"];\r\n return days[this.date.getDay()];\r\n }\r\n\r\n toVerboseString(params) {\r\n params = params || {};\r\n params.addWeekDay = (params.addWeekDay === undefined ? true : params.addWeekDay);\r\n params.addYear = (params.addYear === undefined ? true : params.addYear);\r\n var monthNames = [\"января\", \"февраля\", \"марта\", \"апреля\", \"мая\", \"июня\", \"июля\", \"августа\", \"сентября\", \"октября\", \"ноября\", \"декабря\"];\r\n var result = \"\" + this.date.getDate() + \" \" + monthNames[this.date.getMonth()];\r\n if (params.addYear) {\r\n result += \" \" + this.date.getFullYear() + \" года\";\r\n }\r\n if (params.addWeekDay) {\r\n result += \", \" + this.getDayName(this.date);\r\n }\r\n return result; //E.g. 11 сентября 2019 года, воскресенье\r\n }\r\n\r\n getDaysInMonth() {\r\n if (this.date.getMonth() === 11) {\r\n return new Date(this.date.getFullYear() + 1, 0, 0).getDate();\r\n } else {\r\n return new Date(this.date.getFullYear(), this.date.getMonth() + 1, 0).getDate();\r\n }\r\n }\r\n\r\n /*\r\n * Sets date not changing month and year.\r\n * It is useful in case when you want to set date 31 for feb month:\r\n * 1 march will be chosen unlike in original method (2 or 3 march).\r\n */\r\n setDateGently(date, monthIsolation) {\r\n monthIsolation = monthIsolation || false;\r\n var maxDate = this.getDaysInMonth();\r\n if (date <= maxDate) {\r\n this.date.setDate(date);\r\n } else {\r\n this.date.setDate(maxDate + (monthIsolation ? 0 : 1));\r\n }\r\n }\r\n\r\n /*\r\n * Adds a given number of months to the initial date. \r\n * If there is a gap between the initial date and a calculated one, it sets the last day of the new month.\r\n */\r\n addMonths(months) {\r\n if (months) {\r\n const monthSum = this.date.getMonth() + months;\r\n const addYears = Math.floor(monthSum / 12);\r\n const newMonth = monthSum - addYears * 12;\r\n const currentDay = this.date.getDate();\r\n if (addYears !== 0) {\r\n this.date.setYear(this.date.getFullYear() + addYears);\r\n }\r\n this.date.setMonth(newMonth);\r\n if (this.date.getMonth() !== newMonth) {\r\n this.date.setMonth(newMonth);\r\n }\r\n this.setDateGently(currentDay, true);\r\n }\r\n }\r\n\r\n predictIsDayOff() {\r\n const regularHolidays = [\r\n \"|1|2|3|4|5|6|7|8|\",\r\n \"|23|\",\r\n \"|8|\",\r\n \"||\",\r\n \"|1|9|\",\r\n \"|12|\",\r\n \"||\",\r\n \"||\",\r\n \"||\",\r\n \"||\",\r\n \"|4|\",\r\n \"||\"\r\n ];\r\n\r\n if ([0, 6].indexOf(this.date.getDay()) >= 0)\r\n return true;\r\n if (regularHolidays[this.date.getMonth()].indexOf(\"|\" + this.date.getDate() + \"|\") >= 0)\r\n return true;\r\n return false;\r\n }\r\n\r\n isDayOff() {\r\n if (calendarRes.loading) {\r\n return this.predictIsDayOff();\r\n }\r\n const calendar = calendarRes.content;\r\n for (var i = calendar.length - 1; i >= 0; i--) {\r\n if (this.date.getFullYear() === calendar[i].year) {\r\n return (calendar[i].daysOff[this.date.getMonth()].indexOf(\"|\" + this.date.getDate() + \"|\") >= 0);\r\n }\r\n }\r\n if (this.date.getFullYear() > calendar[calendar.length - 1].year)\r\n return this.predictIsDayOff();\r\n return false;\r\n }\r\n\r\n static currentYear() {\r\n return (new Date()).getFullYear();\r\n }\r\n}\r\n\r\nclass DateSpan {\r\n constructor(dateFrom, dateTo) {\r\n if (dateFrom && dateTo) {\r\n this._dateFrom = new DatePoint(dateFrom);\r\n this._dateTo = new DatePoint(dateTo);\r\n }\r\n }\r\n\r\n toString() {\r\n return this.toLocaleFormat();\r\n }\r\n\r\n isEqualTo(other) {\r\n if (!(other instanceof DateSpan)) {\r\n throw new Error(\"Can't compare DateSpan with \" + typeof (other) + \". Try to cast to DateSpan firstly.\");\r\n }\r\n\r\n if (this._boundsSet()) {\r\n return other._boundsSet() && this.dateFrom.isEqualTo(other.dateFrom) && this.dateTo.isEqualTo(other.dateTo);\r\n }\r\n\r\n if (other._boundsSet()) {\r\n return false;\r\n }\r\n\r\n return this._dayCount === other._dayCount && this._workingDayCount === other._workingDayCount;\r\n }\r\n\r\n get dateFrom() {\r\n return this._dateFrom;\r\n }\r\n\r\n // AG TODO: It's not ideal solution. Come up with a new one.\r\n // Transparent getters allow to change using only getters\r\n // Setters must call 'boundUpdated()' or not update anything at all (maybe remove setters???)\r\n set dateFrom(dateFrom) {\r\n if (dateFrom.valid) {\r\n this._workingDayCount = undefined;\r\n this._dateFrom = dateFrom;\r\n }\r\n }\r\n\r\n get dateTo() {\r\n return this._dateTo;\r\n }\r\n\r\n set dateTo(dateTo) {\r\n if (dateTo.valid) {\r\n this._workingDayCount = undefined;\r\n this._dateTo = dateTo;\r\n }\r\n }\r\n\r\n static fromDays(days) {\r\n var span = new DateSpan();\r\n span._dayCount = days;\r\n return span;\r\n }\r\n\r\n static fromWorkingDays(daysWorking) {\r\n var span = new DateSpan();\r\n span._workingDayCount = daysWorking;\r\n return span;\r\n }\r\n\r\n getWorkingDayCount() {\r\n if (!this._workingDayCount && this._boundsSet()) {\r\n let count = 0;\r\n this.iterDays((day) => count += !day.isDayOff());\r\n this._workingDayCount = count;\r\n }\r\n return this._workingDayCount;\r\n }\r\n\r\n _boundsSet() {\r\n return this.dateFrom !== undefined && this.dateTo !== undefined;\r\n }\r\n\r\n copy() {\r\n if (this._boundsSet())\r\n return new DateSpan(this.dateFrom.copy(), this.dateTo.copy());\r\n\r\n if (this.getDayCount() !== undefined)\r\n return DateSpan.fromDays(this.getDayCount());\r\n\r\n if (this.getWorkingDayCount() !== undefined)\r\n return DateSpan.fromWorkingDays(this.getWorkingDayCount());\r\n }\r\n\r\n getDayCount() {\r\n if (this._boundsSet())\r\n return this.dateFrom.distanceTo(this.dateTo);\r\n return this._dayCount;\r\n }\r\n\r\n toLocaleFormat() {\r\n return this.dateFrom.toLocaleFormat() + \" – \" + this.dateTo.toLocaleFormat();\r\n }\r\n\r\n //return string with day count\r\n getVerboseDayCount() {\r\n return tools.verboseCountingValue(this.getDayCount(), [[\"день\", \"дня\", \"дней\"]]);\r\n }\r\n\r\n /*\r\n * Returns object {valid: true, monthes: [monthes], days: [days]}\r\n * or {valid: false, reason: [reason message string]}\r\n *\r\n * Calculates difference between two dates in monthes and residual days.\r\n * Argument optional (used to subtract specified count of days from period)\r\n * All calculations correct by laws.\r\n */\r\n getPeriodDuration(subtractDayCount) {\r\n subtractDayCount = subtractDayCount || 0;\r\n\r\n //subtracting\r\n var fixedDayTo = this.dateTo.copy();\r\n fixedDayTo = fixedDayTo.addDays(-subtractDayCount);\r\n\r\n if (fixedDayTo.goesBefore(this.dateFrom)) {\r\n if (fixedDayTo.distanceTo(this.dateFrom) == 2) {\r\n return {valid: true, monthes: 0, days: 0, residPoint: fixedDayTo, inDays: 0};\r\n }\r\n return {valid: false, reason: \"dateFrom must be less than dayTo - subtractDayCount\"};\r\n }\r\n\r\n // calculating duration\r\n var months = (fixedDayTo.date.getFullYear() * 12 + fixedDayTo.date.getMonth()) - (this.dateFrom.date.getFullYear() * 12 + this.dateFrom.date.getMonth());\r\n var residPoint = fixedDayTo.copy();\r\n\r\n residPoint.setDateGently(this.dateFrom.date.getDate());\r\n if (residPoint.distanceTo(fixedDayTo) < 0) {\r\n months--;\r\n residPoint = fixedDayTo.copy();\r\n residPoint.date.setDate(1);\r\n residPoint.date.setMonth(residPoint.date.getMonth() - 1);\r\n residPoint.setDateGently(this.dateFrom.date.getDate());\r\n } else if (residPoint.date.getDate() == 1 && fixedDayTo.date.getDate() == residPoint.getDaysInMonth()) {\r\n residPoint.date.setDate(fixedDayTo.date.getDate() + 1);\r\n months++;\r\n }\r\n\r\n return {\r\n valid: true,\r\n monthes: months,\r\n days: residPoint.distanceTo(fixedDayTo),\r\n residPoint: residPoint,\r\n inDays: this.dateFrom.distanceTo(fixedDayTo)\r\n };\r\n }\r\n\r\n //argument of callback should be DatePoint type\r\n iterDays(callback) {\r\n if (!this._boundsSet())\r\n throw new Error(\"DateSpan bounds are undefined\");\r\n var start = this.dateFrom.copy();\r\n var index = 0;\r\n while (this.getDayCount() > index) {\r\n callback(start, index);\r\n start.inc();\r\n index++;\r\n }\r\n }\r\n\r\n /*\r\n * Returns list of objects with next attributes:\r\n * * dateSpan\r\n * * type: [add, sub] (see additional `subtract` parameter)\r\n * * leftKey (for add only, null for first if first key goes after )\r\n * * rightKey (for add only, null for last if last key foes before )\r\n * * instance (for sub only)\r\n * Parameters:\r\n * required parameters: \r\n * * keypoints (list of objects {date: [Date], ...})\r\n * additional parameters:\r\n * * subtract (list of sorted objects {dateFrom: [Date], dateTo: [Date], ...})\r\n * \r\n */\r\n getDateSegments(params) {\r\n if (!tools.checkParams(params, [\"keypoints\"])) {\r\n return [];\r\n }\r\n var keypoints = params.keypoints.sort((a, b) => ((new DatePoint(a.date)).goesBefore(b.date) ? -1 : 1));\r\n\r\n var point = this.dateFrom;\r\n var endPoint = this.dateTo;\r\n var result = [];\r\n\r\n var key = null;\r\n var subtractionUsed = {};\r\n\r\n function add(from, to, leftKey, rightKey) {\r\n result.push({span: new DateSpan(from, to), leftKey: leftKey, rightKey: rightKey, type: \"add\"});\r\n }\r\n\r\n function subtract(instanceIndex) {\r\n var instance = params.subtract[instanceIndex];\r\n result.push({span: new DateSpan(instance.dateFrom, instance.dateTo), instance: instance, type: \"sub\"});\r\n subtractionUsed[instanceIndex] = true;\r\n }\r\n\r\n function addWithSubtractions(start, end, leftKey, rightKey) {\r\n var point = start;\r\n params.subtract.map((s) => new DateSpan(s.dateFrom, s.dateTo)).some(function (s, index) {\r\n if (subtractionUsed[index] !== true) {\r\n if (!point.goesBefore(s.dateFrom)) {\r\n subtract(index);\r\n if (!s.dateTo.goesBefore(point))\r\n point = s.dateTo.addDays(1);\r\n return (!s.dateTo.goesBefore(end));\r\n\r\n } else if (!end.goesBefore(s.dateFrom)) {\r\n add(point, s.dateFrom.addDays(-1), leftKey, rightKey);\r\n subtract(index);\r\n point = s.dateTo.addDays(1);\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n if (!s.dateTo.goesBefore(point)) {\r\n point = s.dateTo.addDays(1);\r\n }\r\n }\r\n return (end.goesBefore(point));\r\n });\r\n\r\n if (!end.goesBefore(point)) {\r\n add(point, end, leftKey, rightKey);\r\n }\r\n }\r\n\r\n function addPeriod(from, to, rightKey) {\r\n if (params.subtract === undefined)\r\n add(from, to, key, rightKey || null);\r\n else\r\n addWithSubtractions(from, to, key, rightKey || null);\r\n }\r\n\r\n if (keypoints.length === 0) {\r\n add(point, endPoint);\r\n }\r\n\r\n // cases:\r\n // 1. kkk[]\r\n // 2. []kkk\r\n // 3. [kkk]\r\n // 4. k[k]k\r\n // 5. k[kk]\r\n // 6. [kk]k\r\n // 7. kk[]k\r\n for (var i = 0; i < keypoints.length; ++i) {\r\n var keypoint = keypoints[i];\r\n var date = new DatePoint(keypoint.date);\r\n if (point.goesBefore(date)) {\r\n if (endPoint.goesBefore(date)) { // 2, 4, 6, 7\r\n addPeriod(point, endPoint, keypoint);\r\n break;\r\n }\r\n else { // 3, 4, 5, 6\r\n addPeriod(point, date.addDays(-1), keypoint);\r\n point = date;\r\n if (i === keypoints.length - 1) { // 3, 5\r\n key = keypoint;\r\n addPeriod(point, endPoint);\r\n }\r\n }\r\n }\r\n else if (i === keypoints.length - 1) { // only 1\r\n key = keypoint;\r\n addPeriod(point, endPoint);\r\n }\r\n\r\n key = keypoint;\r\n }\r\n return result;\r\n }\r\n\r\n contains(datePoint) {\r\n if (!this._boundsSet()) return undefined;\r\n return !datePoint.goesBefore(this.dateFrom) && !this.dateTo.goesBefore(datePoint);\r\n }\r\n\r\n intersects(other) {\r\n if (!this._boundsSet() || !other._boundsSet()) return undefined;\r\n return !this.dateTo.goesBefore(other.dateFrom) && !other.dateTo.goesBefore(this.dateFrom);\r\n }\r\n\r\n // check that this fully inside other\r\n inside(other) {\r\n if (!this._boundsSet() || !other._boundsSet()) return undefined;\r\n return !this.dateFrom.goesBefore(other.dateFrom) && !other.dateTo.goesBefore(this.dateTo);\r\n }\r\n}\r\n\r\n/*Parameters:\r\n * required parameters: \r\n * * from\r\n * * to\r\n*/\r\nfunction makeDateSegmentWorker(segments) {\r\n var _segments = segments\r\n .map((a) => new DateSpan(a.from, a.to))\r\n .sort((a, b) => (a.dateFrom.goesBefore(b.dateFrom) ? -1 : 1));\r\n\r\n return {\r\n /// exclude off days by default\r\n checkDay: function (day, includeOffDays) {\r\n const point = new DatePoint(day);\r\n return (includeOffDays || !point.isDayOff()) && _segments.some((s) => s.contains(point));\r\n },\r\n countSegment: function (from_, to_) {\r\n if (_segments.length == 0) return 0;\r\n if (from_.goesBefore(_segments[0].dateFrom))\r\n from_ = _segments[0].dateFrom;\r\n if (_segments[_segments.length - 1].dateTo.goesBefore(to_))\r\n to_ = _segments[_segments.length - 1].dateTo;\r\n\r\n var result = 0;\r\n var self = this;\r\n var segmentSpan = new DateSpan(from_, to_);\r\n segmentSpan.iterDays((date) => result += self.checkDay(date));\r\n return result;\r\n },\r\n checkIntersection: (dateFrom_, dateTo_) => {\r\n var span = new DateSpan(dateFrom_, dateTo_);\r\n return _segments.some((s) => s.intersects(span));\r\n }\r\n };\r\n}\r\n\r\nfunction getDate(datePicker, returnLegacyDate) {\r\n returnLegacyDate = returnLegacyDate || false;\r\n try {\r\n datePicker = $(datePicker);\r\n\r\n var format = datePicker.datepicker(\"option\", \"dateFormat\"),\r\n text = datePicker.val(),\r\n settings = datePicker.datepicker(\"option\", \"settings\");\r\n\r\n const date = $.datepicker.parseDate(format, text, settings);\r\n return returnLegacyDate ? date : new DatePoint(date, true);\r\n } catch {\r\n return returnLegacyDate ? null : new DatePoint(null, true);\r\n }\r\n}\r\n\r\nfunction nextDateAfterWorkingDay(datePoint, additionalHolidayFunc) {\r\n var checker = (d) => d.isDayOff();\r\n if (additionalHolidayFunc !== undefined) {\r\n checker = function (d) {\r\n return d.isDayOff() || additionalHolidayFunc(d);\r\n };\r\n }\r\n const date = datePoint.copy();\r\n while (true) {\r\n var isWorkingDay = !checker(date);\r\n date.inc();\r\n\r\n if (isWorkingDay) {\r\n return date;\r\n }\r\n }\r\n}\r\n\r\nconst emptyFunc = () => { };\r\n\r\nfunction makeDateFromAlertWorker({\r\n slideUpDuration = 200,\r\n dateFromSelector = \"#dateFrom\",\r\n submitForm = emptyFunc,\r\n dateFromAlertSelector = \"#dateFromAlert\",\r\n alertAcceptSelector = \"#dateFromAlertAccept\",\r\n isDynamicSubmit = false,\r\n minCheckDate = \"01.01.1800\",\r\n maxCheckDate = \"01.01.2999\",\r\n crownPeriods = undefined,\r\n isDayBeforeWeekend = false,\r\n isDayCrownHoliday = false,\r\n isWeekend = false,\r\n calculator = null\r\n}) {\r\n var elem = $(dateFromAlertSelector);\r\n var alertAcceptElem = $(alertAcceptSelector);\r\n var shown = false;\r\n\r\n var config = {\r\n dateFrom: {tmp: null, frozen: null},\r\n prevDate: {tmp: null, frozen: null},\r\n nextPrevDateFrom: {tmp: null, frozen: null},\r\n nextDateFrom: {tmp: null, frozen: null},\r\n set: function (dateFrom_, prevDate_, nextDateFrom_) {\r\n if (dateFrom_ !== null) this.dateFrom.tmp = dateFrom_;\r\n if (prevDate_ !== null) this.prevDate.tmp = prevDate_;\r\n if (nextDateFrom_ !== null) {\r\n this.nextDateFrom.tmp = nextDateFrom_;\r\n this.nextPrevDateFrom.tmp = new DatePoint(nextDateFrom_).dec().date;\r\n }\r\n },\r\n freeze: function () {\r\n [this.dateFrom, this.prevDate, this.nextPrevDateFrom, this.nextDateFrom].forEach(function (x) {\r\n x.frozen = x.tmp;\r\n });\r\n elem.data(\"stateDayFrozen\", elem.data(\"stateDay\"));\r\n }\r\n };\r\n\r\n function previousDateBeforeWeekend(date) {\r\n var currDate = date.copy();\r\n while (true) {\r\n var isWorkingDay = !currDate.isDayOff();\r\n if (isWorkingDay) {\r\n return currDate;\r\n }\r\n currDate.dec();\r\n }\r\n }\r\n\r\n $(\".variant-header\").on(\"click\", function (e) {\r\n if (e.target.tagName == \"A\")\r\n return;\r\n\r\n function updateVariant(elem) {\r\n var parent = elem.parentElement;\r\n var content = $(parent).find(\".variant-content\");\r\n if (!elem.classList.contains(\"close\")) {\r\n content.slideDown();\r\n } else {\r\n content.slideUp(slideUpDuration);\r\n }\r\n }\r\n var self = this;\r\n var close = !self.classList.contains(\"close\");\r\n $(\".variant-header\").addClass(\"close\").each(function () {\r\n if (this === self && !close) {\r\n this.classList.remove(\"close\");\r\n }\r\n updateVariant(this);\r\n });\r\n });\r\n\r\n alertAcceptElem.on(\"click\", function () {\r\n var newDate = new DatePoint($(this).data(\"newDate\"));\r\n const oldDate = new DatePoint($(dateFromSelector)[0].date);\r\n if (newDate.valid) {\r\n config.set(null, null, newDate.date);\r\n config.freeze();\r\n $(dateFromSelector)[0].date = newDate.date;\r\n const dateFromPoint = new DatePoint(config.dateFrom.frozen);\r\n elem.find(\".datefrom-alert-val\").html(dateFromPoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-val-day\").html(dateFromPoint.getDayName());\r\n elem.data(\"crownButton\", this.classList.contains(\"crown\"));\r\n }\r\n\r\n elem.slideUp(slideUpDuration);\r\n\r\n if (isDynamicSubmit) {\r\n elem.data(\"state\", \"accept\");\r\n submitForm();\r\n }\r\n else {\r\n submitForm();\r\n elem.data(\"state\", \"accept\");\r\n }\r\n\r\n if (!crownSegmWorker.checkDay(newDate.date) && crownSegmWorker.checkDay(nextDateAfterWorkingDay(oldDate).date) && oldDate.copy().dec().isDayOff())\r\n elem.data(\"stateDay\", \"crownOff\");\r\n else if (crownSegmWorker.checkDay(newDate.date))\r\n elem.data(\"stateDay\", \"\");\r\n\r\n if (calculator !== null) {\r\n calculator.sendStatisticMessage(\"Check_Day_Off\");\r\n }\r\n\r\n });\r\n\r\n elem.find(\".close-button\").on(\"click\", function () {\r\n elem.slideUp(slideUpDuration);\r\n elem.data(\"state\", \"closed\");\r\n config.freeze();\r\n\r\n if (isDynamicSubmit) {\r\n submitForm();\r\n }\r\n return false;\r\n });\r\n\r\n var isCrown = crownPeriods === undefined ? false : true;\r\n var crownSegmWorker = makeDateSegmentWorker(crownPeriods || []);\r\n\r\n function checkCrown(dateFrom, equalityCheck, hideCovidInfo) {\r\n if (hideCovidInfo) return;\r\n var prevDatePoint = new DatePoint(dateFrom);\r\n prevDatePoint.dec();\r\n\r\n if (prevDatePoint.isDayOff() || crownSegmWorker.checkDay(prevDatePoint.date)) {\r\n var nextDateFromPoint = nextDateAfterWorkingDay(new DatePoint(dateFrom), function (d) { return crownSegmWorker.checkDay(d); });\r\n var nextPrevDateFromPoint = nextDateFromPoint.copy().dec();\r\n\r\n var result = (equalityCheck === undefined || nextDateFromPoint.toLocaleFormat() !== new DatePoint(equalityCheck).toLocaleFormat());\r\n if (result) {\r\n $(\".datefrom-alert-new-prev-crown\").html(nextPrevDateFromPoint.toLocaleFormat());\r\n $(\".datefrom-alert-new-val-crown\").html(nextDateFromPoint.toLocaleFormat());\r\n config.set(null, null, nextDateFromPoint.date);\r\n alertAcceptElem.each(function () {\r\n if (this.classList.contains(\"crown\")) {\r\n $(this).data(\"newDate\", nextDateFromPoint.toLocaleFormat());\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return {\r\n show: function () {\r\n shown = true;\r\n elem.slideDown();\r\n if (calculator !== null) {\r\n calculator.sendStatisticMessage(\"Show_Day_Off\");\r\n }\r\n },\r\n shown: function () { return shown; },\r\n hide: function () { shown = false; elem.slideUp(slideUpDuration); },\r\n reset: function () { shown = false; elem.hide(); },\r\n getElem: function () { return elem; },\r\n getState: function () { return elem.data(\"state\"); },\r\n getFrozenDateFrom: function () { return new DatePoint(config.dateFrom.frozen); },\r\n isVisible: function () { return elem.is(\":visible\"); },\r\n isAccepted: function () { return (elem.data(\"state\") === \"accept\"); },\r\n isAcceptedCrown: function () { return (elem.data(\"crownButton\")); },\r\n isClosed: function () { return (elem.data(\"state\") === \"closed\"); },\r\n isDayCrown: function (frozen) { return frozen ? (elem.data(\"stateDayFrozen\") == \"crown\") : (elem.data(\"stateDay\") == \"crown\"); },\r\n isDayOffCrown: function (frozen) { return frozen ? (elem.data(\"stateDayFrozen\") == \"crownOff\") : (elem.data(\"stateDay\") == \"crownOff\"); },\r\n render: function (freeze) { // this parameter useful for force freeze (card not closed, print, for example)\r\n if (freeze) {\r\n config.freeze();\r\n }\r\n var dateFromPoint = new DatePoint(config.dateFrom.frozen);\r\n var prevDatePoint = new DatePoint(config.prevDate.frozen);\r\n var nextPrevDateFromPoint = new DatePoint(config.nextPrevDateFrom.frozen);\r\n var nextDateFromPoint = new DatePoint(config.nextDateFrom.frozen);\r\n $(\".datefrom-alert-val-render\").html(dateFromPoint.toLocaleFormat());\r\n $(\".datefrom-alert-val-day-render\").html(dateFromPoint.getDayName());\r\n $(\".datefrom-alert-prev-render\").html(prevDatePoint.toLocaleFormat());\r\n $(\".datefrom-alert-prev-day-render\").html(prevDatePoint.getDayName());\r\n $(\".datefrom-alert-new-prev-render\").html(nextPrevDateFromPoint.toLocaleFormat());\r\n $(\".datefrom-alert-new-val-render\").html(nextDateFromPoint.toLocaleFormat());\r\n $(\".datefrom-alert-new-val-day-render\").html(nextDateFromPoint.getDayName());\r\n },\r\n check: function (dateFrom, hideCovidInfo) {\r\n const dateFromPoint = new DatePoint(dateFrom, true);\r\n if (dateFromPoint.goesBefore(minCheckDate) || new DatePoint(maxCheckDate).goesBefore(dateFromPoint)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n elem.data(\"state\", \"\");\r\n elem.data(\"stateDay\", \"\");\r\n if (dateFromPoint.valid) {\r\n if (isDayBeforeWeekend) {\r\n var currentDate = dateFromPoint;\r\n if (currentDate.isDayOff()) {\r\n var previousDatePoint = previousDateBeforeWeekend(dateFromPoint);\r\n config.set(dateFromPoint.date, null, previousDatePoint.date);\r\n alertAcceptElem.data(\"newDate\", previousDatePoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-val\").html(dateFromPoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-val-day\").html(dateFromPoint.getDayName());\r\n elem.find(\".datefrom-alert-new-val\").html(previousDatePoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-new-val-day\").html(previousDatePoint.getDayName());\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n else if (isWeekend) {\r\n var prevDatePoint = dateFromPoint.copy().dec();\r\n if (dateFromPoint.isDayOff() || checkCrown(dateFromPoint.date)) {\r\n config.set(dateFromPoint.date, null, null);\r\n elem.find(\".datefrom-alert-val\").html(dateFromPoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-val-day\").html(dateFromPoint.getDayName());\r\n }\r\n\r\n if (dateFromPoint.isDayOff()) {\r\n var nextDateFromPoint = nextDateAfterWorkingDay(dateFromPoint);\r\n var workingDateFromPoint = nextDateFromPoint.copy().dec();\r\n alertAcceptElem.data(\"newDate\", workingDateFromPoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-new-val\").html(workingDateFromPoint.toLocaleFormat());\r\n\r\n if (isCrown && checkCrown(dateFromPoint.date, nextDateFromPoint.date, hideCovidInfo) && !hideCovidInfo) {\r\n $(\".info-block.variants\").show();\r\n $(\".info-block.single\").hide();\r\n elem.data(\"stateDay\", \"crownOff\");\r\n } else if (isCrown) {\r\n if (dateFromPoint.date.getFullYear() < 2023) {\r\n $(\".info-block-content .normal-cases-before-2023\").show();\r\n $(\".info-block-content .normal-cases\").hide();\r\n } else {\r\n $(\".info-block-content .normal-cases-before-2023\").hide();\r\n $(\".info-block-content .normal-cases\").show();\r\n }\r\n $(\".info-block-content .crown-case\").hide();\r\n $(\".info-block.variants\").hide();\r\n $(\".info-block.single\").show();\r\n if (crownSegmWorker.checkDay(dateFromPoint))\r\n elem.data(\"stateDay\", \"crown\");\r\n }\r\n\r\n config.set(null, null, workingDateFromPoint.date);\r\n\r\n this.show();\r\n } else {\r\n if (isCrown && checkCrown(dateFromPoint.date) && !hideCovidInfo) {\r\n $(\".info-block-content .normal-cases-before-2023\").hide();\r\n $(\".info-block-content .normal-cases\").hide();\r\n $(\".info-block-content .crown-case\").show();\r\n $(\".info-block.variants\").hide();\r\n $(\".info-block.single\").show();\r\n elem.data(\"stateDay\", \"crown\");\r\n if (!isDayCrownHoliday)\r\n this.show();\r\n else\r\n this.hide();\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n } else {\r\n prevDatePoint = dateFromPoint.copy().dec();\r\n if (prevDatePoint.isDayOff() || checkCrown(dateFromPoint.date)) {\r\n config.set(dateFromPoint.date, prevDatePoint.date, null);\r\n elem.find(\".datefrom-alert-val\").html(dateFromPoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-val-day\").html(dateFromPoint.getDayName());\r\n elem.find(\".datefrom-alert-prev\").html(prevDatePoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-prev-day\").html(prevDatePoint.getDayName());\r\n }\r\n\r\n if (prevDatePoint.isDayOff()) {\r\n nextDateFromPoint = nextDateAfterWorkingDay(dateFromPoint);\r\n var nextPrevDateFromPoint = nextDateFromPoint.copy().dec();\r\n\r\n alertAcceptElem.data(\"newDate\", nextDateFromPoint.toLocaleFormat());\r\n\r\n elem.find(\".datefrom-alert-new-prev\").html(nextPrevDateFromPoint.toLocaleFormat());\r\n elem.find(\".datefrom-alert-new-val\").html(nextDateFromPoint.toLocaleFormat());\r\n\r\n if (isCrown && checkCrown(dateFromPoint.date, nextDateFromPoint.date, hideCovidInfo) && !hideCovidInfo) {\r\n $(\".info-block.variants\").show();\r\n $(\".info-block.single\").hide();\r\n elem.data(\"stateDay\", \"crownOff\");\r\n } else if (isCrown) {\r\n if (dateFromPoint.date.getFullYear() < 2023) {\r\n $(\".info-block-content .normal-cases-before-2023\").show();\r\n $(\".info-block-content .normal-cases\").hide();\r\n } else {\r\n $(\".info-block-content .normal-cases-before-2023\").hide();\r\n $(\".info-block-content .normal-cases\").show();\r\n }\r\n $(\".info-block-content .crown-case\").hide();\r\n $(\".info-block.variants\").hide();\r\n $(\".info-block.single\").show();\r\n if (crownSegmWorker.checkDay(dateFromPoint))\r\n elem.data(\"stateDay\", \"crown\");\r\n }\r\n\r\n config.set(null, null, nextDateFromPoint.date);\r\n\r\n this.show();\r\n } else {\r\n if (isCrown && checkCrown(dateFromPoint.date) && !hideCovidInfo) {\r\n $(\".info-block-content .normal-cases-before-2023\").hide();\r\n $(\".info-block-content .normal-cases\").hide();\r\n $(\".info-block-content .crown-case\").show();\r\n $(\".info-block.variants\").hide();\r\n $(\".info-block.single\").show();\r\n elem.data(\"stateDay\", \"crown\");\r\n if (!isDayCrownHoliday)\r\n this.show();\r\n else\r\n this.hide();\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n }\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction makeDateInFutureAlertWorker({\r\n slideUpDuration = 200,\r\n submitForm = emptyFunc,\r\n isDynamicSubmit = false,\r\n dateToFutureAlertSelector = \"#dateToFutureAlert\",\r\n calculator = null\r\n}) {\r\n var elem = $(dateToFutureAlertSelector);\r\n var shown = false;\r\n\r\n elem.find(\".close-button\").on(\"click\", function (e) {\r\n elem.slideUp(slideUpDuration);\r\n elem.data(\"state\", \"closed\");\r\n\r\n if (isDynamicSubmit) {\r\n submitForm();\r\n }\r\n e.preventDefault();\r\n });\r\n\r\n return {\r\n show: function () {\r\n shown = true;\r\n elem.slideDown();\r\n\r\n if (calculator !== null) {\r\n calculator.sendStatisticMessage(\"Date_Future\");\r\n }\r\n },\r\n shown: function () { return shown; },\r\n hide: function () { shown = false; elem.slideUp(slideUpDuration); },\r\n reset: function () { shown = false; elem.hide(); },\r\n getElem: function () { return elem; },\r\n getState: function () { return elem.data(\"state\"); },\r\n isVisible: function () { return elem.is(\":visible\"); },\r\n isAccepted: function () { return shown && (this.getState() === \"accept\"); },\r\n isClosed: function () { return shown && (this.getState() === \"closed\"); },\r\n check: function (dateTo) {\r\n elem.data(\"state\", \"\");\r\n\r\n if (dateTo && dateTo.getDate() && (new DatePoint(dateTo).date > new DatePoint().date))\r\n this.show();\r\n else {\r\n this.hide();\r\n }\r\n }\r\n };\r\n}\r\n\r\n\r\nfunction distinctDates(dates) {\r\n if (!dates || dates.length == 0) {\r\n return dates;\r\n }\r\n if (dates[0] instanceof Date) {\r\n return dates\r\n .map(function (s) { return s.toString(); })\r\n .filter(tools.distinct)\r\n .map(function (s) { return new Date(s); });\r\n }\r\n else if (dates[0] instanceof DatePoint) {\r\n return dates\r\n .map(function (s) { return s.toLocaleFormat(); })\r\n .filter(tools.distinct)\r\n .map(function (s) { return new DatePoint(s); });\r\n } else {\r\n throw new Error(\"Wrong type of elements. Must be some of date formats.\");\r\n }\r\n}\r\n\r\nfunction holidayChecker(date) {\r\n return new DatePoint(date).isDayOff();\r\n}\r\n\r\nfunction getTheFirstOfJanuary(date) {\r\n return new Date(date.getFullYear(), 0, 0);\r\n}\r\n\r\n\r\nexport {DatePoint, DateSpan, getDate, distinctDates, makeDateInFutureAlertWorker, makeDateFromAlertWorker, makeDateSegmentWorker, nextDateAfterWorkingDay, holidayChecker};\r\n","import { Calculator, ShowErrorWay } from \"../common/calculator\";\r\nimport { DateField, DateIntervalField, baseDateIntervalCheck, DateIntervalIgnoreEmptyField } from \"../common/datetime_fields.js\";\r\nimport { Field } from \"../common/basic_fields.js\";\r\nimport { DatePoint, distinctDates, makeDateFromAlertWorker, makeDateInFutureAlertWorker, makeDateSegmentWorker } from '../js/datelib.js';\r\n\r\nconst AddRowType = 'add';\r\nconst DecreaseRowType = 'decrease';\r\nconst IncreaseRowType = 'increase';\r\nconst SubtractionRowType = 'sub';\r\nconst ExcessRowType = 'excess';\r\n\r\nclass NPDCalculator extends Calculator {\r\n code() { return \"npd\"; }\r\n type() { return \"CalcNpd\"; }\r\n\r\n initialize() {\r\n let self = this;\r\n this.patchFieldTypes([ShareField, DateIntervalField, DateField, DateIntervalIgnoreEmptyField]);\r\n this.setupStatistic({\r\n calcName: 'npd'\r\n });\r\n\r\n self.ratesObj = undefined;\r\n $.getJSON(\"conf/calc_395/rates.json?v=\" + DataVersionSalt, function (json) {\r\n self.ratesObj = json;\r\n })\r\n var crownNovember395Holidays = [\r\n { from: \"2021.11.01\", to: \"2021.11.04\" }\r\n ];\r\n\r\n self.todayDate = new DatePoint();\r\n\r\n $('#extraDiv').find('a').click(function () {\r\n let $detalization = $('.extra-detalization');\r\n if ($detalization.is(':visible')) {\r\n $detalization.slideUp(200);\r\n } else {\r\n $detalization.slideDown();\r\n }\r\n \r\n return false;\r\n });\r\n\r\n $('#shareInput .error-tip').find('a').click(function () {\r\n self.shareField.setValue(jQuery(this).html())\r\n self.shareField.clearErrors();\r\n return false;\r\n });\r\n\r\n // add input fields\r\n this.debtSumField = this.addInputField('#debtSumInput input', 'debtSum', {\r\n type: 'money', options: { maxVal: 999999999999.99 },\r\n errors: [{ check: function (v) { return !!v; }, selector: '#debtSumInput .error-text' }]\r\n });\r\n\r\n this.mainPeriodField = this.addInputField('.calc-div-input-main > .period-div', 'mainPeriod', {\r\n showErrorWay: ShowErrorWay.SHOW_FIRST,\r\n });\r\n\r\n this.rateTypeField = this.addInputField('#rateTypeInput dropdown-select', 'rateType', {\r\n errors: [{ check: function (v) { return v.value !== ''; }, selector: '#rateTypeInput .error-text' }]\r\n });\r\n\r\n this.percentRateField = this.addInputField('#percentRateInput .base-input', 'percentRate', {\r\n type: 'float', options: { precision: 4 },\r\n errors: [{ check: function (v) { return !!v; }, selector: '#percentRateInput .error-text' }]\r\n });\r\n\r\n this.fixedAmountField = this.addInputField('#fixedAmountInput input', 'fixedAmount', {\r\n type: 'money', options: { maxVal: 999999999999.99 },\r\n errors: [{ check: function (v) { return !!v; }, selector: '#fixedAmountInput .error-text' }]\r\n });\r\n\r\n this.bankRateTypeField = this.addInputField('#bankRateTypeInput .input-icon', 'bankRateType');\r\n\r\n this.multiplicityField = this.addInputField('#multiplicityInput .base-input', 'multiplicity', {\r\n type: 'float', options: { precision: 2 },\r\n errors: [{ check: function (v) { return !!v; }, selector: '#multiplicityInput .error-text' }]\r\n });\r\n\r\n this.ratePeriodTypeField = this.addInputField('#ratePeriodInput dropdown-select', 'ratePeriodType', {\r\n errors: [{ check: function (v) { return v && v.value !== ''; }, selector: '#ratePeriodInput .field-div .error-text' }]\r\n });\r\n\r\n this.shareField = this.addInputField('#shareInput input', 'share', {\r\n type: 'share',\r\n errors: [\r\n { check: function (v) { return !!v; }, selector: '#shareInput .null-error' },\r\n { check: function (v) { return !(v && v.isError); }, selector: '#shareInput .wrong-error' }\r\n ]\r\n });\r\n\r\n this.rateDateField = this.addInputField('#rateDate', 'rateDate', {\r\n errors: [\r\n { check: function (v) { return !!v.valid; }, selector: '#rateDateErr' },\r\n { check: function (v) { return !v.goesBefore(new DatePoint(\"01.01.2016\")) }, selector: '#rateDateBoundErr' }\r\n ]\r\n });\r\n\r\n this.percentLimitationField = this.addInputField('#percentLimitationInput input', 'percentLimitation', {\r\n type: 'float', options: { precision: 2 },\r\n errors: [{ check: function (v) { return !!v; }, selector: '#limitationInput .error-text' }]\r\n });\r\n\r\n this.rubbleLimitationField = this.addInputField('#rubbleLimitationInput input', 'rubbleLimitation', {\r\n type: 'float', options: { precision: 2 },\r\n errors: [{ check: function (v) { return !!v; }, selector: '#limitationInput .error-text' }]\r\n });\r\n\r\n this.multiplicityField.ignore = true;\r\n this.shareField.ignore = true;\r\n this.rateDateField.ignore = true;\r\n this.fixedAmountField.ignore = true;\r\n this.ratePeriodTypeField.ignore = true;\r\n this.percentLimitationField.ignore = true;\r\n this.rubbleLimitationField.ignore = true;\r\n\r\n // add group and dynamic fields\r\n this.addGroup(['debtDecrease', 'debtIncrease'], this.decreaseIncreaseDateCheck, { parentPeriod: this.mainPeriodField, parentSum: this.loanSumField });\r\n this.addGroup('subtractionPeriods', baseDateIntervalCheck, { parent: this.mainPeriodField });\r\n\r\n function setTemplate($clone, blockPiece) {\r\n $clone.data('rowIndex', blockPiece.index + 1);\r\n\r\n let $comment = $clone.find('.dynamic-list-comment input').change(function () {\r\n $(this).data('changed', '1');\r\n }).focus(tools.selectAllText);\r\n\r\n $comment.val($comment.val() + $clone.data('rowIndex'));\r\n\r\n let $sumInput = $clone.find('.dynamic-list-sum input');\r\n $sumInput.blur(function () {\r\n if ($(this).val() === '') {\r\n $(this).parent().find('i').removeClass('active');\r\n }\r\n }).keyup(function () {\r\n let $rubbleIcon = $(this).parent().find('i');\r\n if ($(this).val() === '') {\r\n $rubbleIcon.removeClass('active');\r\n } else {\r\n $rubbleIcon.addClass('active');\r\n }\r\n });\r\n }\r\n\r\n this.addInputField('#debtDecreaseTable', 'debtDecrease', {\r\n dynamic: true,\r\n appendButtonSelector: \"#addDebtDecrease\",\r\n removeSelector: \".dynamic-list-row-remove a\",\r\n keepOne: false,\r\n prepareTemplate: function($clone, blockPiece) {\r\n setTemplate($clone, blockPiece);\r\n\r\n return { block: $clone };\r\n },\r\n ignoreForEmpty: true,\r\n fields: {\r\n date: {\r\n selector: \".dynamic-list-date date-picker\",\r\n options: function ($clone) {\r\n return {\r\n errors: [\r\n { check: function (v) { return v.valid; }, selector: $clone.find('.dynamic-row-error-date') },\r\n { check: function (v) { return !v.goesBefore(new DatePoint(\"01.01.2016\")); }, selector: $clone.find('.from-bound-err') }\r\n ]\r\n }\r\n },\r\n },\r\n sum: {\r\n selector: \".dynamic-list-sum input\",\r\n options: function ($clone) {\r\n return {\r\n type: 'money',\r\n options: { maxVal: 999999999999.99 },\r\n errors: [{ check: function (v) { return !!v; }, selector: $clone.find('.dynamic-row-error-sum') }]\r\n }\r\n },\r\n },\r\n comment: {\r\n selector: \".dynamic-list-comment input\",\r\n options: function ($clone) {\r\n return {\r\n type: 'text'\r\n }\r\n },\r\n }\r\n }\r\n });\r\n\r\n this.addInputField('#debtIncreaseTable', 'debtIncrease', {\r\n dynamic: true,\r\n appendButtonSelector: \"#addDebtIncrease\",\r\n removeSelector: \".dynamic-list-row-remove a\",\r\n keepOne: false,\r\n prepareTemplate: function ($clone, blockPiece) {\r\n setTemplate($clone, blockPiece);\r\n\r\n const alertOptions = {\r\n submitForm: function () { self.submitForm(null, true); },\r\n dateFromSelector: $clone.find('.dynamic-list-date .dateinput'),\r\n dateFromAlertSelector: $clone.find('.increase-date-alert'),\r\n alertAcceptSelector: $clone.find('.button-normal'),\r\n calculator: self,\r\n minCheckDate: '01.01.2016',\r\n isWeekend: true\r\n };\r\n\r\n return {\r\n block: $clone,\r\n artifacts: {\r\n increaseDateAlertWorker: makeDateFromAlertWorker(alertOptions)\r\n }\r\n };\r\n },\r\n ignoreForEmpty: true,\r\n fields: {\r\n date: {\r\n selector: \".dynamic-list-date date-picker\",\r\n options: function ($clone) {\r\n return {\r\n errors: [\r\n { check: function (v) { return v.valid; }, selector: $clone.find('.dynamic-row-error-date') },\r\n { check: function (v) { return !v.goesBefore(new DatePoint(\"01.01.2016\")); }, selector: $clone.find('.from-bound-err') }\r\n ]\r\n }\r\n },\r\n },\r\n sum: {\r\n selector: \".dynamic-list-sum input\",\r\n options: function ($clone) {\r\n return {\r\n type: 'money',\r\n options: { maxVal: 999999999999.99 },\r\n errors: [{ check: function (v) { return !!v; }, selector: $clone.find('.dynamic-row-error-sum') }]\r\n }\r\n },\r\n },\r\n comment: {\r\n selector: \".dynamic-list-comment input\",\r\n options: function ($clone) {\r\n return {\r\n type: 'text'\r\n }\r\n },\r\n }\r\n }\r\n });\r\n\r\n this.addDynamicField('subtractionPeriods', {\r\n table: \"#subtractionPeriodsTable\",\r\n appendButtonSelector: \"#addSubtractionPeriods\",\r\n removeSelector: \".dynamic-list-row-remove a\",\r\n keepOne: false,\r\n prepareTemplate: function($clone, blockPiece){\r\n $clone.data('rowIndex', blockPiece.index + 1);\r\n\r\n var $comment = $clone.find('.dynamic-list-comment input').change(function () {\r\n $(this).data('changed', '1');\r\n }).focus(tools.selectAllText);\r\n \r\n $comment.val($comment.val() + $clone.data('rowIndex'));\r\n\r\n return { block: $clone };\r\n }\r\n });\r\n\r\n // add output fields\r\n this.addOutputField('.date-from-render', 'mainPeriod', { type: 'dateFromRender', render: function (r) { return r ? r.dateFrom.toString() : null } });\r\n this.addOutputField('.date-to-render', 'mainPeriod', { type: 'dateToRender', render: function (r) { return r ? r.dateTo.toString() : null } });\r\n\r\n function processDetalization(groupPeriods, detalizationDiv, isMainDetalization = true, penaltyLimit = null) {\r\n function renderHeader(params) {\r\n let inner = '';\r\n if (params) {\r\n inner += `${params.year} (${params.days} дней)`;\r\n }\r\n inner += `периоддней${(self.rateType.value === 3 && self.ratePeriodType && self.ratePeriodType.value === 1 ? 'ставка ЦБ' : '')}неустойка${self.isLimitation ? 'огран. неуст.' : ''}сумма неуст.`;\r\n return inner;\r\n }\r\n\r\n function renderRow(period) {\r\n let localeLoanSum = tools.getLocaleSum(period.loanSum);\r\n period.period = period.span.toLocaleFormat();\r\n let title = \"\";\r\n if (self.rateType.value === 1) {\r\n if (self.percentRateType.value === 1) {\r\n title = localeLoanSum + ' × ' + tools.getLocaleNumber(self.percentRate) + '% × ' + period.days;\r\n } else if (self.percentRateType.value === 2) {\r\n title = localeLoanSum + ' × (' + tools.getLocaleNumber(self.percentRate) + '%/' + period.daysInYear + ') × ' + period.days;\r\n }\r\n } else if (self.rateType.value === 2) {\r\n title = tools.getLocaleNumber(self.fixedAmount) + ' × ' + period.days;\r\n } else if (self.rateType.value === 3) {\r\n let multiplier = self.bankRateType.value === \"multiplicity\"\r\n ? (tools.getLocaleSum(self.multiplicity) + ' × ' + tools.getLocaleSum(period.rate) + '%/' + period.daysInYear)\r\n : (self.share.text + ' × ' + tools.getLocaleSum(period.rate)) + '%';\r\n title = localeLoanSum + ' × (' + multiplier + ')' + ' × ' + period.days;\r\n }\r\n\r\n let penalyLimitValue = self.limitationType?.value == 1 \r\n ? period.loanSum * (self.percentLimitation / 100)\r\n : self.rubbleLimitation;\r\n\r\n let penaltyResult = penaltyLimit !== null && !isMainDetalization \r\n ? tools.getLocaleSum(Math.max(self.isLimitation ? Math.min(penalyLimitValue, period.totalPenalty, self.totalPenalty, penaltyLimit): period.totalPenalty, 0))\r\n : tools.getLocaleSum(Math.max(self.isLimitation ? Math.min(penalyLimitValue, period.totalPenalty, self.totalPenalty): period.totalPenalty), 0);\r\n\r\n period.penaltyResult = penaltyResult;\r\n\r\n return `${period.period}`\r\n + `${period.days}`\r\n + (self.rateType.value === 3 && self.ratePeriodType && self.ratePeriodType.value === 1 ? `${tools.getLocaleSum(period.rate)}` : '')\r\n + `${tools.getLocaleSum(period.penalty)}`\r\n + `${self.isLimitation ? `${self.limitationType?.value == 1 ? `${self.percentLimitation}%` : tools.getLocaleSum(self.rubbleLimitation)}` : ''}`\r\n + `${penaltyResult}`;\r\n \r\n }\r\n\r\n function renderDecreaseIncreaseRow(period) {\r\n return `${period.date}`\r\n + `${(period.isIncrease ? 'Увеличение суммы долга' : 'Частичная оплата долга')}`\r\n + `${(period.isIncrease ? '+' : '−')}${tools.getLocaleSumInRubbles(period.value)}`\r\n + `${period.comment ? period.comment : ''}`\r\n + (period.loanSum > 0 ? `Сумма долга ${tools.getLocaleSumInRubbles(period.loanSum)}` : '');\r\n }\r\n\r\n function renderSubRow(period) {\r\n return `${period.span.toLocaleFormat()}`\r\n + `Исключаемый период (${tools.verboseCountingValue(period.span.getPeriodDuration().inDays, [['день', 'дня', 'дней']])})`\r\n + (period.name ? `${period.name}` : '');\r\n }\r\n\r\n function renderExcessSum(period) {\r\n return 'Превышение выплаченной суммы над суммой долга ' + tools.getLocaleSumInRubbles(period.value) + '';\r\n }\r\n\r\n groupPeriods.forEach(function (groupPeriod, k) {\r\n var headerParams = null;\r\n if (self.applyYears) {\r\n headerParams = {};\r\n headerParams.year = groupPeriod[0].year;\r\n headerParams.days = groupPeriod[0].daysInYear;\r\n }\r\n\r\n let inner = \"\";\r\n inner += renderHeader(headerParams);\r\n\r\n let table = document.createElement('table');\r\n table.classList.add('output-table');\r\n\r\n const periodsOfGroup = groupPeriods[k];\r\n periodsOfGroup.forEach(function (period) {\r\n switch(period.type){\r\n case AddRowType:\r\n inner += renderRow(period);\r\n break;\r\n case SubtractionRowType:\r\n inner += renderSubRow(period);\r\n break;\r\n case DecreaseRowType:\r\n case IncreaseRowType:\r\n inner += renderDecreaseIncreaseRow(period);\r\n break; \r\n case ExcessRowType:\r\n inner += renderExcessSum(period);\r\n break;\r\n default:\r\n console.log(`Unknown Row Type - ${period.type}`);\r\n break;\r\n }\r\n });\r\n\r\n table.innerHTML = inner;\r\n detalizationDiv.append(table)\r\n });\r\n\r\n \r\n }\r\n\r\n this.addOutputField('.detalization', 'groupedDetalization', {\r\n html: true,\r\n render: function (groupPeriods) {\r\n var detalizationDiv = document.createElement('div');\r\n detalizationDiv.classList.add('detalization-div');\r\n processDetalization(groupPeriods, detalizationDiv);\r\n return detalizationDiv.outerHTML;\r\n },\r\n });\r\n\r\n this.addOutputField('.extra-detalization', 'extraDetalizations', {\r\n html: true,\r\n render: function (detalizations) {\r\n var detalizationsDiv = document.createElement('div');\r\n detalizationsDiv.classList.add('detalizations-div');\r\n\r\n let penaltyAccum = 0;\r\n\r\n detalizations.forEach(function (detalizationObj, j) {\r\n var groupPeriods = [];\r\n let arr = [];\r\n for (let i = 0; i < detalizationObj.detalization.length; i++) {\r\n if (self.applyYears && i !== 0\r\n && detalizationObj.detalization[i - 1].year !== detalizationObj.detalization[i].year) {\r\n groupPeriods.push(arr.slice());\r\n arr = [];\r\n }\r\n arr.push(detalizationObj.detalization[i]);\r\n }\r\n groupPeriods.push(arr.slice());\r\n\r\n var detalizationDiv = document.createElement('div');\r\n detalizationDiv.classList.add('detalization-div');\r\n\r\n var detalizationInfoDiv = document.createElement('div');\r\n detalizationInfoDiv.classList.add('detalization-info-div');\r\n\r\n detalizationInfoDiv.innerHTML = '
Расчёт неустойки по долгу, возникшему ' + detalizationObj.date + '
'\r\n + '
Сумма долга ' + tools.getLocaleSumInRubbles(detalizationObj.debtSum) + '
';\r\n\r\n detalizationDiv.append(detalizationInfoDiv);\r\n\r\n processDetalization(groupPeriods, detalizationDiv, false, penaltyAccum < self.totalPenalty ? self.totalPenalty - penaltyAccum : 0);\r\n \r\n penaltyAccum += self.limitationType?.value == 1 \r\n ? Math.min((groupPeriods[0].filter(el=>el.penalty).at(-1)?.loanSum || 0) * (self.percentLimitation / 100), (groupPeriods[0].filter(el=>el.penalty).at(-1)?.totalPenalty || 0))\r\n : Math.min(self.rubbleLimitation, groupPeriods[0].filter(el=>el.penalty).at(-1)?.totalPenalty || 0);\r\n \r\n\r\n detalizationsDiv.append(detalizationDiv);\r\n });\r\n\r\n return detalizationsDiv.outerHTML;\r\n }\r\n });\r\n\r\n function _crownAlertHelper(holidays, otherHoliday, includeOffDays) {\r\n let check = (date, holidaysPeriod) => {\r\n date = date.copy().dec();\r\n const crownDays = makeDateSegmentWorker(holidaysPeriod);\r\n if (crownDays.checkDay(date, includeOffDays))\r\n return true;\r\n return false;\r\n }\r\n\r\n let nonWorkingDate = new DatePoint((self.dateFromAlertWorker.isVisible() || self.dateFromAlertWorker.getState() === 'closed') ? $(\".datefrom-alert-new-val\").html() : self.mainPeriod.dateFrom);\r\n let holidayNoteIsShowed = check(nonWorkingDate, holidays);\r\n let otherHolidayNoteIsShowed = otherHoliday ? check(self.mainPeriod.dateFrom, otherHoliday) : false;\r\n\r\n return holidayNoteIsShowed || otherHolidayNoteIsShowed;\r\n }\r\n\r\n this.addOutputField('#resultCrownBasicHolidaysAlert', '', { type: 'note', render: function () { return _crownAlertHelper(crownBasicHolidays, crownMayHolidays) } });\r\n this.addOutputField('#resultCrownParadeHolidaysAlert', '', { type: 'note', render: function () { return _crownAlertHelper(crownParadeHolidays); } });\r\n this.addOutputField('#resultCrownElectionHolidaysAlert', '', { type: 'note', render: function () { return _crownAlertHelper(crownElectionHolidays); } });\r\n this.addOutputField('#resultCrownRegionalHolidays', '', { type: 'note', render: function () { return _crownAlertHelper([], crownRegionalHolidays, true); } });\r\n this.addOutputField('#resultCrownNovemberHolidaysAlert', '', { type: 'note', render: function () { return _crownAlertHelper(crownNovember395Holidays); } });\r\n\r\n\r\n function _alertHelper(name) {\r\n if (!self.futureAlertState.valid || self.futureAlertState.cn !== name) return false;\r\n return self.futureAlertState.printOnly ? 'print' : true;\r\n }\r\n\r\n this.addOutputField('#first-holiday-unchanged', '', { type: 'note', render: function () { return _alertHelper('first-holiday-unchanged'); } });\r\n this.addOutputField('#first-holiday-changed', '', { type: 'note', render: function () { return _alertHelper('first-holiday-changed'); } });\r\n\r\n this.addOutputField('#unpredictable-future', '', {\r\n type: 'note', render: function () {\r\n if (self.dateFutureAlertWorker.getState() === 'closed') {\r\n return true;\r\n } else if (self.dateFutureAlertWorker.isVisible()) {\r\n return 'print';\r\n }\r\n }\r\n });\r\n\r\n this.addOutputField('#rate-future', '', {\r\n type: 'note', render: function () {\r\n if (self.rateFutureAlertWorker.getState() === 'closed') {\r\n return true;\r\n } else if (self.rateFutureAlertWorker.isVisible()) {\r\n return 'print';\r\n }\r\n }\r\n });\r\n\r\n const alertOptions = {\r\n slideUpDuration: 200,\r\n crownPeriods: crownHolidays,\r\n dateFromAlertSelector: $(\"#dateFromAlert\"),\r\n alertAcceptSelector: $('#dateFromAlert .button-normal'),\r\n submitForm: function () { self.submitForm(null, true); },\r\n isDayCrownHoliday: true,\r\n minCheckDate: '01.01.2016'\r\n };\r\n this.dateFromAlertWorker = makeDateFromAlertWorker(alertOptions);\r\n this.dateFutureAlertWorker = makeDateInFutureAlertWorker(alertOptions);\r\n\r\n const rateAlertOptions = {\r\n slideUpDuration: 200,\r\n crownPeriods: crownHolidays,\r\n submitForm: function () { self.submitForm(null, true); },\r\n isDayCrownHoliday: true,\r\n minCheckDate: '01.01.2016',\r\n dateToFutureAlertSelector: $(\"#rateFutureAlert\"),\r\n };\r\n this.rateFutureAlertWorker = makeDateInFutureAlertWorker(rateAlertOptions);\r\n\r\n this.loadDescription();\r\n\r\n this.submitOnClick('#calcSubmit');\r\n this.addResetButton(\"#clearCalcInput\");\r\n }\r\n\r\n isReady() {\r\n return this.ratesObj !== undefined;\r\n }\r\n\r\n onReset() {\r\n $('.calc-div-results').removeClass('show-results');\r\n\r\n let $percentRateInput = $(\"#percentRateInput\");\r\n let $bankRateTypeInput = $(\"#bankRateTypeInput\");\r\n let $fixedAmountInput = $(\"#fixedAmountInput\");\r\n let $multiplicityInput = $(\"#multiplicityInput\");\r\n let $shareInput = $(\"#shareInput\");\r\n let $ratePeriodInput = $(\"#ratePeriodInput\");\r\n let $ratePeriodTypeInput = $(\"#ratePeriodInput dropdown-select\");\r\n let $limitationInputDiv = $(\"#limitationInput\");\r\n let $percentLimitationInput = $(\"#percentLimitationInput\");\r\n let $rubbleLimitationInput = $(\"#rubbleLimitationInput\");\r\n\r\n $percentRateInput.removeClass('hidden-control');\r\n $bankRateTypeInput.addClass('hidden-control');\r\n $fixedAmountInput.addClass('hidden-control');\r\n $ratePeriodInput.addClass('hidden-control');\r\n $ratePeriodInput.removeClass('show-date');\r\n $ratePeriodTypeInput.attr('kind', \"\");\r\n $shareInput.addClass('hidden-control');\r\n $multiplicityInput.addClass('hidden-control');\r\n $limitationInputDiv.addClass('hidden-control');\r\n $limitationInputDiv.find('.error-text').html('Укажите процент от суммы долга');\r\n $percentLimitationInput.removeClass('hidden-control');\r\n $rubbleLimitationInput.addClass('hidden-control');\r\n\r\n this.dateFromAlertWorker.reset();\r\n this.dateFutureAlertWorker.reset();\r\n this.rateFutureAlertWorker.reset();\r\n\r\n this.percentLimitationField.ignore = true;\r\n this.rubbleLimitationField.ignore = true;\r\n this.percentRateField.ignore = false;\r\n this.ratePeriodTypeField.ignore = true;\r\n this.fixedAmountField.ignore = true;\r\n this.rateDateField.ignore = true;\r\n this.multiplicityField.ignore = true;\r\n this.shareField.ignore = true;\r\n this.debtSumField.ignore = false;\r\n }\r\n\r\n generateExportObject() {\r\n let self = this;\r\n let result = super.generateExportObject();\r\n result.resultPeriodString = this.resultPeriodString;\r\n result.resultPeriodDurationString = this.resultPeriodDurationString;\r\n result.render.groupedDetalization = tools.deepcopy(this.groupedDetalization);\r\n result.render.extraDetalizations = tools.deepcopy(this.extraDetalizations);\r\n result.finalLoanSum = self.finalLoanSum;\r\n result.excessSum = self.excessSum;\r\n result.applyYears = self.applyYears;\r\n result.hasDebtDecrease = self.hasDebtDecrease;\r\n result.hasDebtIncrease = self.hasDebtIncrease;\r\n result.debtClosureHasExcess = self.debtClosureHasExcess;\r\n result.isClosure = self.isClosure;\r\n result.isEarlyClosure = self.isEarlyClosure;\r\n result.totalDebt = self.totalDebt;\r\n result.totalPenalty = self.totalPenalty;\r\n result.rateInfo = self.rateInfo;\r\n result.formula = self.formula;\r\n result.rateType = self.rateType?.value;\r\n result.bankRateType = self.bankRateType?.value;\r\n result.share = self.share?.text;\r\n result.multiplicity = self.multiplicity;\r\n result.isLimitation = self.isLimitation;\r\n result.limitationType = self.limitationType?.value;\r\n result.percentLimitation = self.percentLimitation;\r\n result.rubbleLimitation = self.rubbleLimitation;\r\n result.showBankRate = self.rateType?.value === 3 && self.ratePeriodType?.value === 1;\r\n result.render.notes = this.increaseDateNotes ? this.increaseDateNotes.concat(result.render.notes) : result.render.notes;\r\n\r\n return result;\r\n }\r\n\r\n showResults() {\r\n let $noteBlockList = $('.note-block-list');\r\n $noteBlockList.removeClass('hidden-control');\r\n $noteBlockList.addClass('only-print');\r\n\r\n let activeNotesCount = 0;\r\n $('.note-block').each(function (i, elem) {\r\n if ($(elem).hasClass(\"active\")) {\r\n activeNotesCount++;\r\n if (!$(elem).hasClass(\"only-print\")) {\r\n $noteBlockList.removeClass('only-print');\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n if (activeNotesCount === 0) {\r\n $noteBlockList.removeClass('only-print');\r\n $noteBlockList.addClass('hidden-control');\r\n }\r\n\r\n super.showResults();\r\n\r\n var goalParams = {\r\n args: {\r\n },\r\n message: 'Is_Made'\r\n };\r\n this.sendStatisticMessage(goalParams);\r\n }\r\n\r\n get defaultFilled() {\r\n return ($(\"#debtDecreaseTable\").find('.dynamic-list-row').length > 0) ||\r\n ($(\"#debtIncreaseTable\").find('.dynamic-list-row').length > 0) ||\r\n ($(\"#subtractionPeriodsTable\").find('.dynamic-list-row').length > 0);\r\n }\r\n\r\n afterParse(sender, autoValidation) {\r\n let self = this;\r\n let $elem = $(sender);\r\n let $rateTypeInput = $(\"#rateTypeInput dropdown-select\");\r\n let $percentRateInput = $(\"#percentRateInput\");\r\n let $bankRateTypeInputDiv = $(\"#bankRateTypeInput\");\r\n let $fixedAmountInput = $(\"#fixedAmountInput\");\r\n let $bankRateTypeInput = $(\"#bankRateTypeInput .input-icon\");\r\n let $multiplicityInput = $(\"#multiplicityInput\");\r\n let $shareInput = $(\"#shareInput\");\r\n let $ratePeriodInput = $(\"#ratePeriodInput\");\r\n let $ratePeriodTypeInput = $(\"#ratePeriodInput dropdown-select\");\r\n let $limitationCheckbox = $(\"#isLimitationInput .checkboxrow\");\r\n let $limitationInputDiv = $(\"#limitationInput\");\r\n let $percentLimitationInput = $(\"#percentLimitationInput\");\r\n let $rubbleLimitationInput = $(\"#rubbleLimitationInput\");\r\n let $limitationInput = $(\"#limitationInput dropdown-select\");\r\n\r\n if (sender && sender.classList.contains(\"increasedate\")) {\r\n let group = this.decreaseIncreaseGroups.find((group) => { if ($(group.dateField.elem).is($(sender))) { return group; } });\r\n if (group && group.isIncrease) {\r\n let date = group.dateField.getValue(true).date;\r\n group.alertWorker.check(date);\r\n }\r\n }\r\n\r\n if (this.mainPeriodField === undefined) {\r\n return;\r\n }\r\n\r\n let period = this.mainPeriodField.getValue(true);\r\n\r\n if ($elem.is($bankRateTypeInput)) {\r\n if (this.bankRateType.value === \"share\") {\r\n $shareInput.removeClass(\"hidden-control\");\r\n $multiplicityInput.addClass(\"hidden-control\");\r\n this.multiplicityField.ignore = true;\r\n this.shareField.ignore = false;\r\n } else {\r\n $shareInput.addClass(\"hidden-control\");\r\n $multiplicityInput.removeClass(\"hidden-control\");\r\n this.multiplicityField.ignore = false;\r\n this.shareField.ignore = true;\r\n }\r\n }\r\n else if ($elem.is($rateTypeInput)) {\r\n if (this.rateType.value === 1) {\r\n this.percentRateField.ignore = false;\r\n this.multiplicityField.ignore = true;\r\n this.fixedAmountField.ignore = true;\r\n this.shareField.ignore = true;\r\n this.rateDateField.ignore = true;\r\n this.debtSumField.ignore = false;\r\n this.ratePeriodTypeField.ignore = true;\r\n this.dateFutureAlertWorker.check(null);\r\n this.rateFutureAlertWorker.check(null);\r\n $percentRateInput.removeClass('hidden-control');\r\n $bankRateTypeInputDiv.addClass('hidden-control');\r\n $fixedAmountInput.addClass('hidden-control');\r\n $ratePeriodInput.addClass('hidden-control');\r\n $shareInput.addClass('hidden-control');\r\n $multiplicityInput.addClass('hidden-control');\r\n } else if (this.rateType.value === 2) {\r\n this.percentRateField.ignore = true;\r\n this.multiplicityField.ignore = true;\r\n this.fixedAmountField.ignore = false;\r\n this.shareField.ignore = true;\r\n this.rateDateField.ignore = true;\r\n this.ratePeriodTypeField.ignore = true;\r\n this.dateFutureAlertWorker.check(null);\r\n this.rateFutureAlertWorker.check(null);\r\n $percentRateInput.addClass('hidden-control');\r\n $bankRateTypeInputDiv.addClass('hidden-control');\r\n $fixedAmountInput.removeClass('hidden-control');\r\n $ratePeriodInput.addClass('hidden-control');\r\n $shareInput.addClass('hidden-control');\r\n $multiplicityInput.addClass('hidden-control');\r\n\r\n if (this.isLimitation) {\r\n this.debtSumField.ignore = false;\r\n } else {\r\n this.debtSumField.ignore = true;\r\n }\r\n\r\n } else if (this.rateType.value === 3) {\r\n this.percentRateField.ignore = true;\r\n this.fixedAmountField.ignore = true;\r\n this.debtSumField.ignore = false;\r\n this.ratePeriodTypeField.ignore = false;\r\n $percentRateInput.addClass('hidden-control');\r\n $fixedAmountInput.addClass('hidden-control');\r\n $bankRateTypeInputDiv.removeClass('hidden-control');\r\n $ratePeriodInput.removeClass('hidden-control');\r\n\r\n if (this.ratePeriodTypeField.getValue().value === 1\r\n || this.ratePeriodTypeField.getValue().value === 2) {\r\n this.dateFutureAlertWorker.check(period.dateTo.date);\r\n } else {\r\n this.dateFutureAlertWorker.check(null);\r\n }\r\n\r\n if (this.bankRateType.value === \"multiplicity\") {\r\n $shareInput.addClass('hidden-control');\r\n $multiplicityInput.removeClass('hidden-control');\r\n this.multiplicityField.ignore = false;\r\n this.shareField.ignore = true;\r\n } else {\r\n $multiplicityInput.addClass('hidden-control');\r\n $shareInput.removeClass('hidden-control');\r\n this.multiplicityField.ignore = true;\r\n this.shareField.ignore = false;\r\n }\r\n\r\n if (this.ratePeriodTypeField.getValue().value === 4) {\r\n $ratePeriodInput.addClass('show-date');\r\n $ratePeriodTypeInput.attr('kind', \"sharp-right\");\r\n this.rateDateField.ignore = false;\r\n this.rateFutureAlertWorker.check(this.rateDateField.getValue().date);\r\n } else {\r\n $ratePeriodInput.removeClass('show-date');\r\n $ratePeriodTypeInput.attr('kind', \"\");\r\n this.rateDateField.ignore = true;\r\n this.rateFutureAlertWorker.check(null);\r\n }\r\n }\r\n }\r\n else if ($elem.is($ratePeriodTypeInput)) {\r\n\r\n if (this.ratePeriodTypeField.getValue().value === 1\r\n || this.ratePeriodTypeField.getValue().value === 2) {\r\n this.dateFutureAlertWorker.check(period.dateTo.date);\r\n } else {\r\n this.dateFutureAlertWorker.check(null);\r\n }\r\n\r\n if (this.ratePeriodType.value === 4) {\r\n $ratePeriodInput.addClass('show-date');\r\n $ratePeriodTypeInput.attr('kind', \"sharp-right\");\r\n this.rateDateField.ignore = false;\r\n this.rateFutureAlertWorker.check(this.rateDateField.getValue().date);\r\n } else {\r\n $ratePeriodInput.removeClass('show-date');\r\n $ratePeriodTypeInput.attr('kind', \"\");\r\n this.rateDateField.ignore = true;\r\n this.rateFutureAlertWorker.check(null);\r\n }\r\n }\r\n else if ($elem.is($limitationCheckbox)) {\r\n if (this.isLimitation) {\r\n $limitationInputDiv.removeClass('hidden-control');\r\n if (this.limitationType.value === 1) {\r\n this.percentLimitationField.ignore = false;\r\n this.rubbleLimitationField.ignore = true;\r\n } else {\r\n this.percentLimitationField.ignore = true;\r\n this.rubbleLimitationField.ignore = false;\r\n }\r\n\r\n if (this.rateType && this.rateType.value === 2) {\r\n this.debtSumField.ignore = false;\r\n }\r\n } else {\r\n $limitationInputDiv.addClass('hidden-control');\r\n this.percentLimitationField.ignore = true;\r\n this.rubbleLimitationField.ignore = true;\r\n if (this.rateType && this.rateType.value === 2) {\r\n this.debtSumField.ignore = true;\r\n }\r\n }\r\n }\r\n else if ($elem.is($limitationInput)) {\r\n if (this.limitationType.value === 1) {\r\n $percentLimitationInput.removeClass('hidden-control');\r\n $rubbleLimitationInput.addClass('hidden-control');\r\n $limitationInputDiv.find('.error-text').html('Укажите процент от суммы долга');\r\n this.percentLimitationField.ignore = false;\r\n this.rubbleLimitationField.ignore = true;\r\n } else {\r\n $percentLimitationInput.addClass('hidden-control');\r\n $rubbleLimitationInput.removeClass('hidden-control');\r\n $limitationInputDiv.find('.error-text').html('Укажите фиксированную сумму');\r\n this.percentLimitationField.ignore = true;\r\n this.rubbleLimitationField.ignore = false;\r\n }\r\n }\r\n else if(sender && (sender.id === \"dateFrom\" || sender.id === \"dateTo\")) {\r\n\r\n if (sender.id === \"dateFrom\") {\r\n this.dateFromAlertWorker.check(period.dateFrom.date);\r\n } else if (sender.id === \"dateTo\") {\r\n if (this.rateType?.value === 3) {\r\n if (this.ratePeriodTypeField.getValue().value === 1\r\n || this.ratePeriodTypeField.getValue().value === 2) {\r\n this.dateFutureAlertWorker.check(period.dateTo.date);\r\n } else {\r\n this.dateFutureAlertWorker.check(null);\r\n }\r\n \r\n if (this.ratePeriodTypeField.getValue().value === 4) {\r\n this.rateFutureAlertWorker.check(this.rateDateField.getValue().date);\r\n } else {\r\n this.rateFutureAlertWorker.check(null);\r\n }\r\n }\r\n else {\r\n this.dateFutureAlertWorker.check(null);\r\n this.rateFutureAlertWorker.check(null);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.decreaseIncreaseGroups.length; i++) {\r\n let group = this.decreaseIncreaseGroups[i];\r\n if (group.isIncrease) {\r\n let date = group.dateField.getValue(true).date;\r\n group.alertWorker.check(date);\r\n }\r\n }\r\n }\r\n else if (sender && sender.id === \"rateDate\") {\r\n this.rateFutureAlertWorker.check(this.rateDateField.getValue().date);\r\n }\r\n }\r\n\r\n calculateDetalization(mainPeriod, decreaseIncreaseGroups, debtSum, isMainDetalization = false) {\r\n function getPeriodDates(mainPeriod, ratesObj, applyRates, applyYears) {\r\n var dateFrom = mainPeriod.dateFrom.copy();\r\n var dateTo = mainPeriod.dateTo.copy();\r\n var dates = [dateFrom, dateTo.copy().inc()];\r\n\r\n if (applyRates) {\r\n const rates = ratesObj.rates_395;\r\n\r\n for (let i = rates.length - 1; i >= 0; i--) {\r\n let date = new DatePoint(rates[i].date);\r\n if (!date.goesBefore(dateFrom) && !dateTo.goesBefore(date)) {\r\n dates.push(date);\r\n }\r\n }\r\n }\r\n\r\n if (applyYears) {\r\n for (var i = dateFrom.date.getFullYear(); i < dateTo.date.getFullYear(); i++) {\r\n var year = i + 1;\r\n var date = new DatePoint('01.01.' + year);\r\n dates.push(date);\r\n }\r\n }\r\n\r\n return dates;\r\n }\r\n\r\n function getDaysInYear(date) {\r\n return date.fixDayMonthYear(1, 1).distanceTo(date.fixDayMonthYear(31, 12));\r\n }\r\n\r\n function getRate(date, ratesObj) {\r\n const rates = ratesObj.rates_395;\r\n for (let i = rates.length - 1; i >= 0; i--) {\r\n if (!date.goesBefore(rates[i].date)) {\r\n if (new DatePoint(rates[i].date).isEqualTo(new DatePoint('01.06.2015'))) {\r\n break;\r\n }\r\n\r\n return rates[i].rate;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n function fixPeriod(dateFrom, dateTo) {\r\n const subtractionPeriodsDays = self.subtractionPeriods.map(function (sub) {\r\n return sub.period.dateFrom.distanceTo(sub.period.dateTo);\r\n }).reduce(function (a, b) { \r\n return a + b; \r\n }, 0);\r\n const result_ = dateFrom.getSpan(dateTo);\r\n result_.duration = result_.getPeriodDuration(subtractionPeriodsDays);\r\n\r\n return result_;\r\n }\r\n\r\n let self = this;\r\n let detalization = [];\r\n let applyRates = this.rateType.value === 3 && this.ratePeriodType.value === 1;\r\n let dates = getPeriodDates(mainPeriod, this.ratesObj, applyRates, this.applyYears);\r\n var uniqueDecreaseIncreaseDates = [];\r\n decreaseIncreaseGroups.forEach((group) => {\r\n let date = null;\r\n if (group.isExcessType) {\r\n if (group.date.goesBefore(mainPeriod.dateFrom)) {\r\n date = group.date = mainPeriod.dateFrom.copy().dec();\r\n } else {\r\n date = group.date;\r\n }\r\n } else {\r\n date = group.dateField.getValue();\r\n }\r\n if (uniqueDecreaseIncreaseDates.indexOf(date) < 0) {\r\n uniqueDecreaseIncreaseDates.push(date);\r\n dates.push(date.inc());\r\n }\r\n });\r\n dates = distinctDates(dates);\r\n dates.sort(function (a, b) {\r\n return (a.goesBefore(b) ? -1 : 1);\r\n });\r\n\r\n this.subtractionPeriods = (this.subtractionPeriods || []).sort((a, b) => a.period.dateFrom.goesBefore(b.period.dateFrom) ? -1 : 1);\r\n this.hasSubtractionPeriods = this.subtractionPeriods.length > 0;\r\n\r\n function splitSubtractionPeriods() {\r\n if (!uniqueDecreaseIncreaseDates.length) {\r\n return self.subtractionPeriods.map(x => x.period);\r\n }\r\n\r\n const result = [];\r\n self.subtractionPeriods.forEach((sub) => {\r\n if (!sub.period.dateFrom.goesBefore(mainPeriod.dateFrom)){\r\n const filteredDates = distinctDates(uniqueDecreaseIncreaseDates.filter(x => !x.copy().dec().goesBefore(sub.period.dateFrom) && !sub.period.dateTo.goesBefore(x)));\r\n const subDates = [sub.period.dateFrom, ...filteredDates, sub.period.dateTo];\r\n subDates.forEach((_subDate, i, arr) => {\r\n if (i === arr.length - 1) {\r\n return;\r\n }\r\n result.push({\r\n dateFrom: arr[i].copy(),\r\n dateTo: arr[i + 2] ? arr[i + 1].copy().dec() : arr[i + 1].copy(),\r\n includeEnd: sub.period.includeEnd,\r\n name: sub.period.name,\r\n });\r\n });\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n let finalSubtractionPeriods = splitSubtractionPeriods();\r\n finalSubtractionPeriods = finalSubtractionPeriods.filter(sub => !sub.dateFrom.goesBefore(mainPeriod.dateFrom) && !sub.dateTo.goesBefore(mainPeriod.dateFrom));\r\n let loanSumDynamic = debtSum;\r\n let debtSumDynamic = debtSum;\r\n let totalPenalty = 0;\r\n const exceedingDecreases = [];\r\n let decreaseComment = '';\r\n let dtFrom = dates.shift();\r\n let dtTo = dtFrom.copy().dec();\r\n if (isMainDetalization) {\r\n decreaseIncreaseGroups.forEach((group) => {\r\n var date = group.dateField.getValue();\r\n var sum = group.sumField.getValue();\r\n if (dtTo.isEqualTo(date) && group.isIncrease) {\r\n group.isActive = true;\r\n loanSumDynamic = tools.roundNumber(loanSumDynamic + sum, 2);\r\n debtSumDynamic = debtSumDynamic <= 0 ? loanSumDynamic : tools.roundNumber(debtSumDynamic + sum, 2);\r\n detalization.push({\r\n loanSum: loanSumDynamic,\r\n date: dtTo.toLocaleFormat(),\r\n year: dtTo.date.getFullYear(),\r\n daysInYear: getDaysInYear(dtTo),\r\n isIncrease: true,\r\n value: sum,\r\n type: \"increase\",\r\n comment: group.comment,\r\n });\r\n }\r\n });\r\n }\r\n \r\n decreaseIncreaseGroups.forEach((group) => {\r\n let date = !group.isExcessType ? group.dateField.getValue() : group.date.copy().dec();\r\n let sum = !group.isExcessType ? group.sumField.getValue() : group.sum;\r\n if (dtTo.isEqualTo(date) && !group.isIncrease) {\r\n var newDebtSum = tools.roundNumber(debtSumDynamic - sum, 2);\r\n if (sum > self.totalPenalty) {\r\n totalPenalty = 0;\r\n loanSumDynamic = newDebtSum;\r\n } else {\r\n totalPenalty -= sum;\r\n }\r\n decreaseComment = group.comment;\r\n detalization.push({\r\n loanSum: loanSumDynamic,\r\n date: dtTo.toLocaleFormat(),\r\n year: dtTo.date.getFullYear(),\r\n daysInYear: getDaysInYear(dtTo),\r\n isIncrease: false,\r\n value: sum,\r\n type: \"decrease\",\r\n comment: decreaseComment,\r\n });\r\n debtSumDynamic = newDebtSum;\r\n self.resultDateTo = dtTo;\r\n }\r\n });\r\n\r\n if (loanSumDynamic < 0) {\r\n const excessSum = 0 - loanSumDynamic;\r\n detalization.push({\r\n value: excessSum,\r\n year: dtTo.date.getFullYear(),\r\n type: \"excess\"\r\n });\r\n exceedingDecreases.push({date: dtTo.copy(), sum: excessSum, comment: decreaseComment});\r\n }\r\n\r\n let ignoreLoanSum = this.rateType.value === 2 && !this.isLimitation;\r\n\r\n this.resultPeriod = fixPeriod(mainPeriod.dateFrom, mainPeriod.dateTo);\r\n\r\n this.resultPeriod.getDateSegments({\r\n keypoints: distinctDates(dates),\r\n subtract: finalSubtractionPeriods,\r\n }).forEach(function (segment) {\r\n const dtFrom = segment.span.dateFrom;\r\n const dtTo = segment.span.dateTo;\r\n const daysInYear = getDaysInYear(dtFrom);\r\n if (segment.type === AddRowType) {\r\n if (loanSumDynamic > 0 || ignoreLoanSum) {\r\n const days = dtFrom.distanceTo(dtTo);\r\n let rate = 0;\r\n let penalty = 0;\r\n let multiplier = 0;\r\n if (self.rateType.value === 1) {\r\n rate = self.percentRateType.value === 2 ? (self.percentRate / daysInYear) : self.percentRate;\r\n rate /= 100;\r\n penalty = tools.roundNumber(loanSumDynamic * rate * days, 2);\r\n } else if (self.rateType.value === 2) {\r\n rate = self.fixedAmount;\r\n penalty = tools.roundNumber(rate * days, 2)\r\n } else if (self.rateType.value === 3) {\r\n let rateDate = null;\r\n switch (self.ratePeriodType.value) {\r\n case 1:\r\n rateDate = dtFrom;\r\n break;\r\n case 2:\r\n rateDate = mainPeriod.dateTo;\r\n break;\r\n case 3:\r\n rateDate = self.todayDate;\r\n break;\r\n case 4:\r\n rateDate = self.rateDate;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n rate = getRate(rateDate, self.ratesObj) / 100;\r\n multiplier = self.bankRateType.value === \"multiplicity\"\r\n ? self.multiplicity * rate / daysInYear\r\n : self.share.value * rate;\r\n penalty = tools.roundNumber(loanSumDynamic * multiplier * days, 2);\r\n self.bankRate = rate;\r\n self.bankRateRender = rate * 100;\r\n }\r\n\r\n let segmentSpan = dtFrom.getSpan(dtTo);\r\n debtSumDynamic = tools.roundNumber(debtSumDynamic + penalty, 2);\r\n totalPenalty += penalty;\r\n\r\n if (isMainDetalization) {\r\n self.totalDuration += days;\r\n self.resultSpans.push(segmentSpan);\r\n self.resultDateTo = dtTo;\r\n }\r\n\r\n detalization.push({\r\n year: dtFrom.date.getFullYear(),\r\n daysInYear: daysInYear,\r\n span: segmentSpan,\r\n days: days,\r\n rate: rate * 100,\r\n loanSum: loanSumDynamic,\r\n penalty: penalty,\r\n totalPenalty: totalPenalty,\r\n debtSum: debtSumDynamic,\r\n type: AddRowType,\r\n });\r\n }\r\n } else {\r\n if (loanSumDynamic > 0) {\r\n detalization.push({\r\n name: segment.instance.name, \r\n year: segment.instance.dateFrom.date.getFullYear(),\r\n daysInYear: getDaysInYear(segment.instance.dateFrom),\r\n span: segment.span,\r\n type: segment.type,\r\n period: segment.span.toLocaleFormat(),\r\n comment: `Исключаемый период (${segment.span.getPeriodDuration().inDays} дн.)`,\r\n });\r\n }\r\n } \r\n \r\n if (isMainDetalization) {\r\n decreaseIncreaseGroups.forEach((group) => {\r\n var date = group.dateField.getValue();\r\n var sum = group.sumField.getValue();\r\n if (dtTo.isEqualTo(date) && group.isIncrease) {\r\n if (dates.length > 1) {\r\n group.isActive = true;\r\n }\r\n loanSumDynamic = tools.roundNumber(loanSumDynamic + sum, 2);\r\n detalization.push({\r\n loanSum: loanSumDynamic,\r\n date: dtTo.toLocaleFormat(),\r\n year: dtTo.date.getFullYear(),\r\n daysInYear: daysInYear,\r\n isIncrease: true,\r\n value: sum,\r\n type: IncreaseRowType,\r\n comment: group.comment,\r\n });\r\n debtSumDynamic = tools.roundNumber(debtSumDynamic + sum, 2);\r\n ignoreLoanSum = false;\r\n }\r\n });\r\n }\r\n\r\n decreaseIncreaseGroups.forEach((group) => {\r\n let date = !group.isExcessType ? group.dateField.getValue() : group.date.copy().dec();\r\n let sum = !group.isExcessType ? group.sumField.getValue() : group.sum;\r\n if (segment.span.dateTo.isEqualTo(date) && !group.isIncrease) {\r\n decreaseComment = group.comment;\r\n loanSumDynamic = tools.roundNumber(loanSumDynamic - sum, 2);\r\n detalization.push({\r\n loanSum: loanSumDynamic,\r\n date: dtTo.toLocaleFormat(),\r\n year: dtTo.date.getFullYear(),\r\n daysInYear: daysInYear,\r\n isIncrease: false,\r\n value: sum,\r\n type: DecreaseRowType,\r\n comment: decreaseComment,\r\n });\r\n debtSumDynamic = tools.roundNumber(debtSumDynamic - sum, 2);\r\n ignoreLoanSum = false;\r\n }\r\n });\r\n\r\n var lastSegment = detalization[detalization.length - 1];\r\n if ((loanSumDynamic <= 0) && (lastSegment && lastSegment.type !== ExcessRowType) && !ignoreLoanSum) {\r\n if (loanSumDynamic < 0) {\r\n const excessSum = 0 - loanSumDynamic;\r\n detalization.push({\r\n value: excessSum,\r\n type: ExcessRowType,\r\n year: lastSegment.year\r\n });\r\n exceedingDecreases.push({date: dtTo.copy(), sum: excessSum, comment: decreaseComment});\r\n }\r\n if (isMainDetalization && self.resultSpans.length !== 0) {\r\n self.resultSpans.push({ type: ExcessRowType, dateTo: dtTo });\r\n }\r\n }\r\n });\r\n\r\n if (isMainDetalization) {\r\n this.totalDebt = debtSumDynamic;\r\n this.resultPeriodString = `${(!this.hasSubtractionPeriods ? ` (${this.totalDuration} дн.)` : '')}`;\r\n this.resultPeriodDurationString = this.hasSubtractionPeriods ? `(${tools.verboseCountingValue(this.totalDuration, [['день', 'дня', 'дней']])} с учётом исключаемых периодов)` : '';\r\n this.finalLoanSum = loanSumDynamic;\r\n\r\n if (loanSumDynamic <= 0 && !ignoreLoanSum) {\r\n self.isClosure = true;\r\n self.isEarlyClosure = self.resultPeriod.dateTo.goesBefore(self.mainPeriod.dateTo);\r\n self.debtClosureHasExcess = loanSumDynamic < 0;\r\n if (self.debtClosureHasExcess) {\r\n self.excessSum = 0 - loanSumDynamic;\r\n }\r\n self.totalDebt = 0;\r\n }\r\n\r\n this.totalPenalty = totalPenalty;\r\n }\r\n\r\n detalization.totalPenalty = totalPenalty;\r\n detalization.exceedingDecreases = exceedingDecreases;\r\n\r\n return detalization;\r\n }\r\n\r\n calculate(params) {\r\n if (params.autoValidation) {\r\n return false;\r\n }\r\n let self = this;\r\n this.resultSpans = [];\r\n this.totalPenalty = 0;\r\n this.totalDebt = 0;\r\n this.totalDuration = 0;\r\n this.bankRate = 0;\r\n this.resultDateTo = this.mainPeriod.dateTo;\r\n this.isClosure = false;\r\n this.isEarlyClosure = false;\r\n this.debtClosureHasExcess = false;\r\n this.excessSum = 0;\r\n this.applyYears = (this.rateType.value === 1 && this.percentRateType.value === 2) || (this.rateType.value === 3 && this.bankRateType.value === \"multiplicity\");\r\n let fullDebtSum = this.debtSumField.getValue() || 0;\r\n this.mainPeriodString = this.mainPeriod.dateFrom.toString() + \" – \" + this.mainPeriod.dateTo.toString() + \" (\" + tools.verboseCountingValue(this.mainPeriod.dateFrom.distanceTo(this.mainPeriod.dateTo), [['день', 'дня', 'дней']]) + \")\";\r\n this.detalization = this.calculateDetalization(this.mainPeriod, this.decreaseIncreaseGroups, fullDebtSum, true);\r\n let decreaseGroups = [];\r\n let increaseGroups = [];\r\n this.decreaseIncreaseGroups.forEach((group) => {\r\n if (group.isIncrease) {\r\n increaseGroups.push(group);\r\n } else {\r\n decreaseGroups.push(group);\r\n }\r\n });\r\n\r\n let limitPenalty = this.limitationType.value === 1 ? 0 : this.rubbleLimitation;\r\n this.extraDetalizations = [];\r\n if (increaseGroups.length > 0 && this.rateType.value !== 2) {\r\n let detalization = this.calculateDetalization(this.mainPeriod, decreaseGroups, fullDebtSum, false);\r\n let detalizationDate = this.mainPeriod.dateFrom.toLocaleFormat();\r\n self.extraDetalizations.push({ detalization: detalization, debtSum: fullDebtSum, date: detalizationDate });\r\n\r\n if (this.isLimitation && this.limitationType.value === 1) {\r\n let limit = (fullDebtSum * this.percentLimitation / 100);\r\n limitPenalty = limit > detalization.totalPenalty ? detalization.totalPenalty : limit\r\n }\r\n\r\n let excess = 0;\r\n if (detalization[detalization.length - 1].type === 'excess') {\r\n excess += detalization[detalization.length - 1].value;\r\n }\r\n\r\n let exceedingDecreases = detalization.exceedingDecreases;\r\n increaseGroups.forEach((group) => {\r\n if (group.isActive && !group.dateField.getValue().isEqualTo(self.mainPeriod.dateTo)) {\r\n let partialPeriod = {};\r\n partialPeriod.dateFrom = group.dateField.getValue().copy().inc();\r\n partialPeriod.dateTo = self.mainPeriod.dateTo;\r\n let excessDecreaseGroups = [];\r\n if (exceedingDecreases.length > 0) {\r\n for (let i = 0; i < exceedingDecreases.length; i++){\r\n excessDecreaseGroups.push({\r\n date: exceedingDecreases[i].date,\r\n sum: i > 0 ? exceedingDecreases[i].sum - exceedingDecreases[i - 1].sum : exceedingDecreases[i].sum,\r\n comment: exceedingDecreases[i].comment,\r\n isIncrease: false,\r\n isExcessType: true\r\n });\r\n }\r\n }\r\n let detalization = self.calculateDetalization(partialPeriod, excessDecreaseGroups, group.sumField.getValue(), false);\r\n let detalizationDebtSum = group.sumField.getValue();\r\n detalizationDate = group.dateField.getValue().copy().toLocaleFormat();\r\n self.extraDetalizations.push({ detalization: detalization, debtSum: detalizationDebtSum, date: detalizationDate});\r\n if (this.isLimitation && this.limitationType.value === 1) {\r\n let limit = (detalizationDebtSum * self.percentLimitation / 100);\r\n let limitVal = limit > detalization.totalPenalty ? detalization.totalPenalty : limit\r\n limitPenalty += limitVal;\r\n }\r\n exceedingDecreases = detalization.exceedingDecreases;\r\n }\r\n });\r\n\r\n if (this.isLimitation && this.totalPenalty > limitPenalty) {\r\n self.totalPenalty = limitPenalty;\r\n if (!self.isClosure && self.finalLoanSum + limitPenalty > 0) {\r\n self.totalDebt = self.finalLoanSum + limitPenalty;\r\n }\r\n }\r\n } else {\r\n if (this.isLimitation) {\r\n limitPenalty = this.limitationType.value === 1\r\n ? (this.debtSum * this.percentLimitation / 100)\r\n : this.rubbleLimitation;\r\n if (this.totalPenalty > limitPenalty) {\r\n self.totalPenalty = limitPenalty;\r\n if (!self.isClosure && self.finalLoanSum + limitPenalty > 0) {\r\n self.totalDebt = self.finalLoanSum + limitPenalty;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.groupedDetalization = [];\r\n let arr = [];\r\n for (let i = 0; i < this.detalization.length; i++) {\r\n if (self.applyYears && i !== 0 && this.detalization[i - 1].year !== this.detalization[i].year) {\r\n this.groupedDetalization.push(arr.slice());\r\n arr = [];\r\n }\r\n arr.push(this.detalization[i]);\r\n }\r\n this.groupedDetalization.push(arr.slice());\r\n\r\n return true;\r\n }\r\n\r\n beforeRender() {\r\n $('.total-debt').prop('title', tools.verboseNumber(this.totalDebt));\r\n $('.total-penalty').prop('title', tools.verboseNumber(this.totalPenalty));\r\n\r\n this.futureAlertState = {\r\n cn: \"first-holiday-unchanged\",\r\n valid: true,\r\n printOnly: false\r\n };\r\n\r\n if (this.dateFromAlertWorker.getState() === 'accept') {\r\n this.futureAlertState.cn = \"first-holiday-changed\";\r\n } else if (this.dateFromAlertWorker.isVisible()) {\r\n this.futureAlertState.printOnly = true;\r\n } else if (this.dateFromAlertWorker.getState() !== 'closed') {\r\n this.futureAlertState.valid = false;\r\n }\r\n\r\n if (this.futureAlertState.valid) {\r\n this.dateFromAlertWorker.render(this.futureAlertState.printOnly);\r\n }\r\n\r\n this.increaseDateNotes = [];\r\n this.increaseDateNotesHtmlString = '';\r\n this.decreaseIncreaseGroups.forEach((group) => {\r\n if (group.isIncrease && (group.alertWorker.shown() || group.alertWorker.isAccepted())) {\r\n let $increaseDateAlert = group.alertWorker.getElem();\r\n if (group.alertWorker.isClosed()) {\r\n this.increaseDateNotes.push(tools.convertElemToTextWithLinksForExport($increaseDateAlert.find('.info-block-content').html()));\r\n this.increaseDateNotesHtmlString += '
' + $increaseDateAlert.find('.info-block-content').html() + '
';\r\n }\r\n else if (group.alertWorker.isAccepted()) {\r\n this.increaseDateNotes.push(tools.convertElemToTextWithLinksForExport($increaseDateAlert.find('.info-block-accept-content').html()));\r\n this.increaseDateNotesHtmlString += '
' + $increaseDateAlert.find('.info-block-accept-content').html() + '
';\r\n }\r\n else if (!group.alertWorker.isClosed()) {\r\n this.increaseDateNotes.push(tools.convertElemToTextWithLinksForExport($increaseDateAlert.find('.info-block-content').html()));\r\n this.increaseDateNotesHtmlString += '
' + $increaseDateAlert.find('.info-block-content').html() + '
';\r\n }\r\n }\r\n });\r\n\r\n $('#increaseDateNotes').html(this.increaseDateNotesHtmlString);\r\n\r\n if (this.extraDetalizations.length > 1 && this.rateType.value !== 2) {\r\n $('#extraDiv').removeClass('hidden-control');\r\n } else {\r\n $('#extraDiv').addClass('hidden-control');\r\n }\r\n\r\n this.ratePeriodInfo = \"\";\r\n if (this.ratePeriodType) {\r\n switch (this.ratePeriodType.value) {\r\n case 1:\r\n this.ratePeriodInfo = \"по периодам действия\";\r\n break;\r\n case 2:\r\n this.ratePeriodInfo = \"на \" + this.mainPeriod.dateTo.toString();\r\n break;\r\n case 3:\r\n this.ratePeriodInfo = \"на \" + this.todayDate.toString();\r\n break;\r\n case 4:\r\n this.ratePeriodInfo = \"на \" + this.rateDate.toString();\r\n break;\r\n }\r\n }\r\n\r\n this.formula = (this.rateType.value !== 2 ? \"сумма долга × \" : \"фиксированная сумма в день\")\r\n + (this.rateType.value === 1 ? \"процентная ставка\" : \"\")\r\n + (this.rateType.value === 3 ? (this.bankRateType.value === 'multiplicity' ? \"кратность\" : \"доля ставки\") + \" × ключевая ставка \" + this.ratePeriodInfo + (this.bankRateType.value === 'multiplicity' ? \" / число дней в году\" : \"\") : \"\")\r\n + \" × количество дней просрочки\"\r\n + (this.rateType.value === 1 && this.percentRateType.value === 1 ? \" / 100\" : \"\")\r\n + (this.rateType.value === 1 && this.percentRateType.value === 2 ? \" / (количество дней в году × 100)\" : \"\");\r\n\r\n this.rateInfo = (this.rateType.value === 1 ? \"Ставка по договору: \" + tools.getLocaleNumber(this.percentRate, { minPrecision: 0, maxPrecision: 4 }) + \"% \" + this.percentRateType.text : \"\")\r\n + (this.rateType.value === 2 ? \"Ставка в твёрдой денежной сумме в день: \" + tools.getLocaleSumInRubbles(this.fixedAmount) : \"\")\r\n + (this.rateType.value === 3 ? \"Ставка ЦБ РФ\" + (this.ratePeriodType.value === 1 ? \": \" : \" \") + this.ratePeriodInfo + (this.ratePeriodType.value !== 1 ? \": \" + tools.getLocaleSum(this.bankRateRender) + \"%\" : \"\") : \"\");\r\n\r\n $('.rate-info-render').html(this.rateInfo);\r\n $('#initialDebtSum').html(tools.getLocaleSumInRubbles(this.debtSumField.elem.val() ? this.debtSumField.elem.val() : 0));\r\n }\r\n\r\n hideResults() {\r\n super.hideResults();\r\n this.sendStatisticMessage('Is_Made_With_Error');\r\n }\r\n\r\n renderError() {\r\n super.renderError();\r\n this.sendStatisticMessage('Is_Made_With_Error');\r\n }\r\n\r\n\r\n decreaseIncreaseDateCheck(fields, options) {\r\n let result = {\r\n valid: true\r\n }\r\n\r\n let debtInfo = new Object();\r\n debtInfo.decreaseIncreaseGroups = [];\r\n debtInfo.hasDebtIncrease = false;\r\n debtInfo.hasDebtDecrease = false;\r\n\r\n let decreaseFields = fields.tree.debtDecrease || [];\r\n let increaseFields = fields.tree.debtIncrease || [];\r\n\r\n if (fields.length > 0) {\r\n\r\n let decreaseIncreaseGroups = [];\r\n if (increaseFields.length > 0) {\r\n increaseFields.forEach(function (field) {\r\n if (field.date) {\r\n let group = { dateField: field.date, sumField: field.sum, isIncrease: true, valid: true, comment: field.comment.getValue(), alertWorker: field.increaseDateAlertWorker };\r\n decreaseIncreaseGroups.push(group);\r\n if (group.dateField && group.sumField && group.dateField.valid && group.sumField.valid) {\r\n debtInfo.hasDebtIncrease = true;\r\n }\r\n } else {\r\n field.increaseDateAlertWorker.check(null);\r\n }\r\n });\r\n }\r\n\r\n if (decreaseFields.length > 0) {\r\n decreaseFields.forEach(function (field) {\r\n if (field.date) {\r\n let group = { dateField: field.date, sumField: field.sum, isIncrease: false, valid: true, comment: field.comment.getValue() };\r\n decreaseIncreaseGroups.push(group);\r\n if (group.dateField.valid && group.sumField.valid) {\r\n debtInfo.hasDebtDecrease = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n decreaseIncreaseGroups.sort(function (a, b) {\r\n return (a.dateField && a.dateField.getValue().goesBefore(b.dateField.getValue()) ? -1 : 1);\r\n });\r\n\r\n decreaseIncreaseGroups.forEach(function (group, index) {\r\n let elem = group.dateField.elem;\r\n let $error = $(elem).closest(\"tr.dynamic-list-row\").find(\".dynamic-row-error\");\r\n\r\n $error.hide();\r\n if (group.dateField.valid) {\r\n elem.removeClass('err');\r\n }\r\n\r\n let date = group.dateField.getValue();\r\n if (options.parentPeriod.valid && group.dateField.valid) {\r\n if (date.goesBefore(options.parentPeriod.dateFrom) || options.parentPeriod.dateTo.goesBefore(date)) {\r\n elem.addClass('err');\r\n $error.html('Дата ' + (group.isIncrease ? 'увеличения долга' : 'частичной оплаты') + ' не может быть '\r\n + (options.parentPeriod.dateTo.goesBefore(date) ? 'позже' : 'раньше') + ' периода начисления неустойки.');\r\n $error.show();\r\n\r\n let sumElem = group.sumField.elem;\r\n let $sumError = $(sumElem).closest(\"tr.dynamic-list-row\").find(\".dynamic-row-error-sum\");\r\n $sumError.hide();\r\n\r\n result.valid = group.valid = false;\r\n }\r\n }\r\n\r\n debtInfo.decreaseIncreaseGroups.push(group);\r\n });\r\n } else {\r\n increaseFields.forEach(function (field) {\r\n field.increaseDateAlertWorker.check(null);\r\n });\r\n }\r\n\r\n result.artifacts = debtInfo;\r\n\r\n return result;\r\n }\r\n}\r\n\r\nclass ShareField extends Field {\r\n static keyName() { return 'share'; }\r\n getValue() {\r\n if (!Number.parseInt) {\r\n Number.parseInt = window.parseInt\r\n }\r\n\r\n var result = {};\r\n result.text = this.elem.val();\r\n result.value = undefined;\r\n result.isError = false;\r\n\r\n if (!result.text) {\r\n return null;\r\n } else if (result.text.indexOf('/') !== -1) {\r\n var array = result.text.split('/');\r\n var divident = parseInt(array[0], 10);\r\n var divider = array[1] !== '' ? parseInt(array[1], 10) : null;\r\n\r\n if (divider === null) {\r\n result.value = 1;\r\n result.text = divident.toString();\r\n } else {\r\n result.value = divident / divider;\r\n result.text = divident.toString() + '/' + divider.toString();\r\n }\r\n\r\n if (divident === 0) {\r\n return null;\r\n }\r\n\r\n if (!divident || !divider || divident >= divider) {\r\n result.isError = true;\r\n }\r\n } else if ((result.text.indexOf('.') !== -1 || result.text.indexOf(',') !== -1) && result.text.indexOf('%') === -1) {\r\n var floatNum = tools.parseLocaleFloat(result.text);\r\n\r\n result.value = floatNum;\r\n result.text = tools.getLocaleNumber(floatNum).toString();\r\n\r\n if (result.value === undefined || result.value >= 1.0) {\r\n result.isError = true;\r\n }\r\n } else {\r\n result.value = parseInt(result.text, 10);\r\n result.text = result.value.toString();\r\n\r\n if (result.value === 0) {\r\n return null;\r\n }\r\n else {\r\n result.isError = true;\r\n }\r\n }\r\n this.elem.val(result.text);\r\n\r\n return result;\r\n }\r\n getClearValue() { return this.getValue() ? this.getValue().text : null; }\r\n setValue(v) { this.elem.val(v); }\r\n init() {\r\n $.fn.shareFilter = function () {\r\n return this.on(\"input keydown keyup mousedown mouseup select contextmenu drop\", function (e) {\r\n var simpleVal = this.value.replace(/[^0-9\\/]/g, '')\r\n .replace(/^0+/, '0'); // remove leading zeros\r\n\r\n if (simpleVal[0] === '/') {\r\n simpleVal = '1' + simpleVal;\r\n } else if (simpleVal.length === 1 && e.keyCode && e.keyCode !== 8 ) {\r\n simpleVal = simpleVal + '/';\r\n }\r\n\r\n var lastSymbol = simpleVal.slice(-1);\r\n var croppedVal = simpleVal.slice(0, -1);\r\n\r\n if (lastSymbol === '/' && croppedVal.indexOf('/') !== -1) {\r\n simpleVal = croppedVal;\r\n }\r\n\r\n this.value = simpleVal;\r\n });\r\n };\r\n\r\n this.elem.focusin(function () {\r\n var $field = $(this).closest('div.field-div');\r\n this.classList.remove('err');\r\n $field.find(\".error-text\").hide();\r\n $field.find(\"input\").shareFilter();\r\n });\r\n }\r\n}\r\n\r\n$(function () {\r\n var calc = new NPDCalculator();\r\n});","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","const __fetch = require(\"isomorphic-fetch\");\r\n\r\nexport const polyFetch = (...args) => {\r\n return __fetch(...args);\r\n};\r\n\r\nexport const buildApi = (generator) => {\r\n function sendRequest({host = \"/\", method, path, params, headers = {}, body, json, _blob}) {\r\n const url = `${host}${path}`;\r\n const search = new URLSearchParams(params).toString();\r\n return polyFetch(url + \"?\" + search, {method, headers, body, _blob}).then(res => {\r\n if (res.ok) return json ? res.json() : Promise.resolve(res);\r\n console.error(res);\r\n return Promise.reject(res);\r\n });\r\n }\r\n const get = props => sendRequest({method: \"GET\", ...props});\r\n const post = props => sendRequest({method: \"POST\", ...props});\r\n return generator({get, post});\r\n};\r\n\r\nexport const loadResource = (url) => {\r\n const result = {\r\n loading: true,\r\n loaded: false,\r\n content: null,\r\n promise: null\r\n };\r\n result.promise = polyFetch(url).then(resp => /.*[.]json(\\?.+)?$/.test(url) ? resp.json() : resp.arrayBuffer()).then(res => {\r\n result.content = res;\r\n result.loaded = true;\r\n result.loading = false;\r\n return res;\r\n });\r\n return result;\r\n};","import { Field } from './basic_fields.js';\r\nimport { getDate, DateSpan, DatePoint, holidayChecker } from '../js/datelib.js';\r\n\r\nif ([].find === undefined) {\r\n Array.prototype.find = function (callback) {\r\n let result = undefined;\r\n this.some(function (v, index) {\r\n if (callback(v)) {\r\n result = v;\r\n return true;\r\n }\r\n });\r\n return result;\r\n };\r\n}\r\n\r\nclass DateField extends Field {\r\n constructor(selectorOrElem, options) {\r\n super(selectorOrElem, options);\r\n\r\n if (this.elem[0].tagName === 'DATE-PICKER')\r\n this.elem[0].holidayChecker = holidayChecker;\r\n }\r\n static keyName() { return 'date'; }\r\n getValue(silent) {return new DatePoint(this.elem[0].value, true) }\r\n getClearValue() { return this.elem.val(); }\r\n getExportValue() { return this.elem.val(); }\r\n setValue(v) { this.elem.val(v); }\r\n onChange(f) {\r\n let self = this;\r\n this.elem.change(e => f(self.elem[0]));\r\n }\r\n\r\n static detect(elem) {\r\n return elem[0].tagName === 'DATE-PICKER';\r\n }\r\n\r\n reset(params) {\r\n params = params || {};\r\n if (!params.keepValue) {\r\n this.elem[0].reset(this.defaultValue);\r\n }\r\n if (!params.keepErrors) {\r\n this.clearErrors();\r\n }\r\n }\r\n\r\n isFilled(){\r\n return this.getClearValue() !== this.defaultValue; \r\n }\r\n}\r\n\r\n\r\nclass DateIntervalField extends DateField {\r\n /**\r\n * @param {any} options :\r\n * limitMax (boolean) - invalidates dateFields according to max-year attribute\r\n */\r\n constructor(selectorOrElem, options) {\r\n super(selectorOrElem, options);\r\n\r\n if (this.elemFrom[0].tagName === 'DATE-PICKER')\r\n this.elemFrom[0].holidayChecker = holidayChecker;\r\n if (this.elemTo[0].tagName === 'DATE-PICKER')\r\n this.elemTo[0].holidayChecker = holidayChecker;\r\n }\r\n static keyName() { return 'date-interval'; }\r\n getValue(silent) {\r\n let nameVal = (this.nameElem.length > 0 ? tools.removeExtraSpace(this.nameElem.val()) : undefined);\r\n if (nameVal !== undefined && (!this.options || !this.options.raw)) {\r\n nameVal = tools.escapeTags(nameVal);\r\n }\r\n return {\r\n dateFrom: this._getDateFrom(silent),\r\n dateTo: this._getDateTo(silent),\r\n name: nameVal,\r\n includeEnd: this.includeEnd\r\n };\r\n }\r\n getClearValue() {\r\n return this.elemFrom.val() + '+' + this.elemTo.val();\r\n }\r\n getExportValue() {\r\n return { dateFrom: this.elemFrom.val(), dateTo: this.elemTo.val() };\r\n }\r\n setValue(v) {\r\n let pair = v.split('+');\r\n this.elemFrom.val(pair[0]);\r\n this.elemTo.val(pair[1]);\r\n }\r\n init() {\r\n this.elemFrom = this.elem.find('#dateFrom, date-picker.input-from');\r\n this.elemTo = this.elem.find('#dateTo, date-picker.input-to');\r\n this.nameElem = this.elem.find('.dynamic-list-comment input');\r\n\r\n this.errorPeriodElem = this.elem.find(\"#datePeriodErr, .period-error\");\r\n this.errorFromElem = this.elem.find(\"#dateFromErr, .from-error\");\r\n this.errorToElem = this.elem.find(\"#dateToErr, .to-error\");\r\n this.errorFromBound= this.elem.find(\"#dateFromBoundErr, .from-bound-err\");\r\n this.errorToBound = this.elem.find(\"#dateToBoundErr, .to-bound-err\");\r\n this.errorFromBoundMax= this.elem.find(\"#dateFromBoundErrMax, .from-bound-err-max\");\r\n this.errorToBoundMax = this.elem.find(\"#dateToBoundErrMax, .to-bound-err-max\");\r\n \r\n this.includeEnd = {};\r\n }\r\n\r\n _getDateFix(name) {\r\n let includeEndDate = true;\r\n this.options = this.options || [];\r\n if (this.options.include && this.options.include[name] !== undefined) {\r\n let includeEnd = this.options.include[name];\r\n if (typeof (includeEnd) === \"function\")\r\n includeEndDate = includeEnd(this);\r\n else\r\n includeEndDate = includeEnd;\r\n }\r\n this.includeEnd[name] = includeEndDate;\r\n return includeEndDate ? 0 : (name === 'to' ? -1 : 1);\r\n }\r\n\r\n _getDateFrom(silent) {\r\n let res = new DatePoint(this.elemFrom[0].value, true);\r\n return res.valid ? res.inc(silent ? 0 : this._getDateFix('from')) : res;\r\n }\r\n\r\n _getDateTo(silent) {\r\n let res = new DatePoint(this.elemTo[0].value, true);\r\n return res.valid ? res.inc(silent ? 0 : this._getDateFix('to')) : res;\r\n }\r\n\r\n resetErrors(binaryMap) {\r\n if (binaryMap === undefined) {\r\n binaryMap = 3;\r\n this.elem.find('.period-outside-error').hide();\r\n this.elem.find('.period-intersection-error').hide();\r\n }\r\n\r\n if (this.errorPeriodElem.is(\":visible\")) {\r\n this.errorPeriodElem.hide();\r\n this.elemFrom.removeClass('err');\r\n this.elemTo.removeClass('err');\r\n }\r\n\r\n if (binaryMap & 1) {\r\n this.errorFromElem.hide();\r\n this.errorFromBound.hide();\r\n this.errorFromBoundMax.hide();\r\n this.elemFrom.removeClass('err');\r\n }\r\n if (binaryMap & 2) {\r\n this.errorToElem.hide();\r\n this.errorToBound.hide();\r\n this.errorToBoundMax.hide();\r\n this.elemTo.removeClass('err');\r\n }\r\n }\r\n\r\n reset(params) {\r\n params = params || {};\r\n if (!params.keepValue) {\r\n this.elemFrom[0].reset()\r\n this.elemTo[0].reset();\r\n }\r\n if (!params.keepErrors) {\r\n this.resetErrors();\r\n }\r\n }\r\n\r\n check(autoValidation, sender, phase) {\r\n if (phase > 1)\r\n return true;\r\n\r\n var self = this;\r\n this.dateFrom = this._getDateFrom();\r\n this.dateTo = this._getDateTo();\r\n \r\n function setPeriodError() {\r\n self.errorPeriodElem.show();\r\n self.elemFrom[0].classList.add('err');\r\n self.elemTo[0].classList.add('err');\r\n }\r\n\r\n\r\n function processBoundElem(elem, errorElem, hadError = false) {\r\n if (!autoValidation || hadError/* || sender === dateElem*/) {\r\n elem.classList.add('err');\r\n errorElem.show();\r\n } else if (sender === elem && elem.classList.contains('err')) { // Redo: unreacheable condition because of this.resetErrors(1) and (2) inside \"check\"\r\n errorElem.show();\r\n }\r\n }\r\n\r\n var render = true,\r\n result = true;\r\n this.filled = this.dateFrom.valid || this.dateTo.valid;\r\n var valid = {\r\n from: this.dateFrom.valid,\r\n to: this.dateTo.valid\r\n };\r\n this.span = undefined;\r\n\r\n if (render) {\r\n const hadFromError = this.elemFrom[0].classList.contains('err');\r\n const hadToError = this.elemTo[0].classList.contains('err');\r\n this.resetErrors(1);\r\n this.resetErrors(2);\r\n\r\n let maxYearFrom = this.options?.limitMax && this.elemFrom.attr(\"max-year\") ? this.elemFrom.attr(\"max-year\").length == 4 ? this.elemFrom.attr(\"max-year\") : new Date().getFullYear() + +this.elemFrom.attr(\"max-year\") : null;\r\n let maxYearTo = this.options?.limitMax && this.elemTo.attr(\"max-year\") ? this.elemTo.attr(\"max-year\").length == 4 ? this.elemTo.attr(\"max-year\") : new Date().getFullYear() + +this.elemTo.attr(\"max-year\") : null;\r\n \r\n if (!valid.from) processBoundElem(this.elemFrom[0], this.errorFromElem, hadFromError);\r\n else if(this._getDateFrom().goesBefore(new DatePoint(\"01.01.\"+this.elemFrom.attr(\"min-year\")))){\r\n valid.from = false;\r\n this.elemFrom[0].classList.add('err'); \r\n processBoundElem(this.elemFrom[0], this.errorFromBound);\r\n } else if(maxYearFrom && (new DatePoint(\"31.12.\"+maxYearFrom)).goesBefore(this._getDateFrom())){\r\n valid.from = false;\r\n this.elemFrom[0].classList.add('err'); \r\n processBoundElem(this.elemFrom[0], this.errorFromBoundMax);\r\n }\r\n\r\n if (!valid.to) processBoundElem(this.elemTo[0], this.errorToElem, hadToError);\r\n else if(this._getDateTo().goesBefore(new DatePoint(\"01.01.\"+this.elemTo.attr(\"min-year\")))){\r\n valid.to = false\r\n this.elemTo[0].classList.add('err');\r\n processBoundElem(this.elemTo[0], this.errorToBound);\r\n } else if(maxYearTo && (new DatePoint(\"31.12.\"+maxYearTo)).goesBefore(this._getDateTo())){\r\n valid.to = false\r\n this.elemTo[0].classList.add('err');\r\n processBoundElem(this.elemTo[0], this.errorToBoundMax);\r\n }\r\n\r\n if(!valid.from || !valid.to){\r\n result = false;\r\n }\r\n }\r\n \r\n if(valid.from && valid.to) {\r\n this.resetErrors(3);\r\n\r\n if (this.dateTo.goesBefore(this.dateFrom)) {\r\n result = false;\r\n if (render) setPeriodError();\r\n }else{\r\n this.span = new DateSpan(this.dateFrom, this.dateTo);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n onChange(f) {\r\n let self = this;\r\n this.elemFrom.change(e => f(self.elemFrom[0]));\r\n this.elemTo.change(e => f(self.elemTo[0]));\r\n }\r\n\r\n static detect(elem) {\r\n return elem.find('date-picker').length == 2;\r\n }\r\n}\r\n\r\nclass DateIntervalIgnoreEmptyField extends DateIntervalField{\r\n static keyName() { return 'date-interval-ignore'; }\r\n get ignore() { return !this.isFilled(); }\r\n}\r\n\r\n\r\n/**\r\n * Performs base date interval checks like intersections and out of the bounds.\r\n * How it works:\r\n * 1. If period is outside main period bounds, error will be shown\r\n * 2. If somewhere in period value was changed and it intersects with other period, error will be shown\r\n * 3. If intersection was found but reason is not editing some of periods, error will be shown in last period which intersects something.\r\n * 4. If no `outside` and `intersection` problems but all subtracting periods covers parent fully, `outside` error will be shown on active or last.\r\n * @param {any} fields list of fields\r\n * @param {any} options {parent: (field, optional)}\r\n */\r\nfunction baseDateIntervalCheck(fields, options) {\r\n let result = {\r\n valid: true\r\n }\r\n let parent = options !== undefined ? options.parent : undefined;\r\n\r\n if (fields.length > 0) {\r\n fields.sort(function (a, b) {\r\n return (a.dateFrom.goesBefore(b.dateFrom) ? -1 : 1);\r\n });\r\n\r\n function toggleErrorHighlight(period, show) {\r\n if (show) {\r\n period.elemFrom.addClass('err');\r\n period.elemTo.addClass('err');\r\n } else {\r\n period.elemFrom.removeClass('err');\r\n period.elemTo.removeClass('err');\r\n }\r\n }\r\n\r\n var leftDays = (parent && parent.valid ? parent.span.getDayCount() - fields.map(function (period) {\r\n return (period.valid ? period.span.getDayCount() : 0);\r\n }).reduce(function (a, b) { return a + b; }, 0) : 1);\r\n\r\n let info = fields.map(function (period, index) {\r\n let $elem = $(period.elem);\r\n\r\n $elem.find('.period-outside-error').hide();\r\n $elem.find('.period-intersection-error').hide();\r\n $elem.find('.period-outside-intersection-error').hide();\r\n $elem.find('.period-equality-error').hide();\r\n\r\n let bullet = {\r\n elem: $(period.elem),\r\n period: period,\r\n index: index,\r\n active: false,\r\n intersects: false,\r\n outside: false,\r\n equality: false,\r\n showError: function (className) {\r\n result.valid = this.period.valid = false;\r\n toggleErrorHighlight(this.period, true);\r\n this.elem.find(className).show();\r\n }\r\n };\r\n\r\n if (period.valid) {\r\n bullet.active = (options.sender === period.elemFrom[0] || options.sender === period.elemTo[0]);\r\n bullet.intersects = fields.some(function (p) {\r\n return p.span !== undefined && period != p && period.span.intersects(p.span);\r\n });\r\n bullet.outside = parent && parent.valid && (period.dateFrom.goesBefore(parent.dateFrom) || parent.dateTo.goesBefore(period.dateTo));\r\n bullet.equality = parent && parent.valid && (period.dateFrom.isEqualTo(parent.dateFrom) && parent.dateTo.isEqualTo(period.dateTo));\r\n }\r\n\r\n return bullet;\r\n });\r\n\r\n let active = info.find(b => b.active);\r\n\r\n // Check on leftDays only if no intersections was found.\r\n if (info.every(b => !b.intersects && !b.outside) && !leftDays) {\r\n if (active !== undefined)\r\n active.equality = true;\r\n else\r\n info.find(b => { return b.period.valid && info.every(x => !x.period.valid || x.index <= b.index); }).outside = true;\r\n\r\n info.forEach(b => { b.period.valid = false; });\r\n }\r\n\r\n // Show intersection error on last if there is no active period\r\n if (info.some(b => b.intersects) && (active == undefined || !active.intersects)) {\r\n if (active !== undefined)\r\n active.active = false;\r\n info.find(b => b.intersects && info.every(x => !x.intersects || x.index <= b.index)).active = true;\r\n }\r\n\r\n\r\n info.forEach(function (bullet) {\r\n if (bullet.intersects) {\r\n bullet.period.valid = false;\r\n if (bullet.active && bullet.outside) {\r\n bullet.showError('.period-outside-intersection-error');\r\n } else if (bullet.active) {\r\n bullet.showError('.period-intersection-error');\r\n } else if (bullet.outside) {\r\n bullet.showError('.period-outside-error');\r\n }\r\n } else if (bullet.equality) {\r\n bullet.showError('.period-equality-error');\r\n } else if (bullet.outside) {\r\n bullet.showError('.period-outside-error');\r\n }\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n\r\n\r\n\r\nconst fields = [DateField, DateIntervalField];\r\n\r\nexport { fields, DateIntervalField, DateField, baseDateIntervalCheck, DateIntervalIgnoreEmptyField };","/* eslint-disable no-prototype-builtins */\nvar g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {}\n\nvar support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nexport function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)\n var encoding = match ? match[1] : 'utf-8'\n reader.readAsText(blob, encoding)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._noBody = true;\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nexport function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n try {\n headers.append(key, value)\n } catch (error) {\n console.warn('Response ' + error.message)\n }\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nexport function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 200, statusText: ''})\n response.ok = false\n response.status = 0\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nexport var DOMException = g.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nexport function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name))\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value)\n }\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!g.fetch) {\n g.fetch = fetch\n g.Headers = Headers\n g.Request = Request\n g.Response = Response\n}\n","// the whatwg-fetch polyfill installs the fetch() function\n// on the global object (window or self)\n//\n// Return that as the export for use in Webpack, Browserify etc.\nrequire('whatwg-fetch');\nmodule.exports = self.fetch.bind(self);\n","var ShowErrorWay = {\r\n SHOW_ALL: 1,\r\n SHOW_FIRST: 2\r\n}\r\n\r\nexport { ShowErrorWay };","import { ShowErrorWay } from \"./calculator/utils.js\";\r\n\r\n\r\n/*\r\n * To define new field type create class which extends Field class\r\n */\r\nclass Field {\r\n constructor(selectorOrElem, options) {\r\n this.elem = $(selectorOrElem);\r\n this.options = options;\r\n this.defaultGetValue = options && 'defaultGetValue' in options ? options.defaultGetValue : null;\r\n this.init();\r\n this.valid = true;\r\n this.deleted = false;\r\n this.isDynamic = false;\r\n this._ignore = false;\r\n }\r\n\r\n // this method is required for matching type with class\r\n static keyName() { return ''; }\r\n\r\n getValue() { return undefined; }\r\n setValue(v) { }\r\n\r\n // this method is required for automatic calculation of defaultValue\r\n getClearValue() { return this.getValue(); }\r\n\r\n // this method is required for automatic export build\r\n getExportValue() { return this.getValue(); }\r\n\r\n // additional field setup\r\n init() { }\r\n\r\n // for silent check (send sender as argument of function f)\r\n onChange(f) {\r\n let self = this;\r\n this.elem.change(function (e) { f(self.elem[0]); });\r\n if (this.options && this.options.keyup) {\r\n this.elem.keyup(function (e) { f(self.elem[0]); });\r\n }\r\n return this.elem;\r\n }\r\n\r\n // allows showing reset button for ignored fields\r\n showReset() { return false; }\r\n\r\n // for auto detecting type\r\n static detect(elem) { return false; }\r\n\r\n errorIsVisible() { return this.elem.hasClass('err') || this.elem.find('.err').length > 0; }\r\n isFilled() { return this.getClearValue() !== this.defaultValue; }\r\n\r\n\r\n delete() {\r\n this.deleted = true;\r\n }\r\n\r\n get ignore() { return this._ignore; }\r\n set ignore(val) { this._ignore = val; }\r\n\r\n clearErrors() {\r\n const errClassElem = (this.params_.errClassElem === undefined ? this.elem : $(this.params_.errClassElem));\r\n errClassElem.removeClass('err');\r\n if (this.params_.errors !== undefined) {\r\n this.params_.errors.forEach(function (err) {\r\n if (err.errClassElem !== undefined)\r\n $(err.errClassElem).removeClass('err');\r\n $(err.selector).hide();\r\n });\r\n }\r\n }\r\n\r\n reset(params) {\r\n params = params || {};\r\n if (!params.keepValue) {\r\n this.setValue(this.defaultValue);\r\n }\r\n if (!params.keepErrors) {\r\n this.clearErrors();\r\n }\r\n }\r\n\r\n check(autoValidation, sender, phase, loud ) {\r\n if (phase < 2) {\r\n const silent = autoValidation && sender != this.elem[0] && !loud;\r\n const self = this.elem[0];\r\n let valid = true;\r\n if (this.params_.errors !== undefined) {\r\n const handler = (this.params_.showErrorWay == ShowErrorWay.SHOW_ALL ? 'forEach' : 'some');\r\n const v = this.getValue();\r\n const errClassElem = (this.params_.errClassElem === undefined ? this.elem : $(this.params_.errClassElem));\r\n if (!silent) this.clearErrors();\r\n this.params_.errors[handler](function (err) {\r\n if (!err.check(v, autoValidation)) {\r\n if (!silent) {\r\n $(err.selector).show();\r\n // fix for shadow DOM in ie\r\n if (window.document.documentMode && self.tagName == \"SUMMARY-INPUT\")\r\n $(err.selector).css('display', 'block');\r\n if (err.errClassElem !== undefined)\r\n $(err.errClassElem).addClass('err');\r\n else\r\n errClassElem.addClass('err');\r\n }\r\n valid = false;\r\n return true;\r\n }\r\n });\r\n }\r\n return valid;\r\n }\r\n return true;\r\n };\r\n}\r\n\r\n\r\nclass _BaseObjectField extends Field {\r\n getClearValue() { return tools.deepcopy(this.elem[0].value); }\r\n getValue() { return this.elem.val(); }\r\n setValue(v) { this.elem.val(v); }\r\n getExportValue() { return this.elem.val(); }\r\n isFilled() {\r\n const clearValue = this.getClearValue();\r\n for (const key in clearValue) {\r\n if (clearValue[key] !== this.defaultValue[key])\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n\r\nclass NumberField extends Field {\r\n static keyName() { return ''; }\r\n getClearValue() { return this.elem.val() === \"\" ? \"\" : this.getValue(); }\r\n setValue(v) { this.elem.val(v); }\r\n onChange(f) {\r\n let self = this;\r\n if (window.document.documentMode) {\r\n this.elem.blur(function (e) { f(self.elem[0]); });\r\n } else {\r\n this.elem.change(function (e) { f(self.elem[0]); });\r\n }\r\n if (this.options && this.options.keyup) {\r\n this.elem.keyup(function (e) { f(self.elem[0]); });\r\n }\r\n return this.elem;\r\n }\r\n setupNumberInput(isFloat, props, disableProps) {\r\n let self = this;\r\n disableProps = disableProps || [];\r\n if (this.options) {\r\n [\"maxVal\", \"minVal\", \"precision\"].forEach(function (name) {\r\n if (self.options[name] !== undefined) {\r\n if (disableProps.indexOf(name) >= 0) {\r\n console.error(`Prop ${name} is not allowed in field of type \"${self.keyName()}\"`);\r\n }\r\n else {\r\n props[name] = self.options[name];\r\n }\r\n }\r\n });\r\n }\r\n const $field = this.elem.closest('div.field-div');\r\n $field.find(\"input.base-input\").inputFilter(isFloat, props);\r\n this.elem.focusin(function () {\r\n this.classList.remove('err');\r\n $field.find(\".error-text\").hide();\r\n });\r\n }\r\n}\r\n\r\n\r\nclass CountField extends NumberField {\r\n static keyName() { return 'count'; }\r\n getValue() { return this.elem.val() ? tools.parseLocaleInt(this.elem.val()) : this.defaultGetValue; }\r\n init() { this.setupNumberInput(false, {}, ['precision']); }\r\n}\r\n\r\n\r\nclass YearField extends NumberField {\r\n static keyName() { return 'year'; }\r\n getValue() { return this.elem.val() ? tools.parseLocaleInt(this.elem.val()) : this.defaultGetValue; }\r\n init() { this.setupNumberInput(false, { allowSpaces: false, maxLength: 4 }, ['precision']); }\r\n}\r\n\r\n\r\nclass PeriodField extends NumberField {\r\n static keyName() { return 'period'; }\r\n getValue() { return this.elem.val() ? tools.parseLocaleInt(this.elem.val()) : this.defaultGetValue; }\r\n init() { this.setupNumberInput(false, { allowSpaces: false }, ['precision']); }\r\n}\r\n\r\n\r\nclass FloatField extends NumberField {\r\n static keyName() { return 'float'; }\r\n getValue() { return this.elem.val() ? tools.parseLocaleFloat(this.elem.val()) : this.defaultGetValue; }\r\n init() { this.setupNumberInput(true, {precision: 3}); }\r\n}\r\n\r\n\r\nclass MoneyField extends FloatField {\r\n static keyName() { return 'money'; }\r\n init() { this.setupNumberInput(true, {}, ['precision']); }\r\n}\r\n\r\n\r\nclass SelectField extends Field {\r\n static keyName() { return 'select'; }\r\n getValue() {\r\n return { value: this.elem[0].value, text: this.elem[0].itemText };\r\n }\r\n setValue(v) { this.elem.val(v); }\r\n init() {\r\n let self = this;\r\n this.elem.focusin(function () {\r\n var $field = $(this).closest('div.field-div');\r\n self.elem.removeClass('err');\r\n $field.find(\".error-text\").hide();\r\n });\r\n }\r\n onChange(f) {\r\n let self = this;\r\n return this.elem.change(function (e) { f(self.elem[0]); });\r\n }\r\n getClearValue() { return this.getValue().value; }\r\n getExportValue() { return this.getValue().text; }\r\n reset(params) {\r\n params = params || {};\r\n if (!params.keepValue) {\r\n this.elem[0].reset(this.defaultValue);\r\n }\r\n if (!params.keepErrors) {\r\n this.clearErrors();\r\n }\r\n }\r\n static detect(elem) {\r\n return elem[0].tagName === 'DROPDOWN-SELECT';\r\n }\r\n}\r\n\r\n\r\nclass RadioField extends Field {\r\n static keyName() { return 'radio'; }\r\n getValue() {\r\n var checkedElem = this.elem.find('input:checked');\r\n if (checkedElem.length > 0) {\r\n return { value: checkedElem[0].id, text: checkedElem.parent().find(\"label\").text() };\r\n }\r\n return undefined;\r\n }\r\n setValue(v) { this.elem.find('input#' + v).prop(\"checked\", true); }\r\n onChange(f) {\r\n let self = this;\r\n return this.elem.find('input').change(function (e) { f(self.elem[0]); });\r\n }\r\n getClearValue() { return this.getValue().value; }\r\n getExportValue() { return this.getValue().text; }\r\n static detect(elem) {\r\n return elem.find('.radio-elem').length > 0;\r\n }\r\n}\r\n\r\n\r\nclass CheckboxField extends Field {\r\n static keyName() { return 'checkbox'; }\r\n getValue() { return this.control.checked; }\r\n setValue(v) {this.control.checked = v; }\r\n init() {\r\n this.control = this.elem.find('input[type=\"checkbox\"]')[0];\r\n }\r\n onChange(f) {\r\n let self = this;\r\n return this.elem.find('input[type=\"checkbox\"]').change(function (e) {f(self.elem[0]); });\r\n }\r\n static detect(elem) {\r\n return elem.find('input[type=\"checkbox\"]').length == 1;\r\n }\r\n}\r\n\r\nclass TextField extends Field {\r\n static keyName() { return 'text'; }\r\n getClearValue() { return this.elem.val();}\r\n getValue() {\r\n const val = tools.removeExtraSpace(this.elem.val());\r\n return (this.options && this.options.raw ? val : tools.escapeTags(val));\r\n }\r\n setValue(v) { this.elem.val(v); }\r\n isFilled() { return false; }\r\n}\r\n\r\nclass LinkField extends Field {\r\n static keyName() { return 'link'; }\r\n getValue() {\r\n const selectedLink = this.elem.find('a.selected-link');\r\n if (selectedLink.length > 0) {\r\n return selectedLink.data(\"type\");\r\n }\r\n return undefined;\r\n }\r\n setValue(v) { this.elem.find(`a[data-type=\"${v}\"]`).addClass(\"selected-link\"); }\r\n init() {\r\n const self = this;\r\n this.elem.find('a').click(function (event) {\r\n event.preventDefault();\r\n self.elem.find('a').removeClass('selected-link');\r\n $(this).addClass('selected-link');\r\n return false;\r\n });\r\n }\r\n onChange(f) {\r\n let self = this;\r\n return this.elem.find('a').click(function (e) { f(self.elem[0]); });\r\n }\r\n getClearValue() { return this.getValue(); }\r\n getExportValue() { return this.getValue(); }\r\n reset(params) {\r\n this.elem.find('a').removeClass('selected-link');\r\n this.setValue(this.defaultGetValue);\r\n }\r\n static detect(elem) {\r\n return elem.find('a.selected-link').length > 0;\r\n }\r\n}\r\n\r\nconst fields = [MoneyField, FloatField, SelectField, RadioField, CountField, YearField, PeriodField, CheckboxField, TextField, LinkField];\r\n\r\nexport { fields, Field, _BaseObjectField, RadioField, TextField, FloatField };\r\n","import { CalculatorInterface } from \"./calc_interface.js\"\r\n\r\n\r\nexport class CalculatorComplex extends CalculatorInterface {\r\n /**\r\n * Scans document or node (if htmlNode is set)\r\n * @param {any} htmlNode - set if you need to scan fields inside specific node (useful for dynamic content)\r\n * @returns {Object} {inputs, outputs}\r\n */\r\n fetchFields(htmlNode) {\r\n const calc_ = this;\r\n if (htmlNode == undefined)\r\n htmlNode = document;\r\n const $node = $(htmlNode);\r\n\r\n function scopeEvalFunc(underscore, script) {\r\n return new Function(`\"use strict\"; const cc = this; const _ = cc[\"${underscore}\"]; return ${script};`).bind(calc_);\r\n }\r\n\r\n function parseNameType(text) {\r\n const parts = /^(\\[(.*?)\\])?([^\\[\\]\\:]+)(\\:(.+))?$/g.exec(text);\r\n if (parts === null) {\r\n throw new Error(`Incorrect format for cc:input value (\"${attr}\"). Must be \"name\" or \"[type]name\"`);\r\n }\r\n const paramString = parts[5];\r\n const options = (parts[2] !== undefined ? { type: parts[2] } : {});\r\n\r\n if (paramString !== undefined) {\r\n paramString.match(/(?:[^,\\s\\[]+(?:\\[.*?\\])?)(?=\\s*,|\\s*$)/g).forEach(item => {\r\n const splitPos = item.indexOf('=');\r\n if (splitPos < 0) {\r\n console.warn(`Incorrect option value '${item}'. Must be something like 'option=value'. Ignoring...`);\r\n return false;\r\n }\r\n const varName = item.substr(0, splitPos);\r\n let value = item.substr(splitPos + 1);\r\n\r\n if (/^\\d+$/.test(value)) {\r\n value = parseInt(value);\r\n }\r\n else if (/^\\d+(\\.\\d+)?$/.test(value)) {\r\n value = parseFloat(value);\r\n }\r\n else if (/^false|true$/i.test(value)) {\r\n value = (value.toLowerCase() === 'true');\r\n }\r\n else if (/^\\[.*\\]$/.test(value)) {\r\n value = value.slice(1, -1).split(',').map(e => e.trim());\r\n }\r\n else {\r\n try {\r\n value = JSON.parse(value);\r\n } catch (e) {}\r\n }\r\n\r\n options[varName] = value;\r\n });\r\n }\r\n return { name: parts[3], options };\r\n }\r\n\r\n function checkClass(el) {\r\n const class_ = $(el).closest('[cc\\\\:class]');\r\n if (class_.length > 0 && class_[0].getAttribute('cc:class') !== calc_.autoKey()) {\r\n return false;\r\n }\r\n const inTemplate = $(el).closest('.template-list-row').length > 0;\r\n return !inTemplate;\r\n }\r\n\r\n $node.find('[cc\\\\:click]').map((index, el) => {\r\n if(checkClass(el)){\r\n const self = this;\r\n const clickOptions = parseNameType(el.getAttribute('cc:click'));\r\n $(el).on('click', function () {\r\n const result = scopeEvalFunc('_', clickOptions.name)();\r\n if (clickOptions?.options?.submit !== false){\r\n self.autoSubmit(null, true); \r\n }\r\n return result;\r\n });\r\n }\r\n });\r\n\r\n this.toggleClasses = $node.find('[cc\\\\:classname]').toArray().map(el => {\r\n const attr = el.getAttribute(\"cc:classname\");\r\n const classesObj = JSON.parse(attr);\r\n \r\n return {\r\n toggle: () => {\r\n for(let className in classesObj) {\r\n const condition = classesObj[className];\r\n if (scopeEvalFunc('_', condition)()) {\r\n el.classList.add(className);\r\n } else {\r\n el.classList.remove(className);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return {\r\n inputs: $node.find('[cc\\\\:input]').toArray().map(el => {\r\n if (checkClass(el)) {\r\n const attr = el.getAttribute('cc:input');\r\n const { name, options } = parseNameType(attr);\r\n return [el, name, options];\r\n } else {\r\n return null;\r\n }\r\n }),\r\n outputs: $node.find('[cc\\\\:output]').toArray().map(el => {\r\n if (checkClass(el)) {\r\n const attr = el.getAttribute('cc:output');\r\n let { name, options } = parseNameType(attr);\r\n const renderCode = el.getAttribute('cc:render');\r\n\r\n if (renderCode !== null) {\r\n options.render = function (x) { return scopeEvalFunc(name, renderCode)(); }\r\n }\r\n\r\n if (Object.keys(options).length === 0)\r\n options = undefined;\r\n\r\n return [el, name, options];\r\n } else {\r\n return null;\r\n }\r\n }).concat($node.find('[cc\\\\:if]').toArray().map(el => {\r\n if (checkClass(el)) {\r\n \r\n let attr = el.getAttribute('cc:if');\r\n if (attr[0] == '@') {\r\n attr = $(attr.substr(1))[0].getAttribute('cc:if');\r\n }\r\n return [el, \"\", { type: \"toggle\", render: function () { return scopeEvalFunc('_', attr)(); } }];\r\n } else {\r\n return null;\r\n }\r\n })).concat($node.find('[cc\\\\:ifhash]').toArray().map(el => {\r\n if(checkClass(el)){\r\n let attr = el.getAttribute('cc:ifHash');\r\n let self = this;\r\n\r\n return [el, \"\", { type: \"toggle\", render: function () { \r\n return self.checkHash(attr);\r\n } }];\r\n }\r\n return null;\r\n })).concat($node.find('[cc\\\\:forceif]').toArray().map(el => {\r\n if (checkClass(el)) {\r\n let attr = el.getAttribute('cc:forceIf');\r\n if (attr[0] == '@') {\r\n attr = $(attr.substr(1))[0].getAttribute('cc:forceif');\r\n }\r\n return [el, \"\", {type: \"toggle\", render: function () {return scopeEvalFunc('_', attr)();}}, true];\r\n } else {\r\n return null;\r\n }\r\n })),\r\n }\r\n }\r\n \r\n\r\n writePath(obj, path, value, gentle=false) {\r\n if (Array.isArray(obj)) {\r\n obj.forEach(o => this.writePath(o, path, value, gentle));\r\n return;\r\n }\r\n\r\n let parts = path.split('.');\r\n let target = obj;\r\n parts.forEach(function (part, index) {\r\n if (target !== null) {\r\n if (part.indexOf('[]') >= 0) {\r\n let id_ = /[:]\\d+/.exec(part);\r\n id_ = (id_ == null ? -1 : id_[0]);\r\n let clearPart = part.replace(/([:]\\d+)\\[\\]/g, '');\r\n if (target[clearPart] === undefined)\r\n target[clearPart] = [];\r\n if (!target[clearPart].some(o => {\r\n if (o.__id == id_) {\r\n target = o;\r\n return true;\r\n }\r\n })) {\r\n if (gentle) { target = null; return true; }\r\n target[clearPart].push((id_ < 0 ? {} : { __id: id_ }));\r\n target = target[clearPart][target[clearPart].length - 1];\r\n }\r\n } else {\r\n if (index == parts.length - 1) {\r\n target[part] = value;\r\n } else {\r\n if (target[part] === undefined) {\r\n if (gentle) { target = null; return true; }\r\n target[part] = {};\r\n }\r\n target = target[part];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * \r\n * @param {string} name (where value saves: this.[].key\r\n * @param {*} params next keys:\r\n * required:\r\n * table - where to place our elements\r\n * appendButtonSelector - selector for button which will add new item of this dynamic field\r\n * removeSelector - selector (inside template) which deletes particular item\r\n * fields - object {: {selector, options($clone)}}\r\n * \r\n * optional: \r\n * removeFirstEvent() - make some additional acts during removing\r\n * keepOne - true when one element cannot be deleted(false by default)\r\n * keepTable - true when table should be shown, even when keepOne=false (false by default)\r\n * ignoreForEmpty - if true, block wil be ignored if all fields are empty\r\n * prepareTemplate($clone, blockPiece) should return {block: $clone, artifacts: obj(optional)\r\n * (this method can help you to prepare item before placing)\r\n * beforeRemoval($clone) - make some additional acts before removal\r\n * afterRemoval() - make some additional acts after removal\r\n * dontSubmitOnRemove - turning off submitForm in remove()\r\n */\r\n addDynamicField(name, params){\r\n let self = this;\r\n let parent = params.parent || $(document.body);\r\n let fetchRootElem = (selector) => typeof (selector) == \"string\" ? tools.findExternalOnly(parent, selector) : $(selector);\r\n let $table = fetchRootElem(params.table);\r\n let $dataExpandableDiv = $(`.expandablerow[data-expandablediv = '${$table.parent().attr(\"id\")}']`);\r\n let elements = [];\r\n\r\n \r\n function createClone(silent) {\r\n let $template = tools.findExternalOnly($table, \".template-list-row\");\r\n let $lastRow = tools.findExternalOnly($table, '.dynamic-list-row').last();\r\n let $clone = $($table[0].querySelector(\".template-list-row\").cloneNode(true));\r\n let _id = self.genUniqueId();\r\n\r\n let blockPiece = {\r\n index: (() => {\r\n const valid = elements.filter(e => !e.removed);\r\n return valid.length > 0 ? valid[valid.length - 1].index + 1 : 0;\r\n })(),\r\n fields: [],\r\n reset: function() {\r\n if (tools.findExternalOnly($table, '.dynamic-list-row').length > 1 || !params.keepOne) {\r\n if (params.beforeRemoval !== undefined) {\r\n params.beforeRemoval($clone);\r\n }\r\n $clone.remove();\r\n this.fields.map(field => field.delete());\r\n this.removed = true;\r\n if (params.afterRemoval !== undefined) {\r\n params.afterRemoval();\r\n }\r\n } else {\r\n this.index = 0;\r\n }\r\n },\r\n isFilled: function () {\r\n return this.fields.some(f => f.isFilled());\r\n },\r\n artifacts: [],\r\n getFieldsFlat: function () {\r\n let result = [];\r\n this.fields.forEach(f => {\r\n if (f.isDynamic) {\r\n f.getElements().forEach(e => {\r\n result = result.concat(e.getFieldsFlat());\r\n });\r\n } else {\r\n result.push(f);\r\n }\r\n });\r\n return result;\r\n },\r\n tree: {},\r\n removed: false,\r\n remove: function () {\r\n this.removed = true;\r\n let elementsCount = elements.filter(x => !x.removed).length\r\n if (elementsCount === 0) {\r\n if (!params.keepOne) {\r\n $clone.closest('div').hide();\r\n $clone.closest('.expandable-div').find('.expandablerow').addClass('expandablerow-collapsed');\r\n $clone.closest('.expandable-div').find(\".tab-expandablerow-add\").attr(\"tabindex\", \"0\");\r\n }else{\r\n this.removed = false;\r\n }\r\n if (params.removeFirstEvent !== undefined)\r\n params.removeFirstEvent();\r\n }\r\n this.reset();\r\n if (!params.dontSubmitOnRemove)\r\n self.submitForm(null, !self._submitOnChange);\r\n }\r\n }\r\n\r\n $clone.removeClass('template-list-row').addClass('dynamic-list-row');\r\n\r\n // auto fields\r\n self.fetchFields($clone).inputs.forEach(([el, item, options]) => {\r\n const fieldParams = { disabledSubmitting: true, parent: $clone, ...options };\r\n const field = self.addInputField(el, `${name}:${_id}[].${item}`, fieldParams);\r\n blockPiece.tree[item] = field;\r\n blockPiece.fields.push(field);\r\n });\r\n\r\n if (params.fields !== undefined) {\r\n for (let item in params.fields) {\r\n let value = params.fields[item];\r\n let fieldParams = {};\r\n if (typeof (value) === \"string\") {\r\n value = { selector: value };\r\n } else if (value.options !== undefined) {\r\n fieldParams = typeof (value.options) === \"function\" ? value.options($clone) : value.options;\r\n }\r\n fieldParams.disabledSubmitting = true;\r\n fieldParams.parent = $clone;\r\n\r\n const field = self.addInputField($clone.find(value.selector), `${name}:${_id}[].${item}`, fieldParams);\r\n blockPiece.tree[item] = field;\r\n blockPiece.fields.push(field);\r\n }\r\n }\r\n\r\n $clone.find(params.removeSelector).first().click((e) => {\r\n e.preventDefault();\r\n blockPiece.remove();\r\n $(e.target).blur();\r\n });\r\n\r\n let anchor = $lastRow.length === 1 ? $lastRow : $template;\r\n params.prepareTemplate = params.prepareTemplate || (c => { return { block: c }; });\r\n const { block, artifacts } = params.prepareTemplate($clone, blockPiece);\r\n anchor[0].insertAdjacentElement('afterEnd', block[0]);\r\n\r\n if (artifacts !== undefined) {\r\n for (let key in artifacts) {\r\n blockPiece.artifacts.push({\r\n path: `${name}:${_id}[].${key}`,\r\n value: artifacts[key],\r\n name: self.removePathId(`${name}:${_id}[].${key}`),\r\n });\r\n blockPiece.tree[key] = artifacts[key];\r\n }\r\n }\r\n\r\n elements.push(blockPiece);\r\n\r\n if (!silent) {\r\n self.submitForm(null, !self._submitOnChange);\r\n }\r\n\r\n blockPiece.fields.forEach(f => { f.params_.disabledSubmitting = false; });\r\n }\r\n\r\n if(params.keepOne)\r\n createClone(true);\r\n\r\n fetchRootElem(params.appendButtonSelector).click(() => createClone());\r\n\r\n // AG TODO: WILL NOT WORK WITH DYNAMIC-IN-DYNAMIC. NEED TO BE REFACTORED!\r\n $dataExpandableDiv.click(function () {\r\n var $this = $(this);\r\n if ($this.hasClass('expandablerow-collapsed')) {\r\n $this.removeClass('expandablerow-collapsed');\r\n\r\n var $expandableDiv = $('#' + $this.data('expandablediv'));\r\n $expandableDiv.show();\r\n\r\n $this.find(\".tab-expandablerow-add\").attr(\"tabindex\", \"-1\");\r\n\r\n if (tools.findExternalOnly($expandableDiv, '.dynamic-list-row').length === 0) {\r\n createClone();\r\n }\r\n }\r\n });\r\n\r\n let result = {\r\n isDynamic: true,\r\n reset: function () {\r\n elements.forEach((item) => item.reset());\r\n if (!params.keepOne) {\r\n if (!params.keepTable)\r\n $table.parent().hide();\r\n $dataExpandableDiv.addClass('expandablerow-collapsed');\r\n }\r\n if (params.removeFirstEvent !== undefined)\r\n params.removeFirstEvent();\r\n },\r\n params_: params,\r\n getElements: function () {\r\n return elements.filter(bp => !bp.removed);\r\n },\r\n delete: function () {\r\n elements.forEach((item) => item.fields.forEach(f => f.delete()));\r\n },\r\n isFilled: function () { return elements.some(e => e.isFilled()); },\r\n ignoredEmptyFields: function () {\r\n let result = [];\r\n if (params.ignoreForEmpty) {\r\n elements.forEach((e) => {\r\n if (!e.isFilled()) {\r\n result = result.concat(e.getFieldsFlat().map(f => f.varName));\r\n }\r\n });\r\n }\r\n return result;\r\n },\r\n setCount: function ({count, removeStrategy = \"simple\" }) {\r\n let currentCount = this.getElements().length;\r\n if (count !== currentCount) {\r\n if (count > currentCount) {\r\n while (this.getElements().length < count)\r\n createClone();\r\n } else {\r\n if (removeStrategy === \"simple\") {\r\n this.getElements().forEach((bp, i) => { if (i >= count) bp.remove(); });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n this._dynamicFields.push(result);\r\n\r\n if (params.keepOne && !params.disabledSubmitting)\r\n self.submitForm(null, !self._submitOnChange);\r\n\r\n return result;\r\n }\r\n\r\n\r\n /**\r\n * Adds group of fields to calculator.\r\n * @param {any} nameOrNames to fetch all fields you need\r\n * @param {any} checker function f(fields, options) which returns object {valid: bool, artifacts: obj}\r\n * @param {any} options is additional parameters for group\r\n */\r\n addGroup(nameOrNames, checker, options) {\r\n let self = this;\r\n\r\n this.fieldGroups.push({\r\n getFields: function () {\r\n let resList = [];\r\n function checkField(f, name) {\r\n return !f.ignore && !f.__tmpIgnore && self.isPathInside(f.name, name);\r\n }\r\n if (typeof (nameOrNames) === 'string') {\r\n nameOrNames = [nameOrNames];\r\n }\r\n\r\n nameOrNames.forEach(function (name) {\r\n resList = resList.concat(self.inputFields.filter(f => checkField(f, name)));\r\n });\r\n\r\n resList.tree = {};\r\n resList.forEach((f) => { self.writePath(resList.tree, f.varName, f); });\r\n\r\n self._dynamicFields.forEach(df => {\r\n df.getElements().forEach(e => {\r\n e.artifacts.filter(a => nameOrNames.some(name => self.isPathInside(a.name, name))).forEach(a => {\r\n self.writePath(resList.tree, a.path, a.value);\r\n });\r\n });\r\n });\r\n\r\n return resList;\r\n },\r\n check: function (sender, autoValidation) {\r\n let fields = this.getFields();\r\n let newOptions = { sender: sender, autoValidation: autoValidation };\r\n for (let key in options) {\r\n newOptions[key] = options[key];\r\n }\r\n return checker(fields, newOptions);\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Parses all input fields and initialises connected variables\r\n * */\r\n parse(sender, autoValidation) {\r\n var self = this;\r\n const newValues = this.irregularValueNames.reduce((acc, v) => { acc[v] = self[v]; return acc; }, {});\r\n this.log(\"Irregular value obj:\", newValues);\r\n this.inputFields.forEach(function (field) {\r\n field.__tmpIgnore = false;\r\n self.clearPath(self, field.name);\r\n self.clearPath(self._exportObject.parse, field.name);\r\n });\r\n\r\n let ignoreList = this._dynamicFields.reduce((accum, v) => accum.concat(v.ignoredEmptyFields()), []);\r\n this.inputFields = this.inputFields.filter(function (f) { return !f.deleted; });\r\n\r\n var result = {\r\n valid: true,\r\n filled: this.defaultFilled,\r\n enableResetButton: false,\r\n hasValueChanges: false\r\n };\r\n\r\n let fieldsToParse = this.inputFields.filter(function (f) {\r\n let ignoreCouseEmpty = ignoreList.indexOf(f.varName) >= 0;\r\n if (f.showReset()) {\r\n result.enableResetButton = true;\r\n }\r\n if (f.ignore)\r\n f.reset({ keepValue: !self.resetValuesOnIgnore });\r\n else if (ignoreCouseEmpty) {\r\n f.__tmpIgnore = true;\r\n f.reset({ keepValue: true });\r\n }\r\n return !f.ignore && !ignoreCouseEmpty;\r\n });\r\n\r\n const unsilence = [];\r\n if (sender) {\r\n const senderField = fieldsToParse.find(f => sender == f.elem[0]);\r\n if (senderField && senderField.params_.unsilence)\r\n unsilence.push(...senderField.params_.unsilence);\r\n }\r\n \r\n // first phase\r\n fieldsToParse.forEach(function (field) {\r\n var res = field.check(autoValidation, sender, 1, unsilence.indexOf(field.name) >= 0);\r\n field.valid = res;\r\n\r\n if (field.isFilled()) {\r\n result.filled = true;\r\n }\r\n if (field.errorIsVisible()) {\r\n result.enableResetButton = true;\r\n }\r\n\r\n if (!res)\r\n result.valid = false;\r\n else if (field.name !== undefined) {\r\n self.writePath([self, newValues], field.varName, field.getValue());\r\n self.writePath(self._exportObject.parse, field.varName, field.getExportValue());\r\n }\r\n });\r\n\r\n // dynamicField artifacts\r\n this._dynamicFields.forEach(df => {\r\n df.getElements().forEach(e => {\r\n e.artifacts.forEach(a => {self.writePath([self, newValues], a.path, a.value, true);});\r\n });\r\n });\r\n\r\n this.afterFirstPhaseCheck();\r\n\r\n // second phase\r\n fieldsToParse.forEach(function (field) {\r\n var res = field.check(autoValidation, sender, 2);\r\n if (!res)\r\n result.valid = field.valid = false;\r\n });\r\n if (!autoValidation) {\r\n const newValuesString = JSON.stringify(newValues);\r\n result.hasValueChanges = this.lastValuesString !== newValuesString;\r\n this.lastValuesString = newValuesString;\r\n }\r\n\r\n this.fieldGroups.forEach(group => {\r\n let res = this.processGroup(group, sender, autoValidation);\r\n if (!res)\r\n result.valid = false;\r\n });\r\n\r\n this.log(\"PARSE: \", this);\r\n result.enableResetButton = result.enableResetButton || result.filled;\r\n this.afterParse(sender, autoValidation);\r\n this.forceRender();\r\n return result;\r\n }\r\n\r\n\r\n\r\n submitForm(sender, autoValidation, skipValueChangesCheck = false) {\r\n if(!this.isActive) return;\r\n this._exportObject = {\r\n parse: {},\r\n render: {notes: []}\r\n };\r\n \r\n if (this.beforeSubmit() === false) {\r\n return;\r\n }\r\n\r\n let parsing = this.parse(sender, autoValidation);\r\n this.resetButtons.forEach(function (elem) {\r\n (parsing.enableResetButton ? elem.show() : elem.hide());\r\n });\r\n\r\n if (parsing.filled && !this._statistic.startedSent) {\r\n this.sendStatisticMessage('Is_Started');\r\n this._statistic.startedSent = true;\r\n }\r\n\r\n if (!this.isReady()) {\r\n return; // AG TODO: Maybe wait for ready? Design how to do it.\r\n }\r\n\r\n this.log(\"BEFORE CALC: valid=\", parsing.valid);\r\n \r\n if (!this.calculateForValidOnly || parsing.valid) {\r\n this.toggleCustomClasses();\r\n let calcValid = this.calculate({ sender: sender, autoValidation: autoValidation });\r\n this.log('AFTER CALCULATE: ', this);\r\n if (!autoValidation && (skipValueChangesCheck || parsing.hasValueChanges)) {\r\n if (parsing.valid && calcValid) {\r\n this.beforeRender();\r\n this.render();\r\n this._exportObjectFinal = tools.deepcopy(this.generateExportObject());\r\n this.showResults();\r\n } else {\r\n this.hideResults();\r\n }\r\n }\r\n }\r\n\r\n if (!parsing.valid && !autoValidation) {\r\n this.renderError();\r\n }\r\n\r\n this.log(\"EXPORT OBJECT:\", this._exportObject);\r\n this.afterSubmit();\r\n }\r\n \r\n}\r\n","import { ShowErrorWay } from \"./utils.js\";\r\n\r\nexport class CalculatorInterface {\r\n constructor() {\r\n this.debug = false;\r\n this._fieldTypes = [];\r\n this.inputFields = [];\r\n this.outputFields = [];\r\n this.forceOutputs = [];\r\n this.fieldGroups = [];\r\n this.showErrorWay = ShowErrorWay.SHOW_ALL;\r\n this.resetButtons = [];\r\n this._exportObject = {};\r\n this._exportObjectFinal = {};\r\n this.calculateForValidOnly = true;\r\n this.resetValuesOnIgnore = false;\r\n this._submitOnChange = false;\r\n this.isActive = true;\r\n this._dynamicFields = [];\r\n this._inputFieldsTree = {fields: []};\r\n this.view = \"\";\r\n this.irregularValueNames = [];\r\n this.lastValuesString = \"\";\r\n }\r\n\r\n code() { return \"three_letter_code_of_calculator\"; } // reimplement it in inherited classes\r\n type() { return \"code_for_export\"; } // reimplement it in inherited classes\r\n\r\n autoKey() { return '0'; } // used for calculator with tabs (every tab - one mini calculator)\r\n initialize() { } // use this instead of redefining constructor\r\n calculate(params) { } // calculation method (all calculations of calculator should be here)\r\n beforeSubmit() { } // before parsing\r\n afterSubmit() { } // at the end of submit\r\n afterParse(sender, autoValidation) { }\r\n beforeRender() { }\r\n onReset() { }\r\n afterFirstPhaseCheck() { }\r\n isReady() { return true; }\r\n log(...args) {}\r\n setupHandlers() {}\r\n setHash(hash){}\r\n checkHash(hash) {}\r\n getHash() {}\r\n\r\n autoSubmit(sender, skipValueChangesCheck) {\r\n sender = sender || null;\r\n this.submitForm(sender, false, skipValueChangesCheck);\r\n }\r\n fetchFields(htmlNode) {}\r\n\r\n autoAddFields() {} // adds fields from special html attributes\r\n loadDescription(feedbackBottom = true) {} // just loads description from file\r\n patchFieldTypes(newFieldTypes) {} // updates field-type library\r\n\r\n showResults() {$('.calc-div-results').addClass('show-results');} // shows result\r\n hideResults() {} // hides result\r\n\r\n generateExportObject() { return this._exportObject; }\r\n get defaultFilled(){ return false; }\r\n setupStatistic(params) {} // setups statistic module\r\n sendStatisticMessage(string_or_object) {} // sends statistic message to YM\r\n submitOnClick(selectorOrElem) {} // turn on submitting on elem click\r\n submitOnChange() {} // make submit on change\r\n\r\n addResetButton(selector, hideOnDefault) {}\r\n\r\n genUniqueId() { return Math.random() * 1e7 | 0; }\r\n\r\n writePath(obj, path, value, gentle=false) {} // method for writing propery into this object using path (used to generate input values for calculation stage)\r\n removePathId(path) {} // remove path\r\n clearPath(obj, path) {} // clears path\r\n isPathInside(path, srcPath) {} // checks if path inside\r\n \r\n addInputField(selector, name, params) {}\r\n addDynamicField(name, params){}\r\n addGroup(nameOrNames, checker, options) {}\r\n \r\n processGroup(group, sender, autoValidation) { } // Parses group with internal checks (between elements inside group)\r\n\r\n parse(sender, autoValidation) { } // Parses all input fields and initialises connected variables\r\n resetInputFields(params) {}\r\n \r\n addOutputField(selector, name, params, forced = false) {}\r\n\r\n render() {}\r\n\r\n forceRender() {}\r\n\r\n toggleCustomClasses() {}\r\n\r\n renderError() {}\r\n\r\n /**\r\n * Submits form\r\n * - calls beforeSubmit (if it returns false, stops)\r\n * - parse\r\n * - toggling reset buttons\r\n * - Is_Started stat send\r\n * - calls isReady (if false, breaks, but almost always should be true)\r\n * - if parse result is valid:\r\n * - toggle custom classes\r\n * - call calculate\r\n * - if calculation is not valid, hides result part, otherwise \r\n * call beforeRender, then render, then generateExportObject, then shows results\r\n * - renders error for invalid parsing result\r\n * - calls afterSubmit\r\n */\r\n submitForm(sender, autoValidation, skipValueChangesCheck = false) {} \r\n autoValidate(sender) {} \r\n}","class BaseOutputField {\r\n constructor(calculator, selector, name, params) {\r\n this.calculator = calculator;\r\n this.container = $(selector);\r\n this.name = name;\r\n this.params = params;\r\n this.setup();\r\n }\r\n\r\n setup() {}\r\n\r\n get(paramName, defaultValue) {\r\n if (this.params !== undefined && this.params[paramName] !== undefined)\r\n return this.params[paramName];\r\n return defaultValue;\r\n }\r\n\r\n get renderMethod() {\r\n if (this.get('html') !== undefined) {\r\n return 'html';\r\n }\r\n return 'text';\r\n }\r\n\r\n get type() {\r\n return this.get('type', 'text');\r\n }\r\n\r\n get value() {\r\n return this.calculator[this.name];\r\n }\r\n\r\n compose() {\r\n const val = this.value;\r\n if (this.params === undefined && val !== undefined) {\r\n if (val.hasOwnProperty('text'))\r\n return val.text;\r\n return val;\r\n }\r\n }\r\n\r\n compose_() {\r\n const renderFunc = this.get('render');\r\n if (renderFunc === undefined) {\r\n return this.compose();\r\n }\r\n return renderFunc(this.value);\r\n }\r\n\r\n render() {\r\n this.container[this.renderMethod](this.compose_());\r\n }\r\n\r\n renderExport(exportObject) {\r\n exportObject[this.name + '_' + this.type] = this.compose_();\r\n }\r\n}\r\n\r\nclass RenderRequiredOutputField extends BaseOutputField {\r\n setup() {\r\n const renderFunc = this.get('render');\r\n if (renderFunc == undefined) {\r\n console.error(`You must write render method for [${this.type}] type of output field.`);\r\n }\r\n this.renderFunc = renderFunc;\r\n }\r\n\r\n compose() {\r\n return this.renderFunc(this.value);\r\n }\r\n}\r\n\r\nclass HtmlOutputField extends BaseOutputField {\r\n get renderMethod() { return 'html'; }\r\n}\r\n\r\nclass TextField extends HtmlOutputField {\r\n compose() { return this.value; }\r\n}\r\n\r\nclass LocaleNumOutputField extends BaseOutputField {\r\n compose() {\r\n const options = {\r\n minPrecision: this.get('minPrecision'),\r\n maxPrecision: this.get('maxPrecision')\r\n };\r\n return tools.getLocaleNumber(this.value, options);\r\n }\r\n}\r\n\r\nclass LocaleSumOutputField extends BaseOutputField {\r\n compose() { return tools.getLocaleSum(this.value); }\r\n}\r\n\r\nclass MoneyRubleOutputField extends HtmlOutputField {\r\n compose() { return tools.getLocaleSumInRubbles(this.value); }\r\n}\r\n\r\nclass MoneyTextOutputField extends BaseOutputField {\r\n compose() { return tools.verboseNumber(this.value); }\r\n}\r\n\r\nclass MoneyRoundedRubleField extends HtmlOutputField {\r\n compose() { return tools.getRoundedNumberInRubbles(this.value); }\r\n}\r\n\r\nclass MoneyRoundedRubleOutputField extends HtmlOutputField {\r\n compose() { return tools.getRoundedNumberInRubbles(this.value); }\r\n}\r\n\r\nclass PeriodOutputField extends BaseOutputField {\r\n compose() {\r\n const from_ = this.value.dateFrom.toLocaleFormat();\r\n const to_ = this.value.dateTo.toLocaleFormat();\r\n switch (this.get('kind', 'with-duration')) {\r\n case 'with-duration':\r\n return `с ${from_} по ${to_} (${this.value.duration.inDays} дн.)`;\r\n case 'with-full-duration':\r\n return `с ${from_} по ${to_} (${tools.verboseCountingValue(this.value.duration.inDays, [['день', 'дня', 'дней']])})`;\r\n }\r\n }\r\n}\r\n\r\nclass DateOutputField extends BaseOutputField {\r\n compose() { return this.value.toLocaleFormat(); }\r\n}\r\n\r\nclass DayOutputField extends BaseOutputField {\r\n compose() { \r\n return tools.verboseCountingValue(this.value, [[\"день\", \"дня\", \"дней\"]]);}\r\n}\r\n\r\nclass PercentOutputField extends HtmlOutputField {\r\n compose() {\r\n const options = {\r\n minPrecision: this.get('minPrecision'),\r\n maxPrecision: this.get('maxPrecision')\r\n };\r\n\r\n return tools.getLocaleNumber(this.value, options) + \"%\";\r\n }\r\n}\r\n\r\nclass NoteOutputField extends RenderRequiredOutputField {\r\n render() {\r\n const result = this.compose_();\r\n this.container.removeClass('active only-print');\r\n if (result === 'print' || result === true) {\r\n this.container.addClass('active');\r\n if (result === 'print') {\r\n this.container.addClass('only-print');\r\n }\r\n }\r\n }\r\n\r\n renderExport(exportObject) {\r\n const result = this.compose_();\r\n if (result === 'print' || result === true) {\r\n exportObject.notes.push(tools.convertElemToTextWithLinksForExport(this.container));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * works with only direct children elements\r\n * Takes optional params: \r\n * - parseLink : true if convertElemToTextWithLinksForExport is needed\r\n * - selector : selector for additional logic\r\n */\r\nclass ExportVisibleOutputField extends BaseOutputField {\r\n renderExport(exportObject) {\r\n const selector = this.get('selector', '> *');\r\n const htmlObject = this.container.find(`${selector}:visible`).toArray().filter(x=>$(x).text())[0];\r\n\r\n exportObject[this.name] = this.get(\"parseLink\") && htmlObject \r\n ? tools.convertElemToTextWithLinksForExport(htmlObject) \r\n : $(htmlObject).text();\r\n }\r\n}\r\n\r\n/**\r\n * Takes optional params: \r\n * - duration : object with slideUp and slideDown time or true to use default time\r\n */\r\nclass ToggleOutputField extends RenderRequiredOutputField {\r\n render() {\r\n const slideUpTime = this.get('duration', {slideUp : undefined}).slideUp;\r\n const slideDownTime = this.get('duration', {slideDown : undefined}).slideDown;\r\n\r\n const show = () => this.get('duration') ? this.container.slideDown(slideUpTime || 400) : this.container.show();\r\n const hide = () => this.get('duration') ? this.container.slideUp(slideDownTime || 400) : this.container.hide();\r\n\r\n if (this.compose_())\r\n show();\r\n else\r\n hide();\r\n }\r\n}\r\n\r\nclass ConditionalBlockOutputField extends RenderRequiredOutputField {\r\n setup() {\r\n super.setup();\r\n const alternativeBlockSelector = this.get('alternativeBlock', '');\r\n if (alternativeBlockSelector === '') {\r\n console.warn(\"It's bad way to use `conditionalBlock` with empty alternativeBlock param. Try to use `toggle` instead.\")\r\n }\r\n this.alternativeBlock = $(alternativeBlockSelector);\r\n }\r\n\r\n render() {\r\n if (this.compose_()) {\r\n this.container.show();\r\n this.alternativeBlock.hide();\r\n }\r\n else {\r\n this.container.hide();\r\n this.alternativeBlock.show();\r\n }\r\n }\r\n}\r\n\r\nclass ShareOutputField extends HtmlOutputField {\r\n compose() {\r\n return this.value.text.replace('%', ' %');\r\n }\r\n}\r\n\r\nclass MoneyLocalRoundedOutField extends HtmlOutputField {\r\n compose() {\r\n return tools.getLocaleSumInRubbles(tools.getRoundedNumber(this.value))\r\n }\r\n}\r\n\r\nfunction createOutputField(calculator, selector, name, params) {\r\n let params_ = params || {};\r\n let class_ = undefined;\r\n switch (params_.type) {\r\n case 'localeNumber': class_ = LocaleNumOutputField; break;\r\n case 'localeSum': class_ = LocaleSumOutputField; break;\r\n case 'moneyRuble': class_ = MoneyRubleOutputField; break;\r\n case 'moneyRoundedRuble': class_ = MoneyRoundedRubleOutputField; break;\r\n case 'moneyText': class_ = MoneyTextOutputField; break;\r\n case 'moneyRoundedRuble': class_ = MoneyRoundedRubleField; break;\r\n case 'moneyLocalRoundedRuble': class_ = MoneyLocalRoundedOutField; break\r\n case 'period': class_ = PeriodOutputField; break;\r\n case 'date': class_ = DateOutputField; break;\r\n case 'percent': class_ = PercentOutputField; break;\r\n case 'note': class_ = NoteOutputField; break;\r\n case 'toggle': class_ = ToggleOutputField; break;\r\n case 'conditionalBlock': class_ = ConditionalBlockOutputField; break;\r\n case 'day': class_ = DayOutputField; break;\r\n case 'share': class_ = ShareOutputField; break;\r\n case 'text': class_ = TextField; break;\r\n case 'exportVisible' : class_ = ExportVisibleOutputField; break\r\n default: class_ = BaseOutputField; break;\r\n }\r\n\r\n return new class_(calculator, selector, name, params);\r\n}\r\n\r\nexport { createOutputField };","import {fields as basicFields} from \"../basic_fields.js\";\r\nimport {CalculatorComplex} from \"./calc_complex.js\";\r\nimport {createOutputField} from \"./output_fields.js\";\r\nexport {ShowErrorWay} from \"./utils.js\";\r\n\r\n\r\n/**\r\n * TODO: Move inline-radio to web-component\r\n * TODO: Move datetime-segment elem to web-component\r\n * \r\n * */\r\nexport class Calculator extends CalculatorComplex {\r\n\r\n constructor() {\r\n super();\r\n this._fieldTypes = basicFields;\r\n this.showVersionBanner = ShowVersionBanner;\r\n this.setupVersionBanner();\r\n this.setupHandlers();\r\n this.autoAddFields();\r\n this.initialize();\r\n this.forceRender();\r\n }\r\n \r\n log(...args) {\r\n if (this.debug) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n setupVersionBanner() {\r\n if(this.showVersionBanner){\r\n $('.old-version-alert')?.show();\r\n $('.old-version-alert')?.find('.close-button')?.click(function () {\r\n $('.old-version-alert').slideUp(200);\r\n });\r\n\r\n $('.new-version-alert')?.show();\r\n $('.new-version-alert')?.find('.close-button')?.click(function () {\r\n $('.new-version-alert').slideUp(200);\r\n });\r\n }\r\n }\r\n\r\n setupHandlers() {\r\n const self = this;\r\n $(\"#printResult\").click(function () {\r\n if (self.isActive){\r\n window.print();\r\n const message = self._statistic.printMessage;\r\n self.sendStatisticMessage(typeof(message) === \"function\" ? message() : message);\r\n }\r\n return false;\r\n });\r\n\r\n $(\"#wordResult\").click(function () {\r\n if (self.isActive) {\r\n const formData = new FormData();\r\n formData.append(\"calcType\", self.type());\r\n formData.append(\"json\", JSON.stringify(self._exportObjectFinal));\r\n\r\n $.ajax({\r\n url: ExportWordHost,\r\n type: \"POST\",\r\n data: formData,\r\n processData: false,\r\n contentType: false,\r\n cache: false,\r\n xhr:function(){\r\n var xhr = new XMLHttpRequest();\r\n xhr.onloadstart = function(ev) {\r\n xhr.responseType = \"blob\";\r\n };\r\n return xhr;\r\n },\r\n success: function(response, textStatus, jQxhr) {\r\n const name = decodeURI(jQxhr.getResponseHeader(\"Content-Disposition\").split(\"filename*=UTF-8''\")[1]);\r\n const blob = new Blob([response], {type:\"application/ms-word\"});\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveOrOpenBlob(blob, name);\r\n } else {\r\n const link = document.createElement(\"a\");\r\n link.download = name;\r\n link.href = URL.createObjectURL(blob);\r\n link.click(); \r\n }\r\n return true;\r\n }, \r\n });\r\n\r\n const message = self._statistic.exportMessage;\r\n self.sendStatisticMessage(typeof(message) === \"function\" ? message() : message);\r\n }\r\n return false;\r\n });\r\n\r\n }\r\n /**\r\n * \r\n * @param {string} hash - place where need to redirect\r\n */\r\n setHash(hash){\r\n if (hash)\r\n window.location.hash = hash;\r\n else\r\n window.history.pushState(\"\", document.title, window.location.pathname);\r\n }\r\n\r\n checkHash(hash) {\r\n const currentHash = this.getHash();\r\n return currentHash.match(new RegExp(`^${hash}$`));\r\n }\r\n\r\n getHash() {\r\n return document.location.hash.substring(1);\r\n }\r\n\r\n autoSubmit(sender, skipValueChangesCheck) {\r\n sender = sender || null;\r\n this.submitForm(sender, false, skipValueChangesCheck);\r\n }\r\n \r\n autoAddFields() {\r\n const fields = this.fetchFields();\r\n fields.inputs.forEach(args => { if (args !== null) this.addInputField(...args); });\r\n fields.outputs.forEach(args => { if (args !== null) this.addOutputField(...args); });\r\n }\r\n\r\n loadDescription(feedbackBottom = true) {\r\n const self = this;\r\n return new Promise(function (resolve, reject) {\r\n $(\"#calcDescription\").load(\"/conf/calc_\"+self.code()+\"/promo.html?v=\" + DataVersionSalt, function () {\r\n $(\".smart-link\").each(function () {\r\n tools.initSmartLink(this);\r\n });\r\n\r\n tools.setWarningMessage(this);\r\n\r\n if (!IsAuthEnabled) {\r\n const mailSubject = `Обратная связь`;\r\n if (feedbackBottom) {\r\n $(\".calc-div-input-footer\").append($(mailSubject));\r\n }\r\n else {\r\n $(\"#calcDescription\").prepend($(`
${mailSubject}
`));\r\n }\r\n }\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n patchFieldTypes(newFieldTypes) {\r\n this._fieldTypes = this._fieldTypes.concat(newFieldTypes);\r\n }\r\n\r\n showResults() {\r\n $(\".calc-div-results\").addClass(\"show-results\");\r\n }\r\n\r\n hideResults() {\r\n $(\".calc-div-results\").removeClass(\"show-results\");\r\n }\r\n\r\n generateExportObject() {\r\n return this._exportObject;\r\n }\r\n\r\n get defaultFilled(){\r\n return false;\r\n }\r\n\r\n /**\r\n * Sets up part which works with statistic\r\n * @param {object} params\r\n * - calcName (required) uses in message gen\r\n * - prefix ('Calculation_' by default) uses in message gen\r\n * - printMessage ('Print' by default) you can use object here (@see {sendStattisticMessage}) or even function which returns string_or_object\r\n * - exportMessage ('Export' by default) the same as previous but for export\r\n */\r\n setupStatistic(params) {\r\n params = params || {};\r\n this._statistic = params;\r\n this._statistic.startedSent = params.isStartedEventIgnore || false;\r\n if (this._statistic.prefix === undefined)\r\n this._statistic.prefix = \"Calculation_\";\r\n\r\n if (this._statistic.printMessage === undefined)\r\n this._statistic.printMessage = \"Print\";\r\n\r\n if (this._statistic.exportMessage === undefined)\r\n this._statistic.exportMessage = \"Export\";\r\n }\r\n\r\n /**\r\n * Sends statistic message\r\n * @param {any} string_or_object\r\n * If this value is object it could contain next props:\r\n * - message (required)\r\n * - args, if you need to send additional arguments\r\n * - prefix, if you need to redefine prefix for specific stat message\r\n * Otherwise it uses like an object with only `message` prop filled\r\n */\r\n sendStatisticMessage(string_or_object) {\r\n let params = string_or_object;\r\n if (typeof (string_or_object) === \"string\") { \r\n params = {\r\n message: string_or_object\r\n };\r\n }\r\n const prefix = params.prefix !== undefined ? params.prefix : this._statistic.prefix;\r\n\r\n if (this._statistic.calcName === undefined) {\r\n console.warn(\"Calculator's name is not set up. Use method `setupStatistic` for it.\");\r\n }\r\n\r\n ym(ymId, ymReachGoal, prefix + params.message + \"_\" + this._statistic.calcName, params.args);\r\n }\r\n\r\n submitOnClick(selectorOrElem) {\r\n var self = this;\r\n $(selectorOrElem).click(function () { self.submitForm(null, false, true); });\r\n }\r\n\r\n submitOnChange() {\r\n this._submitOnChange = true;\r\n }\r\n\r\n addResetButton(selector, hideOnDefault) {\r\n hideOnDefault = hideOnDefault === undefined ? true : hideOnDefault;\r\n var self = this;\r\n var elem = $(selector);\r\n elem.click(function () {\r\n if (self.isActive){\r\n self.resetInputFields();\r\n self.sendStatisticMessage(\"Default\");\r\n }\r\n });\r\n if (hideOnDefault) {\r\n this.resetButtons.push(elem);\r\n }\r\n }\r\n\r\n removePathId(path) {\r\n return path.replace(/[:]\\d+/g, \"\");\r\n }\r\n\r\n clearPath(obj, path) {\r\n const parts = path.split(\".\");\r\n const part0 = parts[0];\r\n obj[part0.replace(/\\[|\\]/g, \"\")] = undefined;\r\n }\r\n\r\n /**\r\n * Checks that path inside srcPath\r\n * @param {object} obj\r\n * @param {string} path\r\n * @param {string} srcPath\r\n */\r\n isPathInside(path, srcPath) {\r\n return (path.indexOf(srcPath + \".\") == 0 || path.indexOf(srcPath + \"[]\") == 0 || path === srcPath);\r\n }\r\n\r\n /**\r\n * Method for adding input fields (instead of parsing form)\r\n * @param {stringOrElement} selector\r\n * @param {string} name (where value saves: this.)\r\n * @param {Object} params has next keys:\r\n * - type - one of (money, int). Some can be detected automatically ()\r\n * - defaultValue - (for reseting)\r\n * - errClassElem - (optional, set it if it's requires to add err class not to $(selector) elem but to different)\r\n * - showErrorWay - (optional - redefines global setting)\r\n * - disableAutoCheck - (optional - otherwise will check on change)\r\n * - errors - list of objects {check: func(v), selector: strOrElem, errClassElem: strOrElem[optional]}\r\n * - options - for some fieldTypes this options is useful\r\n * - preInit - (optional, will be called before init call)\r\n * - unsilence - (optional - array of other field names that would have non-silent check when this field is a sender)\r\n */\r\n addInputField(selector, name, params) {\r\n params = params || {};\r\n const self = this;\r\n\r\n if (params.dynamic) {\r\n params.table = selector;\r\n return this.addDynamicField(name, params);\r\n }\r\n\r\n const elem = $(selector);\r\n const ftype = params.type === undefined ? this._detectFieldType(elem) : params.type;\r\n const field = this._makeFieldObject(elem, ftype, params.options);\r\n params.showErrorWay = params.showErrorWay || self.showErrorWay;\r\n field.params_ = params;\r\n field.varName = name;\r\n field.name = self.removePathId(name);\r\n field.defaultValue = (params.defaultValue === undefined ? field.getClearValue() : params.defaultValue);\r\n\r\n if (!params.disableAutoCheck) {\r\n field.onChange(function (sender) {\r\n if (!params.disabledSubmitting) {\r\n self.submitForm(sender, !self._submitOnChange);\r\n }\r\n });\r\n }\r\n\r\n if (params.preInit !== undefined)\r\n params.preInit(field);\r\n\r\n field.init();\r\n\r\n this.inputFields.push(field);\r\n return field;\r\n }\r\n\r\n _detectFieldType(elem) {\r\n var result = undefined;\r\n this._fieldTypes.some(function (ft) {\r\n if (ft.detect(elem)) {\r\n result = ft.keyName();\r\n return true;\r\n }\r\n });\r\n if (result === undefined) {\r\n console.error(\"Can't detect field type\", elem);\r\n }\r\n return result;\r\n }\r\n\r\n _makeFieldObject(elem, fieldType, options) {\r\n var result = undefined;\r\n if (!this._fieldTypes.some(function (ft) {\r\n if (ft.keyName() === fieldType) {\r\n result = new ft(elem, options);\r\n return true;\r\n }\r\n })) {\r\n console.error(\"Can't find class for field type\", fieldType, \"of element\", elem);\r\n }\r\n return result;\r\n }\r\n \r\n /**\r\n * Parses group with internal checks (between elements inside group)\r\n * @param {any} group\r\n */\r\n processGroup(group, sender, autoValidation) {\r\n const result = group.check(sender, autoValidation);\r\n if (result.artifacts !== undefined) {\r\n for (const key in result.artifacts) {\r\n this[key] = result.artifacts[key];\r\n }\r\n }\r\n return result.valid; \r\n }\r\n \r\n resetInputFields(params) {\r\n const self = this;\r\n if (!this.isActive) return;\r\n params = params || {};\r\n this.inputFields.forEach(function (f) {\r\n if (params.fields === undefined || params.fields.some(f => self.isPathInside(f.name, f)))\r\n f.reset(params);\r\n });\r\n this.lastValuesString = \"\";\r\n\r\n this._dynamicFields.map((item) => item.reset());\r\n this.onReset();\r\n this.forceRender();\r\n\r\n this.resetButtons.forEach(function (elem) {\r\n elem.hide();\r\n });\r\n }\r\n\r\n /**\r\n * Method for rendering from variables (instead of render function)\r\n * @param {any} selector\r\n * @param {any} name\r\n * @param {any} params\r\n * @param {any} forced\r\n */\r\n addOutputField(selector, name, params, forced = false) {\r\n const field = createOutputField(this, selector, name, params);\r\n this.outputFields.push(field);\r\n if (forced)\r\n this.forceOutputs.push(field);\r\n return field;\r\n }\r\n\r\n render() {\r\n const self = this;\r\n const orderedFields = this.outputFields.map(x => x);\r\n const priorities = orderedFields.map(f => f.get(\"priority\", 0));\r\n if (priorities.length > 0 && priorities.some(x => x != priorities[0]))\r\n orderedFields.sort((a, b) => a.get(\"priority\", 0) - b.get(\"priority\", 0));\r\n orderedFields.forEach(function (field) {\r\n field.render(self);\r\n field.renderExport(self._exportObject.render);\r\n });\r\n }\r\n\r\n forceRender() {\r\n this.forceOutputs.forEach((field) => {\r\n field.render(this);\r\n });\r\n }\r\n\r\n toggleCustomClasses() {\r\n this.toggleClasses.map(customClass => {\r\n customClass.toggle();\r\n });\r\n }\r\n\r\n renderError() {\r\n if (!this._submitOnChange) {\r\n $(\".calc-div-results\").removeClass(\"show-results\");\r\n }\r\n }\r\n \r\n autoValidate(sender) {\r\n sender = sender || null;\r\n this.submitForm(sender, true);\r\n }\r\n \r\n}"],"sourceRoot":""}