c5bafb400d31a4b73aaac3933da6a31885d24ef8.svn-base 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. BemsWebApplication.MaterialStored2 = 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 MenuPermission;
  10. var defaultSearchClassArray = $SearchView.createDefaultArray('MaterialClassId');
  11. var businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true),
  12. materialDataSource = BemsWebApplication.db.createDataSource('FmsMaterial', true, true),
  13. warehouseDataSource = BWA.db.createDataSource('FmsMaterialWarehouse', true, true),
  14. progressDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeProgress'),
  15. warehouses = ko.observableArray(),
  16. businessFields = ko.observableArray();
  17. var materialStoredDatSource = BWA.db.createDataSource('FmsMaterialStored', true, true),
  18. materials = ko.observableArray(),
  19. dataModelMaterial = new BWA.FmsMaterialViewModel();
  20. var materialFactory = BWA.Factory.Material;
  21. var materialsForPurchaseOrderDataSource = materialFactory.getBasicDataSourceRef({
  22. dbModeIId: 'FmsMaterialPurchaseOrderMaterial',
  23. primaryKeyDataField: 'PurchaseOrderId',
  24. moreSelectFields: [
  25. 'FmsMaterial/Unit', 'FmsMaterial/Standard',
  26. 'FmsMaterial/TradeCompanyId',
  27. 'FmsMaterial/FinalPrice',
  28. 'FmsMaterial/FirstClassId',
  29. 'FmsMaterial/SecondClassId',
  30. 'FmsMaterial/ThirdClassId'
  31. ]
  32. });
  33. var forApprovalViewOptions,
  34. forApprovalPopupOptions,
  35. popup;
  36. if (_.isObject(forApprovalOptions)) {
  37. forApprovalViewOptions = forApprovalOptions.viewOptions;
  38. forApprovalPopupOptions = forApprovalOptions.popupOptions;
  39. }
  40. var materialDataGridOptions = undefined;
  41. var materialGridView;
  42. var eq = BWA.DataUtil.constructEqualFilter,
  43. and = BWA.DataUtil.andFilter;
  44. var deferredForSearch = new $.Deferred();
  45. var businessFieldsForSearch = ko.observableArray(),
  46. progressesForSearch = ko.observableArray();
  47. var dataSourceOptions = {
  48. select: [
  49. 'SiteId',
  50. 'BusinessFieldId',
  51. 'StoredDate',
  52. 'MaterialStoredId',
  53. 'PurchaseOrderId',
  54. 'StoredCount',
  55. 'RemainStoredCount',
  56. 'ApprovalDate',
  57. 'IsApproval',
  58. 'CmBusinessField/Name',
  59. 'FmsMaterialWarehouse/Name',
  60. 'FmsMaterialPurchaseOrder/Title',
  61. 'FmsMaterialPurchaseOrder/Reason', // 2016 01 11 hcLee 추가
  62. 'FmsMaterial/MaterialCode',
  63. 'FmsMaterial/Name',
  64. 'FmsMaterial/Unit',
  65. 'FmsMaterial/Standard',
  66. 'LocationInWarehouse',
  67. 'CmUser/Name', 'CmUser1/Name',
  68. 'FmsMaterial/FirstClassId',
  69. 'FmsMaterial/SecondClassId',
  70. 'FmsMaterial/ThirdClassId'
  71. ],
  72. expand: [
  73. 'CmBusinessField',
  74. 'FmsMaterial',
  75. 'FmsMaterialWarehouse',
  76. 'FmsMaterialPurchaseOrder',
  77. 'CmUser', 'CmUser1'
  78. ],
  79. filter: [
  80. ['SiteId', '=', BWA.UserInfo.SiteId()],
  81. ],
  82. extendOptions: { forceOriginalField: true, }
  83. };
  84. var viewModel;
  85. var viewOptions = {
  86. popupWidth: 1600,
  87. dataSourceOptions: dataSourceOptions,
  88. columns: [
  89. { dataField: 'MaterialStoredId', caption: $G('number'), width: '8%', alignment: 'center', sortOrder: 'desc' },
  90. { dataField: 'CmBusinessField/Name', caption: $G('businessFieldName'), width: '10%', alignment: 'center', },
  91. {
  92. dataField: 'FmsMaterial/FirstClassId', width: '12%', caption: '자재(대)', alignment: 'center',
  93. customizeText: function (cellInfo) {
  94. for (var i = 1; i < materialClassForSearch().length; i++) {
  95. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  96. return materialClassForSearch()[i].Name();
  97. }
  98. }
  99. }
  100. },
  101. {
  102. dataField: 'FmsMaterial/SecondClassId', width: '12%', caption: '자재(중)', alignment: 'center',
  103. customizeText: function (cellInfo) {
  104. for (var i = 1; i < materialClassForSearch().length; i++) {
  105. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  106. return materialClassForSearch()[i].Name();
  107. }
  108. }
  109. }
  110. },
  111. {
  112. dataField: 'FmsMaterial/ThirdClassId', width: '12%', caption: '자재(소)', alignment: 'center',
  113. customizeText: function (cellInfo) {
  114. for (var i = 1; i < materialClassForSearch().length; i++) {
  115. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  116. return materialClassForSearch()[i].Name();
  117. }
  118. }
  119. }
  120. },
  121. { dataField: 'FmsMaterial/MaterialCode', caption: $G('materialCode'), width: '20%', alignment: 'center', visible: false },
  122. { dataField: 'FmsMaterial/Name', caption: $G('materialName'), width: '20%', alignment: 'center' },
  123. { dataField: 'FmsMaterial/Standard', caption: '규격', width: '20%', alignment: 'center' },
  124. { dataField: 'FmsMaterial/Unit', caption: $G('unit'), width: '8%', alignment: 'center' },
  125. { dataField: 'StoredCount', caption: $G('storedCount'), width: '11%', alignment: 'center', format: 'fixedPoint' },
  126. {
  127. dataField: 'StoredDate', caption: $G('storedDateTime'), width: '20%', alignment: 'center', sortOrder: 'desc', dataType: "shortDate", format: "yyyy-MM-dd hh:mm:ss",
  128. customizeText: function (cellInfo) {
  129. return cellInfo.valueText;
  130. }
  131. },
  132. {
  133. dataField: 'ApprovalDate', caption: $G('approvalDate'), width: '20%', alignment: 'center', sortOrder: 'desc', dataType: "shortDate", format: "yyyy-MM-dd hh:mm:ss",
  134. customizeText: function (cellInfo) {
  135. return cellInfo.valueText;
  136. }
  137. },
  138. { dataField: 'CmUser1/Name', caption: $G('approvalUserName'), width: '8%', alignment: 'center' }
  139. ],
  140. paging: {
  141. pageSize: 18,
  142. enabled: true
  143. },
  144. pager: {},
  145. "export": {
  146. enabled: true,
  147. fileName: '자재 입고 목록',
  148. },
  149. onExporting: function (e) {
  150. e.component.columnOption("MaterialStoredId", "visible", false);
  151. },
  152. onExported: function (e) {
  153. e.component.columnOption("MaterialStoredId", "visible", true);
  154. },
  155. promiseDataInSearchView: deferredForSearch.promise(),
  156. searchViewItems: [
  157. { id: 'BusinessFieldId', ignoreValue: 0, defaultValue: 0, dataSource: businessFieldsForSearch },
  158. { id: 'FmsMaterial/MaterialCode' },
  159. { id: 'FmsMaterial/FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
  160. { id: 'FmsMaterial/SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FmsMaterial/FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
  161. { id: 'FmsMaterial/ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FmsMaterial/FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2] },
  162. { id: 'FmsMaterial/Name' },
  163. //hcLee 2015 11 18
  164. { id: 'FmsMaterial/Standard' },
  165. { id: 'StoredCount' },
  166. { id: 'CmUser1/Name' },
  167. { id: 'ProgressId', ignoreValue: 0, defaultValue: 0, dataSource: progressesForSearch },
  168. { id: 'StoredDate', type: 'dateRange', isOnlyDate: true },
  169. { id: 'ApprovalDate', type: 'dateRange', isOnlyDate: true },
  170. ],
  171. handleViewShowing: function (dataModel) {
  172. MaterialCodeClassDataSource.filter([
  173. ['SiteId', '=', BWA.UserInfo.SiteId()]
  174. ]);
  175. $.when(
  176. MaterialCodeClassDataSource.load()
  177. ).done(function (Result) {
  178. materialClass = ko.observableArray();
  179. var cnt = 0;
  180. for (var i = 0; i < Result.length; i++) {
  181. materialClass.push(Result[i]);
  182. if (Result[i].Depth() == 0) {
  183. if (cnt == 0) {
  184. searchFacilityClasses[0](defaultSearchClassArray.slice(0).concat(Result[i]));
  185. cnt++;
  186. }
  187. else {
  188. searchFacilityClasses[0].push(Result[i]);
  189. }
  190. }
  191. }
  192. facilityClasses[0](Result[0]);
  193. materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
  194. });
  195. var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName)
  196. this.dataSourceOptions.filter.splice(0, this.dataSourceOptions.filter.length);
  197. this.dataSourceOptions.filter.push([eq('SiteId', BWA.UserInfo.SiteId())]);
  198. if (useBusinessFiltering) {
  199. this.dataSourceOptions.filter.push('and');
  200. this.dataSourceOptions.filter.push([eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId())]);
  201. businessFieldDataSource.filter([
  202. eq('SiteId', BWA.UserInfo.SiteId()),
  203. 'and',
  204. ['BusinessFieldId', '=', BWA.UserInfo.BusinessFieldId()],
  205. 'and',
  206. ['BusinessFieldId', '<>', 1]
  207. ]);
  208. }
  209. else {
  210. this.dataSourceOptions.filter.push('and');
  211. this.dataSourceOptions.filter.push(['BusinessFieldId', '<>', 1]);
  212. businessFieldDataSource.filter([
  213. eq('SiteId', BWA.UserInfo.SiteId()),
  214. 'and',
  215. ['BusinessFieldId', '<>', 1],
  216. ]);
  217. }
  218. for (var i = 0; i < BWA.UserInfo.MenuPermissions().length; i++) {
  219. if (BWA.UserInfo.MenuPermissions()[i].MenuId == 'MaterialStored2') {
  220. MenuPermission = BWA.UserInfo.MenuPermissions()[i].MenuPermission;
  221. break;
  222. }
  223. }
  224. if (MenuPermission >= 4) {
  225. warehouseDataSource.filter([
  226. eq('SiteId', BWA.UserInfo.SiteId()),
  227. and,
  228. eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()),
  229. and,
  230. eq('IsUse', true),
  231. and,
  232. ['BusinessFieldId', '<>', 1],
  233. ]);
  234. }
  235. else {
  236. warehouseDataSource.filter([
  237. eq('SiteId', BWA.UserInfo.SiteId()),
  238. and,
  239. eq('IsUse', true),
  240. and,
  241. ['BusinessFieldId', '<>', 1],
  242. ]);
  243. }
  244. $.when(
  245. businessFieldDataSource.load(),
  246. warehouseDataSource.load(),
  247. progressDataSource.load())
  248. .done(function (dbBusinessField, dbWarehouses, dbProgresses) {
  249. dbBusinessField = dbBusinessField[0];
  250. dbWarehouses = dbWarehouses[0];
  251. dbProgresses = dbProgresses[0];
  252. businessFields(dbBusinessField);
  253. warehouses(dbWarehouses);
  254. businessFieldsForSearch($SearchView.createArrayOfSelectBox('BusinessFieldId', dbBusinessField));
  255. progressesForSearch($SearchView.createArrayOfSelectBox('ProgressId', dbProgresses));
  256. deferredForSearch.resolve();
  257. });
  258. },
  259. handleViewShown: function () {
  260. },
  261. handlePopupShown: function (isEditMode, isNew, dataViewModel) {
  262. var warehouses = viewModel.warehouses();
  263. if (!_.isEmpty(warehouses)) {
  264. dataViewModel.WarehouseId(warehouses[0].WarehouseId());
  265. }
  266. if (isEditMode) {
  267. if (isNew) {
  268. dataViewModel.IsApproval(false);
  269. }
  270. var userInfo = BWA.UserInfo;
  271. }
  272. },
  273. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  274. dataGrid.clearSelection();
  275. var data = clickRow.data;
  276. var dataModel = viewModel.dataModel;
  277. if (forApprovalViewOptions && forApprovalViewOptions.handleBeforeShowingPopupForEdit) {
  278. forApprovalViewOptions.handleBeforeShowingPopupForEdit(data, dataModel);
  279. }
  280. dataModel.BusinessFieldName = $KoSet(dataModel.BusinessFieldName, data['CmBusinessField/Name']);
  281. dataModel.StoredUserName = $KoSet(dataModel.StoredUserName, data['CmUser/Name']);
  282. dataModel.PurchaseOrderTitle = $KoSet(dataModel.PurchaseOrderTitle, data['FmsMaterialPurchaseOrder/Title']);
  283. //hcLee 2016 01 11
  284. dataModel.PurchaseOrderReason = $KoSet(dataModel.PurchaseOrderReason, data['FmsMaterialPurchaseOrder/Reason']);
  285. dataModel.ApprovalUserName = $KoSet(dataModel.ApprovalUserName, data['CmUser1/Name']);
  286. dataModel.WarehouseName = $KoSet(dataModel.WarehouseName, data['FmsMaterialWarehouse/Name']);
  287. dataModelMaterial.FirstClassId(data['FmsMaterial/FirstClassId']());
  288. dataModelMaterial.SecondClassId(data['FmsMaterial/SecondClassId']());
  289. dataModelMaterial.ThirdClassId(data['FmsMaterial/ThirdClassId']());
  290. dataModelMaterial.Name(data['FmsMaterial/Name']());
  291. dataModelMaterial.Unit(data['FmsMaterial/Unit']());
  292. dataModelMaterial.Standard(data['FmsMaterial/Standard']());
  293. popupVisible(true);
  294. },
  295. handleAfterLoadingModelByKey: function (data, dataViewModel) {
  296. loadMaterials(dataViewModel);
  297. },
  298. // 팝업 화면이 나타날때 발생하는 이벤트
  299. handlePopupShowing: function (isNewInPopup) {
  300. var userInfo = BWA.UserInfo;
  301. if (isNewInPopup()) {
  302. materials([]);
  303. viewModel.dataModel.BusinessFieldId(userInfo.BusinessFieldId());
  304. viewModel.dataModel.StoredUserId(userInfo.UserId());
  305. viewModel.dataModel.StoredUserName(userInfo.Name());
  306. viewModel.dataModel.StoredDate(new Date());
  307. }
  308. }
  309. };
  310. if (_.isObject(forApprovalViewOptions)) {
  311. _.extend(viewOptions, forApprovalViewOptions);
  312. }
  313. else {
  314. // 승인 화면이 아니면 수정에 관련 기능이 필요없다.
  315. _.extend(viewOptions, {
  316. isValidateWithFunction: function (errorMessage) {
  317. if (popup && popup.isValidateWithFunction) {
  318. return popup.isValidateWithFunction(errorMessage);
  319. }
  320. return true;
  321. },
  322. mandatoryFields: [
  323. { dataField: 'PurchaseRequestId', name: $G('purchaseRequest') },
  324. { dataField: 'MaterialId', name: $G('materialName') },
  325. { dataField: 'WarehouseId', name: $G('warehouseName') },
  326. { dataField: 'StoredCount', name: $G('storedCount') }
  327. ],
  328. handleSaveButtonInPopup: function (isInsert) {
  329. if (isInsert === false) {
  330. if (popup && popup.handleAfterSave) {
  331. popup.handleAfterSave(undefined);
  332. }
  333. }
  334. },
  335. handleAfterSaveInPopup: function (responseKey, response) {
  336. if (popup && popup.handleAfterSave) {
  337. popup.handleAfterSave(responseKey, response);
  338. }
  339. },
  340. });
  341. }
  342. function initializeSearchClasses(onlyThird) {
  343. if (onlyThird === undefined || onlyThird === false) {
  344. searchFacilityClasses[1](defaultSearchClassArray.slice(0));
  345. searchFacilityClassValues[1](0);
  346. }
  347. searchFacilityClasses[2](defaultSearchClassArray.slice(0));
  348. searchFacilityClassValues[2](0);
  349. }
  350. var handleFirstClassChangedValueInSearchView = function (e) {
  351. if (e.value === 0) {
  352. initializeSearchClasses();
  353. return;
  354. }
  355. BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[1], defaultSearchClassArray);
  356. };
  357. var handleSecondClassChangedValueInSearchView = function (e) {
  358. if (searchFacilityClassValues[1]() == null) {
  359. initializeSearchClasses();
  360. BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', 0, searchFacilityClasses[1], defaultSearchClassArray);
  361. }
  362. if (e.value === 0) {
  363. initializeSearchClasses(true);
  364. return;
  365. }
  366. BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[2], defaultSearchClassArray);
  367. };
  368. function loadMaterials(dataViewModel) {
  369. var materialStoredId = dataViewModel.MaterialStoredId();
  370. materialsForPurchaseOrderDataSource.filter([
  371. eq('SiteId', dataViewModel.SiteId()),
  372. and,
  373. eq('BusinessFieldId', dataViewModel.BusinessFieldId()),
  374. and,
  375. eq('PurchaseOrderId', dataViewModel.PurchaseOrderId())
  376. ]);
  377. materialStoredDatSource.filter([
  378. eq('SiteId', dataViewModel.SiteId()),
  379. and,
  380. eq('BusinessFieldId', dataViewModel.BusinessFieldId()),
  381. and,
  382. eq('PurchaseOrderId', dataViewModel.PurchaseOrderId())
  383. ]);
  384. materialStoredDatSource.load().done(function (dbStoredMaterials) {
  385. materialsForPurchaseOrderDataSource.load().done(function (dbMaterials) {
  386. materials(_.map(dbMaterials, function (m) {
  387. m.Unit = m.Unit();
  388. m.Standard = m.Standard();
  389. m.UnitCost = m['FmsMaterial/FinalPrice'];
  390. m.FirstClassId = m.FirstClassId();
  391. m.SecondClassId = m.SecondClassId();
  392. m.ThirdClassId = m.ThirdClassId();
  393. if (m.UnitCost() === null) {
  394. m.UnitCost(0);
  395. }
  396. m.StoredCount = ko.observable(0);
  397. m.PossibleStoredCount = ko.observable(0);
  398. if (_.isEmpty(dbStoredMaterials)) {
  399. m.PossibleStoredCount(m.MaterialCount());
  400. }
  401. // 입고가능수량 계산
  402. var currentStoredCountSum = 0;
  403. dbStoredMaterials.forEach(function (item) {
  404. if (m.MaterialId() == item.MaterialId() && item.StockCount !== undefined) {
  405. currentStoredCountSum += item.StoredCount();
  406. }
  407. });
  408. m.PossibleStoredCount(m.MaterialCount() - currentStoredCountSum);
  409. dbStoredMaterials.forEach(function (item) {
  410. if (m.MaterialId() == item.MaterialId() && item.MaterialStoredId() == materialStoredId) {
  411. if (item.StoredCount === undefined) {
  412. m.StoredCount(0);
  413. } else {
  414. m.StoredCount(item.StoredCount());
  415. }
  416. return false;
  417. }
  418. });
  419. return m;
  420. }));
  421. });
  422. });
  423. }
  424. function loadMaterialsInPurchaseOrder(purchaseOrder) {
  425. materialsForPurchaseOrderDataSource.filter([
  426. eq('SiteId', purchaseOrder.SiteId),
  427. and,
  428. eq('BusinessFieldId', purchaseOrder.BusinessFieldId),
  429. and,
  430. eq('PurchaseOrderId', purchaseOrder.PurchaseOrderId)
  431. ]);
  432. // 선택된 구매요청에 대한 자재들을 로드한다.
  433. var promise = materialsForPurchaseOrderDataSource.load();
  434. promise.then(function (dbMaterials) {
  435. var companies = [];
  436. materialStoredDatSource.filter([
  437. eq('SiteId', purchaseOrder.SiteId),
  438. and,
  439. eq('BusinessFieldId', purchaseOrder.BusinessFieldId),
  440. and,
  441. eq('PurchaseOrderId', purchaseOrder.PurchaseOrderId)
  442. ]);
  443. materialStoredDatSource.load().done(function (dbStoredMaterials) {
  444. materials(_.map(dbMaterials, function (m) {
  445. m.Unit = m.Unit;
  446. m.Standard = m.Standard;
  447. m.UnitCost = m['FmsMaterial/FinalPrice'];
  448. m.FirstClassId = m.FirstClassId;
  449. m.SecondClassId = m.SecondClassId;
  450. m.ThirdClassId = m.ThirdClassId;
  451. m.MaxMaterialCount = ko.observable();
  452. m.StoredCount = ko.observable();
  453. m.PossibleStoredCount = ko.observable();
  454. if (_.isEmpty(dbStoredMaterials)) {
  455. m.PossibleStoredCount(m.MaterialCount());
  456. }
  457. // 입고가능수량 계산
  458. var currentStoredCountSum = 0;
  459. dbStoredMaterials.forEach(function (item) {
  460. if (m.MaterialId() == item.MaterialId() && item.StockCount !== undefined) {
  461. currentStoredCountSum += item.StoredCount();
  462. }
  463. });
  464. m.PossibleStoredCount(m.MaterialCount() - currentStoredCountSum);
  465. m.MaxMaterialCount(m.MaterialCount() - currentStoredCountSum);
  466. if (m.UnitCost() === null) { m.UnitCost(0); }
  467. m.StoredCount(m.PossibleStoredCount());
  468. return m;
  469. }));
  470. });
  471. });
  472. }
  473. function handlePopupButtonClose() {
  474. viewModel.popupVisible(false);
  475. viewModel.gridView().refresh();
  476. }
  477. function handlePopupButtonCancel() {
  478. viewModel.popupVisible(false);
  479. }
  480. function handlePopupButtonEdit() {
  481. }
  482. function handlePopupButtonDelete() {
  483. }
  484. viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsMaterialStored', viewOptions);
  485. var materialStoredPopupToolbarItems = [
  486. { location: 'before', text: '입고 등록' },
  487. {
  488. location: 'after',
  489. widget: 'button',
  490. options: {
  491. text: $G('approval'), icon: 'save', type: 'success',
  492. visible: viewModel.visibleApprovalButton,
  493. disabled: viewModel.hasnotModificationPermission,
  494. clickAction: function () {
  495. }
  496. }
  497. },
  498. {
  499. location: 'after', widget: 'button', options: {
  500. text: '입고', icon: 'save', visible: viewModel.isEditModeInPopup,
  501. clickAction: handlePopupButtonSave
  502. }
  503. },
  504. { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: materialStoredPopupButtonClose } }
  505. ];
  506. function materialStoredPopupButtonClose() {
  507. viewModel.popupVisible(false);
  508. }
  509. function handlePopupButtonSave() {
  510. if (viewModel.isNewInPopup()) {
  511. var selectedRowCount = materialGridView.getSelectedRowsData().length;
  512. if (selectedRowCount == 0) {
  513. utils.toast.show('입고하려는 자재를 선택하시기 바랍니다.', 'error');
  514. return;
  515. }
  516. for (var i = 0; i < selectedRowCount; i++) {
  517. if (materialGridView.getSelectedRowsData()[i].PossibleStoredCount() < materialGridView.getSelectedRowsData()[i].StoredCount()) {
  518. utils.toast.show('입고가능수량을 초과하였습니다.', 'error');
  519. return;
  520. }
  521. if (materialGridView.getSelectedRowsData()[i].StoredCount() <= 0) {
  522. utils.toast.show('입고수량은 최소1개 이상입니다.', 'error');
  523. return;
  524. }
  525. }
  526. for (var i = 0; i < selectedRowCount; i++) {
  527. viewModel.dataModel.MaterialId(materialGridView.getSelectedRowsData()[i].MaterialId());
  528. viewModel.dataModel.UnitCost(materialGridView.getSelectedRowsData()[i].UnitCost())
  529. viewModel.dataModel.StoredCount(materialGridView.getSelectedRowsData()[i].StoredCount());
  530. viewModel.dataModel.RemainStoredCount(materialGridView.getSelectedRowsData()[i].StoredCount());
  531. var postData = viewModel.dataModel.toJS();
  532. BWA.api.post('FmsMaterialStored/Store', viewModel.dataModel.toJS()).then(function () {
  533. utils.toast.show($G('successDatabaseProcessMsg'));
  534. viewModel.gridView().refresh();
  535. //var purchaseOrder = {
  536. // SiteId: viewModel.dataModel.SiteId(),
  537. // BusinessFieldId: viewModel.dataModel.BusinessFieldId(),
  538. // PurchaseOrderId: viewModel.dataModel.PurchaseOrderId(),
  539. //};
  540. //loadMaterialsInPurchaseOrder(purchaseOrder);
  541. });
  542. }
  543. }
  544. viewModel.popupVisible(false);
  545. }
  546. viewModel.handleButtonSearchPurchaseOrder = function () {
  547. viewModel.purchaseOrderSearchPopup.show();
  548. };
  549. viewModel.purchaseOrderSearchPopup = BWA.Popup.PurchaseOrderSearch.create(viewModel, {
  550. filter: [
  551. eq('SiteId', BWA.UserInfo.SiteId())
  552. ],
  553. onSelectedPurchaseOrder: function (purchaseOrder) {
  554. var purchaseOrderId = purchaseOrder.PurchaseOrderId;
  555. loadMaterialsInPurchaseOrder(purchaseOrder);
  556. viewModel.dataModel.PurchaseOrderId(purchaseOrder.PurchaseOrderId);
  557. viewModel.dataModel.PurchaseOrderTitle(purchaseOrder.Title);
  558. // hcLee 2016 01 11
  559. viewModel.dataModel.PurchaseOrderReason(purchaseOrder.Reason);
  560. // JD Comment : 구매목록이 선택되면 비즈니스 필드를 변경
  561. viewModel.dataModel.BusinessFieldId(purchaseOrder.BusinessFieldId);
  562. var result = $.grep(businessFields(), function (e) { return e.BusinessFieldId() == purchaseOrder.BusinessFieldId; });
  563. if (result.length != 0) {
  564. viewModel.dataModel.BusinessFieldName(result[0].Name());
  565. }
  566. // hcLee 2016 05 02 창고도 변경
  567. for (var i = 0; i < BWA.UserInfo.MenuPermissions().length; i++) {
  568. if (BWA.UserInfo.MenuPermissions()[i].MenuId == 'MaterialStored') {
  569. MenuPermission = BWA.UserInfo.MenuPermissions()[i].MenuPermission;
  570. break;
  571. }
  572. }
  573. if (MenuPermission >= 4) {
  574. warehouseDataSource.filter([
  575. eq('SiteId', BWA.UserInfo.SiteId()),
  576. and,
  577. eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()),
  578. and,
  579. eq('IsUse', true),
  580. and,
  581. ['BusinessFieldId', '<>', 1],
  582. ]);
  583. }
  584. else {
  585. warehouseDataSource.filter([
  586. eq('SiteId', BWA.UserInfo.SiteId()),
  587. and,
  588. eq('IsUse', true),
  589. and,
  590. ['BusinessFieldId', '<>', 1],
  591. ]);
  592. }
  593. $.when(
  594. warehouseDataSource.load())
  595. .done(function (dbWarehouses) {
  596. viewModel.warehouses(dbWarehouses);
  597. var warehouses = viewModel.warehouses();
  598. if (!_.isEmpty(warehouses)) {
  599. viewModel.dataModel.WarehouseId(warehouses[0].WarehouseId());
  600. }
  601. deferredForSearch.resolve();
  602. });
  603. // hcLee 2016 05 02 창고도 변경
  604. }
  605. });
  606. viewModel.popupVisible.subscribe(function (visible) {
  607. if (!visible) {
  608. materials([]);
  609. }
  610. });
  611. viewModel.materialStoredPopupToolbarItems = materialStoredPopupToolbarItems;
  612. viewModel.dataModel.PurchaseOrderTitle = ko.observable();
  613. // 2016 01 11
  614. viewModel.dataModel.PurchaseOrderReason = ko.observable();
  615. viewModel.dataModel.BusinessFieldName = ko.observable();
  616. viewModel.dataModel.ProgressName = ko.observable();
  617. viewModel.dataModel.StoredUserName = ko.observable();
  618. viewModel.dataModel.WarehouseName = ko.observable();
  619. viewModel.dataModelMaterial = dataModelMaterial;
  620. viewModel.businessFields = businessFields;
  621. viewModel.warehouses = warehouses;
  622. viewModel.materialDataGridOptions = utils.datagrid.defaultOptions({
  623. width: 970,
  624. visible: true,
  625. selection: { mode: 'multiple', allowSelectAll: true }, // hcLee 2015 11 26추가
  626. pager: {
  627. //showPageSizeSelector: false,
  628. //allowedPageSizes: []
  629. },
  630. paging: {
  631. pageSize: 15,
  632. enabled: true
  633. },
  634. dataSource: materials,
  635. columns: materialFactory.getColumns([
  636. { dataField: 'MaterialCode', width: '25%', visible: false },
  637. {
  638. dataField: 'FirstClassId', width: '15%', caption: '자재(대)', alignment: 'center',
  639. customizeText: function (cellInfo) {
  640. for (var i = 1; i < materialClassForSearch().length; i++) {
  641. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  642. return materialClassForSearch()[i].Name();
  643. }
  644. }
  645. }
  646. },
  647. {
  648. dataField: 'SecondClassId', width: '15%', caption: '자재(중)', alignment: 'center',
  649. customizeText: function (cellInfo) {
  650. for (var i = 1; i < materialClassForSearch().length; i++) {
  651. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  652. return materialClassForSearch()[i].Name();
  653. }
  654. }
  655. }
  656. },
  657. {
  658. dataField: 'ThirdClassId', width: '15%', caption: '자재(소)', alignment: 'center',
  659. customizeText: function (cellInfo) {
  660. for (var i = 1; i < materialClassForSearch().length; i++) {
  661. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  662. return materialClassForSearch()[i].Name();
  663. }
  664. }
  665. }
  666. },
  667. { dataField: 'Name', width: '30%' },
  668. { dataField: 'Standard', width: '30%', alignment: 'center', caption: '규격' },
  669. { dataField: 'Unit', width: '15%', alignment: 'center', caption: '단위' },
  670. { dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: '발주수량', format: 'currency' },
  671. { dataField: 'PossibleStoredCount', width: '25%', alignment: 'center', caption: '입고가능수량', format: 'currency' },
  672. {
  673. dataField: 'StoredCount', width: '15%', alignment: 'center', caption: '입고수량',
  674. cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({
  675. min: 0,
  676. max: 1000000,
  677. dataField: 'StoredCount',
  678. convertValueWhenValueChanged: function (value) {
  679. return Math.max(1, value);
  680. }
  681. })
  682. },
  683. {
  684. dataField: 'UnitCost', width: '15%', alignment: 'center', caption: $G('unitCost'), format: 'currency'
  685. }
  686. ]),
  687. cellClick: function (e) {
  688. if (viewModel.isEditModeInPopup()) {
  689. utils.datagrid.cellClickEventForDataGridTemplate(e, 'StoredCount');
  690. }
  691. },
  692. contentReadyAction: function (e) { materialGridView = e.component; },
  693. rowPrepared: function (rowElement, rowInfo) {
  694. if (rowInfo.rowType == 'data') {
  695. var data = rowInfo.data;
  696. if (data.MaterialId() === viewModel.dataModel.MaterialId()) {
  697. var color;
  698. if (data.MaterialCount() === viewModel.dataModel.StoredCount()) { color = 'rgba(0,255,0,0.1)'; }
  699. else { color = 'rgba(255,0,0,0.1)'; }
  700. rowElement.css('background-color', color);
  701. }
  702. }
  703. },
  704. rowClick: function (clickRow) {
  705. var data = clickRow.data;
  706. if (viewModel.isEditModeInPopup()) {
  707. dataModelMaterial.MaterialId(data.MaterialId());
  708. dataModelMaterial.Name(data.Name());
  709. dataModelMaterial.Unit(data.Unit());
  710. dataModelMaterial.ThirdClassId(data.ThirdClassId());
  711. dataModelMaterial.FirstClassId(data.FirstClassId());
  712. dataModelMaterial.SecondClassId(data.SecondClassId());
  713. dataModelMaterial.Standard(data.Standard());
  714. viewModel.dataModel.StoredCount(data.StoredCount());
  715. viewModel.dataModel.UnitCost(data.UnitCost());
  716. }
  717. }
  718. });
  719. viewModel.popup = popup;
  720. viewModel.handleSecondClassChangedValueInSearchView = handleSecondClassChangedValueInSearchView;
  721. viewModel.handleFirstClassChangedValueInSearchView = handleFirstClassChangedValueInSearchView;
  722. viewModel.facilityClasses = facilityClasses;
  723. return viewModel;
  724. };