7e96c12354b3b28dc5598b3868773ac586827de4.svn-base 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. $(function () {
  2. 'use strict';
  3. var materialClassForSearch = ko.observableArray();
  4. var materialClass = ko.observableArray();
  5. var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass');
  6. BemsWebApplication.Popup.PurchaseRequest = {
  7. create: function (viewInfo, viewModel, forApprovalOptions) {
  8. var materials = ko.observableArray(),
  9. materialsInView = ko.observableArray(),
  10. businessFields = ko.observableArray();
  11. var materialFactory = BWA.Factory.Material,
  12. purchaseProgressCode = BWA.Code.PurchaseProgress,
  13. materialGridView,
  14. materialDataGridOptions,
  15. modifiableMaterialDataGridOptions = undefined;
  16. var materialsDataSource = materialFactory.getBasicDataSourceRef({
  17. dbModeIId: 'FmsMaterialPurchaseRequestMaterial',
  18. primaryKeyDataField: 'PurchaseRequestId'
  19. });
  20. function isValidateWithFunction(errorMessage) {
  21. if (_.isEmpty(materials())) {
  22. errorMessage.message = '구매요청한 자재가 없습니다.';
  23. return false;
  24. }
  25. return true;
  26. }
  27. function handlePopupShowing(isNewInPopup, dataModel) {
  28. $("#gridContainer2").dxDataGrid({
  29. paging: {
  30. pageSize: 10,
  31. enabled: true
  32. }
  33. });
  34. $("#gridContainer3").dxDataGrid({
  35. paging: {
  36. pageSize: 10,
  37. enabled: true
  38. }
  39. });
  40. MaterialCodeClassDataSource.filter([
  41. ['SiteId', '=', BWA.UserInfo.SiteId()]
  42. ]);
  43. $.when(
  44. MaterialCodeClassDataSource.load()
  45. ).done(function (Result) {
  46. materialClass = ko.observableArray();
  47. var cnt = 0;
  48. for (var i = 0; i < Result.length; i++) {
  49. materialClass.push(Result[i]);
  50. }
  51. materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
  52. });
  53. var userInfo = BWA.UserInfo;
  54. if (isNewInPopup()) {
  55. var progressId = $Code.PurchaseProgress.PURCHASE_REQUEST;
  56. if (userInfo.isDependBusinessField(viewInfo.viewName)) {
  57. BWA.db.CmBusinessField.byKey({
  58. SiteId: userInfo.SiteId(),
  59. BusinessFieldId: userInfo.BusinessFieldId()
  60. }).done(function (businessField) {
  61. dataModel.BusinessFieldName(businessField.Name);
  62. });
  63. }
  64. dataModel.ProgressId(progressId);
  65. dataModel.ProgressName(purchaseProgressCode.getName(progressId));
  66. dataModel.BusinessFieldId(userInfo.BusinessFieldId());
  67. dataModel.RequestUserId(userInfo.UserId());
  68. dataModel.RequesterName(userInfo.Name());
  69. dataModel.RequestDate(new Date());
  70. dataModel.PurchaseHopeDate(moment().add(1, 'd').toDate());
  71. dataModel.bSameOrder(false);
  72. }
  73. }
  74. function handleDeleteSelectedMaterials() {
  75. var rows = materialGridView.getSelectedRowsData();
  76. if (_.isEmpty(rows)) {
  77. utils.toast.show('선택된 자재가 없습니다.', 'error');
  78. return;
  79. }
  80. _.each(rows, function (row) {
  81. var array = materials();
  82. var length = array.length;
  83. var id = row.MaterialId();
  84. for (var i = 0 ; i < length ; i++) {
  85. if (id === array[i].MaterialId()) {
  86. materials().splice(i, 1);
  87. break;
  88. }
  89. }
  90. });
  91. materialGridView.refresh();
  92. }
  93. function handlePopupShown(editMode, isNew, dataViewModel) {
  94. }
  95. // 구매신청 정보가 저장된 후에 호출 된다.
  96. // 등록이면 responseKey가 있고, 수정이면 없다.
  97. function handleAfterSave(responseKey) {
  98. var array = materials();
  99. if (_.isEmpty(array)) {
  100. return;
  101. }
  102. var siteId, purchaseRequestId, businessFieldId;
  103. if (_.isUndefined(responseKey)) {
  104. var dataModel = viewModel.dataModel;
  105. siteId = dataModel.SiteId();
  106. businessFieldId = dataModel.BusinessFieldId();
  107. purchaseRequestId = dataModel.PurchaseRequestId();
  108. }
  109. else {
  110. siteId = responseKey.SiteId;
  111. // JD Comment : BusinessField 가 키에서 제거되면서 발생된 사항
  112. // businessFieldId = responseKey.BusinessFieldId;
  113. businessFieldId = viewModel.dataModel.BusinessFieldId();
  114. purchaseRequestId = responseKey.PurchaseRequestId;
  115. }
  116. var postData;
  117. var parameters = {
  118. SiteId: siteId,
  119. BusinessFieldId: businessFieldId,
  120. PurchaseRequestId: purchaseRequestId
  121. };
  122. postData = _.map(array, function (m) {
  123. return {
  124. SiteId: siteId,
  125. BusinessFieldId: businessFieldId,
  126. PurchaseRequestId: purchaseRequestId,
  127. MaterialId: m.MaterialId(),
  128. MaterialCount: m.MaterialCount()
  129. };
  130. });
  131. BWA.api.post('FmsMaterialPurchaseRequestMaterial', postData, parameters).done(function () {
  132. utils.toast.show($G('successDatabaseInsertionMsg'));
  133. viewModel.popupVisible(false);
  134. viewModel.gridView().refresh();
  135. });
  136. }
  137. function handleAfterLoadingModelByKey(data, dataViewModel) {
  138. if (dataViewModel.ProgressId() !== $Code.PurchaseProgress.PURCHASE_REQUEST) {
  139. viewModel.visibleEditButton(false);
  140. viewModel.visibleDeleteButton(false);
  141. }
  142. dataViewModel.ProgressName(purchaseProgressCode.getName(dataViewModel.ProgressId()));
  143. var eq = BWA.DataUtil.constructEqualFilter;
  144. var and = BWA.DataUtil.andFilter;
  145. var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName)
  146. if (useBusinessFiltering) {
  147. materialsDataSource.filter([
  148. eq('SiteId', dataViewModel.SiteId()),
  149. and,
  150. [
  151. eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()),
  152. 'or',
  153. eq('BusinessFieldId', 1)
  154. ],
  155. and,
  156. eq('PurchaseRequestId', dataViewModel.PurchaseRequestId())
  157. ]);
  158. }
  159. else {
  160. materialsDataSource.filter([
  161. eq('SiteId', dataViewModel.SiteId()),
  162. and,
  163. eq('PurchaseRequestId', dataViewModel.PurchaseRequestId())
  164. ]);
  165. }
  166. materialsDataSource.load().done(function (dbMaterials) {
  167. materialsInView(dbMaterials);
  168. });
  169. }
  170. function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {
  171. dataViewModel.BusinessFieldName(rowData['CmBusinessField/Name']());
  172. dataViewModel.RequesterName(rowData['CmUser/Name']());
  173. dataViewModel.PurchaseTypeName(rowData['FmsMaterialCodePurchaseType/Name']());
  174. dataViewModel.ApprovalUserName = $KoSet(dataViewModel.ApprovalUserName, rowData['CmUser1/Name']);
  175. }
  176. viewModel.popupVisible.subscribe(function (visible) {
  177. if (!visible) {
  178. materialsInView([]);
  179. // TODO : Sitde-Effects ???
  180. materials([]);
  181. }
  182. });
  183. viewModel.isEditModeInPopup.subscribe(function (isEditMode) {
  184. if (isEditMode) {
  185. materials(materialsInView.slice(0));
  186. }
  187. });
  188. viewModel.dataModel.BusinessFieldName = ko.observable();
  189. viewModel.dataModel.ProgressName = ko.observable();
  190. viewModel.dataModel.RequesterName = ko.observable();
  191. viewModel.dataModel.ApprovalUserName = ko.observable();
  192. viewModel.dataModel.PurchaseTypeName = ko.observable();
  193. var materialColumns = materialFactory.getColumns([
  194. {
  195. dataField: 'FirstClassId', width: '15%', caption: '자재(대)', alignment: 'center',
  196. customizeText: function (cellInfo) {
  197. for (var i = 1; i < materialClassForSearch().length; i++) {
  198. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  199. return materialClassForSearch()[i].Name();
  200. }
  201. }
  202. }
  203. },
  204. {
  205. dataField: 'SecondClassId', width: '15%', caption: '자재(중)', alignment: 'center',
  206. customizeText: function (cellInfo) {
  207. for (var i = 1; i < materialClassForSearch().length; i++) {
  208. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  209. return materialClassForSearch()[i].Name();
  210. }
  211. }
  212. }
  213. },
  214. {
  215. dataField: 'ThirdClassId', width: '15%', caption: '자재(소)', alignment: 'center',
  216. customizeText: function (cellInfo) {
  217. for (var i = 1; i < materialClassForSearch().length; i++) {
  218. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  219. return materialClassForSearch()[i].Name();
  220. }
  221. }
  222. }
  223. },
  224. { dataField: 'MaterialCode', width: '30%', visible: false },
  225. { dataField: 'Name', width: '25%' },
  226. { dataField: 'Standard', width: '25%', caption: '규격', alignment: 'center' },
  227. { dataField: 'Unit', width: '15%', caption: '단위', alignment: 'center' },
  228. //{ dataField: 'UnitCost', width: '25%', caption: '단가', alignment: 'center' }
  229. ]);
  230. materialDataGridOptions = utils.datagrid.defaultOptions({
  231. width: 820,
  232. visible: viewModel.viewModeInPopup,
  233. pager: {
  234. showPageSizeSelector: false,
  235. allowedPageSizes: []
  236. },
  237. dataSource: materialsInView,
  238. columns: materialColumns.concat([{ dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: $G('materialCount'), format: 'currency' }])
  239. });
  240. if (_.isObject(forApprovalOptions) === false) {
  241. modifiableMaterialDataGridOptions = utils.datagrid.defaultOptions({
  242. width: 820,
  243. pager: {
  244. showPageSizeSelector: false,
  245. allowedPageSizes: []
  246. },
  247. visible: viewModel.isEditModeInPopup,
  248. dataSource: materials,
  249. selection: { mode: 'multiple', allowSelectAll: true },
  250. columns: materialColumns.concat([{
  251. dataField: 'MaterialCount', width: '20%', type: 'number',
  252. caption: $G('materialCount'), alignment: 'center',
  253. cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({
  254. min: 1,
  255. max: 1000000,
  256. dataField: 'MaterialCount',
  257. convertValueWhenValueChanged: function (value) {
  258. return Math.max(1, value);
  259. }
  260. })
  261. }]),
  262. cellClick: function (e) {
  263. utils.datagrid.cellClickEventForDataGridTemplate(e, 'MaterialCount');
  264. },
  265. contentReadyAction: function (e) {
  266. materialGridView = e.component;
  267. },
  268. });
  269. viewModel.materialSearchPopup = BWA.Popup.Material.create(viewModel, {
  270. isMultipleSelect: true,
  271. onSelectedMaterials: function (selectedMaterials) {
  272. var purchaseRequestId = viewModel.dataModel.PurchaseRequestId();
  273. _.each(selectedMaterials, function (sm) {
  274. // 어차피 SiteId와 BusinessField는 동일 할 수 밖에 없으므로 비교하지 않는다.
  275. // JD : 팝업에서 전체선택시 추가로 하면 오류 발생함. 이에 대한 회피 코드로 try-catch
  276. // JD : 근본적인 원인은 시간 관계상 차후로 넘김
  277. var found = _.some(materials(), function (m) {
  278. try {
  279. return m.MaterialId() === sm.MaterialId();
  280. } catch (e) {
  281. return m.MaterialId() === sm.MaterialId;
  282. }
  283. });
  284. if (found) return;
  285. try {
  286. materials.push({
  287. SiteId: ko.observable(sm.SiteId()),
  288. PurchaseRequestId: ko.observable(purchaseRequestId),
  289. MaterialId: ko.observable(sm.MaterialId()),
  290. Name: ko.observable(sm.Name()),
  291. MaterialCode: ko.observable(sm.MaterialCode()),
  292. MaterialCount: ko.observable(1),
  293. FirstClassId: ko.observable(sm.FirstClassId()),
  294. SecondClassId: ko.observable(sm.SecondClassId()),
  295. ThirdClassId: ko.observable(sm.ThirdClassId()),
  296. Standard: ko.observable(sm.Standard()),
  297. Unit: ko.observable(sm.Unit()),
  298. });
  299. } catch (e) {
  300. materials.push({
  301. SiteId: ko.observable(sm.SiteId),
  302. PurchaseRequestId: ko.observable(purchaseRequestId),
  303. MaterialId: ko.observable(sm.MaterialId),
  304. Name: ko.observable(sm.Name),
  305. MaterialCode: ko.observable(sm.MaterialCode),
  306. MaterialCount: ko.observable(1),
  307. FirstClassId: ko.observable(sm.FirstClassId),
  308. SecondClassId: ko.observable(sm.SecondClassId),
  309. ThirdClassId: ko.observable(sm.ThirdClassId),
  310. Standard: ko.observable(sm.Standard),
  311. Unit: ko.observable(sm.Unit),
  312. });
  313. }
  314. });
  315. materialGridView.refresh();
  316. }
  317. });
  318. }
  319. return {
  320. materials: materials,
  321. businessFields: businessFields,
  322. isValidateWithFunction: isValidateWithFunction,
  323. materialDataGridOptions: materialDataGridOptions,
  324. modifiableMaterialDataGridOptions: modifiableMaterialDataGridOptions,
  325. handleAfterLoadingModelByKey: handleAfterLoadingModelByKey,
  326. handleAfterSave: handleAfterSave,
  327. handlePopupShowing: handlePopupShowing,
  328. handlePopupShown: handlePopupShown,
  329. handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit,
  330. handleDeleteSelectedMaterials: handleDeleteSelectedMaterials
  331. };
  332. }
  333. }
  334. });