5feb15b5301db05eef66cddbfab2d84df490060c.svn-base 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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.PurchaseOrder = {
  7. create: function (viewInfo, viewModel, forApprovalOptions) {
  8. var tradeCompanies = ko.observableArray(),
  9. materials = ko.observableArray(),
  10. materialsInView = ko.observableArray(),
  11. materialsInPurchaseRequest = ko.observableArray(),
  12. businessFields = ko.observableArray();
  13. var materialFactory = BWA.Factory.Material,
  14. purchaseProgressCode = BWA.Code.PurchaseProgress,
  15. materialGridView,
  16. uploadedFileInfo = {},
  17. materialDataGridOptions,
  18. modifiableMaterialDataGridOptions = undefined,
  19. purchaseOrderFileUrl = ko.observable(),
  20. initialized = false;
  21. var materialsDataSource = materialFactory.getBasicDataSourceRef({
  22. dbModeIId: 'FmsMaterialPurchaseOrderMaterial',
  23. primaryKeyDataField: 'PurchaseOrderId',
  24. moreSelectFields: ['UnitCost']
  25. }),
  26. materialsForPurchaseRequestDataSource = materialFactory.getBasicDataSourceRef({
  27. dbModeIId: 'FmsMaterialPurchaseRequestMaterial',
  28. primaryKeyDataField: 'PurchaseRequestId',
  29. moreSelectFields: [
  30. 'FmsMaterial/TradeCompanyId',
  31. 'FmsMaterial/FinalPrice']
  32. });
  33. var eq = BWA.DataUtil.constructEqualFilter,
  34. and = BWA.DataUtil.andFilter;
  35. function isValidateWithFunction(errorMessage) {
  36. if (_.isEmpty(materials())) {
  37. errorMessage.message = '발주 요청한 자재가 없습니다.';
  38. return false;
  39. }
  40. return true;
  41. }
  42. function handlePopupShowing(isNewInPopup, dataModel) {
  43. $("#gridContainer2").dxDataGrid({
  44. paging: {
  45. pageSize: 13,
  46. enabled: true
  47. }
  48. });
  49. $("#gridContainer3").dxDataGrid({
  50. paging: {
  51. pageSize: 13,
  52. enabled: true
  53. }
  54. });
  55. MaterialCodeClassDataSource.filter([
  56. ['SiteId', '=', BWA.UserInfo.SiteId()]
  57. ]);
  58. $.when(
  59. MaterialCodeClassDataSource.load()
  60. ).done(function (Result) {
  61. materialClass = ko.observableArray();
  62. var cnt = 0;
  63. for (var i = 0; i < Result.length; i++) {
  64. materialClass.push(Result[i]);
  65. }
  66. materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
  67. });
  68. var userInfo = BWA.UserInfo;
  69. if (isNewInPopup()) {
  70. var progressId = $Code.PurchaseProgress.PURCHASE_ORDER;
  71. if (userInfo.isDependBusinessField(viewInfo.viewName)) {
  72. BWA.db.CmBusinessField.byKey({
  73. SiteId: userInfo.SiteId(),
  74. BusinessFieldId: userInfo.BusinessFieldId()
  75. }).done(function (businessField) {
  76. dataModel.BusinessFieldName(businessField.Name);
  77. });
  78. }
  79. dataModel.BusinessFieldId(userInfo.BusinessFieldId());
  80. dataModel.OrderUserId(userInfo.UserId());
  81. dataModel.OrdererName(userInfo.Name());
  82. dataModel.OrderDate(new Date());
  83. dataModel.StoredDueDate(moment().add(1, 'd').toDate());
  84. }
  85. }
  86. function handleDeleteSelectedMaterials() {
  87. var rows = materialGridView.getSelectedRowsData();
  88. if (_.isEmpty(rows)) {
  89. utils.toast.show('선택된 자재가 없습니다.', 'error');
  90. return;
  91. }
  92. _.each(rows, function (row) {
  93. var array = materials();
  94. var length = array.length;
  95. var id = (typeof (row.MaterialId) == "function" ? row.MaterialId() : row.MaterialId);
  96. for (var i = 0 ; i < length ; i++) {
  97. if (id === (typeof (array[i].MaterialId) == "function" ? array[i].MaterialId() : array[i].MaterialId)) {
  98. materials().splice(i, 1);
  99. break;
  100. }
  101. }
  102. });
  103. materialGridView.refresh();
  104. }
  105. function handleViewShown(dataViewModel, isEditModeInPopup) {
  106. if (initialized === false) {
  107. }
  108. }
  109. function handleSaveSuccess() {
  110. }
  111. function handlePopupShown(isEditMode, isNew, dataViewModel) {
  112. }
  113. // 구매신청 정보가 저장된 후에 호출 된다.
  114. // 등록이면 responseKey가 있고, 수정이면 없다.
  115. function handleAfterSave(response, responseKey) {
  116. var array = materials();
  117. if (_.isEmpty(array)) {
  118. return;
  119. }
  120. var siteId, purchaseOrderId, purchaseRequestId, businessFieldId;
  121. if (_.isUndefined(responseKey)) {
  122. var dataModel = viewModel.dataModel;
  123. siteId = dataModel.SiteId();
  124. businessFieldId = dataModel.BusinessFieldId();
  125. purchaseOrderId = dataModel.PurchaseOrderId();
  126. purchaseRequestId = dataModel.PurchaseRequestId();
  127. }
  128. else {
  129. siteId = responseKey.SiteId;
  130. businessFieldId = viewModel.dataModel.BusinessFieldId();
  131. //hcLee 2016 01 05 아래 위 변경
  132. purchaseOrderId = responseKey.PurchaseOrderId;
  133. purchaseRequestId = viewModel.dataModel.PurchaseRequestId();
  134. }
  135. var parameters = {
  136. SiteId: siteId,
  137. BusinessFieldId: businessFieldId,
  138. PurchaseOrderId: purchaseOrderId,
  139. PurchaseRequestId: purchaseRequestId
  140. };
  141. var postData = _.map(array, function (m) {
  142. return {
  143. SiteId: siteId,
  144. BusinessFieldId: businessFieldId,
  145. PurchaseOrderId: purchaseOrderId,
  146. MaterialId: (typeof (m.MaterialId) == "function" ? m.MaterialId() : m.MaterialId),
  147. MaterialCount: (typeof (m.MaterialCount) == "function" ? m.MaterialCount() : m.MaterialCount),
  148. UnitCost: (typeof (m.UnitCost) == "function" ? m.UnitCost() : m.UnitCost)
  149. };
  150. });
  151. BWA.api.post('FmsMaterialPurchaseOrderMaterial', postData, parameters).done(function () {
  152. utils.toast.show($G('successDatabaseInsertionMsg'));
  153. viewModel.popupVisible(false);
  154. viewModel.gridView().refresh();
  155. });
  156. }
  157. function handleAfterLoadingModelByKey(data, dataViewModel) {
  158. var url = [
  159. BWA.db._url,
  160. '/CmFile(SiteId={0},FileId={1})/$value'.formati(dataViewModel.SiteId(), dataViewModel.FileId())
  161. ].join('');
  162. purchaseOrderFileUrl(url);
  163. loadMaterialsInPurchaseRequest({
  164. SiteId: dataViewModel.SiteId(),
  165. BusinessFieldId: dataViewModel.BusinessFieldId(),
  166. PurchaseRequestId: dataViewModel.PurchaseRequestId()
  167. });
  168. materialsDataSource.filter([
  169. eq('SiteId', dataViewModel.SiteId()),
  170. and,
  171. eq('BusinessFieldId', dataViewModel.BusinessFieldId()),
  172. and,
  173. eq('PurchaseOrderId', dataViewModel.PurchaseOrderId())
  174. ]);
  175. materialsDataSource.load().done(function (dbMaterials) {
  176. materialsInView(dbMaterials);
  177. });
  178. viewModel.visibleDeleteButton(false);
  179. }
  180. function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {
  181. dataViewModel.OrdererName = $KoSet(dataViewModel.OrdererName, rowData['CmUser/Name']);
  182. dataViewModel.BusinessFieldName = $KoSet(dataViewModel.BusinessFieldName, rowData['CmBusinessField/Name']);
  183. dataViewModel.PurchaseRequestTitle = $KoSet(dataViewModel.PurchaseRequestTitle, rowData['FmsMaterialPurchaseRequest/Title']);
  184. dataViewModel.PurchaseRequestReason = $KoSet(dataViewModel.PurchaseRequestReason, rowData['FmsMaterialPurchaseRequest/Reason']);
  185. dataViewModel.TradeCompanyName = $KoSet(dataViewModel.TradeCompanyName, rowData['FmsMaterialTradeCompany/Name']);
  186. dataViewModel.FileName = $KoSet(dataViewModel.FileName, rowData['CmFile/Name']);
  187. }
  188. function handleButtonSearchPurchaseRequest() {
  189. viewModel.purchaseRequestSearchPopup.show();
  190. }
  191. function handleSelectBoxChangeTradeCompany(e) {
  192. e.value;
  193. }
  194. function loadMaterialsInPurchaseRequest(purchaseRequest) {
  195. materialsForPurchaseRequestDataSource.filter([
  196. eq('SiteId', purchaseRequest.SiteId),
  197. and,
  198. eq('BusinessFieldId', purchaseRequest.BusinessFieldId),
  199. and,
  200. eq('PurchaseRequestId', purchaseRequest.PurchaseRequestId)
  201. ]);
  202. // 선택된 구매요청에 대한 자재들을 로드한다.
  203. var promise = materialsForPurchaseRequestDataSource.load();
  204. promise.then(function (dbMaterials) {
  205. var companies = [];
  206. materialsInPurchaseRequest(_.map(dbMaterials, function (m) {
  207. var tradeCompanyId = m['FmsMaterial/TradeCompanyId'];
  208. BWA.DataUtil.pushInArrayNoDup(companies, ['TradeCompanyId'], {
  209. TradeCompanyId: tradeCompanyId,
  210. Name: m['FmsMaterial/FmsMaterialTradeCompany/Name']
  211. });
  212. m.TradeCompanyId = tradeCompanyId;
  213. m.UnitCost = m['FmsMaterial/FinalPrice'];
  214. if (m.UnitCost() === null) {
  215. m.UnitCost(0);
  216. }
  217. return m;
  218. }));
  219. // 구매신청에 대한 모든 자재를 표시
  220. materials(dbMaterials);
  221. });
  222. }
  223. viewModel.popupVisible.subscribe(function (visible) {
  224. if (!visible) {
  225. materialsInView([]);
  226. }
  227. });
  228. viewModel.isEditModeInPopup.subscribe(function (isEditMode) {
  229. if (isEditMode) {
  230. materials(materialsInView.slice(0));
  231. }
  232. });
  233. // 값이 같아도 항상 subscribe가 호출
  234. viewModel.dataModel.TradeCompanyId.extend({ notify: 'always' });
  235. // 거래처가 바뀌면 해당하는 자재들로 보여준다.
  236. viewModel.dataModel.TradeCompanyId.subscribe(function (tradeCompanyId) {
  237. if (viewModel.isEditModeInPopup() && viewModel.isNewInPopup()) {
  238. if (_.isNull(tradeCompanyId)) {
  239. materials([]);
  240. return;
  241. }
  242. materials(_.reject(materialsInPurchaseRequest(), function (m) {
  243. return m.TradeCompanyId() !== tradeCompanyId;
  244. }));
  245. }
  246. else {
  247. var isNeedRefresh = false;
  248. _.each(materialsInPurchaseRequest(), function (m) {
  249. isNeedRefresh |= BWA.DataUtil.pushInArrayNoDup(materials(), ['MaterialId'], m);
  250. });
  251. if (isNeedRefresh) {
  252. materialGridView.refresh();
  253. }
  254. }
  255. });
  256. // dxview에서 사용할 ko를 미리 생성해 둬야 값 변경시 적용된다.
  257. viewModel.dataModel.BusinessFieldName = ko.observable();
  258. viewModel.dataModel.ProgressName = ko.observable();
  259. viewModel.dataModel.OrdererName = ko.observable();
  260. viewModel.dataModel.TradeCompanyName = ko.observable();
  261. viewModel.dataModel.PurchaseRequestTitle = ko.observable();
  262. viewModel.dataModel.PurchaseRequestReason = ko.observable();
  263. var materialColumns = [
  264. ].concat(materialFactory.getColumns([
  265. {
  266. dataField: 'FirstClassId', width: '19%', caption: '자재(대)', alignment: 'center',
  267. customizeText: function (cellInfo) {
  268. for (var i = 1; i < materialClassForSearch().length; i++) {
  269. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  270. return materialClassForSearch()[i].Name();
  271. }
  272. }
  273. }
  274. },
  275. {
  276. dataField: 'SecondClassId', width: '19%', caption: '자재(중)', alignment: 'center',
  277. customizeText: function (cellInfo) {
  278. for (var i = 1; i < materialClassForSearch().length; i++) {
  279. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  280. return materialClassForSearch()[i].Name();
  281. }
  282. }
  283. }
  284. },
  285. {
  286. dataField: 'ThirdClassId', width: '19%', caption: '자재(소)', alignment: 'center',
  287. customizeText: function (cellInfo) {
  288. for (var i = 1; i < materialClassForSearch().length; i++) {
  289. if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
  290. return materialClassForSearch()[i].Name();
  291. }
  292. }
  293. }
  294. },
  295. { dataField: 'Name', width: '35%' },
  296. { dataField: 'Standard', width: '35%', caption: '규격', alignment: 'center' },
  297. { dataField: 'Unit', width: '15%', caption: '단위', alignment: 'center' },
  298. ]));
  299. var numberFormat = $NumberFormat;
  300. materialDataGridOptions = utils.datagrid.defaultOptions({
  301. width: 940,
  302. visible: viewModel.viewModeInPopup,
  303. pager: {
  304. showPageSizeSelector: false,
  305. allowedPageSizes: []
  306. },
  307. dataSource: materialsInView,
  308. columns: materialColumns.concat([
  309. {
  310. dataField: 'UnitCost', width: '15%', alignment: 'center', caption: $G('unitCost'),
  311. customizeText: function (cellInfo) {
  312. return numberFormat(cellInfo.value);
  313. }
  314. },
  315. {
  316. dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: $G('materialCount'),
  317. customizeText: function (cellInfo) {
  318. return numberFormat(cellInfo.value);
  319. }
  320. },
  321. ])
  322. });
  323. modifiableMaterialDataGridOptions = utils.datagrid.defaultOptions({
  324. width: 940,
  325. pager: {
  326. showPageSizeSelector: false,
  327. allowedPageSizes: []
  328. },
  329. visible: viewModel.isEditModeInPopup,
  330. dataSource: materials,
  331. selection: { mode: 'multiple', allowSelectAll: true },
  332. columns: materialColumns.concat([
  333. {
  334. dataField: 'UnitCost', width: '15%', type: 'number', caption: $G('unitCost'),
  335. alignment: 'center',
  336. cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({
  337. step: 100
  338. })
  339. },
  340. {
  341. dataField: 'MaterialCount', width: '15%', type: 'number',
  342. caption: $G('materialCount'), alignment: 'center',
  343. cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({
  344. min: 0,
  345. max: 1000000,
  346. convertValueWhenValueChanged: function (value) {
  347. return Math.max(1, value);
  348. }
  349. })
  350. }]),
  351. cellClick: function (e) {
  352. utils.datagrid.cellClickEventForDataGridTemplate(e, 'MaterialCount');
  353. utils.datagrid.cellClickEventForDataGridTemplate(e, 'UnitCost');
  354. },
  355. contentReadyAction: function (e) {
  356. materialGridView = e.component;
  357. },
  358. });
  359. viewModel.materialSearchPopup = BWA.Popup.Material.create(viewModel, {
  360. isMultipleSelect: true,
  361. onSelectedMaterials: function (sMaterials) {
  362. var koValue = $KoValue;
  363. var purchaseOrderId = viewModel.dataModel.PurchaseOrderId();
  364. _.each(sMaterials, function (sm) {
  365. // 어차피 SiteId와 BusinessField는 동일 할 수 밖에 없으므로 비교하지 않는다.
  366. var found = _.some(materials(), function (m) {
  367. return (typeof (m.MaterialId) == "function" ? m.MaterialId() : m.MaterialId) === (typeof (sm.MaterialId) == "function" ? sm.MaterialId() : sm.MaterialId);
  368. });
  369. if (found) return;
  370. var newMaterial = {
  371. SiteId: sm.SiteId,
  372. PurchaseOrderId: ko.observable(purchaseOrderId),
  373. MaterialId: sm.MaterialId,
  374. Name: sm.Name,
  375. MaterialCode: sm.MaterialCode,
  376. MaterialCount: ko.observable(1),
  377. UnitCost: ko.observable(koValue(sm.FinalPrice)),
  378. FirstClassId: (typeof (sm.FirstClassId) == "function" ? ko.observable(sm.FirstClassId()) : ko.observable(sm.FirstClassId)),
  379. SecondClassId: (typeof (sm.SecondClassId) == "function" ? ko.observable(sm.SecondClassId()) : ko.observable(sm.SecondClassId)),
  380. ThirdClassId: (typeof (sm.ThirdClassId) == "function" ? ko.observable(sm.ThirdClassId()) : ko.observable(sm.ThirdClassId)),
  381. Standard: (typeof (sm.Standard) == "function" ? ko.observable(sm.Standard()) : ko.observable(sm.Standard)),
  382. Unit: (typeof (sm.Unit) == "function" ? ko.observable(sm.Unit()) : ko.observable(sm.Unit)),
  383. 'FmsMaterial/FmsMaterialTradeCompany/Name': sm['FmsMaterialTradeCompany/Name']
  384. };
  385. if (_.isNull(newMaterial.UnitCost())) {
  386. newMaterial.UnitCost(0);
  387. }
  388. materials.push(newMaterial);
  389. });
  390. materialGridView.refresh();
  391. }
  392. });
  393. viewModel.purchaseRequestSearchPopup = BWA.Popup.PurchaseRequestSearch.create(viewModel, {
  394. filter: [
  395. eq('SiteId', BWA.UserInfo.SiteId()),
  396. and,
  397. eq('ProgressId', $Code.PurchaseProgress.PURCHASE_REQUEST_APPROVAL)
  398. ],
  399. onSelectedPurchaseRequest: function (purchaseRequest) {
  400. var purchaseRequestId = purchaseRequest.PurchaseRequestId;
  401. loadMaterialsInPurchaseRequest(purchaseRequest);
  402. viewModel.dataModel.PurchaseRequestId(purchaseRequest.PurchaseRequestId);
  403. viewModel.dataModel.PurchaseRequestTitle(purchaseRequest.Title);
  404. viewModel.dataModel.PurchaseRequestReason(purchaseRequest.Reason);
  405. // JD Comment : 구매목록이 선택되면 비즈니스 필드를 변경
  406. viewModel.dataModel.BusinessFieldId(purchaseRequest.BusinessFieldId);
  407. }
  408. });
  409. return {
  410. businessFields: businessFields,
  411. tradeCompanies: tradeCompanies,
  412. purchaseOrderFileUrl: purchaseOrderFileUrl,
  413. isValidateWithFunction: isValidateWithFunction,
  414. materialDataGridOptions: materialDataGridOptions,
  415. modifiableMaterialDataGridOptions: modifiableMaterialDataGridOptions,
  416. handleAfterLoadingModelByKey: handleAfterLoadingModelByKey,
  417. handleAfterSave: handleAfterSave,
  418. handleViewShown: handleViewShown,
  419. handlePopupShowing: handlePopupShowing,
  420. handlePopupShown: handlePopupShown,
  421. handleSaveSuccess: handleSaveSuccess,
  422. handleButtonSearchPurchaseRequest: handleButtonSearchPurchaseRequest,
  423. handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit,
  424. handleDeleteSelectedMaterials: handleDeleteSelectedMaterials,
  425. materials: materials,
  426. };
  427. }
  428. }
  429. });