{"version":3,"sources":["1Initializers.js","directcostdatatables.js","directcosteditviews.js","directcostlistviews.js","directcostmodels.js"],"names":["PJQ","collections","directcosts","models","views","modules","routes","route","name","callback","projectId","projectWall","initProjectNavigator","parseInt","directCostId","app","addRoutes","DirectCostDataTable","dataTables","DataTable","extend","defaults","language","emptyTable","zeroRecords","subTemplates","header","templating","Template","constants","DIRECTCOSTS","toggleRowClass","events","beforeDataTableRender","this","options","pageLength","settings","rowsPerPage","getDefaultFilter","defaultFilter","filterType","DIRECT_COST_TYPE_FILTER","userSettings","get","_","map","type","DIRECT_COST_STATUS_FILTER","size","statusIds","getFilterValues","typeFilter","getFilter","statusFilter","search","$","val","join","afterHeaderRender","inputs","Selectpicker","el","defaultValue","isGrouped","isIntChoices","isMultiple","noneSelectedText","onChange","bind","value","directCostStatusFilter","directCostTypeFilter","each","filter","setFilter","defaultFilters","getFilterData","result","draft","total","data","row","contains","directCost","directCostStatus","DRAFT","directCostView","renderTotals","getColumns","_this","includeAllColumns","arguments","length","undefined","columns","includeColumns","customFields","customField","push","columnData","title","width","orderable","searchable","defaultContent","render","isAdmin","helpers","erp","getERPIcon","erpSyncStatus","columnName","dateHelpers","getDateString","Date","dateFormats","DATE_TIME","className","formatHelpers","formatCurrency","directCostTypeNames","directCostStatusNames","DATE","companyName","contactName","startsWith","commitments","customFieldType","INTEGER","MONEY","PERCENT","indexOf","fieldValue","getCustomFieldValue","BOOLEAN","CHOICE","choices","choice","find","DATETIME","toLocaleString","parseFloat","numbersOnly","visible","getRowChildTable","childOpts","costTypes","unitsOfMeasure","groups","parentDataTable","dom","DirectCostLineItemDataTable","getRowChildData","LineItems","canEdit","onEditLineItem","noop","onDeleteLineItem","parentData","budget","accountingMethod","AMOUNT","formatDecimal","unitOfMeasure","group","titleSettings","costType","DirectCostEditModal","BaseModal","template","maxWidth","model","isShowCloseButton","onSave","onDelete","click .btn-save-email","click .btn-save","click .btn-push-erp","click .btn-undo-push-erp","click .btn-unlink-erp","click .btn-delete","click .btn-export","click .btn-close","click .btn-email","click .nav-link","beforeModalCreated","_beforeModalCreated","_asyncToGenerator","_regeneratorRuntime","mark","_callee","customFieldValues","wrap","_context","prev","next","isFetched","project","session","hasPermission","fetchDirectCostFieldSettings","coreFieldSettings","sent","fetchDirectCostSettings","fetchDirectCostCustomFields","fetchCostCodes","costCodes","fetchCostTypes","fetchUnitsOfMeasure","fetchERPIntegration","erpIntegration","getSetting","fetchERPObject","index","fieldNumber","fieldTypeId","fieldType","id","DirectCost","directCostType","EXPENSE","description","terms","statusId","isNew","fetch","stop","apply","beforeRender","disabledStatuses","canDelete","canEditStatus","status","APPROVED","syncStatus","integrations","syncStatuses","REVIEWING","SYNCED","canEditLineItems","renderData","activeView","checkFieldVisible","checkFieldRequired","afterRender","_this2","activateView","stopListening","listenTo","renderERP","lineItems","renderGeneral","renderLineItems","updateCounts","text","GENERAL","LINEITEMS","activeViewChanged","e","view","target","hash","replace","tab","_this3","Binder","$el","useDecimalPercentFields","watchElements","typeSelectPicker","onHide","set","getValue","statusPicker","st","disabled","newStatus","oldStatus","save","success","notifications","notify","successNotify","message","setValue","vendorPicker","contacts","ContactsSelectInput","selectedContact","vendor","hideUsers","canViewContacts","isERPSynced","displayContactsBlock","context","contexts","PROJECTCONTACTS","isSingleChoice","reportedByPicker","reportedBy","Datepicker","datepickerOptions","format","datePicker","defaultDate","parseDateString","newDate","directCostCustomFieldsForm","CustomFieldsForm","isEdit","collection","fieldValues","isDirty","fileUploader","files","FileUploaderGrid","attachments","canUpload","useApiV2","canView","includeProjectAttachments","previewImageDimension","onSuccess","file","attachment","destroy","lineItemsView","LineItemsView","lineItemModel","LineItem","canChangeAccountingMethod","showGrandTotal","onAccountingMethodChanged","onLineItemChange","onLineItemAdd","onLineItemDelete","amount","billed","lineItem","saveEmail","_this4","email","fieldName","fieldSettings","findWhere","saveDirectCost","_this5","removeModal","validate","isValid","$appliedOn","inputHelpers","setInputError","$receivedOn","$paidOn","$terms","$description","$type","clearError","showError","prevObject","scrollTop","getChanged","trigger","error","errorNotify","deleteDirectCost","modals","DeleteCancel","body","_this$options$project","_this$options$project2","projectName","trim","subject","concat","ComposeEmailModal","share","$erp","canPush","disablePushReason","renderERPButtons","pushSupported","hasAvailableAction","actions","PUSH_DIRECT_COSTS","canPushChanges","unlinkSupported","UNLINK_DIRECT_COSTS","remove","pushERP","_this6","pushDirectCost","undoPushERP","undoPush","unlinkERP","loader","Loader","unlinkDirectCost","exportDirectCost","downloadFile","urlHelpers","generateEndpoint","endpoint","isAPIv2","hasChanged","close","SaveDontSave","onDontSave","DirectCostSettingsModal","minWidth","change .select-column","click .btn-edit-company-default","click button.settings-save","defaultTypeFilter","defaultStatusFilter","attributes","viewSettings","setting","getDataTableInstance","selectedColumns","columnsDefault","column","defaultFilterSelectPicker","mustSelectValuePerOptGroup","currentView","selectView","DIRECT_COSTS","editCompanySettings","UserSettings","forCompany","show","hide","dataTable","undelegateEvents","empty","isHideSearch","order","columnSelected","sender","currentTarget","closest","prop","fnOnSave","settingTemp","slice","columnTemp","ProjectDirectCosts","BaseView","click .btn-pull-erp","click .btn-settings","click .new-direct-cost","click .btn-view-direct-cost","click .btn-delete-direct-cost","beforeFirstRender","_beforeFirstRender","_callee2","_context2","DirectCosts","costCodeId","costTypeId","fetchDirectCostUserSettings","canAdd","renderView","initDirectCost","viewDirectCost","renderStats","totals","getTotalAmountsByStatus","PENDING","REVISE","renderERPButton","SYNC_DIRECT_COSTS","pullSupported","PULL_DIRECT_COSTS","canPull","pullERP","_this7","pullDirectCosts","res","err","directCosts","directCostTypes","filterSelectPicker","rowId","onPageSizeChange","headerData","getSettings","colReorder","fixedColumnsLeft","fixedColumnsRight","realtime","columnOrderChanged","onRowDoubleClick","afterDataTableRender","contextMenuOptions","onClick","editSettings","newDirectCost","viewDirectCostClicked","getRow","add","deleteDirectCostClicked","removeRow","exportList","parameters","parameter","getTimezoneOffset","ModalViewDirectCosts","BaseModel","idAttribute","parse","Attachments","Contact","beforeSave","toJSON","syncERP","ajax","Request","post","done","response","fail","xhr","responseJSON","makeERPUrl","integration","externalId","providers","QBO","toEmails","ccEmails","BaseLineItem","Group","Attachment","File","CustomField","CustomFieldChoice","DirectCostFieldSetting","Settings","BaseCollection","params","Files","commitmentId","CustomFields","CustomFieldChoices","DirectCostFieldSettings"],"mappings":"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","file":"app.js","sourcesContent":["PJQ.collections.directcosts = PJQ.collections.directcosts ? PJQ.collections.directcosts : {};;\nPJQ.models.directcosts = PJQ.models.directcosts ? PJQ.models.directcosts : {};\nPJQ.views.directcosts = PJQ.views.directcosts ? PJQ.views.directcosts : {};\n\nPJQ.modules.directcosts = {\n routes: [\n {\n route: 'projects/:projectId/directcosts',\n name: 'directcosts',\n callback: function (projectId) {\n PJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"directcosts\");\n }\n },\n {\n route: 'projects/:projectId/directcosts/:directCostId',\n name: 'directcosts',\n callback: function (projectId, directCostId) {\n PJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"directcosts\", {\n directCostId: parseInt(directCostId)\n });\n }\n }\n ]\n};\n\nPJQ.app.addRoutes(PJQ.modules.directcosts.routes);\n","PJQ.views.directcosts.DirectCostDataTable = PJQ.views.dataTables.DataTable.extend({\r\n defaults: {\r\n language: {\r\n emptyTable: 'Click \"Add Direct Cost\" to create a new Direct Cost',\r\n zeroRecords: \"No Direct Costs matched the search criteria\"\r\n },\r\n subTemplates: {\r\n header: new PJQ.templating.Template(PJQ.constants.modules.DIRECTCOSTS, 'data-table-header-direct-costs')\r\n },\r\n toggleRowClass: '.dc-toggle-row'\r\n },\r\n events: {},\r\n beforeDataTableRender: function () {\r\n this.options.pageLength = this.options.settings ? this.options.settings.rowsPerPage : 10;\r\n },\r\n getDefaultFilter: function () {\r\n let defaultFilter = {};\r\n defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER] = this.options.userSettings.get('defaultTypeFilter');\r\n defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER] = _.map(defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER], function (type) {\r\n return type * -1;\r\n });\r\n defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER] = _.size(this.options.statusIds) > 0 ? this.options.statusIds : this.options.userSettings.get('defaultStatusFilter');\r\n\r\n return defaultFilter;\r\n },\r\n getFilterValues: function () {\r\n let typeFilter = this.getFilter(PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER),\r\n statusFilter = this.getFilter(PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER);\r\n return {\r\n search: this.$('.datatable-search').val(),\r\n typeFilter: typeFilter.join(','),\r\n statusFilter: statusFilter.join(',')\r\n };\r\n },\r\n afterHeaderRender: function () {\r\n new PJQ.inputs.Selectpicker({\r\n el: this.$('.direct-cost-filter'),\r\n defaultValue: this.getDefaultFilter(),\r\n isGrouped: true,\r\n isIntChoices: true,\r\n isMultiple: true,\r\n noneSelectedText: 'No Filters',\r\n onChange: _.bind(function (value) {\r\n value.directCostStatusFilter = value.directCostStatusFilter ? value.directCostStatusFilter : [];\r\n value.directCostTypeFilter = value.directCostTypeFilter ? value.directCostTypeFilter : [];\r\n _.each(value, _.bind(function (value, filter) {\r\n if (filter === PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER)\r\n value = _.map(value, function (type) {\r\n return type * -1;\r\n });\r\n this.setFilter(filter, value);\r\n }, this));\r\n }, this)\r\n });\r\n\r\n let defaultFilters = this.getDefaultFilter();\r\n this.setFilter(PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER, defaultFilters[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER]);\r\n this.setFilter(PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER, defaultFilters[PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER]);\r\n },\r\n getFilterData: function () {\r\n let typeFilter = this.getFilter(PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER),\r\n statusFilter = this.getFilter(PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER),\r\n result = null, draft = 0, total = 0;\r\n if (_.size(typeFilter) === 0 && _.size(statusFilter) === 0) {\r\n result = this.options.data;\r\n } else {\r\n result = _.filter(this.options.data, function (row) {\r\n return (_.size(typeFilter) === 0 || _.contains(typeFilter, row.get('type'))) && (_.size(statusFilter) === 0 || _.contains(statusFilter, row.get('statusId')));\r\n });\r\n }\r\n\r\n _.each(result, function (directCost) {\r\n if (directCost.get('statusId') === PJQ.constants.directcosts.directCostStatus.DRAFT)\r\n draft += directCost.get('amount') ? directCost.get('amount') : 0;\r\n else\r\n total += directCost.get('amount') ? directCost.get('amount') : 0;\r\n });\r\n\r\n this.options.directCostView.renderTotals(draft, total);\r\n\r\n return result;\r\n },\r\n getColumns: function (includeAllColumns = false) {\r\n let columns = [],\r\n includeColumns = ['createdOn', 'type', 'status', 'description', 'vendor.companyName', 'vendor.contactName', 'reportedBy.companyName', 'reportedBy.contactName', 'terms', 'appliedOn', 'receivedOn', 'paidOn', 'amount'];\r\n\r\n if (this.options.customFields) {\r\n _.each(this.options.customFields.models, _.bind(function (customField) {\r\n includeColumns.push('fieldValue' + customField.get('fieldNumber'));\r\n }, this));\r\n }\r\n\r\n if (!includeAllColumns) {\r\n if (_.size(this.options.settings.columns) > 0)\r\n includeColumns = this.options.settings.columns;\r\n\r\n columns.push({\r\n \"columnData\": \"childData\",\r\n \"data\": null,\r\n \"title\": \"\",\r\n \"width\": \"20px\",\r\n \"orderable\": false,\r\n \"searchable\": false,\r\n \"defaultContent\": '',\r\n \"render\": (data, type, row) => {\r\n if(!this.options.isAdmin){\r\n return \"\";\r\n }\r\n\r\n return PJQ.helpers.erp.getERPIcon(row.erpSyncStatus());\r\n }\r\n });\r\n }\r\n\r\n _.each(includeColumns, _.bind(function (columnName) {\r\n switch (columnName) {\r\n case 'createdOn':\r\n columns.push({\r\n \"columnData\": \"createdOn\",\r\n \"data\": \"attributes.createdOn\",\r\n \"title\": 'Created',\r\n \"width\": '90px',\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.helpers.dateHelpers.getDateString(new Date(row.get('createdOn')), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME);\r\n }, this)\r\n });\r\n break;\r\n case 'amount':\r\n columns.push({\r\n \"columnData\": \"amount\",\r\n \"data\": \"attributes.amount\",\r\n \"width\": \"10%\",\r\n \"title\": \"Amount\",\r\n \"className\": \"text-align-right\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.helpers.formatHelpers.formatCurrency(row.get('amount'));\r\n }, this)\r\n });\r\n break;\r\n case 'type':\r\n columns.push({\r\n \"columnData\": \"type\",\r\n \"data\": \"attributes.type\",\r\n \"title\": \"Type\",\r\n \"width\": \"110px\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.constants.directcosts.directCostTypeNames[row.get('type')]\r\n }, this)\r\n });\r\n break;\r\n case 'status':\r\n columns.push({\r\n \"columnData\": \"status\",\r\n \"data\": \"attributes.statusId\",\r\n \"title\": \"Status\",\r\n \"width\": \"100px\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.constants.directcosts.directCostStatusNames[row.get('statusId')]\r\n }, this)\r\n });\r\n break;\r\n case 'description':\r\n columns.push({\r\n \"columnData\": \"description\",\r\n \"data\": \"attributes.description\",\r\n \"title\": \"Description\"\r\n });\r\n break;\r\n case 'terms':\r\n columns.push({\r\n \"columnData\": \"terms\",\r\n \"data\": \"attributes.terms\",\r\n \"title\": \"Terms\"\r\n });\r\n break;\r\n case 'appliedOn':\r\n columns.push({\r\n \"columnData\": \"appliedOn\",\r\n \"data\": \"attributes.appliedOn\",\r\n \"title\": 'Applied',\r\n \"width\": '90px',\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('appliedOn') ? PJQ.helpers.dateHelpers.getDateString(new Date(row.get('appliedOn')), PJQ.helpers.dateHelpers.dateFormats.DATE, true) : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n case 'receivedOn':\r\n columns.push({\r\n \"columnData\": \"receivedOn\",\r\n \"data\": \"attributes.receivedOn\",\r\n \"title\": 'Received',\r\n \"width\": '90px',\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('receivedOn') ? PJQ.helpers.dateHelpers.getDateString(new Date(row.get('receivedOn')), PJQ.helpers.dateHelpers.dateFormats.DATE, true) : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n case 'paidOn':\r\n columns.push({\r\n \"columnData\": \"paidOn\",\r\n \"data\": \"attributes.paidOn\",\r\n \"title\": 'Paid',\r\n \"width\": '90px',\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('paidOn') ? PJQ.helpers.dateHelpers.getDateString(new Date(row.get('paidOn')), PJQ.helpers.dateHelpers.dateFormats.DATE, true) : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n case 'vendor.companyName':\r\n columns.push({\r\n \"columnData\": \"vendor.companyName\",\r\n \"title\": \"Vendor\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('vendor') ? row.get('vendor').companyName : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n case 'vendor.contactName':\r\n columns.push({\r\n \"columnData\": \"vendor.contactName\",\r\n \"title\": \"Vendor Contact\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('vendor') ? row.get('vendor').contactName : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n case 'reportedBy.companyName':\r\n columns.push({\r\n \"columnData\": \"reportedBy.companyName\",\r\n \"title\": \"Reported by Company\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('reportedBy') ? row.get('reportedBy').companyName : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n case 'reportedBy.contactName':\r\n columns.push({\r\n \"columnData\": \"reportedBy.contactName\",\r\n \"title\": \"Reported by Contact\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return row.get('reportedBy') ? row.get('reportedBy').contactName : 'N/A';\r\n }, this)\r\n });\r\n break;\r\n default:\r\n if (columnName.startsWith('fieldValue')) {\r\n _.each(this.options.customFields.models, function (customField) {\r\n if (columnName === 'fieldValue' + customField.get('fieldNumber')) {\r\n columns.push({\r\n \"columnData\": 'fieldValue' + customField.get('fieldNumber'),\r\n \"title\": customField.get('name'),\r\n \"className\": [PJQ.constants.commitments.customFieldType.INTEGER, PJQ.constants.commitments.customFieldType.MONEY, PJQ.constants.commitments.customFieldType.PERCENT].indexOf(customField.get('fieldTypeId')) !== -1 ? \"text-align-right\" : \"\",\r\n \"render\": function (data, type, row) {\r\n let fieldValue = row.getCustomFieldValue(customField.get('id'));\r\n fieldValue = (fieldValue !== null) ? fieldValue : '';\r\n switch (customField.get('fieldTypeId')) {\r\n case PJQ.constants.commitments.customFieldType.BOOLEAN:\r\n if (fieldValue != null)\r\n fieldValue = fieldValue ? 'Yes' : 'No';\r\n break;\r\n case PJQ.constants.commitments.customFieldType.CHOICE:\r\n let choices = [];\r\n // convert single choice value into array so that the logic below can work for both types.\r\n if (typeof fieldValue === 'number')\r\n fieldValue = [fieldValue];\r\n\r\n _.each(customField.choices.models, _.bind(function (choice) {\r\n if (_.find(fieldValue, function (value) {\r\n return value === choice.get('id');\r\n }))\r\n choices.push(choice.get('name'));\r\n }, this));\r\n\r\n fieldValue = choices.join((', '));\r\n break;\r\n case PJQ.constants.commitments.customFieldType.DATE:\r\n if (fieldValue) {\r\n if (type !== 'sort' && type !== 'type')\r\n fieldValue = PJQ.helpers.dateHelpers.getDateString(new Date(fieldValue), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\r\n }\r\n if (fieldValue === undefined)\r\n fieldValue = '';\r\n\r\n break;\r\n case PJQ.constants.commitments.customFieldType.DATETIME:\r\n if (fieldValue) {\r\n if (type !== 'sort' && type !== 'type')\r\n fieldValue = PJQ.helpers.dateHelpers.getDateString(new Date(fieldValue), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, false);\r\n }\r\n if (fieldValue === undefined)\r\n fieldValue = '';\r\n\r\n break;\r\n case PJQ.constants.commitments.customFieldType.INTEGER:\r\n if (type !== 'sort' && type !== 'type' && fieldValue) {\r\n fieldValue = parseInt(fieldValue).toLocaleString();\r\n }\r\n break;\r\n case PJQ.constants.commitments.customFieldType.MONEY:\r\n if (type === 'sort' || type === 'type') {\r\n if (fieldValue && fieldValue !== '$')\r\n fieldValue = parseFloat(PJQ.helpers.formatHelpers.numbersOnly(fieldValue, true));\r\n else\r\n fieldValue = 0;\r\n } else {\r\n fieldValue = PJQ.helpers.formatHelpers.formatCurrency(parseInt(PJQ.helpers.formatHelpers.numbersOnly(fieldValue)));\r\n }\r\n break;\r\n case PJQ.constants.commitments.customFieldType.PERCENT:\r\n if (type === 'sort' || type === 'type') {\r\n if (!fieldValue)\r\n fieldValue = 0;\r\n } else {\r\n fieldValue = fieldValue ? PJQ.helpers.formatHelpers.formatCurrency(parseInt(PJQ.helpers.formatHelpers.numbersOnly(fieldValue)), 2, false) + '%' : '';\r\n }\r\n break;\r\n }\r\n\r\n return fieldValue;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n }, this));\r\n\r\n if (!includeAllColumns) {\r\n columns.push({\r\n \"title\": '',\r\n \"render\": _.bind(function (data, type, row) {\r\n return '
';\r\n }, this),\r\n \"orderable\": false,\r\n \"searchable\": false,\r\n \"width\": \"90px\",\r\n \"className\": \"text-center\",\r\n \"visible\": true\r\n });\r\n }\r\n\r\n return columns;\r\n },\r\n getRowChildTable: function (childOpts) {\r\n childOpts.costTypes = this.options.costTypes;\r\n childOpts.unitsOfMeasure = this.options.unitsOfMeasure;\r\n childOpts.groups = this.options.groups;\r\n childOpts.parentDataTable = this;\r\n childOpts.dom = 't';\r\n return new PJQ.views.directcosts.DirectCostLineItemDataTable(childOpts);\r\n },\r\n getRowChildData: function (row) {\r\n return new PJQ.collections.directcosts.LineItems(null, {\r\n projectId: row.data().get('projectId'),\r\n directCostId: row.data().get('id')\r\n });\r\n }\r\n});\r\n\r\nPJQ.views.directcosts.DirectCostLineItemDataTable = PJQ.views.dataTables.DataTable.extend({\r\n defaults: {\r\n language: {\r\n zeroRecords: \"No Line Items Added\"\r\n },\r\n canEdit: false,\r\n onEditLineItem: _.noop,\r\n onDeleteLineItem: _.noop\r\n },\r\n getColumns: function (includeAllColumns = false) {\r\n let columns = [],\r\n includeColumns;\r\n if (this.options.parentData && this.options.parentData.get('accountingMethod') === PJQ.constants.budget.accountingMethod.AMOUNT)\r\n includeColumns = ['group', 'costTypeDescription', 'description', 'amount', 'billedToDate', 'amountRemaining'];\r\n else\r\n includeColumns = ['group', 'costTypeDescription', 'description', 'quantity', 'unitOfMeasure', 'unitPrice', 'amount', 'billedToDate', 'amountRemaining'];\r\n\r\n _.each(includeColumns, _.bind(function (columnName) {\r\n switch (columnName) {\r\n case 'description':\r\n columns.push({\r\n \"columnData\": \"description\",\r\n \"data\": \"attributes.description\",\r\n \"orderable\": false,\r\n \"title\": \"Description\"\r\n\r\n });\r\n break;\r\n case 'quantity':\r\n columns.push({\r\n \"columnData\": \"quantity\",\r\n \"data\": \"attributes.quantity\",\r\n \"orderable\": false,\r\n \"width\": \"8%\",\r\n \"title\": \"Units\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.helpers.formatHelpers.formatDecimal(row.get('quantity'), 2);\r\n }, this)\r\n });\r\n break;\r\n case 'unitOfMeasure':\r\n columns.push({\r\n \"columnData\": \"unitOfMeasure\",\r\n \"data\": \"attributes.unitId\",\r\n \"orderable\": false,\r\n \"title\": \"Unit\",\r\n \"width\": \"5%\",\r\n \"render\": _.bind(function (data, type, row) {\r\n let unitOfMeasure = this.options.unitsOfMeasure.get(row.get('unitId'));\r\n return unitOfMeasure ? unitOfMeasure.get('code') : '';\r\n }, this)\r\n });\r\n break;\r\n case 'unitPrice':\r\n columns.push({\r\n \"columnData\": \"unitPrice\",\r\n \"data\": \"attributes.unitPrice\",\r\n \"orderable\": false,\r\n \"width\": \"10%\",\r\n \"title\": \"Unit Price\",\r\n \"className\": \"text-align-right\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.helpers.formatHelpers.formatCurrency(row.get('unitPrice'));\r\n }, this)\r\n });\r\n break;\r\n case 'amount':\r\n columns.push({\r\n \"columnData\": \"amount\",\r\n \"data\": \"attributes.amount\",\r\n \"orderable\": false,\r\n \"width\": \"10%\",\r\n \"title\": \"Amount\",\r\n \"className\": \"text-align-right\",\r\n \"render\": _.bind(function (data, type, row) {\r\n return PJQ.helpers.formatHelpers.formatCurrency(row.get('amount'));\r\n }, this)\r\n });\r\n break;\r\n case 'group':\r\n columns.push({\r\n \"columnData\": \"group\",\r\n \"orderable\": false,\r\n \"title\": \"Cost Code\",\r\n \"render\": _.bind(function (data, type, row) {\r\n let group = this.options.groups.get(row.get('groupId'));\r\n return group ? group.get('groupName') : '';\r\n }, this)\r\n });\r\n break;\r\n case 'costType':\r\n columns.push({\r\n \"columnData\": \"costType\",\r\n \"orderable\": false,\r\n \"title\": \"Type Code\",\r\n \"titleSettings\": \"Cost Type\",\r\n \"width\": \"8%\",\r\n \"render\": _.bind(function (data, type, row) {\r\n let costType = this.options.costTypes.get(row.get('costTypeId'));\r\n return costType ? costType.get('code') : '';\r\n }, this)\r\n });\r\n break;\r\n case 'costTypeDescription':\r\n columns.push({\r\n \"columnData\": \"costTypeDescription\",\r\n \"orderable\": false,\r\n \"title\": \"Type\",\r\n \"render\": _.bind(function (data, type, row) {\r\n let costType = this.options.costTypes.get(row.get('costTypeId'));\r\n return costType ? costType.get('name') : '';\r\n }, this)\r\n });\r\n break;\r\n }\r\n }, this));\r\n\r\n return columns;\r\n }\r\n});\r\n","PJQ.views.directcosts.DirectCostEditModal = PJQ.views.BaseModal.extend({\r\n defaults: {\r\n template: new PJQ.templating.Template(PJQ.constants.modules.DIRECTCOSTS, 'modal-direct-cost-edit'),\r\n width: '95%',\r\n maxWidth: 1500,\r\n model: null,\r\n isShowCloseButton: true,\r\n onSave: _.noop(),\r\n onDelete: _.noop()\r\n },\r\n events: {\r\n 'click .btn-save-email': 'saveEmail',\r\n 'click .btn-save': 'saveDirectCost',\r\n 'click .btn-push-erp': 'pushERP',\r\n 'click .btn-undo-push-erp': 'undoPushERP',\r\n 'click .btn-unlink-erp': 'unlinkERP',\r\n 'click .btn-delete': 'deleteDirectCost',\r\n 'click .btn-export': 'exportDirectCost',\r\n 'click .btn-close': 'close',\r\n 'click .btn-email': 'email',\r\n 'click .nav-link': 'activeViewChanged'\r\n },\r\n beforeModalCreated: async function () {\r\n this.isFetched = false;\r\n this.options.project = PJQ.app.session.project;\r\n this.options.isAdmin = PJQ.app.session.project.hasPermission('directCosts.isAdmin');\r\n\r\n this.coreFieldSettings = await PJQ.app.session.fetchDirectCostFieldSettings();\r\n this.settings = await PJQ.app.session.fetchDirectCostSettings();\r\n this.customFields = await this.options.project.fetchDirectCostCustomFields();\r\n this.costCodes = await this.options.project.fetchCostCodes();\r\n this.costTypes = await this.options.project.fetchCostTypes();\r\n this.unitsOfMeasure = await this.options.project.fetchUnitsOfMeasure();\r\n this.erpIntegration = await PJQ.app.session.fetchERPIntegration();\r\n\r\n if (this.erpIntegration != null && this.erpIntegration.getSetting('syncProjects')) {\r\n await this.options.project.fetchERPObject();\r\n }\r\n\r\n if (this.model == null) {\r\n let customFieldValues = [];\r\n\r\n _.each(this.customFields.models, function (model, index) {\r\n let value = model.get('defaultValue') ? model.get('defaultValue') : '';\r\n if (model.get('fieldType') === 'CHOICE') {\r\n value = parseInt(value);\r\n }\r\n customFieldValues.push({\r\n fieldNumber: model.get('fieldNumber'),\r\n fieldTypeId: model.get('fieldTypeId'),\r\n fieldType: model.get('fieldType'),\r\n isMultiple: model.get('isMultiple'),\r\n value: value,\r\n id: model.get('id')\r\n })\r\n }, this);\r\n\r\n this.model = new PJQ.models.directcosts.DirectCost({\r\n type: PJQ.constants.directcosts.directCostType.EXPENSE,\r\n description: '',\r\n terms: '',\r\n projectId: PJQ.app.session.project.id,\r\n statusId: PJQ.constants.directcosts.directCostStatus.DRAFT,\r\n accountingMethod: this.settings.get('defaultAccountingMethod'),\r\n customFieldValues: customFieldValues\r\n });\r\n }\r\n\r\n if (!this.model.isNew()) {\r\n await this.model.fetch();\r\n }\r\n\r\n this.isFetched = true;\r\n this.render();\r\n },\r\n beforeRender: function () {\r\n if (!this.isFetched) {\r\n return;\r\n }\r\n\r\n this.options.disabledStatuses = [];\r\n this.options.canEdit = this.options.project.hasPermission('directCosts.canEdit');\r\n this.options.canDelete = this.options.isAdmin;\r\n this.options.canEditStatus = this.options.isAdmin;\r\n if (this.model != null) {\r\n let status = this.model.get('statusId');\r\n if (status === PJQ.constants.directcosts.directCostStatus.DRAFT) {\r\n this.options.canEdit = true;\r\n } else if (status === PJQ.constants.directcosts.directCostStatus.APPROVED) {\r\n this.options.canDelete = false;\r\n this.options.canEdit = this.options.canEdit && this.model.isNew();\r\n } else {\r\n this.options.canEdit = PJQ.app.session.project.hasPermission('directCosts.canEdit');\r\n }\r\n\r\n if (this.erpIntegration != null) {\r\n let syncStatus = this.model.erpSyncStatus();\r\n if (syncStatus === PJQ.constants.integrations.erp.syncStatuses.REVIEWING\r\n || syncStatus === PJQ.constants.integrations.erp.syncStatuses.APPROVED\r\n || syncStatus === PJQ.constants.integrations.erp.syncStatuses.SYNCED\r\n ) {\r\n this.options.canEdit = false;\r\n this.options.canEditLineItems = false;\r\n this.options.canDelete = false;\r\n this.options.canEditStatus = false;\r\n }\r\n }\r\n }\r\n },\r\n renderData: function () {\r\n return {\r\n isFetched: this.isFetched,\r\n model: this.model,\r\n canEdit: this.options.canEdit,\r\n isAdmin: this.options.isAdmin,\r\n canDelete: this.options.canDelete,\r\n erpIntegration: this.erpIntegration,\r\n activeView: this.options.activeView,\r\n views: this.views,\r\n checkFieldVisible: _.bind(this.checkFieldVisible, this),\r\n checkFieldRequired: _.bind(this.checkFieldRequired, this)\r\n }\r\n },\r\n afterRender: function () {\r\n if (!this.isFetched) {\r\n return;\r\n }\r\n\r\n this.activateView(this.options.activeView);\r\n\r\n this.stopListening(this.model);\r\n this.listenTo(this.model, 'change:statusId', () => {\r\n this.renderERP();\r\n });\r\n this.stopListening(this.model.lineItems);\r\n this.listenTo(this.model.lineItems, 'update', () => {\r\n this.renderERP();\r\n });\r\n this.renderERP();\r\n\r\n this.renderGeneral();\r\n this.renderLineItems();\r\n this.updateCounts();\r\n this.renderTotals();\r\n },\r\n updateCounts: function () {\r\n // todo: fix this to account for deleted items on an existing model\r\n this.$('.count-line-items').text(_.size(this.model.lineItems.models));\r\n },\r\n views: {\r\n GENERAL: 'D_General',\r\n LINEITEMS: 'D_LineItems'\r\n },\r\n activeViewChanged: function (e) {\r\n let view = e.target.hash ? e.target.hash.replace('#', '') : null;\r\n this.activateView(view);\r\n },\r\n activateView: function (view) {\r\n switch (view) {\r\n case this.views.LINEITEMS:\r\n // do nothing\r\n break;\r\n default:\r\n view = this.views.GENERAL;\r\n break;\r\n }\r\n this.$('.nav-link[href=\"#' + view + '\"]').tab('show');\r\n this.options.activeView = view;\r\n },\r\n renderGeneral: function () {\r\n new PJQ.Binder(this.$el, this.model, {\r\n canEdit: !this.options.canEdit ? false : null,\r\n useDecimalPercentFields: true,\r\n watchElements: [\r\n 'input',\r\n 'textarea'\r\n ]\r\n });\r\n\r\n if (this.checkFieldVisible('type')) {\r\n this.typeSelectPicker = new PJQ.inputs.Selectpicker({\r\n el: this.$('.direct-cost-type'),\r\n isIntChoices: true,\r\n canEdit: this.options.canEdit,\r\n defaultValue: this.model.get('type'),\r\n onHide: _.bind(function () {\r\n this.model.set('type', this.typeSelectPicker.getValue());\r\n }, this)\r\n });\r\n }\r\n\r\n this.statusPicker = new PJQ.inputs.Selectpicker({\r\n el: this.$('.select-status'),\r\n isIntChoices: true,\r\n canEdit: this.options.canEditStatus,\r\n defaultValue: this.model.get('statusId'),\r\n choices: _.map(PJQ.constants.directcosts.directCostStatus, (st) => {\r\n return {\r\n id: st,\r\n name: PJQ.constants.directcosts.directCostStatusNames[st],\r\n disabled: this.options.disabledStatuses != null && this.options.disabledStatuses.indexOf(st) > -1\r\n }\r\n }),\r\n onChange: (newStatus) => {\r\n let oldStatus = this.model.get('statusId');\r\n if(newStatus === oldStatus){\r\n return;\r\n }\r\n\r\n this.model.set('statusId', newStatus);\r\n if (!this.model.isNew()) {\r\n this.save((success) => {\r\n if (success) {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost saved successfully'\r\n });\r\n } else {\r\n this.model.set('statusId', oldStatus);\r\n this.statusPicker.setValue(oldStatus);\r\n }\r\n });\r\n } else{\r\n this.render();\r\n }\r\n }\r\n });\r\n\r\n if (this.checkFieldVisible('vendor')) {\r\n this.vendorPicker = new PJQ.views.contacts.ContactsSelectInput({\r\n el: this.$('.vendor'),\r\n selectedContact: this.model.vendor,\r\n hideUsers: true,\r\n canViewContacts: this.options.project.hasPermission('projectContacts.canView'),\r\n canEdit: this.options.isAdmin && !this.model.isERPSynced(),\r\n displayContactsBlock: true,\r\n context: PJQ.constants.contacts.contexts.PROJECTCONTACTS,\r\n isSingleChoice: true,\r\n onChange: _.bind(function (selectedContact) {\r\n this.model.vendor = selectedContact;\r\n this.model.set('vendorId', selectedContact ? selectedContact.get('contactId') : null);\r\n }, this)\r\n });\r\n }\r\n\r\n if (this.checkFieldVisible('reportedBy')) {\r\n this.reportedByPicker = new PJQ.views.contacts.ContactsSelectInput({\r\n el: this.$('.reported-by'),\r\n selectedContact: this.model.reportedBy,\r\n hideUsers: true,\r\n canViewContacts: this.options.project.hasPermission('projectContacts.canView'),\r\n canEdit: this.options.isAdmin,\r\n displayContactsBlock: true,\r\n context: PJQ.constants.contacts.contexts.PROJECTCONTACTS,\r\n isSingleChoice: true,\r\n onChange: _.bind(function (selectedContact) {\r\n this.model.reportedBy = selectedContact;\r\n this.model.set('reportedById', selectedContact ? selectedContact.id : null);\r\n }, this)\r\n });\r\n }\r\n\r\n if (this.checkFieldVisible('appliedOn')) {\r\n new PJQ.inputs.Datepicker({\r\n el: this.$('.applied-on'),\r\n canEdit: this.options.canEdit,\r\n datepickerOptions: {\r\n format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\r\n defaultDate: this.model.get('appliedOn') != null ? PJQ.helpers.dateHelpers.parseDateString(this.model.get('appliedOn'), false) : null\r\n },\r\n onChange: _.bind(function (newDate) {\r\n this.model.set('appliedOn', newDate);\r\n }, this)\r\n });\r\n }\r\n\r\n if (this.checkFieldVisible('receivedOn')) {\r\n new PJQ.inputs.Datepicker({\r\n el: this.$('.received-on'),\r\n canEdit: this.options.canEdit,\r\n datepickerOptions: {\r\n format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\r\n defaultDate: this.model.get('receivedOn') != null ? PJQ.helpers.dateHelpers.parseDateString(this.model.get('receivedOn'), false) : null\r\n },\r\n onChange: _.bind(function (newDate) {\r\n this.model.set('receivedOn', newDate);\r\n }, this)\r\n });\r\n }\r\n\r\n if (this.checkFieldVisible('paidOn')) {\r\n new PJQ.inputs.Datepicker({\r\n el: this.$('.paid-on'),\r\n canEdit: this.options.canEdit,\r\n datepickerOptions: {\r\n format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\r\n defaultDate: this.model.get('paidOn') != null ? PJQ.helpers.dateHelpers.parseDateString(this.model.get('paidOn'), false) : null\r\n },\r\n onChange: _.bind(function (newDate) {\r\n this.model.set('paidOn', newDate);\r\n }, this)\r\n });\r\n }\r\n\r\n if (_.size(this.customFields) > 0) {\r\n this.directCostCustomFieldsForm = new PJQ.views.customFields.CustomFieldsForm({\r\n el: this.$('.direct-cost-custom-fields'),\r\n isAdmin: true,\r\n isEdit: this.options.canEdit,\r\n collection: this.customFields,\r\n fieldValues: this.model.get('customFieldValues'),\r\n onChange: _.bind(function () {\r\n this.model.isDirty = true;\r\n }, this)\r\n });\r\n }\r\n\r\n if (this.checkFieldVisible('attachments')) {\r\n this.fileUploader = new PJQ.views.files.FileUploaderGrid({\r\n el: this.$('.direct-cost-file-uploader'),\r\n collection: this.model.attachments,\r\n canUpload: this.options.canEdit,\r\n useApiV2: true,\r\n canView: false,\r\n canDelete: this.options.isAdmin,\r\n includeProjectAttachments: false,\r\n previewImageDimension: 150,\r\n onSuccess: _.bind(function (file) {\r\n this.model.isDirty = true;\r\n }, this),\r\n onDelete: _.bind(function (attachment, callback) {\r\n if (attachment.get('id') > 0) {\r\n attachment.set('delete', true);\r\n } else {\r\n attachment.destroy();\r\n }\r\n\r\n this.model.isDirty = true;\r\n callback();\r\n }, this)\r\n });\r\n }\r\n },\r\n renderLineItems() {\r\n this.lineItemsView = new PJQ.views.budget.LineItemsView({\r\n el: this.$('.direct-cost-line-items'),\r\n collection: this.model.lineItems,\r\n lineItemModel: PJQ.models.directcosts.LineItem,\r\n accountingMethod: this.model.get('accountingMethod'),\r\n canEdit: this.options.canEdit,\r\n canDelete: this.options.canEdit,\r\n canChangeAccountingMethod: true,\r\n showGrandTotal: true,\r\n onAccountingMethodChanged: _.bind(function (value) {\r\n this.model.set('accountingMethod', value);\r\n }, this),\r\n onLineItemChange: _.bind(function () {\r\n this.model.isDirty = true;\r\n }, this),\r\n onLineItemAdd: _.bind(function () {\r\n this.updateCounts();\r\n }, this),\r\n onLineItemDelete: _.bind(function () {\r\n this.updateCounts();\r\n }, this)\r\n });\r\n },\r\n renderTotals: function () {\r\n let amount = 0,\r\n billed = 0;\r\n _.each(this.model.lineItems.models, function (lineItem) {\r\n amount += lineItem.get('amount');\r\n billed += lineItem.get('billedToDate');\r\n });\r\n this.$('.total-amount').text(PJQ.helpers.formatHelpers.formatCurrency(amount));\r\n this.$('.total-billed').text(PJQ.helpers.formatHelpers.formatCurrency(billed));\r\n this.$('.total-remaining').text(PJQ.helpers.formatHelpers.formatCurrency(amount - billed));\r\n },\r\n saveEmail: function () {\r\n this.save((success) => {\r\n if (success) {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost saved successfully'\r\n });\r\n\r\n this.email();\r\n }\r\n });\r\n },\r\n checkFieldVisible: function (fieldName) {\r\n if (this.coreFieldSettings) {\r\n let fieldSettings = this.coreFieldSettings.findWhere({fieldName: fieldName});\r\n if (fieldSettings != null) {\r\n return fieldSettings.get('isVisible');\r\n }\r\n }\r\n return true;\r\n },\r\n checkFieldRequired: function (fieldName) {\r\n if (this.coreFieldSettings) {\r\n let fieldSettings = this.coreFieldSettings.findWhere({fieldName: fieldName});\r\n if (fieldSettings != null) {\r\n return fieldSettings.get('isRequired');\r\n }\r\n }\r\n return false;\r\n },\r\n saveDirectCost: function () {\r\n this.save((success) => {\r\n if (success) {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost saved successfully'\r\n });\r\n\r\n this.removeModal();\r\n }\r\n });\r\n },\r\n validate: function () {\r\n let isValid = true;\r\n\r\n if (this.directCostCustomFieldsForm != null && !this.directCostCustomFieldsForm.validate()) {\r\n isValid = false;\r\n }\r\n\r\n if (this.checkFieldRequired('vendor')) {\r\n if (!this.vendorPicker.validate()) {\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('reportedBy')) {\r\n if (!this.reportedByPicker.validate()) {\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('appliedOn')) {\r\n let $appliedOn = this.$('.applied-on');\r\n PJQ.helpers.inputHelpers.setInputError($appliedOn, true);\r\n if (this.model.get('appliedOn') == null || this.model.get('appliedOn').length === 0) {\r\n PJQ.helpers.inputHelpers.setInputError($appliedOn, false);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('receivedOn')) {\r\n let $receivedOn = this.$('.received-on');\r\n PJQ.helpers.inputHelpers.setInputError($receivedOn, true);\r\n if (this.model.get('receivedOn') == null || this.model.get('receivedOn').length === 0) {\r\n PJQ.helpers.inputHelpers.setInputError($receivedOn, false);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('paidOn')) {\r\n let $paidOn = this.$('.paid-on');\r\n PJQ.helpers.inputHelpers.setInputError($paidOn, true);\r\n if (this.model.get('paidOn') == null || this.model.get('paidOn').length === 0) {\r\n PJQ.helpers.inputHelpers.setInputError($paidOn, false);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('terms')) {\r\n let $terms = this.$('.terms');\r\n PJQ.helpers.inputHelpers.setInputError($terms, true);\r\n if (_.size(this.model.get('terms')) === 0) {\r\n PJQ.helpers.inputHelpers.setInputError($terms, false);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('description')) {\r\n let $description = this.$('.description');\r\n PJQ.helpers.inputHelpers.setInputError($description, true);\r\n if (_.size(this.model.get('description')) === 0) {\r\n PJQ.helpers.inputHelpers.setInputError($description, false);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('type')) {\r\n let $type = this.$('.direct-cost-type');\r\n PJQ.helpers.inputHelpers.setInputError($type, true);\r\n if (this.model.get('type') == null) {\r\n PJQ.helpers.inputHelpers.setInputError($type, false);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (this.checkFieldRequired('attachments')) {\r\n this.fileUploader.clearError();\r\n let hasValidAttachment = _.find(this.model.attachments.models, function (model) {\r\n return !model.get('delete')\r\n }, this) != null;\r\n\r\n if (!hasValidAttachment) {\r\n this.fileUploader.showError('Missing attachment', 100000);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!isValid && this.options.activeView !== 'general') {\r\n this.activateView(this.views.GENERAL);\r\n return isValid;\r\n }\r\n\r\n if (!this.lineItemsView.validate()) {\r\n isValid = false;\r\n\r\n this.activateView(this.views.LINEITEMS);\r\n return isValid\r\n }\r\n\r\n return isValid;\r\n },\r\n save: function (callback) {\r\n if (!this.validate()) {\r\n this.$('.modal').prevObject.scrollTop(0);\r\n if (typeof callback === 'function') {\r\n callback(false);\r\n }\r\n return;\r\n }\r\n\r\n this.model.save({\r\n lineItems: this.model.lineItems.models,\r\n customFields: this.directCostCustomFieldsForm != null ? this.directCostCustomFieldsForm.getChanged() : null\r\n }, {\r\n success: _.bind(function () {\r\n this.render();\r\n if (typeof this.options.onSave === 'function') {\r\n this.options.onSave(this.model);\r\n }\r\n\r\n this.options.project.trigger('directCostChanged', this.model);\r\n if (typeof callback === 'function') {\r\n callback(true);\r\n }\r\n }, this),\r\n error: () => {\r\n if (typeof callback === 'function') {\r\n callback(false);\r\n }\r\n PJQ.notifications.notify.errorNotify({\r\n message: \"Encountered an error while saving this Direct Cost. Please contact customer service.\"\r\n });\r\n }\r\n });\r\n },\r\n deleteDirectCost: function () {\r\n new PJQ.views.modals.DeleteCancel({\r\n header: \"Confirm Delete\",\r\n body: \"Are you sure you want to delete this direct cost?\",\r\n onDelete: _.bind(function () {\r\n this.model.destroy({\r\n success: _.bind(function () {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct cost deleted successfully'\r\n });\r\n\r\n if (typeof this.options.onDelete === 'function')\r\n this.options.onDelete();\r\n\r\n this.removeModal();\r\n }, this)\r\n });\r\n }, this)\r\n });\r\n },\r\n email: function () {\r\n let projectName = this.options.project?.get('projectName')?.trim();\r\n let subject = `A Direct Cost has been shared with you ${projectName && _.size(projectName) > 0 ? `for ${projectName}` : ''}`;\r\n new PJQ.views.email.ComposeEmailModal({\r\n header: \"Email Direct Cost\",\r\n project: PJQ.app.session.project,\r\n subject: subject,\r\n onSave: _.bind(function (data) {\r\n this.model.share(data, _.bind(function () {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost email sent'\r\n });\r\n }, this));\r\n }, this)\r\n });\r\n },\r\n renderERP: function () {\r\n let $erp = this.$('.erp-sync');\r\n if (!this.options.isAdmin || this.erpIntegration == null || !this.options.project.isERPSynced()) {\r\n $erp.remove();\r\n return;\r\n }\r\n\r\n let canPush = true,\r\n disablePushReason = \"\";\r\n if (_.size(this.model.lineItems.models) === 0\r\n || this.model.get('statusId') !== PJQ.constants.directcosts.directCostStatus.APPROVED) {\r\n canPush = false;\r\n disablePushReason = \"Direct Cost must be approved and have line items\";\r\n }\r\n\r\n PJQ.helpers.erp.renderERPButtons($erp, {\r\n pushSupported: !this.model.isERPSynced() && this.erpIntegration.hasAvailableAction(PJQ.constants.integrations.actions.PUSH_DIRECT_COSTS),\r\n canPush: canPush,\r\n canPushChanges: false,\r\n disablePushReason: disablePushReason,\r\n unlinkSupported: this.erpIntegration.hasAvailableAction(PJQ.constants.integrations.actions.UNLINK_DIRECT_COSTS),\r\n status: this.model.erpSyncStatus()\r\n });\r\n },\r\n pushERP: function (callback) {\r\n if (!this.erpIntegration.hasAvailableAction(PJQ.constants.integrations.actions.PUSH_DIRECT_COSTS)) {\r\n return;\r\n }\r\n\r\n this.save((success) => {\r\n if (success) {\r\n this.erpIntegration.pushDirectCost(this.model, () => {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost pushed to ERP'\r\n });\r\n\r\n if (typeof this.options.onSave === 'function') {\r\n this.options.onSave(this.model);\r\n }\r\n\r\n if (callback && typeof callback === 'function') {\r\n callback();\r\n } else {\r\n this.render();\r\n }\r\n });\r\n }\r\n });\r\n },\r\n undoPushERP: function () {\r\n if (this.model.erpSyncStatus() === PJQ.constants.integrations.erp.syncStatuses.REVIEWING) {\r\n this.erpIntegration.undoPush(this.model, _.bind(function () {\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost removed from ERP approval'\r\n });\r\n\r\n if (typeof this.options.onSave === 'function') {\r\n this.options.onSave(this.model);\r\n }\r\n\r\n this.render();\r\n }, this));\r\n }\r\n },\r\n unlinkERP: function () {\r\n if (this.erpIntegration != null) {\r\n let loader = new PJQ.Loader(this.$('.modal-content'));\r\n this.erpIntegration.unlinkDirectCost(this.model, _.bind(function (success) {\r\n if (success) {\r\n loader.remove();\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct Cost unlinked from ERP'\r\n });\r\n\r\n if (typeof this.options.onSave === 'function') {\r\n this.options.onSave(this.model);\r\n }\r\n\r\n this.render();\r\n }\r\n }, this));\r\n }\r\n },\r\n exportDirectCost: function () {\r\n let callback = _.bind(function () {\r\n PJQ.files.downloadFile(PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'projects',\r\n value: this.model.get('projectId')\r\n },\r\n {\r\n endpoint: 'directcosts',\r\n value: this.model.get('id')\r\n },\r\n {\r\n endpoint: 'export',\r\n }\r\n ]), {isAPIv2: true});\r\n }, this);\r\n\r\n if (this.options.canEdit && this.model.hasChanged()) {\r\n this.save(callback);\r\n } else {\r\n callback();\r\n }\r\n },\r\n close: function () {\r\n if (this.model.hasChanged() && this.options.canEdit) {\r\n new PJQ.views.modals.SaveDontSave({\r\n header: \"Unsaved Changes\",\r\n body: \"Do you want to save changes?\",\r\n onSave: _.bind(function () {\r\n this.saveDirectCost();\r\n this.removeModal();\r\n }, this),\r\n onDontSave: _.bind(function () {\r\n this.removeModal();\r\n }, this)\r\n });\r\n } else {\r\n this.removeModal();\r\n }\r\n }\r\n});\r\n\r\nPJQ.views.directcosts.DirectCostSettingsModal = PJQ.views.BaseModal.extend({\r\n defaults: {\r\n template: new PJQ.templating.Template(PJQ.constants.modules.DIRECTCOSTS, 'modal-direct-cost-settings'),\r\n minWidth: '600px',\r\n },\r\n events: {\r\n 'change .select-column': 'columnSelected',\r\n 'click .btn-edit-company-default': 'editCompanySettings',\r\n 'click button.settings-save': 'onSave'\r\n },\r\n beforeModalCreated: function () {\r\n this.userSettings = this.options.directCostView.userSettings;\r\n },\r\n beforeRender: function () {\r\n // copy userSettings for our UI; we only update global userSettings object on save.\r\n this.options.userSettings = [];\r\n\r\n this.options.defaultTypeFilter = this.userSettings.get('defaultTypeFilter');\r\n this.options.defaultStatusFilter = this.userSettings.get('defaultStatusFilter');\r\n _.each(this.userSettings.attributes.viewSettings, _.bind(function (setting) {\r\n let columns = this.options.directCostView.getDataTableInstance(setting.view).getColumns(true),\r\n selectedColumns = (_.size(setting.columns) > 0) ? setting.columns : setting.columnsDefault;\r\n _.each(columns, _.bind(function (column) {\r\n column.visible = selectedColumns.indexOf(column.columnData) !== -1\r\n }, this));\r\n\r\n this.options.userSettings.push({\r\n view: setting.view,\r\n rowsPerPage: setting.rowsPerPage,\r\n columns: columns\r\n });\r\n }, this));\r\n },\r\n renderData: function () {\r\n return {\r\n userSettings: this.userSettings\r\n }\r\n },\r\n afterRender: function () {\r\n let defaultFilter = {};\r\n defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER] = this.userSettings.get('defaultTypeFilter');\r\n defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER] = _.map(defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER], function (type) {\r\n return type * -1;\r\n });\r\n defaultFilter[PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER] = this.userSettings.get('defaultStatusFilter');\r\n\r\n this.defaultFilterSelectPicker = new PJQ.inputs.Selectpicker({\r\n el: this.$('.select-filter-default'),\r\n isIntChoices: true,\r\n isMultiple: true,\r\n isGrouped: true,\r\n mustSelectValuePerOptGroup: false,\r\n defaultValue: defaultFilter,\r\n onHide: _.bind(function () {\r\n this.options.defaultTypeFilter = this.defaultFilterSelectPicker.getValue()[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER];\r\n this.options.defaultTypeFilter = _.map(this.options.defaultTypeFilter, function (type) {\r\n return type * -1;\r\n });\r\n\r\n this.options.defaultStatusFilter = this.defaultFilterSelectPicker.getValue()[PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER];\r\n }, this)\r\n });\r\n\r\n this.rowsPerPage = new PJQ.inputs.Selectpicker({\r\n el: this.$('select.rows-per-page'),\r\n isIntChoices: true,\r\n onChange: _.bind(function (value) {\r\n this.currentView.rowsPerPage = value;\r\n }, this)\r\n });\r\n\r\n this.selectView(PJQ.constants.directcosts.view.DIRECT_COSTS);\r\n },\r\n editCompanySettings: function () {\r\n this.userSettings = new PJQ.models.directcosts.UserSettings(null, {\r\n forCompany: true\r\n });\r\n this.userSettings.fetch({\r\n success: _.bind(function () {\r\n this.render();\r\n }, this)\r\n });\r\n },\r\n selectView: function (view) {\r\n this.currentView = _.find(this.options.userSettings, _.bind(function (setting) {\r\n return setting.view === view;\r\n }, this));\r\n\r\n if (view.indexOf('-') === -1) {\r\n this.rowsPerPage.setValue(this.currentView.rowsPerPage);\r\n this.$('div.rows-per-page').show();\r\n } else\r\n this.$('div.rows-per-page').hide();\r\n\r\n if (this.dataTable) {\r\n this.dataTable.undelegateEvents();\r\n $(this.dataTable.el).empty();\r\n }\r\n\r\n this.dataTable = new PJQ.views.dataTables.DataTable({\r\n el: this.$('div.select-columns-datatable'),\r\n data: this.currentView.columns,\r\n isHideSearch: true,\r\n pageLength: 6,\r\n order: [],\r\n columns: [\r\n {\"data\": \"title\", \"title\": \"Column\", \"orderable\": false},\r\n {\r\n \"data\": \"visible\",\r\n \"title\": \"Show\",\r\n \"orderable\": false,\r\n \"searchable\": false,\r\n \"render\": _.bind(function (data) {\r\n return ('
');\r\n }, this),\r\n \"width\": '10%'\r\n }\r\n ],\r\n dom: '<\"top\"<\"clear\">>rt<\"bottom\"p<\"clear\">>'\r\n });\r\n\r\n },\r\n columnSelected: function (sender) {\r\n this.dataTable.dataTable.row($(sender.currentTarget).closest('tr')).data().visible = $(sender.currentTarget).prop('checked');\r\n },\r\n onSave: function () {\r\n\r\n let fnOnSave = _.bind(function () {\r\n if (typeof this.options.onSave === 'function')\r\n this.options.onSave();\r\n this.removeModal();\r\n }, this);\r\n\r\n this.userSettings.set('defaultTypeFilter', this.options.defaultTypeFilter);\r\n this.userSettings.set('defaultStatusFilter', this.options.defaultStatusFilter);\r\n\r\n _.each(this.options.userSettings, _.bind(function (settingTemp) {\r\n _.each(this.userSettings.get('viewSettings'), _.bind(function (setting) {\r\n if (settingTemp.view === setting.view) {\r\n setting.rowsPerPage = settingTemp.rowsPerPage;\r\n\r\n let columns = _.size(setting.columns) > 0 ? setting.columns.slice() : setting.columnsDefault.slice();\r\n\r\n // update columns\r\n _.each(settingTemp.columns, _.bind(function (column) {\r\n if (column.visible) {\r\n if (columns.indexOf(column.columnData) === -1)\r\n columns.push(column.columnData);\r\n } else {\r\n if (columns.indexOf(column.columnData) !== -1)\r\n columns = _.filter(columns, _.bind(function (columnTemp) {\r\n return columnTemp != column.columnData;\r\n }, this));\r\n }\r\n }, this));\r\n\r\n setting.columns = columns;\r\n }\r\n }, this));\r\n }, this));\r\n\r\n this.userSettings.save(null, {\r\n success: _.bind(function () {\r\n fnOnSave();\r\n }, this)\r\n });\r\n }\r\n});\r\n","PJQ.views.directcosts.ProjectDirectCosts = PJQ.views.BaseView.extend({\r\n defaults: {\r\n template: new PJQ.templating.Template(PJQ.constants.modules.DIRECTCOSTS, 'direct-costs-list'),\r\n directCostId: null\r\n },\r\n events: {\r\n 'click .btn-pull-erp': 'pullERP',\r\n 'click .btn-settings': 'editSettings',\r\n 'click .new-direct-cost': 'newDirectCost',\r\n 'click .btn-view-direct-cost': 'viewDirectCostClicked',\r\n 'click .btn-delete-direct-cost': 'deleteDirectCostClicked',\r\n 'click .btn-export': 'exportList'\r\n },\r\n beforeFirstRender: async function () {\r\n this.isFetched = false;\r\n this.options.project = this.options.project ? this.options.project : PJQ.app.session.project;\r\n\r\n if (this.collection == null) {\r\n this.collection = new PJQ.collections.directcosts.DirectCosts(null, {\r\n projectId: this.options.project.get('projectId'),\r\n costCodeId: this.options.costCodeId ? this.options.costCodeId : null,\r\n costTypeId: this.options.costTypeId ? this.options.costTypeId : null\r\n });\r\n }\r\n\r\n if (!this.collection.isFetched) {\r\n await this.collection.fetch();\r\n }\r\n\r\n this.settings = await PJQ.app.session.fetchDirectCostSettings();\r\n this.userSettings = await PJQ.app.session.fetchDirectCostUserSettings();\r\n this.customFields = await this.options.project.fetchDirectCostCustomFields();\r\n this.erpIntegration = await PJQ.app.session.fetchERPIntegration();\r\n\r\n if (this.erpIntegration != null && this.erpIntegration.getSetting('syncProjects')) {\r\n await this.options.project.fetchERPObject();\r\n }\r\n\r\n this.isFetched = true;\r\n this.render();\r\n },\r\n beforeRender: function () {\r\n if (!this.isFetched) {\r\n return;\r\n }\r\n\r\n this.options.canAdd = PJQ.app.session.project.hasPermission('directCosts.canAdd');\r\n this.options.canEdit = PJQ.app.session.project.hasPermission('directCosts.canEdit');\r\n this.options.isAdmin = PJQ.app.session.project.hasPermission('directCosts.isAdmin');\r\n },\r\n renderData: function () {\r\n return {\r\n isFetched: this.isFetched,\r\n canAdd: this.options.canAdd,\r\n isAdmin: this.options.isAdmin,\r\n erpIntegration: this.erpIntegration\r\n }\r\n },\r\n afterRender: function () {\r\n if (!this.isFetched) {\r\n return;\r\n }\r\n\r\n this.renderView();\r\n\r\n if (this.options.directCostId > 0) {\r\n let initDirectCost = this.collection.get(this.options.directCostId);\r\n if (initDirectCost != null) {\r\n this.viewDirectCost(initDirectCost);\r\n this.options.directCostId = null;\r\n }\r\n }\r\n },\r\n renderStats: function () {\r\n let totals = this.collection.getTotalAmountsByStatus();\r\n this.$('.total-draft').text(PJQ.helpers.formatHelpers.formatCurrency(totals[PJQ.constants.directcosts.directCostStatus.DRAFT]));\r\n this.$('.total-pending').text(PJQ.helpers.formatHelpers.formatCurrency(totals[PJQ.constants.directcosts.directCostStatus.PENDING]));\r\n this.$('.total-approved').text(PJQ.helpers.formatHelpers.formatCurrency(totals[PJQ.constants.directcosts.directCostStatus.APPROVED]));\r\n this.$('.total-revise').text(PJQ.helpers.formatHelpers.formatCurrency(totals[PJQ.constants.directcosts.directCostStatus.REVISE]));\r\n },\r\n renderERPButton: function () {\r\n let $erp = this.$('.erp-sync');\r\n if (!this.options.isAdmin || this.erpIntegration == null || this.erpIntegration.getSetting(PJQ.constants.integrations.settings.SYNC_DIRECT_COSTS) === false || !this.options.project || !this.options.project.isERPSynced()) {\r\n $erp.remove();\r\n return;\r\n }\r\n\r\n let pullSupported = this.erpIntegration.hasAvailableAction(PJQ.constants.integrations.actions.PULL_DIRECT_COSTS);\r\n PJQ.helpers.erp.renderERPButtons($erp, {\r\n pushSupported: false,\r\n pullSupported: pullSupported,\r\n canPull: true\r\n });\r\n },\r\n pullERP: function () {\r\n if (this.options.project != null && this.erpIntegration.hasAvailableAction(PJQ.constants.integrations.actions.PULL_DIRECT_COSTS)) {\r\n this.erpIntegration.pullDirectCosts(this.options.project, (res, err) => {\r\n if (res == null) {\r\n return;\r\n }\r\n\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Direct cost transactions pulled from ERP'\r\n });\r\n this.directCosts = res;\r\n\r\n this.collection.fetch({\r\n success: () => {\r\n this.render();\r\n }\r\n });\r\n });\r\n }\r\n },\r\n getFilterValues: function () {\r\n let directCostTypes = this.filterSelectPicker.getValue()[PJQ.constants.directcosts.filterType.DIRECT_COST_TYPE_FILTER];\r\n directCostTypes = _.map(directCostTypes, function (type) {\r\n return type * -1;\r\n });\r\n return {\r\n projectId: this.options.project.get('projectId'),\r\n search: this.$('.input-search').val(),\r\n typeFilter: directCostTypes.join(','),\r\n statusFilter: this.filterSelectPicker.getValue()[PJQ.constants.directcosts.filterType.DIRECT_COST_STATUS_FILTER].join(',')\r\n };\r\n },\r\n renderView: function () {\r\n if (this.dataTable) {\r\n this.dataTable.remove();\r\n this.dataTable = null;\r\n }\r\n\r\n this.dataTable = this.getDataTableInstance();\r\n this.renderStats();\r\n },\r\n getDataTableInstance: function () {\r\n return new PJQ.views.directcosts.DirectCostDataTable({\r\n el: this.$('.direct-cost-data'),\r\n rowId: \"cid\",\r\n data: this.collection.models,\r\n onPageSizeChange: function (value) {\r\n // PJQ.helpers.cookieHelpers.setCookie(PJQ.constants.cookies.RFI_PAGE_LENGTH, value);\r\n },\r\n isAdmin: this.options.isAdmin,\r\n statusIds: this.options.statusIds,\r\n headerData: _.bind(function () {\r\n return {\r\n project: this.options.project,\r\n canAdd: this.options.canAdd,\r\n isAdmin: this.options.isAdmin\r\n };\r\n }, this),\r\n directCostView: this,\r\n customFields: this.customFields,\r\n userSettings: this.userSettings,\r\n settings: this.userSettings.getSettings(PJQ.constants.directcosts.view.DIRECT_COSTS),\r\n order: [[1, 'asc']],\r\n colReorder: {\r\n fixedColumnsLeft: 1,\r\n fixedColumnsRight: 1,\r\n realtime: false\r\n },\r\n columnOrderChanged: _.bind(function () {\r\n this.userSettings.save();\r\n }, this),\r\n onRowDoubleClick: _.bind(function (row) {\r\n this.viewDirectCost(row.data());\r\n }, this),\r\n afterDataTableRender: _.bind(function () {\r\n this.renderERPButton();\r\n }, this),\r\n contextMenuOptions: {\r\n actions: [\r\n {\r\n name: 'View',\r\n onClick: _.bind(function (row) {\r\n this.viewDirectCost(row.data());\r\n }, this)\r\n }\r\n ]\r\n }\r\n });\r\n },\r\n editSettings: function () {\r\n new PJQ.views.directcosts.DirectCostSettingsModal({\r\n directCostView: this,\r\n onSave: _.bind(function () {\r\n this.renderView();\r\n PJQ.notifications.notify.successNotify({\r\n message: 'Settings updated successfully'\r\n });\r\n }, this)\r\n });\r\n },\r\n newDirectCost: function (e) {\r\n this.viewDirectCost();\r\n },\r\n viewDirectCostClicked: function (e) {\r\n let row = this.dataTable.getRow($(e.currentTarget).closest('tr'));\r\n this.viewDirectCost(row.data());\r\n },\r\n viewDirectCost: function (directCost) {\r\n let isNew = directCost == null;\r\n new PJQ.views.directcosts.DirectCostEditModal({\r\n model: directCost,\r\n settings: this.settings,\r\n customFields: this.customFields,\r\n onSave: _.bind(function (directCost) {\r\n if (isNew) {\r\n this.collection.add(directCost);\r\n }\r\n this.renderView();\r\n }, this),\r\n onDelete: _.bind(function (directCost) {\r\n this.collection.remove(directCost);\r\n this.renderView();\r\n }, this)\r\n });\r\n },\r\n deleteDirectCostClicked: function (e) {\r\n let row = this.dataTable.getRow($(e.currentTarget).closest('tr'));\r\n this.deleteDirectCost(row);\r\n },\r\n deleteDirectCost: function (row) {\r\n if (row != null) {\r\n let directCost = row.data();\r\n if (directCost != null) {\r\n new PJQ.views.modals.DeleteCancel({\r\n header: \"Delete Direct Cost\",\r\n body: \"Are you sure you want to delete this Direct Cost?\",\r\n onDelete: _.bind(function () {\r\n directCost.destroy({\r\n success: _.bind(function () {\r\n this.dataTable.removeRow(row);\r\n if (typeof this.options.onDelete === 'function') {\r\n this.options.onDelete(directCost);\r\n }\r\n }, this)\r\n });\r\n }, this)\r\n });\r\n }\r\n }\r\n },\r\n exportList: function () {\r\n let filter = this.dataTable.getFilterValues(),\r\n parameters = [\r\n {\r\n parameter: 'search',\r\n value: filter.search\r\n },\r\n {\r\n parameter: 'typeFilter',\r\n value: filter.typeFilter\r\n },\r\n {\r\n parameter: 'statusFilter',\r\n value: filter.statusFilter\r\n },\r\n {\r\n parameter: 'timeZoneOffset',\r\n value: new Date().getTimezoneOffset()\r\n }\r\n ];\r\n\r\n PJQ.files.downloadFile(PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'projects',\r\n value: PJQ.app.session.project.id\r\n },\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'export'\r\n }\r\n ], parameters), {isAPIv2: true});\r\n },\r\n renderTotals: function (draft, total) {\r\n this.$('.total-draft').text(PJQ.helpers.formatHelpers.formatCurrency(draft));\r\n this.$('.total-direct-costs').text(PJQ.helpers.formatHelpers.formatCurrency(total));\r\n }\r\n});\r\n\r\nPJQ.views.directcosts.ModalViewDirectCosts = PJQ.views.BaseModal.extend({\r\n defaults: {\r\n template: new PJQ.templating.Template(PJQ.constants.modules.DIRECTCOSTS, 'modal-view-direct-costs'),\r\n maxWidth: 1000,\r\n isShowCloseButton: true,\r\n onSave: _.noop,\r\n isAdmin: true\r\n },\r\n events: {},\r\n beforeModalCreated: function () {\r\n\r\n },\r\n renderData: function () {\r\n return {\r\n model: this.model\r\n }\r\n },\r\n afterRender: function () {\r\n if (this.model != null) {\r\n new PJQ.views.directcosts.ProjectDirectCosts({\r\n el: this.$('.modal-body'),\r\n model: this.model,\r\n costCodeId: this.model.get('costCodeId'),\r\n costTypeId: this.model.get('costTypeId'),\r\n statusIds: this.options.statusIds,\r\n project: this.options.project\r\n })\r\n }\r\n },\r\n});","PJQ.models.directcosts.DirectCost = PJQ.models.BaseModel.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'id',\r\n endpoint: function () {\r\n if (this.isNew()) {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'projects',\r\n value: this.get('projectId')\r\n },\r\n {\r\n endpoint: 'directcosts'\r\n }\r\n ]);\r\n }\r\n\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'directcosts',\r\n value: this.get('id')\r\n }\r\n ]);\r\n },\r\n parse: function (model) {\r\n if (!model)\r\n return model;\r\n\r\n this.attachments = new PJQ.collections.directcosts.Attachments(model.attachments);\r\n this.lineItems = new PJQ.collections.directcosts.LineItems(model.lineItems);\r\n\r\n if (model && model.vendor)\r\n this.vendor = new PJQ.models.contacts.Contact(model.vendor);\r\n\r\n if (model && model.reportedBy)\r\n this.reportedBy = new PJQ.models.contacts.Contact(model.reportedBy);\r\n\r\n return model;\r\n },\r\n beforeSave: function () {\r\n this.set('attachments', this.attachments.toJSON());\r\n this.set('lineItems', this.lineItems.toJSON());\r\n },\r\n syncERP: function (callback) {\r\n new PJQ.ajax.Request({\r\n endpoint: this.endpoint() + '/syncerp',\r\n isAPIv2: true,\r\n }).post().done(_.bind(function (response) {\r\n callback();\r\n }, this)).fail(_.bind(function (xhr, err, result) {\r\n //todo: error\r\n }, this));\r\n },\r\n unlinkERP: function (callback) {\r\n new PJQ.ajax.Request({\r\n endpoint: this.endpoint() + '/unlinkerp',\r\n isAPIv2: true,\r\n }).post().done(_.bind(function () {\r\n this.set('externalId', null);\r\n if (typeof callback === 'function') {\r\n callback(true);\r\n }\r\n }, this)).fail(_.bind(function (xhr) {\r\n if (typeof callback === 'function') {\r\n let err;\r\n if (xhr.responseJSON != null) {\r\n err = xhr.responseJSON.type;\r\n } else {\r\n err = null;\r\n }\r\n callback(false, err);\r\n }\r\n }, this));\r\n },\r\n makeERPUrl: function (integration) {\r\n let externalId = this.externalId();\r\n if (_.size(externalId) === 0) {\r\n return '';\r\n }\r\n\r\n switch (integration.get('name')) {\r\n case PJQ.constants.integrations.providers.QBO.name:\r\n return '';\r\n default:\r\n return '';\r\n }\r\n },\r\n share: function (data, callback) {\r\n new PJQ.ajax.Request({\r\n endpoint: this.endpoint() + '/email',\r\n isAPIv2: true,\r\n data: {\r\n subject: data != null ? data.subject : null,\r\n body: data != null ? data.body : null,\r\n toEmails: data != null ? data.toEmails : null,\r\n ccEmails: data != null ? data.ccEmails : null,\r\n }\r\n }).post().done(_.bind(function (response) {\r\n callback();\r\n }, this)).fail(_.bind(function (xhr, err, result) {\r\n //todo: error\r\n }, this));\r\n }\r\n});\r\n\r\nPJQ.models.directcosts.LineItem = PJQ.models.budget.BaseLineItem.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'id',\r\n parse: function (model) {\r\n if (!model)\r\n return model;\r\n\r\n if (model && model.group) {\r\n this.group = new PJQ.models.groups.Group(model.group);\r\n } else\r\n this.group = null;\r\n\r\n return model;\r\n }\r\n});\r\n\r\nPJQ.models.directcosts.Attachment = PJQ.models.files.File.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'id'\r\n});\r\n\r\nPJQ.models.directcosts.CustomField = PJQ.models.customFields.CustomField.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'id',\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'customfields',\r\n value: this.get('id')\r\n }\r\n ]);\r\n }\r\n});\r\n\r\nPJQ.models.directcosts.CustomFieldChoice = PJQ.models.BaseModel.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'id',\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'customfields',\r\n value: this.get('customFieldId')\r\n },\r\n {\r\n endpoint: 'choices',\r\n value: this.get('id')\r\n }\r\n ]);\r\n }\r\n});\r\n\r\nPJQ.models.directcosts.DirectCostFieldSetting = PJQ.models.BaseModel.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'settingId',\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'settings'\r\n },\r\n {\r\n endpoint: 'fields',\r\n value: this.id ? this.id : 'directcosts'\r\n }\r\n ]);\r\n }\r\n});\r\n\r\n\r\nPJQ.models.directcosts.Settings = PJQ.models.BaseModel.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'settingId',\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'settings'\r\n }\r\n ]);\r\n }\r\n});\r\n\r\nPJQ.models.directcosts.UserSettings = PJQ.models.BaseModel.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n idAttribute: 'settingId',\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'settings'\r\n },\r\n {\r\n endpoint: 'user'\r\n }\r\n ]);\r\n },\r\n getSettings: function (view) {\r\n return _.find(this.attributes.viewSettings, _.bind(function (setting) {\r\n return setting.view === view;\r\n }, this));\r\n }\r\n});\r\n\r\nPJQ.collections.directcosts.DirectCosts = PJQ.collections.BaseCollection.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n model: PJQ.models.directcosts.DirectCost,\r\n endpoint: function () {\r\n let params = [\r\n {\r\n parameter: 'search',\r\n value: this.options.search\r\n },\r\n {\r\n parameter: 'typeFilter',\r\n value: this.options.typeFilter\r\n },\r\n {\r\n parameter: 'statusFilter',\r\n value: this.options.statusFilter\r\n }\r\n ];\r\n if (this.options.costCodeId && this.options.costTypeId) {\r\n params.push({\r\n parameter: 'costCodeId',\r\n value: this.options.costCodeId\r\n }, {\r\n parameter: 'costTypeId',\r\n value: this.options.costTypeId\r\n });\r\n }\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'projects',\r\n value: this.options.projectId\r\n },\r\n {\r\n endpoint: 'directcosts'\r\n }\r\n ], params);\r\n },\r\n getTotalAmountsByStatus: function () {\r\n let result = {};\r\n result[PJQ.constants.directcosts.directCostStatus.DRAFT] = 0;\r\n result[PJQ.constants.directcosts.directCostStatus.PENDING] = 0;\r\n result[PJQ.constants.directcosts.directCostStatus.APPROVED] = 0;\r\n result[PJQ.constants.directcosts.directCostStatus.REVISE] = 0;\r\n _.each(this.models, function (directCost) {\r\n result[directCost.get('statusId')] += directCost.get('amount');\r\n });\r\n return result;\r\n }\r\n});\r\n\r\nPJQ.collections.directcosts.LineItems = PJQ.collections.BaseCollection.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n model: PJQ.models.directcosts.LineItem,\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'projects',\r\n value: this.options.projectId\r\n },\r\n {\r\n endpoint: 'directcosts',\r\n value: this.options.directCostId\r\n },\r\n {\r\n endpoint: 'lineitems'\r\n }\r\n ]);\r\n }\r\n});\r\n\r\nPJQ.collections.directcosts.Attachments = PJQ.collections.files.Files.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n model: PJQ.models.directcosts.Attachment,\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'commitments',\r\n value: this.options.commitmentId\r\n },\r\n {\r\n endpoint: 'attachments'\r\n }\r\n ]);\r\n }\r\n});\r\n\r\nPJQ.collections.directcosts.CustomFields = PJQ.collections.BaseCollection.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n model: PJQ.models.directcosts.CustomField,\r\n endpoint: function () {\r\n if (this.options.projectId > 0) {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'projects',\r\n value: this.options.projectId\r\n },\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'customfields'\r\n }\r\n ]);\r\n }\r\n\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'directcosts'\r\n },\r\n {\r\n endpoint: 'customfields'\r\n }\r\n ]);\r\n }\r\n});\r\n\r\nPJQ.collections.directcosts.CustomFieldChoices = PJQ.collections.BaseCollection.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n model: PJQ.models.directcosts.CustomFieldChoice\r\n});\r\n\r\nPJQ.collections.directcosts.DirectCostFieldSettings = PJQ.collections.BaseCollection.extend({\r\n defaults: {\r\n isAPIv2: true\r\n },\r\n model: PJQ.models.directcosts.DirectCostFieldSetting,\r\n endpoint: function () {\r\n return PJQ.helpers.urlHelpers.generateEndpoint([\r\n {\r\n endpoint: 'settings'\r\n },\r\n {\r\n endpoint: 'fields',\r\n value: 'directcosts'\r\n }\r\n ]);\r\n }\r\n});"]}