$(function () { 'use strict'; var materialClassForSearch = ko.observableArray(); var materialClass = ko.observableArray(); var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass'); BemsWebApplication.Popup.PurchaseRequest = { create: function (viewInfo, viewModel, forApprovalOptions) { var materials = ko.observableArray(), materialsInView = ko.observableArray(), businessFields = ko.observableArray(); var materialFactory = BWA.Factory.Material, purchaseProgressCode = BWA.Code.PurchaseProgress, materialGridView, materialDataGridOptions, modifiableMaterialDataGridOptions = undefined; var materialsDataSource = materialFactory.getBasicDataSourceRef({ dbModeIId: 'FmsMaterialPurchaseRequestMaterial', primaryKeyDataField: 'PurchaseRequestId' }); function isValidateWithFunction(errorMessage) { if (_.isEmpty(materials())) { errorMessage.message = '구매요청한 자재가 없습니다.'; return false; } return true; } function handlePopupShowing(isNewInPopup, dataModel) { $("#gridContainer2").dxDataGrid({ paging: { pageSize: 10, enabled: true } }); $("#gridContainer3").dxDataGrid({ paging: { pageSize: 10, enabled: true } }); 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]); } materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass())); }); var userInfo = BWA.UserInfo; if (isNewInPopup()) { var progressId = $Code.PurchaseProgress.PURCHASE_REQUEST; if (userInfo.isDependBusinessField(viewInfo.viewName)) { BWA.db.CmBusinessField.byKey({ SiteId: userInfo.SiteId(), BusinessFieldId: userInfo.BusinessFieldId() }).done(function (businessField) { dataModel.BusinessFieldName(businessField.Name); }); } dataModel.ProgressId(progressId); dataModel.ProgressName(purchaseProgressCode.getName(progressId)); dataModel.BusinessFieldId(userInfo.BusinessFieldId()); dataModel.RequestUserId(userInfo.UserId()); dataModel.RequesterName(userInfo.Name()); dataModel.RequestDate(new Date()); dataModel.PurchaseHopeDate(moment().add(1, 'd').toDate()); dataModel.bSameOrder(false); } } function handleDeleteSelectedMaterials() { var rows = materialGridView.getSelectedRowsData(); if (_.isEmpty(rows)) { utils.toast.show('선택된 자재가 없습니다.', 'error'); return; } _.each(rows, function (row) { var array = materials(); var length = array.length; var id = row.MaterialId(); for (var i = 0 ; i < length ; i++) { if (id === array[i].MaterialId()) { materials().splice(i, 1); break; } } }); materialGridView.refresh(); } function handlePopupShown(editMode, isNew, dataViewModel) { } // 구매신청 정보가 저장된 후에 호출 된다. // 등록이면 responseKey가 있고, 수정이면 없다. function handleAfterSave(responseKey) { var array = materials(); if (_.isEmpty(array)) { return; } var siteId, purchaseRequestId, businessFieldId; if (_.isUndefined(responseKey)) { var dataModel = viewModel.dataModel; siteId = dataModel.SiteId(); businessFieldId = dataModel.BusinessFieldId(); purchaseRequestId = dataModel.PurchaseRequestId(); } else { siteId = responseKey.SiteId; // JD Comment : BusinessField 가 키에서 제거되면서 발생된 사항 // businessFieldId = responseKey.BusinessFieldId; businessFieldId = viewModel.dataModel.BusinessFieldId(); purchaseRequestId = responseKey.PurchaseRequestId; } var postData; var parameters = { SiteId: siteId, BusinessFieldId: businessFieldId, PurchaseRequestId: purchaseRequestId }; postData = _.map(array, function (m) { return { SiteId: siteId, BusinessFieldId: businessFieldId, PurchaseRequestId: purchaseRequestId, MaterialId: m.MaterialId(), MaterialCount: m.MaterialCount() }; }); BWA.api.post('FmsMaterialPurchaseRequestMaterial', postData, parameters).done(function () { utils.toast.show($G('successDatabaseInsertionMsg')); viewModel.popupVisible(false); viewModel.gridView().refresh(); }); } function handleAfterLoadingModelByKey(data, dataViewModel) { if (dataViewModel.ProgressId() !== $Code.PurchaseProgress.PURCHASE_REQUEST) { viewModel.visibleEditButton(false); viewModel.visibleDeleteButton(false); } dataViewModel.ProgressName(purchaseProgressCode.getName(dataViewModel.ProgressId())); var eq = BWA.DataUtil.constructEqualFilter; var and = BWA.DataUtil.andFilter; var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName) if (useBusinessFiltering) { materialsDataSource.filter([ eq('SiteId', dataViewModel.SiteId()), and, [ eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1) ], and, eq('PurchaseRequestId', dataViewModel.PurchaseRequestId()) ]); } else { materialsDataSource.filter([ eq('SiteId', dataViewModel.SiteId()), and, eq('PurchaseRequestId', dataViewModel.PurchaseRequestId()) ]); } materialsDataSource.load().done(function (dbMaterials) { materialsInView(dbMaterials); }); } function handleBeforeShowingPopupForEdit(rowData, dataViewModel) { dataViewModel.BusinessFieldName(rowData['CmBusinessField/Name']()); dataViewModel.RequesterName(rowData['CmUser/Name']()); dataViewModel.PurchaseTypeName(rowData['FmsMaterialCodePurchaseType/Name']()); dataViewModel.ApprovalUserName = $KoSet(dataViewModel.ApprovalUserName, rowData['CmUser1/Name']); } viewModel.popupVisible.subscribe(function (visible) { if (!visible) { materialsInView([]); // TODO : Sitde-Effects ??? materials([]); } }); viewModel.isEditModeInPopup.subscribe(function (isEditMode) { if (isEditMode) { materials(materialsInView.slice(0)); } }); viewModel.dataModel.BusinessFieldName = ko.observable(); viewModel.dataModel.ProgressName = ko.observable(); viewModel.dataModel.RequesterName = ko.observable(); viewModel.dataModel.ApprovalUserName = ko.observable(); viewModel.dataModel.PurchaseTypeName = ko.observable(); var materialColumns = materialFactory.getColumns([ { dataField: 'FirstClassId', width: '15%', 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: 'SecondClassId', width: '15%', 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: 'ThirdClassId', width: '15%', 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: 'MaterialCode', width: '30%', visible: false }, { dataField: 'Name', width: '25%' }, { dataField: 'Standard', width: '25%', caption: '규격', alignment: 'center' }, { dataField: 'Unit', width: '15%', caption: '단위', alignment: 'center' }, //{ dataField: 'UnitCost', width: '25%', caption: '단가', alignment: 'center' } ]); materialDataGridOptions = utils.datagrid.defaultOptions({ width: 820, visible: viewModel.viewModeInPopup, pager: { showPageSizeSelector: false, allowedPageSizes: [] }, dataSource: materialsInView, columns: materialColumns.concat([{ dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: $G('materialCount'), format: 'currency' }]) }); if (_.isObject(forApprovalOptions) === false) { modifiableMaterialDataGridOptions = utils.datagrid.defaultOptions({ width: 820, pager: { showPageSizeSelector: false, allowedPageSizes: [] }, visible: viewModel.isEditModeInPopup, dataSource: materials, selection: { mode: 'multiple', allowSelectAll: true }, columns: materialColumns.concat([{ dataField: 'MaterialCount', width: '20%', type: 'number', caption: $G('materialCount'), alignment: 'center', cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({ min: 1, max: 1000000, dataField: 'MaterialCount', convertValueWhenValueChanged: function (value) { return Math.max(1, value); } }) }]), cellClick: function (e) { utils.datagrid.cellClickEventForDataGridTemplate(e, 'MaterialCount'); }, contentReadyAction: function (e) { materialGridView = e.component; }, }); viewModel.materialSearchPopup = BWA.Popup.Material.create(viewModel, { isMultipleSelect: true, onSelectedMaterials: function (selectedMaterials) { var purchaseRequestId = viewModel.dataModel.PurchaseRequestId(); _.each(selectedMaterials, function (sm) { // 어차피 SiteId와 BusinessField는 동일 할 수 밖에 없으므로 비교하지 않는다. // JD : 팝업에서 전체선택시 추가로 하면 오류 발생함. 이에 대한 회피 코드로 try-catch // JD : 근본적인 원인은 시간 관계상 차후로 넘김 var found = _.some(materials(), function (m) { try { return m.MaterialId() === sm.MaterialId(); } catch (e) { return m.MaterialId() === sm.MaterialId; } }); if (found) return; try { materials.push({ SiteId: ko.observable(sm.SiteId()), PurchaseRequestId: ko.observable(purchaseRequestId), MaterialId: ko.observable(sm.MaterialId()), Name: ko.observable(sm.Name()), MaterialCode: ko.observable(sm.MaterialCode()), MaterialCount: ko.observable(1), FirstClassId: ko.observable(sm.FirstClassId()), SecondClassId: ko.observable(sm.SecondClassId()), ThirdClassId: ko.observable(sm.ThirdClassId()), Standard: ko.observable(sm.Standard()), Unit: ko.observable(sm.Unit()), }); } catch (e) { materials.push({ SiteId: ko.observable(sm.SiteId), PurchaseRequestId: ko.observable(purchaseRequestId), MaterialId: ko.observable(sm.MaterialId), Name: ko.observable(sm.Name), MaterialCode: ko.observable(sm.MaterialCode), MaterialCount: ko.observable(1), FirstClassId: ko.observable(sm.FirstClassId), SecondClassId: ko.observable(sm.SecondClassId), ThirdClassId: ko.observable(sm.ThirdClassId), Standard: ko.observable(sm.Standard), Unit: ko.observable(sm.Unit), }); } }); materialGridView.refresh(); } }); } return { materials: materials, businessFields: businessFields, isValidateWithFunction: isValidateWithFunction, materialDataGridOptions: materialDataGridOptions, modifiableMaterialDataGridOptions: modifiableMaterialDataGridOptions, handleAfterLoadingModelByKey: handleAfterLoadingModelByKey, handleAfterSave: handleAfterSave, handlePopupShowing: handlePopupShowing, handlePopupShown: handlePopupShown, handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit, handleDeleteSelectedMaterials: handleDeleteSelectedMaterials }; } } });