c13a0ef68e765ff6586871b64aff3d4bb09e8fa6.svn-base 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. BemsWebApplication.MaterialStockAdjustment2 = function (params, viewInfo, forApprovalOptions) {
  2. "use strict";
  3. var materialClassForSearch = ko.observableArray();
  4. var materialClass = ko.observableArray();
  5. var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass');
  6. var facilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];
  7. var searchFacilityClassValues = [ko.observable(), ko.observable(), ko.observable()];
  8. var searchFacilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];
  9. var first = true;
  10. var visibleApprovalButton = ko.observable();
  11. var businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true),
  12. materialClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass', true, true),
  13. warehouseDataSource = BemsWebApplication.db.createDataSource('FmsMaterialWarehouse', true, true),
  14. releaseTypeDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeReleaseType'),
  15. adjustmentTypeDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeAdjustmentType');
  16. var materialClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
  17. businessFields = ko.observableArray(),
  18. releaseTypes = ko.observableArray(),
  19. warehouses = ko.observableArray(),
  20. materials = ko.observableArray(),
  21. adjustmentTypes = ko.observableArray();
  22. var forApprovalViewOptions, forApprovalPopupOptions, popup;
  23. var materialClassesForSearch = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
  24. materialClassValuesForSearch = [ko.observable(), ko.observable(), ko.observable()],
  25. businessFieldsForSearch = ko.observableArray(),
  26. businessFieldIdForSearch = ko.observable(),
  27. warehousesForSearch = ko.observableArray(),
  28. warehousesIdForSearch = ko.observable(),
  29. releaseTypesForSearch = ko.observableArray(),
  30. adjustmentTypesForSearch = ko.observableArray();
  31. if (_.isObject(forApprovalOptions)) {
  32. forApprovalViewOptions = forApprovalOptions.viewOptions;
  33. forApprovalPopupOptions = forApprovalOptions.popupOptions;
  34. }
  35. var deferredForSearch = new $.Deferred();
  36. var defaultSearchClassArray = $SearchView.createDefaultArray('MaterialClassId');
  37. var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter;
  38. function initializeSearchClasses(onlyThird) {
  39. if (onlyThird === undefined || onlyThird === false) {
  40. searchFacilityClasses[1](defaultSearchClassArray.slice(0));
  41. searchFacilityClassValues[1](0);
  42. }
  43. searchFacilityClasses[2](defaultSearchClassArray.slice(0));
  44. searchFacilityClassValues[2](0);
  45. }
  46. var handleFirstClassChangedValueInSearchView = function (e) {
  47. if (first == true && e.value == null) {
  48. e.value = 0;
  49. first = false;
  50. searchFacilityClassValues[0](0);
  51. }
  52. if (e.value === 0) {
  53. initializeSearchClasses();
  54. return;
  55. }
  56. BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[1], defaultSearchClassArray);
  57. };
  58. var handleSecondClassChangedValueInSearchView = function (e) {
  59. if (searchFacilityClassValues[1]() == null) {
  60. initializeSearchClasses();
  61. BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', 0, searchFacilityClasses[1], defaultSearchClassArray);
  62. }
  63. if (e.value === 0) {
  64. initializeSearchClasses(true);
  65. return;
  66. }
  67. BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[2], defaultSearchClassArray);
  68. };
  69. var dataSourceOptions = {
  70. select: [
  71. 'SiteId',
  72. 'BusinessFieldId',
  73. 'MaterialId',
  74. 'FmsMaterial/MaterialCode',
  75. 'FmsMaterial/Name',
  76. 'FmsMaterial/Unit',
  77. 'MaterialReleaseId',
  78. 'ReleaseTypeId',
  79. 'FmsMaterialCodeReleaseType/Name',
  80. 'FmsMaterialCodeAdjustmentType/Name',
  81. 'ReleaseDate',
  82. 'MaterialCount',
  83. 'ReleaseTotalCost',
  84. 'WarehouseId',
  85. 'CmBusinessField/Name',
  86. 'CmUser1/Name',
  87. 'CmUser/Name',
  88. 'IsConfirmed',
  89. 'ConfirmedUserId',
  90. 'AdjustmentTypeId',
  91. 'StockCountByPoint',
  92. 'FmsMaterial/FirstClassId',
  93. 'FmsMaterial/SecondClassId',
  94. 'FmsMaterial/ThirdClassId',
  95. 'FmsMaterial/Standard'
  96. ],
  97. filter: [
  98. ['SiteId', '=', BWA.UserInfo.SiteId()],
  99. 'and',
  100. ['AdjustmentTypeId', '<>', 0]
  101. ],
  102. expand: [
  103. 'CmUser', 'CmUser1',
  104. 'FmsMaterial',
  105. 'FmsMaterialCodeReleaseType',
  106. 'CmBusinessField',
  107. 'FmsMaterialCodeAdjustmentType'
  108. ],
  109. extendOptions: {
  110. forceOriginalField: true
  111. }
  112. };
  113. var viewModel;
  114. var viewOptions = {
  115. dataSourceOptions: dataSourceOptions,
  116. columns: [
  117. { dataField: 'MaterialReleaseId', caption: $G('number'), width: '10%', alignment: 'center', allowFiltering: false },
  118. { dataField: 'CmBusinessField/Name', caption: $G('businessFieldName'), width: '10%', alignment: 'center', },
  119. { dataField: 'FmsMaterialCodeReleaseType/Name', caption: '출고구분', width: '10%', alignment: 'center', visible: false },
  120. { dataField: 'FmsMaterialCodeAdjustmentType/Name', caption: '정산사유', width: '10%', alignment: 'center' },
  121. { dataField: 'FmsMaterial/MaterialCode', caption: '자재코드', width: '20%', alignment: 'center', visible: false },
  122. {
  123. dataField: 'FmsMaterial/FirstClassId', width: '13%', caption: '자재(대)', alignment: 'center',
  124. customizeText: function (cellInfo) {
  125. for (var i = 1; i < materialClassForSearch().length; i++) {
  126. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  127. return materialClassForSearch()[i].Name();
  128. }
  129. }
  130. }
  131. },
  132. {
  133. dataField: 'FmsMaterial/SecondClassId', width: '13%', caption: '자재(중)', alignment: 'center',
  134. customizeText: function (cellInfo) {
  135. for (var i = 1; i < materialClassForSearch().length; i++) {
  136. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  137. return materialClassForSearch()[i].Name();
  138. }
  139. }
  140. }
  141. },
  142. {
  143. dataField: 'FmsMaterial/ThirdClassId', width: '13%', caption: '자재(소)', alignment: 'center',
  144. customizeText: function (cellInfo) {
  145. for (var i = 1; i < materialClassForSearch().length; i++) {
  146. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  147. return materialClassForSearch()[i].Name();
  148. }
  149. }
  150. }
  151. },
  152. { dataField: 'FmsMaterial/Name', caption: '자재명', width: '20%', alignment: 'center' },
  153. { dataField: 'FmsMaterial/Standard', caption: '규격', width: '20%', alignment: 'center' },
  154. { dataField: 'FmsMaterial/Unit', caption: '단위', width: '10%', alignment: 'center' },
  155. { dataField: 'MaterialCount', caption: '수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
  156. {
  157. dataField: 'ReleaseDate', caption: '출고일', width: '20%', alignment: 'center', sortOrder: 'desc', dataType: "shortDate", format: "yyyy-MM-dd hh:mm:ss",
  158. customizeText: function (cellInfo) {
  159. return cellInfo.valueText;
  160. }
  161. },
  162. { dataField: 'CmUser1/Name', caption: '등록자', width: '10%', alignment: 'center' },
  163. { dataField: 'CmUser/Name', caption: '승인자', width: '10%', alignment: 'center' },
  164. ],
  165. pager: {
  166. },
  167. paging: {
  168. pageSize: 18,
  169. enabled: true
  170. },
  171. // 2019.04.17 엑셀 출력 기능 추가 ~~~
  172. "export": {
  173. enabled: true,
  174. fileName: '자재 정산 승인 목록'
  175. },
  176. onExporting: function (e) {
  177. e.component.columnOption("MaterialReleaseId", "visible", false);
  178. },
  179. onExported: function (e) {
  180. e.component.columnOption("MaterialReleaseId", "visible", true);
  181. },
  182. // ~~~ 2019.04.17 엑셀 출력 기능 추가
  183. selection: { mode: 'multiple', allowSelectAll: true },
  184. popupWidth: 1060,
  185. searchViewItems: [
  186. { id: 'ReleaseTypeId', ignoreValue: 0, defaultValue: 0, dataSource: releaseTypesForSearch },
  187. { id: 'FmsMaterialCodeAdjustmentType/Name' },
  188. { id: 'FmsMaterial/FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
  189. { id: 'FmsMaterial/SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FmsMaterial/FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
  190. { id: 'FmsMaterial/ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FmsMaterial/FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2] },
  191. { id: 'FmsMaterial/MaterialCode' },
  192. { id: 'FmsMaterial/Name' },
  193. { id: 'FmsMaterial/Unit' },
  194. { id: 'FmsMaterial/Standard' },
  195. { id: 'ReleaseDate', type: 'dateRange', isOnlyDate: true },
  196. { id: 'CmUser/Name' },
  197. { id: 'CmUser1/Name' },
  198. //{ id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: materialClassValuesForSearch[0], dataSource: materialClassesForSearch[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
  199. //{ id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: materialClassValuesForSearch[1], dataSource: materialClassesForSearch[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
  200. //{ id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: materialClassValuesForSearch[2], dataSource: materialClassesForSearch[2] },
  201. //{ id: 'BusinessFieldId', ignoreValue: 0, defaultValue: 0, value: businessFieldIdForSearch, dataSource: businessFieldsForSearch },
  202. //{ id: 'WarehouseId', ignoreValue: 0, defaultValue: 0, value: warehousesIdForSearch, dataSource: warehousesForSearch },
  203. ],
  204. isValidateWithFunction: function (errorMessage) {
  205. return popup.isValidateWithFunction(errorMessage);
  206. },
  207. mandatoryFields: [
  208. { dataField: 'ReleaseDate', name: '출고일' },
  209. { dataField: 'BusinessFieldId', name: $G('businessField') },
  210. { dataField: 'FmsMaterialCodeReleaseType/Name', name: '출고구분' },
  211. { dataField: 'FmsMaterialCodeAdjustmentType/Name', name: '정산사유' }
  212. ],
  213. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  214. dataGrid.clearSelection();
  215. var data = clickRow.data;
  216. var dataModel = viewModel.dataModel;
  217. if (popup && popup.handleBeforeShowingPopupForEdit) {
  218. popup.handleBeforeShowingPopupForEdit(data, dataModel);
  219. }
  220. popupVisible(true);
  221. },
  222. handleAfterLoadingModelByKey: function (data, dataViewModel) {
  223. if (popup && popup.handleAfterLoadingModelByKey) {
  224. popup.handleAfterLoadingModelByKey(data, dataViewModel);
  225. }
  226. },
  227. handlePopupShowing: function (isNewInPopup, dataViewModel) {
  228. //if (isNewInPopup()) {
  229. // viewModel.toolbarItems[1].options.visible(true);
  230. // viewModel.toolbarItems[2].options.visible(true);
  231. //}
  232. //else {
  233. // viewModel.toolbarItems[1].options.visible(false);
  234. // viewModel.toolbarItems[2].options.visible(false);
  235. //}
  236. if (popup && popup.handlePopupShowing) {
  237. popup.handlePopupShowing(isNewInPopup, dataViewModel);
  238. }
  239. },
  240. handlePopupShown: function (editMode, isNew, dataViewModel) {
  241. if (popup && popup.handlePopupShown) {
  242. popup.handlePopupShown(editMode, isNew, dataViewModel);
  243. }
  244. },
  245. handleViewShowing: function () {
  246. MaterialCodeClassDataSource.filter([
  247. ['SiteId', '=', BWA.UserInfo.SiteId()]
  248. ]);
  249. $.when(
  250. MaterialCodeClassDataSource.load()
  251. ).done(function (Result) {
  252. materialClass = ko.observableArray();
  253. var cnt = 0;
  254. for (var i = 0; i < Result.length; i++) {
  255. materialClass.push(Result[i]);
  256. if (Result[i].Depth() == 0) {
  257. if (cnt == 0) {
  258. searchFacilityClasses[0](defaultSearchClassArray.slice(0).concat(Result[i]));
  259. cnt++;
  260. }
  261. else {
  262. searchFacilityClasses[0].push(Result[i]);
  263. }
  264. }
  265. }
  266. facilityClasses[0](Result[0]);
  267. materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
  268. });
  269. var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName)
  270. if (useBusinessFiltering) {
  271. this.dataSourceOptions.filter.push('and');
  272. this.dataSourceOptions.filter.push([eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]);
  273. businessFieldDataSource.filter([
  274. eq('SiteId', BWA.UserInfo.SiteId()),
  275. and,
  276. [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]
  277. ]);
  278. }
  279. materialClassDataSource.filter([
  280. ['SiteId', '=', BWA.UserInfo.SiteId()],
  281. 'and',
  282. ['ParentMaterialClassId', '=', null]
  283. ]);
  284. adjustmentTypeDataSource.filter([
  285. ['AdjustmentTypeId', '<>', 0]
  286. ]);
  287. $.when(
  288. businessFieldDataSource.load(),
  289. materialClassDataSource.load(),
  290. warehouseDataSource.load(),
  291. releaseTypeDataSource.load(),
  292. adjustmentTypeDataSource.load()
  293. ).done(function (dbBusinessFields, dbMaterialClasses, dbWarehouses, dbreleaseTypes, dbadjustmentTypes) {
  294. dbBusinessFields = dbBusinessFields[0];
  295. dbMaterialClasses = dbMaterialClasses[0];
  296. dbWarehouses = dbWarehouses[0];
  297. // TODO : 아래 두코드의 차이점이 무엇인지 확인 필요.
  298. //releaseTypes(dbreleaseTypes);
  299. // 의도한 대로 동작하려면 아래 코드로 써야 함
  300. releaseTypes(dbreleaseTypes[0]);
  301. adjustmentTypes(dbadjustmentTypes[0]);
  302. materialClasses[0](dbMaterialClasses);
  303. materialClassesForSearch[0]($SearchView.createArrayOfSelectBox('MaterialClassId', dbMaterialClasses));
  304. initializeSearchClasses();
  305. businessFields(dbBusinessFields);
  306. warehouses(dbWarehouses);
  307. releaseTypesForSearch($SearchView.createArrayOfSelectBox('ReleaseTypeId', releaseTypes()));
  308. //adjustmentTypesForSearch($SearchView.createArrayOfSelectBox('AdjustmentTypeId', adjustmentTypes));
  309. //adjustmentTypesForSearch(adjustmentTypes);
  310. businessFieldsForSearch($SearchView.createArrayOfSelectBox('BusinessFieldId', dbBusinessFields));
  311. warehousesForSearch($SearchView.createArrayOfSelectBox('WarehouseId', dbWarehouses));
  312. deferredForSearch.resolve();
  313. });
  314. },
  315. handleViewShown: function () {
  316. },
  317. };
  318. if (_.isObject(forApprovalViewOptions)) {
  319. _.extend(viewOptions, forApprovalViewOptions);
  320. }
  321. else {
  322. // 승인 화면이 아니면 수정에 관련 기능이 필요없다.
  323. _.extend(viewOptions, {
  324. isValidateWithFunction: function (errorMessage) {
  325. if (popup && popup.isValidateWithFunction) {
  326. return popup.isValidateWithFunction(errorMessage);
  327. }
  328. return true;
  329. },
  330. mandatoryFields: [
  331. { dataField: 'BusinessFieldId', name: $G('businessField') }
  332. ],
  333. handleSaveButtonInPopup: function (isInsert) {
  334. if (isInsert === false) {
  335. if (popup && popup.handleAfterSave) {
  336. popup.handleAfterSave(undefined);
  337. }
  338. }
  339. },
  340. handleAfterSaveInPopup: function (responseKey, response) {
  341. if (popup && popup.handleAfterSave) {
  342. popup.handleAfterSave(responseKey, response);
  343. }
  344. },
  345. getAddedToolbarItemsInPopup: function (e) {
  346. var hasnotModificationPermission = e.hasnotModificationPermission,
  347. dataViewModel = e.dataViewModel,
  348. popupVisible = e.popupVisible,
  349. isEditModeInPopup = e.isEditModeInPopu,
  350. isNewInPopup = e.isNewInPopup;
  351. return [
  352. {
  353. location: 'after', widget: 'button', options: {
  354. text: $G('materialInsertion'), icon: 'search', visible: isNewInPopup,
  355. clickAction: function () { viewModel.materialSearchPopup.show(); }
  356. }
  357. },
  358. {
  359. location: 'after', widget: 'button', options: {
  360. text: $G('materialDeletion'), icon: 'remove', type: 'danger', visible: isNewInPopup,
  361. clickAction: function () {
  362. if (popup && popup.handleDeleteSelectedMaterials) { popup.handleDeleteSelectedMaterials(); }
  363. }
  364. }
  365. },
  366. {
  367. location: 'after',
  368. widget: 'button',
  369. options: {
  370. text: $G('approval'), icon: 'save', type: 'success',
  371. visible: visibleApprovalButton,
  372. //visible: true,
  373. disabled: hasnotModificationPermission,
  374. clickAction: function () {
  375. dataViewModel.ConfirmedDate(new Date());
  376. dataViewModel.IsConfirmed(true);
  377. dataViewModel.ConfirmedUserId(BWA.UserInfo.UserId());
  378. var keys = BWA.db.extractKeysObject('FmsMaterialRelease', dataViewModel);
  379. BWA.db.FmsMaterialRelease.update(keys, dataViewModel.toJS()).done(function (res) {
  380. // TODO : 트랜잭션이 필요할 것으로 예상됨
  381. var postData = dataViewModel.toJS();
  382. var parameters = {
  383. SiteId: dataViewModel.SiteId(),
  384. BusinessFieldId: dataViewModel.BusinessFieldId(),
  385. MaterialId: dataViewModel.MaterialId()
  386. };
  387. // 자재 테이블 업데이트 필요, 자재정산 승인
  388. BWA.api.post('FmsMaterialRelease/Approval', postData, parameters).done(function () {
  389. utils.toast.show($G('successDatabaseInsertionMsg'));
  390. popupVisible(false);
  391. viewModel.gridView().refresh();
  392. });
  393. });
  394. }
  395. }
  396. }
  397. ];
  398. },
  399. });
  400. }
  401. viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsMaterialRelease', viewOptions);
  402. // 툴바 버튼 관련 수정
  403. viewModel.toolbarItems[7].options.clickAction = handlePopupButtonSave;
  404. function handlePopupButtonSave() {
  405. if (viewModel.isNewInPopup()) {
  406. if (viewModel.popup.modifiableMaterialDataGridOptions.dataSource().length != 0) {
  407. var parameters = {
  408. SiteId: BWA.UserInfo.SiteId(),
  409. BusinessFieldId: viewModel.dataModel.BusinessFieldId(),
  410. //WorkRequestId: viewModel.dataModel.WorkRequestId()
  411. };
  412. var postData = [];
  413. for (var i = 0; i < viewModel.popup.modifiableMaterialDataGridOptions.dataSource().length; i++) {
  414. // AdjustmentTypeName
  415. // AdjustmentTypeId == 1 인 경우 재고수량보다 클 수 없음
  416. if (viewModel.dataModel.AdjustmentTypeId() == 1) {
  417. if (viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialCount() > viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].StockCountByPoint()) {
  418. //viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialCount(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].StockCount());
  419. //viewModel.popup.materialGridView.refresh();
  420. utils.toast.show('자재손실은 재고수량 보다 클 수 없습니다.', 'error');
  421. return;
  422. }
  423. }
  424. viewModel.dataModel.StockCountByPoint(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].StockCountByPoint());
  425. viewModel.dataModel.MaterialId(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialId());
  426. viewModel.dataModel.MaterialCount(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[i].MaterialCount());
  427. viewModel.dataModel.ReleaseTotalCost(0);
  428. postData.push(viewModel.dataModel.toJS());
  429. }
  430. BWA.api.post('FmsMaterialRelease/Add', postData, parameters).done(function () {
  431. utils.toast.show($G('successDatabaseInsertionMsg'));
  432. viewModel.popupVisible(false);
  433. viewModel.gridView().refresh();
  434. });
  435. }
  436. else {
  437. utils.toast.show('선택된 자재가 없습니다.', 'error');
  438. }
  439. }
  440. else if (viewModel.isEditModeInPopup()) {
  441. viewModel.dataModel.MaterialCount(viewModel.popup.modifiableMaterialDataGridOptions.dataSource()[0].MaterialCount());
  442. var keys = BWA.db.extractKeysObject('FmsMaterialRelease', viewModel.dataModel);
  443. BWA.db.FmsMaterialRelease.update(keys, viewModel.dataModel.toJS()).done(function (res) {
  444. utils.toast.show($G('successDatabaseUpdateMsg'));
  445. viewModel.popupVisible(false);
  446. viewModel.gridView().refresh();
  447. });
  448. }
  449. // 등록은 멀티플로 추가
  450. // 상세보기에는 하나만 표시되게 하고 자재추가/삭제 안되도록 변경 / 수량만 바꾸도록
  451. // 승인도 멀티플로 할 수 있도록
  452. };
  453. var commandInsertButtonOptions = [
  454. {
  455. id: 'create1',
  456. title: '등록',
  457. disabled: viewModel.hasnotModificationPermission,
  458. action: function () {
  459. viewModel.isNewInPopup(true);
  460. viewModel.viewModeInPopup(false);
  461. viewModel.isEditModeInPopup(true);
  462. viewModel.visibleDeleteButton(false);
  463. viewModel.visibleEditButton(false);
  464. viewModel.popupVisible(true);
  465. }
  466. },
  467. {
  468. id: 'create2',
  469. title: '승인',
  470. disabled: viewModel.hasnotModificationPermission,
  471. action: handleApproveSelectedItem
  472. }];
  473. viewModel.businessFields = businessFields;
  474. viewModel.releaseTypes = releaseTypes;
  475. viewModel.adjustmentTypes = adjustmentTypes;
  476. viewModel.visibleApprovalButton = visibleApprovalButton;
  477. viewModel.commandInsertButtonOptions = commandInsertButtonOptions;
  478. var isUsePopup = forApprovalPopupOptions && forApprovalPopupOptions.isUsePopup !== false;
  479. if ((forApprovalPopupOptions && _.isFunction(forApprovalPopupOptions.popupCreatorFunc))) {
  480. popup = viewModel.popup = forApprovalPopupOptions.popupCreatorFunc(viewInfo, viewModel, forApprovalPopupOptions);
  481. }
  482. else {
  483. popup = viewModel.popup = BWA.Popup.MaterialStockAdjustment.create(viewInfo, viewModel, forApprovalPopupOptions);
  484. }
  485. function handleApproveSelectedItem() {
  486. var materialStoredList = viewModel.gridView().getSelectedRowsData();
  487. var list = _.reject(materialStoredList, function (x) {
  488. try {
  489. return x.IsConfirmed();
  490. } catch (e) {
  491. return x.IsConfirmed;
  492. }
  493. });
  494. if (_.isEmpty(list)) {
  495. utils.toast.show('승인 할 정산 항목이 없습니다. 이미 승인되었거나 선택된 항목이 없습니다.', 'error');
  496. return;
  497. }
  498. var postData = list; // undefined;
  499. list.forEach(function (item) {
  500. item.SiteId = BWA.UserInfo.SiteId();
  501. item.IsConfirmed = true;
  502. item.ConfirmedUserId = BWA.UserInfo.UserId();
  503. try {
  504. item.MaterialReleaseId = item.MaterialReleaseId();
  505. } catch (e) {
  506. item.MaterialReleaseId = item.MaterialReleaseId;
  507. }
  508. });
  509. return BWA.api.post('FmsMaterialRelease/ApprovalMany', postData).then(function () {
  510. viewModel.refreshList();
  511. utils.toast.show('성공적으로 승인 처리되었습니다.');
  512. });
  513. }
  514. viewModel.handleSecondClassChangedValueInSearchView = handleSecondClassChangedValueInSearchView;
  515. viewModel.handleFirstClassChangedValueInSearchView = handleFirstClassChangedValueInSearchView;
  516. return viewModel;
  517. };