BemsWebApplication.MaterialStockAdjustment2 = function (params, viewInfo, forApprovalOptions) { "use strict"; var materialClassForSearch = ko.observableArray(); var materialClass = ko.observableArray(); var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass'); var facilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()]; var searchFacilityClassValues = [ko.observable(), ko.observable(), ko.observable()]; var searchFacilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()]; var first = true; var visibleApprovalButton = ko.observable(); var businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true), materialClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass', true, true), warehouseDataSource = BemsWebApplication.db.createDataSource('FmsMaterialWarehouse', true, true), releaseTypeDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeReleaseType'), adjustmentTypeDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeAdjustmentType'); var materialClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()], businessFields = ko.observableArray(), releaseTypes = ko.observableArray(), warehouses = ko.observableArray(), materials = ko.observableArray(), adjustmentTypes = ko.observableArray(); var forApprovalViewOptions, forApprovalPopupOptions, popup; var materialClassesForSearch = [ko.observableArray(), ko.observableArray(), ko.observableArray()], materialClassValuesForSearch = [ko.observable(), ko.observable(), ko.observable()], businessFieldsForSearch = ko.observableArray(), businessFieldIdForSearch = ko.observable(), warehousesForSearch = ko.observableArray(), warehousesIdForSearch = ko.observable(), releaseTypesForSearch = ko.observableArray(), adjustmentTypesForSearch = ko.observableArray(); if (_.isObject(forApprovalOptions)) { forApprovalViewOptions = forApprovalOptions.viewOptions; forApprovalPopupOptions = forApprovalOptions.popupOptions; } var deferredForSearch = new $.Deferred(); var defaultSearchClassArray = $SearchView.createDefaultArray('MaterialClassId'); var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter; function initializeSearchClasses(onlyThird) { if (onlyThird === undefined || onlyThird === false) { searchFacilityClasses[1](defaultSearchClassArray.slice(0)); searchFacilityClassValues[1](0); } searchFacilityClasses[2](defaultSearchClassArray.slice(0)); searchFacilityClassValues[2](0); } var handleFirstClassChangedValueInSearchView = function (e) { if (first == true && e.value == null) { e.value = 0; first = false; searchFacilityClassValues[0](0); } if (e.value === 0) { initializeSearchClasses(); return; } BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[1], defaultSearchClassArray); }; var handleSecondClassChangedValueInSearchView = function (e) { if (searchFacilityClassValues[1]() == null) { initializeSearchClasses(); BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', 0, searchFacilityClasses[1], defaultSearchClassArray); } if (e.value === 0) { initializeSearchClasses(true); return; } BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[2], defaultSearchClassArray); }; var dataSourceOptions = { select: [ 'SiteId', 'BusinessFieldId', 'MaterialId', 'FmsMaterial/MaterialCode', 'FmsMaterial/Name', 'FmsMaterial/Unit', 'MaterialReleaseId', 'ReleaseTypeId', 'FmsMaterialCodeReleaseType/Name', 'FmsMaterialCodeAdjustmentType/Name', 'ReleaseDate', 'MaterialCount', 'ReleaseTotalCost', 'WarehouseId', 'CmBusinessField/Name', 'CmUser1/Name', 'CmUser/Name', 'IsConfirmed', 'ConfirmedUserId', 'AdjustmentTypeId', 'StockCountByPoint', 'FmsMaterial/FirstClassId', 'FmsMaterial/SecondClassId', 'FmsMaterial/ThirdClassId', 'FmsMaterial/Standard' ], filter: [ ['SiteId', '=', BWA.UserInfo.SiteId()], 'and', ['AdjustmentTypeId', '<>', 0] ], expand: [ 'CmUser', 'CmUser1', 'FmsMaterial', 'FmsMaterialCodeReleaseType', 'CmBusinessField', 'FmsMaterialCodeAdjustmentType' ], extendOptions: { forceOriginalField: true } }; var viewModel; var viewOptions = { dataSourceOptions: dataSourceOptions, columns: [ { dataField: 'MaterialReleaseId', caption: $G('number'), width: '10%', alignment: 'center', allowFiltering: false }, { dataField: 'CmBusinessField/Name', caption: $G('businessFieldName'), width: '10%', alignment: 'center', }, { dataField: 'FmsMaterialCodeReleaseType/Name', caption: '출고구분', width: '10%', alignment: 'center', visible: false }, { dataField: 'FmsMaterialCodeAdjustmentType/Name', caption: '정산사유', width: '10%', alignment: 'center' }, { dataField: 'FmsMaterial/MaterialCode', caption: '자재코드', width: '20%', alignment: 'center', visible: false }, { dataField: 'FmsMaterial/FirstClassId', width: '13%', caption: '자재(대)', alignment: 'center', customizeText: function (cellInfo) { for (var i = 1; i < materialClassForSearch().length; i++) { if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) { return materialClassForSearch()[i].Name(); } } } }, { dataField: 'FmsMaterial/SecondClassId', width: '13%', caption: '자재(중)', alignment: 'center', customizeText: function (cellInfo) { for (var i = 1; i < materialClassForSearch().length; i++) { if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) { return materialClassForSearch()[i].Name(); } } } }, { dataField: 'FmsMaterial/ThirdClassId', width: '13%', caption: '자재(소)', alignment: 'center', customizeText: function (cellInfo) { for (var i = 1; i < materialClassForSearch().length; i++) { if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) { return materialClassForSearch()[i].Name(); } } } }, { dataField: 'FmsMaterial/Name', caption: '자재명', width: '20%', alignment: 'center' }, { dataField: 'FmsMaterial/Standard', caption: '규격', width: '20%', alignment: 'center' }, { dataField: 'FmsMaterial/Unit', caption: '단위', width: '10%', alignment: 'center' }, { dataField: 'MaterialCount', caption: '수량', width: '10%', alignment: 'center', format: 'fixedPoint' }, { dataField: 'ReleaseDate', caption: '출고일', width: '20%', alignment: 'center', sortOrder: 'desc', dataType: "shortDate", format: "yyyy-MM-dd hh:mm:ss", customizeText: function (cellInfo) { return cellInfo.valueText; } }, { dataField: 'CmUser1/Name', caption: '등록자', width: '10%', alignment: 'center' }, { dataField: 'CmUser/Name', caption: '승인자', width: '10%', alignment: 'center' }, ], pager: { }, paging: { pageSize: 18, enabled: true }, // 2019.04.17 엑셀 출력 기능 추가 ~~~ "export": { enabled: true, fileName: '자재 정산 승인 목록' }, onExporting: function (e) { e.component.columnOption("MaterialReleaseId", "visible", false); }, onExported: function (e) { e.component.columnOption("MaterialReleaseId", "visible", true); }, // ~~~ 2019.04.17 엑셀 출력 기능 추가 selection: { mode: 'multiple', allowSelectAll: true }, popupWidth: 1060, searchViewItems: [ { id: 'ReleaseTypeId', ignoreValue: 0, defaultValue: 0, dataSource: releaseTypesForSearch }, { id: 'FmsMaterialCodeAdjustmentType/Name' }, { id: 'FmsMaterial/FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView }, { id: 'FmsMaterial/SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FmsMaterial/FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView }, { id: 'FmsMaterial/ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FmsMaterial/FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2] }, { id: 'FmsMaterial/MaterialCode' }, { id: 'FmsMaterial/Name' }, { id: 'FmsMaterial/Unit' }, { id: 'FmsMaterial/Standard' }, { id: 'ReleaseDate', type: 'dateRange', isOnlyDate: true }, { id: 'CmUser/Name' }, { id: 'CmUser1/Name' }, //{ id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: materialClassValuesForSearch[0], dataSource: materialClassesForSearch[0], handleChangedValue: handleFirstClassChangedValueInSearchView }, //{ id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: materialClassValuesForSearch[1], dataSource: materialClassesForSearch[1], handleChangedValue: handleSecondClassChangedValueInSearchView }, //{ id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: materialClassValuesForSearch[2], dataSource: materialClassesForSearch[2] }, //{ id: 'BusinessFieldId', ignoreValue: 0, defaultValue: 0, value: businessFieldIdForSearch, dataSource: businessFieldsForSearch }, //{ id: 'WarehouseId', ignoreValue: 0, defaultValue: 0, value: warehousesIdForSearch, dataSource: warehousesForSearch }, ], isValidateWithFunction: function (errorMessage) { return popup.isValidateWithFunction(errorMessage); }, mandatoryFields: [ { dataField: 'ReleaseDate', name: '출고일' }, { dataField: 'BusinessFieldId', name: $G('businessField') }, { dataField: 'FmsMaterialCodeReleaseType/Name', name: '출고구분' }, { dataField: 'FmsMaterialCodeAdjustmentType/Name', name: '정산사유' } ], handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) { dataGrid.clearSelection(); var data = clickRow.data; var dataModel = viewModel.dataModel; if (popup && popup.handleBeforeShowingPopupForEdit) { popup.handleBeforeShowingPopupForEdit(data, dataModel); } popupVisible(true); }, handleAfterLoadingModelByKey: function (data, dataViewModel) { if (popup && popup.handleAfterLoadingModelByKey) { popup.handleAfterLoadingModelByKey(data, dataViewModel); } }, handlePopupShowing: function (isNewInPopup, dataViewModel) { //if (isNewInPopup()) { // viewModel.toolbarItems[1].options.visible(true); // viewModel.toolbarItems[2].options.visible(true); //} //else { // viewModel.toolbarItems[1].options.visible(false); // viewModel.toolbarItems[2].options.visible(false); //} if (popup && popup.handlePopupShowing) { popup.handlePopupShowing(isNewInPopup, dataViewModel); } }, handlePopupShown: function (editMode, isNew, dataViewModel) { if (popup && popup.handlePopupShown) { popup.handlePopupShown(editMode, isNew, dataViewModel); } }, handleViewShowing: function () { MaterialCodeClassDataSource.filter([ ['SiteId', '=', BWA.UserInfo.SiteId()] ]); $.when( MaterialCodeClassDataSource.load() ).done(function (Result) { materialClass = ko.observableArray(); var cnt = 0; for (var i = 0; i < Result.length; i++) { materialClass.push(Result[i]); if (Result[i].Depth() == 0) { if (cnt == 0) { searchFacilityClasses[0](defaultSearchClassArray.slice(0).concat(Result[i])); cnt++; } else { searchFacilityClasses[0].push(Result[i]); } } } facilityClasses[0](Result[0]); materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass())); }); var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName) if (useBusinessFiltering) { this.dataSourceOptions.filter.push('and'); this.dataSourceOptions.filter.push([eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]); businessFieldDataSource.filter([ eq('SiteId', BWA.UserInfo.SiteId()), and, [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)] ]); } materialClassDataSource.filter([ ['SiteId', '=', BWA.UserInfo.SiteId()], 'and', ['ParentMaterialClassId', '=', null] ]); adjustmentTypeDataSource.filter([ ['AdjustmentTypeId', '<>', 0] ]); $.when( businessFieldDataSource.load(), materialClassDataSource.load(), warehouseDataSource.load(), releaseTypeDataSource.load(), adjustmentTypeDataSource.load() ).done(function (dbBusinessFields, dbMaterialClasses, dbWarehouses, dbreleaseTypes, dbadjustmentTypes) { dbBusinessFields = dbBusinessFields[0]; dbMaterialClasses = dbMaterialClasses[0]; dbWarehouses = dbWarehouses[0]; // TODO : 아래 두코드의 차이점이 무엇인지 확인 필요. //releaseTypes(dbreleaseTypes); // 의도한 대로 동작하려면 아래 코드로 써야 함 releaseTypes(dbreleaseTypes[0]); adjustmentTypes(dbadjustmentTypes[0]); materialClasses[0](dbMaterialClasses); materialClassesForSearch[0]($SearchView.createArrayOfSelectBox('MaterialClassId', dbMaterialClasses)); initializeSearchClasses(); businessFields(dbBusinessFields); warehouses(dbWarehouses); releaseTypesForSearch($SearchView.createArrayOfSelectBox('ReleaseTypeId', releaseTypes())); //adjustmentTypesForSearch($SearchView.createArrayOfSelectBox('AdjustmentTypeId', adjustmentTypes)); //adjustmentTypesForSearch(adjustmentTypes); businessFieldsForSearch($SearchView.createArrayOfSelectBox('BusinessFieldId', dbBusinessFields)); warehousesForSearch($SearchView.createArrayOfSelectBox('WarehouseId', dbWarehouses)); deferredForSearch.resolve(); }); }, handleViewShown: function () { }, }; if (_.isObject(forApprovalViewOptions)) { _.extend(viewOptions, forApprovalViewOptions); } else { // 승인 화면이 아니면 수정에 관련 기능이 필요없다. _.extend(viewOptions, { isValidateWithFunction: function (errorMessage) { if (popup && popup.isValidateWithFunction) { return popup.isValidateWithFunction(errorMessage); } return true; }, mandatoryFields: [ { dataField: 'BusinessFieldId', name: $G('businessField') } ], handleSaveButtonInPopup: function (isInsert) { if (isInsert === false) { if (popup && popup.handleAfterSave) { popup.handleAfterSave(undefined); } } }, handleAfterSaveInPopup: function (responseKey, response) { if (popup && popup.handleAfterSave) { popup.handleAfterSave(responseKey, response); } }, getAddedToolbarItemsInPopup: function (e) { var hasnotModificationPermission = e.hasnotModificationPermission, dataViewModel = e.dataViewModel, popupVisible = e.popupVisible, isEditModeInPopup = e.isEditModeInPopu, isNewInPopup = e.isNewInPopup; return [ { location: 'after', widget: 'button', options: { text: $G('materialInsertion'), icon: 'search', visible: isNewInPopup, clickAction: function () { viewModel.materialSearchPopup.show(); } } }, { location: 'after', widget: 'button', options: { text: $G('materialDeletion'), icon: 'remove', type: 'danger', visible: isNewInPopup, clickAction: function () { if (popup && popup.handleDeleteSelectedMaterials) { popup.handleDeleteSelectedMaterials(); } } } }, { location: 'after', widget: 'button', options: { text: $G('approval'), icon: 'save', type: 'success', visible: visibleApprovalButton, //visible: true, disabled: hasnotModificationPermission, clickAction: function () { dataViewModel.ConfirmedDate(new Date()); dataViewModel.IsConfirmed(true); dataViewModel.ConfirmedUserId(BWA.UserInfo.UserId()); var keys = BWA.db.extractKeysObject('FmsMaterialRelease', dataViewModel); BWA.db.FmsMaterialRelease.update(keys, dataViewModel.toJS()).done(function (res) { // TODO : 트랜잭션이 필요할 것으로 예상됨 var postData = dataViewModel.toJS(); var parameters = { SiteId: dataViewModel.SiteId(), BusinessFieldId: dataViewModel.BusinessFieldId(), MaterialId: dataViewModel.MaterialId() }; // 자재 테이블 업데이트 필요, 자재정산 승인 BWA.api.post('FmsMaterialRelease/Approval', postData, parameters).done(function () { utils.toast.show($G('successDatabaseInsertionMsg')); popupVisible(false); viewModel.gridView().refresh(); }); }); } } } ]; }, }); } viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsMaterialRelease', viewOptions); // 툴바 버튼 관련 수정 viewModel.toolbarItems[7].options.clickAction = handlePopupButtonSave; function handlePopupButtonSave() { if (viewModel.isNewInPopup()) { if (viewModel.popup.modifiableMaterialDataGridOptions.dataSource().length != 0) { var parameters = { SiteId: BWA.UserInfo.SiteId(), BusinessFieldId: viewModel.dataModel.BusinessFieldId(), //WorkRequestId: viewModel.dataModel.WorkRequestId() }; var postData = []; for (var i = 0; i < viewModel.popup.modifiableMaterialDataGridOptions.dataSource().length; i++) { // AdjustmentTypeName // AdjustmentTypeId == 1 인 경우 재고수량보다 클 수 없음 if (viewModel.dataModel.AdjustmentTypeId() == 1) { if (viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialCount() > viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].StockCountByPoint()) { //viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialCount(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].StockCount()); //viewModel.popup.materialGridView.refresh(); utils.toast.show('자재손실은 재고수량 보다 클 수 없습니다.', 'error'); return; } } viewModel.dataModel.StockCountByPoint(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].StockCountByPoint()); viewModel.dataModel.MaterialId(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialId()); viewModel.dataModel.MaterialCount(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialCount()); viewModel.dataModel.ReleaseTotalCost(0); postData.push(viewModel.dataModel.toJS()); } BWA.api.post('FmsMaterialRelease/Add', postData, parameters).done(function () { utils.toast.show($G('successDatabaseInsertionMsg')); viewModel.popupVisible(false); viewModel.gridView().refresh(); }); } else { utils.toast.show('선택된 자재가 없습니다.', 'error'); } } else if (viewModel.isEditModeInPopup()) { viewModel.dataModel.MaterialCount(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[0].MaterialCount()); var keys = BWA.db.extractKeysObject('FmsMaterialRelease', viewModel.dataModel); BWA.db.FmsMaterialRelease.update(keys, viewModel.dataModel.toJS()).done(function (res) { utils.toast.show($G('successDatabaseUpdateMsg')); viewModel.popupVisible(false); viewModel.gridView().refresh(); }); } // 등록은 멀티플로 추가 // 상세보기에는 하나만 표시되게 하고 자재추가/삭제 안되도록 변경 / 수량만 바꾸도록 // 승인도 멀티플로 할 수 있도록 }; var commandInsertButtonOptions = [ { id: 'create1', title: '등록', disabled: viewModel.hasnotModificationPermission, action: function () { viewModel.isNewInPopup(true); viewModel.viewModeInPopup(false); viewModel.isEditModeInPopup(true); viewModel.visibleDeleteButton(false); viewModel.visibleEditButton(false); viewModel.popupVisible(true); } }, { id: 'create2', title: '승인', disabled: viewModel.hasnotModificationPermission, action: handleApproveSelectedItem }]; viewModel.businessFields = businessFields; viewModel.releaseTypes = releaseTypes; viewModel.adjustmentTypes = adjustmentTypes; viewModel.visibleApprovalButton = visibleApprovalButton; viewModel.commandInsertButtonOptions = commandInsertButtonOptions; var isUsePopup = forApprovalPopupOptions && forApprovalPopupOptions.isUsePopup !== false; if ((forApprovalPopupOptions && _.isFunction(forApprovalPopupOptions.popupCreatorFunc))) { popup = viewModel.popup = forApprovalPopupOptions.popupCreatorFunc(viewInfo, viewModel, forApprovalPopupOptions); } else { popup = viewModel.popup = BWA.Popup.MaterialStockAdjustment.create(viewInfo, viewModel, forApprovalPopupOptions); } function handleApproveSelectedItem() { var materialStoredList = viewModel.gridView().getSelectedRowsData(); var list = _.reject(materialStoredList, function (x) { try { return x.IsConfirmed(); } catch (e) { return x.IsConfirmed; } }); if (_.isEmpty(list)) { utils.toast.show('승인 할 정산 항목이 없습니다. 이미 승인되었거나 선택된 항목이 없습니다.', 'error'); return; } var postData = list; // undefined; list.forEach(function (item) { item.SiteId = BWA.UserInfo.SiteId(); item.IsConfirmed = true; item.ConfirmedUserId = BWA.UserInfo.UserId(); try { item.MaterialReleaseId = item.MaterialReleaseId(); } catch (e) { item.MaterialReleaseId = item.MaterialReleaseId; } }); return BWA.api.post('FmsMaterialRelease/ApprovalMany', postData).then(function () { viewModel.refreshList(); utils.toast.show('성공적으로 승인 처리되었습니다.'); }); } viewModel.handleSecondClassChangedValueInSearchView = handleSecondClassChangedValueInSearchView; viewModel.handleFirstClassChangedValueInSearchView = handleFirstClassChangedValueInSearchView; return viewModel; };