RecBalanceTK.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. Ext.QuickTips.init();
  2. Ext.define('erp.controller.fa.ars.RecBalanceTK', {
  3. extend: 'Ext.app.Controller',
  4. FormUtil: Ext.create('erp.util.FormUtil'),
  5. GridUtil: Ext.create('erp.util.GridUtil'),
  6. BaseUtil: Ext.create('erp.util.BaseUtil'),
  7. views:[
  8. 'core.form.Panel','fa.ars.RecBalanceTK','core.grid.Panel2','core.toolbar.Toolbar',
  9. 'core.button.Save','core.button.Add','core.button.Close','core.button.Delete','core.button.Submit','core.button.ResAudit',
  10. 'core.button.Audit','core.button.ResSubmit','core.button.Post','core.button.ResPost','core.button.Update','core.button.DeleteDetail',
  11. 'core.trigger.DbfindTrigger','core.trigger.TextAreaTrigger','core.form.YnField','core.button.ResAccounted','core.button.AssMain','core.button.Accounted','core.button.StrikeBalance',
  12. 'core.trigger.CateTreeDbfindTrigger','core.trigger.HrOrgTreeDbfindTrigger','core.button.Print','fa.ars.recbalanceprdetail.RecBalancePRDetailGrid',
  13. 'core.button.AssDetail', 'core.trigger.MultiDbfindTrigger', 'core.form.SeparNumber'
  14. ],
  15. init:function(){
  16. var me = this;
  17. me.gridLastSelected = null;
  18. this.control({
  19. 'erpGridPanel2': {
  20. itemclick:function(selModel, record){
  21. me.onGridItemClick(selModel, record);
  22. var btn = Ext.getCmp('assdetail');
  23. var ass = record.data['ca_asstype'];
  24. if(btn){
  25. if(!Ext.isEmpty(ass)){
  26. btn.setDisabled(false);
  27. } else {
  28. btn.setDisabled(true);
  29. }
  30. }
  31. }
  32. },
  33. 'erpAssMainButton':{
  34. afterrender:function(btn){
  35. if(Ext.getCmp('ca_asstype').getValue()==null||Ext.getCmp('ca_asstype').getValue()==""){
  36. btn.setDisabled(true);
  37. }else{
  38. btn.setDisabled(false);
  39. }
  40. }
  41. },
  42. 'erpSaveButton': {
  43. click: function(btn){
  44. var form = me.getForm(btn);
  45. if(Ext.getCmp(form.codeField).value == null || Ext.getCmp(form.codeField).value == ''){
  46. me.BaseUtil.getRandomNumber();
  47. }
  48. this.getAramount();
  49. //保存之前的一些前台的逻辑判定
  50. this.beforeSaveRecBalance();
  51. }
  52. },
  53. 'erpDeleteDetailButton': {
  54. afterrender: function(btn){
  55. if(caller == 'RecBalance!TK'){
  56. //辅助核算
  57. btn.ownerCt.add({
  58. xtype:'erpAssDetailButton',
  59. disabled:true
  60. });
  61. }
  62. }
  63. },
  64. 'erpPostButton' : {
  65. afterrender: function(btn){
  66. var status = Ext.getCmp(me.getForm(btn).statusCode);
  67. if(status && status.value == 'UNPOST'){
  68. btn.show();
  69. }else{
  70. btn.hide();
  71. }
  72. },
  73. click: function(btn){
  74. me.beforePost(btn);
  75. }
  76. },
  77. 'erpResPostButton' : {
  78. afterrender: function(btn){
  79. var status = Ext.getCmp(me.getForm(btn).statusCode);
  80. if(status && status.value == 'POSTED'){
  81. btn.show();
  82. }else{
  83. btn.hide();
  84. }
  85. },
  86. click: function(btn){
  87. me.FormUtil.onResPost(Ext.getCmp('rb_id').value);
  88. }
  89. },
  90. 'erpDeleteButton' : {
  91. click: function(btn){
  92. me.FormUtil.onDelete(Ext.getCmp('rb_id').value);
  93. }
  94. },
  95. 'erpUpdateButton': {
  96. click: function(btn){
  97. this.getAramount();
  98. me.beforeUpdateRecBalance();
  99. }
  100. },
  101. 'erpAddButton': {
  102. click: function(){
  103. var form = Ext.getCmp('form');
  104. var title = '新增';
  105. if(form){
  106. if(form.title){
  107. title = title+form.title;
  108. }
  109. }
  110. me.FormUtil.onAdd('addRecBalance', title, 'jsps/fa/ars/recBalanceTK.jsp?whoami='+caller);
  111. }
  112. },
  113. 'erpCloseButton': {
  114. click: function(btn){
  115. me.FormUtil.beforeClose(me);
  116. }
  117. },
  118. 'erpSubmitButton': {
  119. afterrender: function(btn){
  120. var auditStatus = Ext.getCmp(me.getForm(btn).auditStatusCode);
  121. if(auditStatus && auditStatus.value != 'ENTERING'){
  122. btn.hide();
  123. }
  124. },
  125. click: function(btn){
  126. me.beforeSubmit(btn);
  127. }
  128. },
  129. 'textfield[name=rb_amount]':{
  130. change: me.changecmrate
  131. },
  132. 'textfield[name=rb_cmamount]':{
  133. change: me.changecmrate
  134. },
  135. 'erpResSubmitButton': {
  136. afterrender: function(btn){
  137. var auditStatus = Ext.getCmp(me.getForm(btn).auditStatusCode);
  138. if(auditStatus && auditStatus.value != 'COMMITED'){
  139. btn.hide();
  140. }
  141. },
  142. click: function(btn){
  143. me.FormUtil.onResSubmit(Ext.getCmp('rb_id').value);
  144. }
  145. },
  146. 'erpAuditButton': {
  147. afterrender: function(btn){
  148. var auditStatus = Ext.getCmp(me.getForm(btn).auditStatusCode);
  149. if(auditStatus && auditStatus.value != 'COMMITED'){
  150. btn.hide();
  151. }
  152. },
  153. click: function(btn){
  154. me.FormUtil.onAudit(Ext.getCmp('rb_id').value);
  155. }
  156. },
  157. 'erpResAuditButton': {
  158. afterrender: function(btn){
  159. var auditStatus = Ext.getCmp(me.getForm(btn).auditStatusCode);
  160. if(auditStatus && auditStatus.value != 'AUDITED'){
  161. btn.hide();
  162. }
  163. },
  164. click: function(btn){
  165. me.FormUtil.onResAudit(Ext.getCmp('rb_id').value);
  166. }
  167. },
  168. 'erpPrintButton': {
  169. click: function(btn){
  170. me.FormUtil.onPrint(Ext.getCmp('rb_id').value);
  171. }
  172. },
  173. 'numberfield[name=rb_amount]':{
  174. beforerender:function(num){
  175. num.minValue = Number.NEGATIVE_INFINITY;
  176. num.setMinValue(num.minValue);
  177. b = num.baseChars+"";
  178. b += num.decimalSeparator;
  179. b += "-";
  180. b = Ext.String.escapeRegex(b);
  181. num.maskRe = new RegExp("[" + b + "]");
  182. }
  183. },
  184. 'numberfield[name=rb_cmamount]':{
  185. beforerender:function(num){
  186. num.minValue = Number.NEGATIVE_INFINITY;
  187. num.setMinValue(num.minValue);
  188. b = num.baseChars+"";
  189. b += num.decimalSeparator;
  190. b += "-";
  191. b = Ext.String.escapeRegex(b);
  192. num.maskRe = new RegExp("[" + b + "]");
  193. }
  194. },
  195. 'numberfield[name=rb_aramount]':{
  196. beforerender:function(num){
  197. num.minValue = Number.NEGATIVE_INFINITY;
  198. num.setMinValue(num.minValue);
  199. b = num.baseChars+"";
  200. b += num.decimalSeparator;
  201. b += "-";
  202. b = Ext.String.escapeRegex(b);
  203. num.maskRe = new RegExp("[" + b + "]");
  204. }
  205. },
  206. 'cateTreeDbfindTrigger[name=rb_catecode]':{
  207. aftertrigger:function(trigger, data){
  208. Ext.getCmp('rb_catename').setValue(data[0].raw.data.ca_name);
  209. if(caller == 'RecBalance!IMRE'||caller == 'RecBalance!PBIL'){
  210. var asstype = data[0].raw.data.ca_asstype;
  211. var btn = Ext.getCmp("assmainbutton");
  212. if(Ext.isEmpty(asstype)){
  213. btn.setDisabled(true);
  214. }else{
  215. btn.setDisabled(false);
  216. }
  217. }
  218. }
  219. },
  220. 'field[name=rbd_ordercode]': {
  221. aftertrigger: function(){
  222. var grid = Ext.getCmp('grid');
  223. var record = grid.selModel.lastSelected;
  224. var data = record.data['rbd_aramount']-record.data['rbd_havepay'];
  225. record.set('rbd_nowbalance', data);
  226. },
  227. afterrender:function(t){
  228. t.gridKey="rb_custcode";
  229. t.mappinggirdKey="ab_custcode";
  230. t.gridErrorMessage="请先选择客户";
  231. },
  232. beforetrigger:function(t){
  233. var currency = Ext.getCmp('rb_cmcurrency').getValue();
  234. if(currency&&currency!=''){
  235. t.findConfig="ab_currency='"+currency+"'";
  236. }
  237. }
  238. },
  239. 'gridcolumn[dataIndex=rbd_currency]' : {
  240. afterrender : function(c) {
  241. c.defaultValue = 'RMB';
  242. }
  243. }
  244. });
  245. },
  246. beforePost:function(btn){
  247. var me = this;
  248. if(caller == 'RecBalance!TK'){
  249. var grid = Ext.getCmp('grid'),items=grid.store.data.items;
  250. var sameCurrency = true;
  251. var amount = Number(Ext.getCmp('rb_amount').getValue());
  252. var cmamount =Number(Ext.getCmp('rb_cmamount').getValue());
  253. var cmcurrency = Ext.getCmp('rb_cmcurrency').getValue();
  254. var cmrate = Number(Ext.getCmp('rb_cmrate').getValue());
  255. var detailamount = 0;
  256. var currency = Ext.getCmp('rb_currency').getValue();
  257. if(amount != 0 && cmamount != 0){
  258. if(Ext.Number.toFixed(cmrate, 8)!= Ext.Number.toFixed(cmamount/amount, 8)){
  259. showError('冲账汇率不正确,不能过账!');
  260. return;
  261. }
  262. }
  263. if(currency == cmcurrency){
  264. if(cmrate != 1){
  265. showError('币别相同,冲账汇率不等于1,不能过账!');
  266. return;
  267. }
  268. }
  269. if(currency != cmcurrency){
  270. if(cmrate == 1){
  271. showError('币别不相同,冲账汇率等于1,不能过账!');
  272. return;
  273. }
  274. }
  275. Ext.each(items,function(item,index){
  276. detailamount = detailamount+Number(item.data['rbd_nowbalance']);
  277. if(cmcurrency!=item.data['rbd_currency']){
  278. //从表币别有与主表币别不同的
  279. //抛出异常
  280. sameCurrency = false;
  281. }
  282. });
  283. if(!sameCurrency){
  284. //从表币别有与主表币别不同的
  285. //抛出异常
  286. showError('明细行币别与冲账币别不同,不能过账');return;
  287. }
  288. if(Ext.Number.toFixed(cmamount,2) != Ext.Number.toFixed(detailamount,2)){
  289. //冲账金额与明细行本次结算总和不等
  290. //抛出异常
  291. showError('明细行本次结算与冲账金额不等,不能过账');return;
  292. }
  293. me.FormUtil.onPost(Ext.getCmp('rb_id').value);
  294. }else{
  295. me.FormUtil.onPost(Ext.getCmp('rb_id').value);
  296. }
  297. },
  298. beforeSubmit:function(btn){
  299. var me = this;
  300. if(caller == 'RecBalance!TK'){
  301. var grid = Ext.getCmp('grid'),items=grid.store.data.items;
  302. var sameCurrency = true;
  303. var amount = Number(Ext.getCmp('rb_amount').getValue());
  304. var cmamount =Number(Ext.getCmp('rb_cmamount').getValue());
  305. var cmcurrency = Ext.getCmp('rb_cmcurrency').getValue();
  306. var cmrate = Number(Ext.getCmp('rb_cmrate').getValue());
  307. var detailamount = 0;
  308. var currency = Ext.getCmp('rb_currency').getValue();
  309. if(amount != 0 && cmamount != 0){
  310. if(Ext.Number.toFixed(cmrate, 8)!= Ext.Number.toFixed(cmamount/amount, 8)){
  311. showError('冲账汇率不正确,不能提交!');
  312. return;
  313. }
  314. }
  315. if(currency == cmcurrency){
  316. if(cmrate != 1){
  317. showError('币别相同,冲账汇率不等于1,不能提交!');
  318. return;
  319. }
  320. }
  321. if(currency != cmcurrency){
  322. if(cmrate == 1){
  323. showError('币别不相同,冲账汇率等于1,不能提交!');
  324. return;
  325. }
  326. }
  327. Ext.each(items,function(item,index){
  328. detailamount = detailamount+Number(item.data['rbd_nowbalance']);
  329. if(cmcurrency!=item.data['rbd_currency']){
  330. //从表币别有与主表币别不同的
  331. //抛出异常
  332. sameCurrency = false;
  333. }
  334. });
  335. if(!sameCurrency){
  336. //从表币别有与主表币别不同的
  337. //抛出异常
  338. showError('明细行币别与冲账币别不同,不能提交');return;
  339. }
  340. if(Ext.Number.toFixed(cmamount, 2) != Ext.Number.toFixed(detailamount, 2)){
  341. //冲账金额与明细行本次结算总和不等
  342. //抛出异常
  343. showError('明细行本次结算与冲账金额不等,不能提交');return;
  344. }
  345. me.FormUtil.onSubmit(Ext.getCmp('rb_id').value);
  346. }else{
  347. me.FormUtil.onSubmit(Ext.getCmp('rb_id').value);
  348. }
  349. },
  350. onGridItemClick: function(selModel, record){//grid行选择
  351. this.gridLastSelected = record;
  352. var grid = Ext.getCmp('grid');
  353. if(record.data[grid.necessaryField] == null || record.data[grid.necessaryField] == ''){
  354. this.gridLastSelected.findable = true;//空数据可以在输入完code,并移开光标后,自动调出该条数据
  355. } else {
  356. this.gridLastSelected.findable = false;
  357. }
  358. this.GridUtil.onGridItemClick(selModel, record);
  359. },
  360. getForm: function(btn){
  361. return btn.ownerCt.ownerCt;
  362. },
  363. beforeSaveRecBalance: function(){
  364. var grid = Ext.getCmp('grid');
  365. var items = grid.store.data.items;
  366. var bool = true;
  367. var warnStr='';
  368. Ext.each(items,function(item,index){
  369. if(item.dirty && item.data[grid.necessaryField] != null && item.data[grid.necessaryField] != ''){
  370. var aramount =item.data['rbd_aramount']; //订单金额
  371. var havepay = item.data['rbd_havepay']; //已预收金额
  372. var nowbalance = item.data['rbd_nowbalance']; //本次预收额
  373. //订单金额>=已预收金额+本次预收额
  374. //此种情况不能进行保存
  375. if(havepay+nowbalance>aramount){
  376. var i = index+1;
  377. if(warnStr ==''||warnStr.length<=0){
  378. warnStr = warnStr +i;
  379. }else{
  380. warnStr = warnStr +','+i;
  381. }
  382. bool = false;
  383. }
  384. }
  385. });
  386. if(bool){
  387. this.beforeSave(this);
  388. }else{
  389. if(warnStr != ''||warnStr.length>0){
  390. showError('明细表第'+warnStr+'行 已收金额与本次结算额的合计超过发票金额,不能保存');return;
  391. }
  392. }
  393. },
  394. //冲账汇率计算 = 冲账金额/预收金额
  395. changecmrate: function(){
  396. if(Ext.getCmp('rb_amount') && Ext.getCmp('rb_cmrate')) {
  397. var rbamount = Ext.Number.from(Ext.getCmp('rb_amount').getValue(), 0);
  398. var cmamount = Ext.Number.from(Ext.getCmp('rb_cmamount').getValue(), 0);
  399. if(rbamount != 0)
  400. Ext.getCmp('rb_cmrate').setValue(Ext.Number.toFixed(cmamount/rbamount, 8));
  401. }
  402. },
  403. //计算冲账收款金额 并写入主表 冲账收款金额字段
  404. getAramount: function(){
  405. var grid = Ext.getCmp('grid');
  406. var items = grid.store.data.items;
  407. var aramount = 0;
  408. Ext.each(items,function(item,index){
  409. if(item.data['rbd_ordercode']!=null&&item.data['rbd_ordercode']!=""){
  410. aramount= aramount + Number(item.data['rbd_nowbalance']);
  411. }
  412. });
  413. Ext.getCmp('rb_aramount').setValue(aramount);
  414. },
  415. beforeSave:function(){
  416. var me = this;
  417. var form = Ext.getCmp('form');
  418. if(! me.FormUtil.checkForm()){
  419. return;
  420. }
  421. if(Ext.getCmp(form.keyField).value == null || Ext.getCmp(form.keyField).value == ''){
  422. me.FormUtil.getSeqId(form);
  423. }
  424. var detail = Ext.getCmp('grid');
  425. var param2 = new Array();
  426. var param3 = new Array();
  427. if(Ext.getCmp('assdetail')){
  428. Ext.each(Ext.Object.getKeys(Ext.getCmp('assdetail').cacheStoreGrid), function(key){
  429. Ext.each(Ext.getCmp('assdetail').cacheStoreGrid[key], function(d){
  430. d['dass_condid'] = key;
  431. param2.push(d);
  432. });
  433. });
  434. }
  435. if(Ext.getCmp('assmainbutton')){
  436. Ext.each(Ext.Object.getKeys(Ext.getCmp('assmainbutton').cacheStoreForm), function(key){
  437. Ext.each(Ext.getCmp('assmainbutton').cacheStoreForm[key], function(d){
  438. d['ass_conid'] = key;
  439. param3.push(d);
  440. });
  441. });
  442. }
  443. Ext.each(detail.store.data.items, function(item){
  444. if(item.data.prd_id == null || item.data.prd_id == 0){
  445. item.data.prd_id = -item.index;
  446. }
  447. });
  448. var param1 = me.GridUtil.getGridStore(detail);
  449. me.onSave(form, param1, param2,param3);
  450. },
  451. onSave:function(form, param1, param2,param3){
  452. var me = this;
  453. param1 = param1 == null ? [] : "[" + param1.toString().replace(/\\/g,"%") + "]";
  454. param2 = param2 == null ? [] : Ext.encode(param2).replace(/\\/g,"%");
  455. param3 = param3 == null ? [] : Ext.encode(param3).replace(/\\/g,"%");
  456. if(form.getForm().isValid()){
  457. Ext.each(form.items.items, function(item){
  458. if(item.xtype == 'numberfield'){
  459. if(item.value == null || item.value == ''){
  460. item.setValue(0);
  461. }
  462. }
  463. });
  464. var r = form.getValues();
  465. form.getForm().getFields().each(function(){
  466. if(this.logic == 'ignore') {
  467. delete r[this.name];
  468. }
  469. });
  470. me.FormUtil.save(r, param1, param2,param3);
  471. }else{
  472. me.FormUtil.checkForm();
  473. }
  474. },
  475. beforeUpdateRecBalance: function(){
  476. var me = this;
  477. var grid = Ext.getCmp('grid');
  478. Ext.Array.each(grid.store.data.items, function(item){
  479. item.set('rbd_rbid',Ext.getCmp('rb_id').value);
  480. });
  481. //采购价格不能为0
  482. var grid = Ext.getCmp('grid');
  483. var items = grid.store.data.items;
  484. var bool = true;
  485. var warnStr='';
  486. Ext.each(items,function(item,index){
  487. if(item.dirty && item.data[grid.necessaryField] != null && item.data[grid.necessaryField] != ''){
  488. var aramount =item.data['rbd_aramount']; //发票金额
  489. var havepay = item.data['rbd_havepay']; //已收金额
  490. var nowbalance = item.data['rbd_nowbalance']; //本次结算额
  491. //订单金额>=已预收金额+本次预收额
  492. //此种情况不能进行保存
  493. if(havepay+nowbalance>aramount){
  494. var i = index+1;
  495. if(warnStr ==''||warnStr.length<=0){
  496. warnStr = warnStr +i;
  497. }else{
  498. warnStr = warnStr +','+i;
  499. }
  500. bool = false;
  501. }
  502. }
  503. });
  504. if(bool){
  505. me.beforeUpdate();
  506. }else{
  507. if(warnStr != ''||warnStr.length>0){
  508. showError('明细表第'+warnStr+'行 已收金额与本次结算额的合计超过发票金额,不能保存');return;
  509. }
  510. }
  511. },
  512. beforeUpdate:function(){
  513. var me = this;
  514. var form = Ext.getCmp('form');
  515. if(! me.FormUtil.checkForm()){
  516. return;
  517. }
  518. var detail = Ext.getCmp('grid');
  519. Ext.each(detail.store.data.items, function(item){
  520. if(item.data.prd_id == null || item.data.prd_id == 0){
  521. item.data.prd_id = -item.index;
  522. }
  523. });
  524. var param1 = me.GridUtil.getGridStore(detail);
  525. var param2 = new Array();
  526. var param3 = new Array();
  527. if(caller == 'RecBalance!PBIL'){
  528. }
  529. if(Ext.getCmp('assdetail')){
  530. Ext.each(Ext.Object.getKeys(Ext.getCmp('assdetail').cacheStoreGrid), function(key){
  531. Ext.each(Ext.getCmp('assdetail').cacheStoreGrid[key], function(d){
  532. d['dass_condid'] = key;
  533. param2.push(d);
  534. });
  535. });
  536. }
  537. if(Ext.getCmp('assmainbutton')){
  538. Ext.each(Ext.Object.getKeys(Ext.getCmp('assmainbutton').cacheStoreForm), function(key){
  539. Ext.each(Ext.getCmp('assmainbutton').cacheStoreForm[key], function(d){
  540. d['ass_conid'] = key;
  541. param3.push(d);
  542. });
  543. });
  544. }
  545. if(me.FormUtil.checkFormDirty(form) == '' && detail.necessaryField.length > 0 && (param1.length == 0)
  546. && param2.length == 0&& param3.length == 0){
  547. showError($I18N.common.grid.emptyDetail);
  548. return;
  549. } else {
  550. param1 = param1 == null ? [] : "[" + param1.toString().replace(/\\/g,"%") + "]";
  551. param2 = param2 == null ? [] : Ext.encode(param2).replace(/\\/g,"%");
  552. param3 = param3 == null ? [] : Ext.encode(param3).replace(/\\/g,"%");
  553. if(form.getForm().isValid()){
  554. Ext.each(form.items.items, function(item){
  555. if(item.xtype == 'numberfield'){
  556. if(item.value == null || item.value == ''){
  557. item.setValue(0);
  558. }
  559. }
  560. });
  561. var r = form.getValues();
  562. form.getForm().getFields().each(function(){
  563. if(this.logic == 'ignore') {
  564. delete r[this.name];
  565. }
  566. });
  567. me.FormUtil.update(r, param1, param2,param3);
  568. }else{
  569. me.FormUtil.checkForm();
  570. }
  571. }
  572. }
  573. });