$(function () { 'use strict'; var materialClassForSearch = ko.observableArray(); var materialClass = ko.observableArray(); var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass'); BemsWebApplication.Popup.PurchaseOrder = { create: function (viewInfo, viewModel, forApprovalOptions) { var tradeCompanies = ko.observableArray(), materials = ko.observableArray(), materialsInView = ko.observableArray(), materialsInPurchaseRequest = ko.observableArray(), businessFields = ko.observableArray(); var materialFactory = BWA.Factory.Material, purchaseProgressCode = BWA.Code.PurchaseProgress, materialGridView, uploadedFileInfo = {}, materialDataGridOptions, modifiableMaterialDataGridOptions = undefined, purchaseOrderFileUrl = ko.observable(), initialized = false; var materialsDataSource = materialFactory.getBasicDataSourceRef({ dbModeIId: 'FmsMaterialPurchaseOrderMaterial', primaryKeyDataField: 'PurchaseOrderId', moreSelectFields: ['UnitCost'] }), materialsForPurchaseRequestDataSource = materialFactory.getBasicDataSourceRef({ dbModeIId: 'FmsMaterialPurchaseRequestMaterial', primaryKeyDataField: 'PurchaseRequestId', moreSelectFields: [ 'FmsMaterial/TradeCompanyId', 'FmsMaterial/FinalPrice'] }); var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter; function isValidateWithFunction(errorMessage) { if (_.isEmpty(materials())) { errorMessage.message = '발주 요청한 자재가 없습니다.'; return false; } return true; } function handlePopupShowing(isNewInPopup, dataModel) { $("#gridContainer2").dxDataGrid({ paging: { pageSize: 13, enabled: true } }); $("#gridContainer3").dxDataGrid({ paging: { pageSize: 13, 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_ORDER; if (userInfo.isDependBusinessField(viewInfo.viewName)) { BWA.db.CmBusinessField.byKey({ SiteId: userInfo.SiteId(), BusinessFieldId: userInfo.BusinessFieldId() }).done(function (businessField) { dataModel.BusinessFieldName(businessField.Name); }); } dataModel.BusinessFieldId(userInfo.BusinessFieldId()); dataModel.OrderUserId(userInfo.UserId()); dataModel.OrdererName(userInfo.Name()); dataModel.OrderDate(new Date()); dataModel.StoredDueDate(moment().add(1, 'd').toDate()); } } 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 = (typeof (row.MaterialId) == "function" ? row.MaterialId() : row.MaterialId); for (var i = 0 ; i < length ; i++) { if (id === (typeof (array[i].MaterialId) == "function" ? array[i].MaterialId() : array[i].MaterialId)) { materials().splice(i, 1); break; } } }); materialGridView.refresh(); } function handleViewShown(dataViewModel, isEditModeInPopup) { if (initialized === false) { } } function handleSaveSuccess() { } function handlePopupShown(isEditMode, isNew, dataViewModel) { } // 구매신청 정보가 저장된 후에 호출 된다. // 등록이면 responseKey가 있고, 수정이면 없다. function handleAfterSave(response, responseKey) { var array = materials(); if (_.isEmpty(array)) { return; } var siteId, purchaseOrderId, purchaseRequestId, businessFieldId; if (_.isUndefined(responseKey)) { var dataModel = viewModel.dataModel; siteId = dataModel.SiteId(); businessFieldId = dataModel.BusinessFieldId(); purchaseOrderId = dataModel.PurchaseOrderId(); purchaseRequestId = dataModel.PurchaseRequestId(); } else { siteId = responseKey.SiteId; businessFieldId = viewModel.dataModel.BusinessFieldId(); //hcLee 2016 01 05 아래 위 변경 purchaseOrderId = responseKey.PurchaseOrderId; purchaseRequestId = viewModel.dataModel.PurchaseRequestId(); } var parameters = { SiteId: siteId, BusinessFieldId: businessFieldId, PurchaseOrderId: purchaseOrderId, PurchaseRequestId: purchaseRequestId }; var postData = _.map(array, function (m) { return { SiteId: siteId, BusinessFieldId: businessFieldId, PurchaseOrderId: purchaseOrderId, MaterialId: (typeof (m.MaterialId) == "function" ? m.MaterialId() : m.MaterialId), MaterialCount: (typeof (m.MaterialCount) == "function" ? m.MaterialCount() : m.MaterialCount), UnitCost: (typeof (m.UnitCost) == "function" ? m.UnitCost() : m.UnitCost) }; }); BWA.api.post('FmsMaterialPurchaseOrderMaterial', postData, parameters).done(function () { utils.toast.show($G('successDatabaseInsertionMsg')); viewModel.popupVisible(false); viewModel.gridView().refresh(); }); } function handleAfterLoadingModelByKey(data, dataViewModel) { var url = [ BWA.db._url, '/CmFile(SiteId={0},FileId={1})/$value'.formati(dataViewModel.SiteId(), dataViewModel.FileId()) ].join(''); purchaseOrderFileUrl(url); loadMaterialsInPurchaseRequest({ SiteId: dataViewModel.SiteId(), BusinessFieldId: dataViewModel.BusinessFieldId(), PurchaseRequestId: dataViewModel.PurchaseRequestId() }); materialsDataSource.filter([ eq('SiteId', dataViewModel.SiteId()), and, eq('BusinessFieldId', dataViewModel.BusinessFieldId()), and, eq('PurchaseOrderId', dataViewModel.PurchaseOrderId()) ]); materialsDataSource.load().done(function (dbMaterials) { materialsInView(dbMaterials); }); viewModel.visibleDeleteButton(false); } function handleBeforeShowingPopupForEdit(rowData, dataViewModel) { dataViewModel.OrdererName = $KoSet(dataViewModel.OrdererName, rowData['CmUser/Name']); dataViewModel.BusinessFieldName = $KoSet(dataViewModel.BusinessFieldName, rowData['CmBusinessField/Name']); dataViewModel.PurchaseRequestTitle = $KoSet(dataViewModel.PurchaseRequestTitle, rowData['FmsMaterialPurchaseRequest/Title']); dataViewModel.PurchaseRequestReason = $KoSet(dataViewModel.PurchaseRequestReason, rowData['FmsMaterialPurchaseRequest/Reason']); dataViewModel.TradeCompanyName = $KoSet(dataViewModel.TradeCompanyName, rowData['FmsMaterialTradeCompany/Name']); dataViewModel.FileName = $KoSet(dataViewModel.FileName, rowData['CmFile/Name']); } function handleButtonSearchPurchaseRequest() { viewModel.purchaseRequestSearchPopup.show(); } function handleSelectBoxChangeTradeCompany(e) { e.value; } function loadMaterialsInPurchaseRequest(purchaseRequest) { materialsForPurchaseRequestDataSource.filter([ eq('SiteId', purchaseRequest.SiteId), and, eq('BusinessFieldId', purchaseRequest.BusinessFieldId), and, eq('PurchaseRequestId', purchaseRequest.PurchaseRequestId) ]); // 선택된 구매요청에 대한 자재들을 로드한다. var promise = materialsForPurchaseRequestDataSource.load(); promise.then(function (dbMaterials) { var companies = []; materialsInPurchaseRequest(_.map(dbMaterials, function (m) { var tradeCompanyId = m['FmsMaterial/TradeCompanyId']; BWA.DataUtil.pushInArrayNoDup(companies, ['TradeCompanyId'], { TradeCompanyId: tradeCompanyId, Name: m['FmsMaterial/FmsMaterialTradeCompany/Name'] }); m.TradeCompanyId = tradeCompanyId; m.UnitCost = m['FmsMaterial/FinalPrice']; if (m.UnitCost() === null) { m.UnitCost(0); } return m; })); // 구매신청에 대한 모든 자재를 표시 materials(dbMaterials); }); } viewModel.popupVisible.subscribe(function (visible) { if (!visible) { materialsInView([]); } }); viewModel.isEditModeInPopup.subscribe(function (isEditMode) { if (isEditMode) { materials(materialsInView.slice(0)); } }); // 값이 같아도 항상 subscribe가 호출 viewModel.dataModel.TradeCompanyId.extend({ notify: 'always' }); // 거래처가 바뀌면 해당하는 자재들로 보여준다. viewModel.dataModel.TradeCompanyId.subscribe(function (tradeCompanyId) { if (viewModel.isEditModeInPopup() && viewModel.isNewInPopup()) { if (_.isNull(tradeCompanyId)) { materials([]); return; } materials(_.reject(materialsInPurchaseRequest(), function (m) { return m.TradeCompanyId() !== tradeCompanyId; })); } else { var isNeedRefresh = false; _.each(materialsInPurchaseRequest(), function (m) { isNeedRefresh |= BWA.DataUtil.pushInArrayNoDup(materials(), ['MaterialId'], m); }); if (isNeedRefresh) { materialGridView.refresh(); } } }); // dxview에서 사용할 ko를 미리 생성해 둬야 값 변경시 적용된다. viewModel.dataModel.BusinessFieldName = ko.observable(); viewModel.dataModel.ProgressName = ko.observable(); viewModel.dataModel.OrdererName = ko.observable(); viewModel.dataModel.TradeCompanyName = ko.observable(); viewModel.dataModel.PurchaseRequestTitle = ko.observable(); viewModel.dataModel.PurchaseRequestReason = ko.observable(); var materialColumns = [ ].concat(materialFactory.getColumns([ { dataField: 'FirstClassId', width: '19%', 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: '19%', 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: '19%', 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: 'Name', width: '35%' }, { dataField: 'Standard', width: '35%', caption: '규격', alignment: 'center' }, { dataField: 'Unit', width: '15%', caption: '단위', alignment: 'center' }, ])); var numberFormat = $NumberFormat; materialDataGridOptions = utils.datagrid.defaultOptions({ width: 940, visible: viewModel.viewModeInPopup, pager: { showPageSizeSelector: false, allowedPageSizes: [] }, dataSource: materialsInView, columns: materialColumns.concat([ { dataField: 'UnitCost', width: '15%', alignment: 'center', caption: $G('unitCost'), customizeText: function (cellInfo) { return numberFormat(cellInfo.value); } }, { dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: $G('materialCount'), customizeText: function (cellInfo) { return numberFormat(cellInfo.value); } }, ]) }); modifiableMaterialDataGridOptions = utils.datagrid.defaultOptions({ width: 940, pager: { showPageSizeSelector: false, allowedPageSizes: [] }, visible: viewModel.isEditModeInPopup, dataSource: materials, selection: { mode: 'multiple', allowSelectAll: true }, columns: materialColumns.concat([ { dataField: 'UnitCost', width: '15%', type: 'number', caption: $G('unitCost'), alignment: 'center', cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({ step: 100 }) }, { dataField: 'MaterialCount', width: '15%', type: 'number', caption: $G('materialCount'), alignment: 'center', cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({ min: 0, max: 1000000, convertValueWhenValueChanged: function (value) { return Math.max(1, value); } }) }]), cellClick: function (e) { utils.datagrid.cellClickEventForDataGridTemplate(e, 'MaterialCount'); utils.datagrid.cellClickEventForDataGridTemplate(e, 'UnitCost'); }, contentReadyAction: function (e) { materialGridView = e.component; }, }); viewModel.materialSearchPopup = BWA.Popup.Material.create(viewModel, { isMultipleSelect: true, onSelectedMaterials: function (sMaterials) { var koValue = $KoValue; var purchaseOrderId = viewModel.dataModel.PurchaseOrderId(); _.each(sMaterials, function (sm) { // 어차피 SiteId와 BusinessField는 동일 할 수 밖에 없으므로 비교하지 않는다. var found = _.some(materials(), function (m) { return (typeof (m.MaterialId) == "function" ? m.MaterialId() : m.MaterialId) === (typeof (sm.MaterialId) == "function" ? sm.MaterialId() : sm.MaterialId); }); if (found) return; var newMaterial = { SiteId: sm.SiteId, PurchaseOrderId: ko.observable(purchaseOrderId), MaterialId: sm.MaterialId, Name: sm.Name, MaterialCode: sm.MaterialCode, MaterialCount: ko.observable(1), UnitCost: ko.observable(koValue(sm.FinalPrice)), FirstClassId: (typeof (sm.FirstClassId) == "function" ? ko.observable(sm.FirstClassId()) : ko.observable(sm.FirstClassId)), SecondClassId: (typeof (sm.SecondClassId) == "function" ? ko.observable(sm.SecondClassId()) : ko.observable(sm.SecondClassId)), ThirdClassId: (typeof (sm.ThirdClassId) == "function" ? ko.observable(sm.ThirdClassId()) : ko.observable(sm.ThirdClassId)), Standard: (typeof (sm.Standard) == "function" ? ko.observable(sm.Standard()) : ko.observable(sm.Standard)), Unit: (typeof (sm.Unit) == "function" ? ko.observable(sm.Unit()) : ko.observable(sm.Unit)), 'FmsMaterial/FmsMaterialTradeCompany/Name': sm['FmsMaterialTradeCompany/Name'] }; if (_.isNull(newMaterial.UnitCost())) { newMaterial.UnitCost(0); } materials.push(newMaterial); }); materialGridView.refresh(); } }); viewModel.purchaseRequestSearchPopup = BWA.Popup.PurchaseRequestSearch.create(viewModel, { filter: [ eq('SiteId', BWA.UserInfo.SiteId()), and, eq('ProgressId', $Code.PurchaseProgress.PURCHASE_REQUEST_APPROVAL) ], onSelectedPurchaseRequest: function (purchaseRequest) { var purchaseRequestId = purchaseRequest.PurchaseRequestId; loadMaterialsInPurchaseRequest(purchaseRequest); viewModel.dataModel.PurchaseRequestId(purchaseRequest.PurchaseRequestId); viewModel.dataModel.PurchaseRequestTitle(purchaseRequest.Title); viewModel.dataModel.PurchaseRequestReason(purchaseRequest.Reason); // JD Comment : 구매목록이 선택되면 비즈니스 필드를 변경 viewModel.dataModel.BusinessFieldId(purchaseRequest.BusinessFieldId); } }); return { businessFields: businessFields, tradeCompanies: tradeCompanies, purchaseOrderFileUrl: purchaseOrderFileUrl, isValidateWithFunction: isValidateWithFunction, materialDataGridOptions: materialDataGridOptions, modifiableMaterialDataGridOptions: modifiableMaterialDataGridOptions, handleAfterLoadingModelByKey: handleAfterLoadingModelByKey, handleAfterSave: handleAfterSave, handleViewShown: handleViewShown, handlePopupShowing: handlePopupShowing, handlePopupShown: handlePopupShown, handleSaveSuccess: handleSaveSuccess, handleButtonSearchPurchaseRequest: handleButtonSearchPurchaseRequest, handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit, handleDeleteSelectedMaterials: handleDeleteSelectedMaterials, materials: materials, }; } } });