JSlip  1.0
user_journal_edit.tmplt
Go to the documentation of this file.
1 <?php
2 /**
3  * @link https://datagram.co.jp/source/bksj for the canonical source repository
4  * @copyright Copyright (c) 2006-2019 Datagram Ltd. (https://datagram.co.jp)
5  * @license https://datagram.co.jp/source/bksj/license.txt
6  */
7 
8 $view = $ctrl->view;
9 $dat = $ctrl->dat;
10 $bid = $ctrl->bid;
11 $mode = $ctrl->mode;
12 $basic = $ctrl->basic;
13 $item = $ctrl->item;
14 $sect = $ctrl->sect;
15 $stld = $ctrl->stld;
16 
17 $jid = $view->str($dat['journal']['id']);
18 $scd = $view->str($dat['journal']['scd']);
19 $ymd = $view->str(str_replace('-', '/', $dat['journal']['ymd']));
20 $settled_flg = $view->str($dat['journal']['settled_flg']);
21 $not_use_flg = $view->str($dat['journal']['not_use_flg']);
22 $slip = $dat['slip'];
23 
24 $max = 30;
25 $lines = count($slip);
26 $sundry = '0';
27 
28 $insert = ($mode == 'edit') ? 0 : 1;
29 $title = ($mode == 'edit') ? '編集' : '複製';
30 ?>
31 <script type="text/javascript">
32 
33  var my = {
34 
35  errmsg: null,
36  ans: null,
37  next: null,
38  func: null,
39  act: null,
40  jid: null,
41  scd: null,
42  ymd: null,
43  settled_flg: null,
44  not_use_flg: null,
45 
46  val: null,
47 
48  sort1: null,
49  sort2: null,
50  sid: 0,
51  sname: ['50音順', '使用順'],
52  sundry: '<?= $sundry ?>',
53 
54  max: <?= $max ?>,
55  lines: <?= $lines ?>,
56  last: <?= $lines ?>,
57 
58  gotoNext: function(func, act) {
59  this.func.val(func);
60  this.act.val(act);
61  this.next.submit();
62  return false;
63  },
64 
65  getVal: function() {
66  var s, a, v;
67  var val = {};
68 
69  val['jid'] = $('#jid').val();
70  val['ymd'] = $('#ymd').val();
71 
72  $('select').each(function(){
73  s = $(this).attr('id');
74  if (s) {
75  val[s] = $('#' + s).val();
76  }
77  });
78 
79  $('input[type="hidden"]').each(function(){
80  s = $(this).attr('id');
81  a = s.split('_');
82  if (a[0] == 'v') {
83  v = '#v_' + a[1] + '_valid';
84  if ($(v).val() == 1) {
85  val[s] = $('#' + s).val();
86  }
87  }
88  });
89 
90  $('input[type="text"]').each(function(){
91  s = $(this).attr('id');
92  a = s.split('_');
93  if (a[0] == 'v') {
94  v = '#v_' + a[1] + '_valid';
95  if ($(v).val() == 1) {
96  val[s] = $('#' + s).val();
97  }
98  }
99  });
100 
101  this.val = val;
102  },
103 
104  debug: function() {
105  this.getVal();
106  for (var i in this.val) {
107  alert(i + ' = ' + this.val[i]);
108  }
109  },
110 
111  slct: function(id) {
112 
113  var itm = (this.sid == 0) ? '#item_name' : '#item_time';
114 
115  var debs = 's_' + id + '_deb_name';
116  var debo = 'o_' + id + '_deb_name';
117  var debv = 'v_' + id + '_deb_name';
118  $('#' + debs).html($(itm).html());
119  $('#' + debs + ' select').attr('id', debo);
120  $('#' + debo).attr('onchange', "return my.selChg(" + id + ", 'deb');");
121  $('#' + debo).val($('#' + debv).val());
122 
123  var cres = 's_' + id + '_cre_name';
124  var creo = 'o_' + id + '_cre_name';
125  var crev = 'v_' + id + '_cre_name';
126  $('#' + cres).html($(itm).html());
127  $('#' + cres + ' select').attr('id', creo);
128  $('#' + creo).attr('onchange', "return my.selChg(" + id + ", 'cre');");
129  $('#' + creo).val($('#' + crev).val());
130  },
131 
132  selChg: function(id, w) {
133  var o = '#o_' + id + '_' + w + '_name';
134  var v = '#v_' + id + '_' + w + '_name';
135  var k = $(o).val();
136 
137  $(v).val(k);
138 
139  if (k == this.sundry) {
140  $('#v_' + id + '_' + w + '_amount').val(0);
141  this.getSum();
142  }
143  },
144 
145  getSum: function() {
146 
147  var d, c;
148  var deb = 0;
149  var cre = 0;
150 
151  for (var i = 1; i <= this.max; i++) {
152  if ($('#v_' + i + '_valid').val() > 0) {
153  d = $('#v_' + i + '_deb_amount').val();
154  c = $('#v_' + i + '_cre_amount').val();
155  deb += d.replace(/,/g, '') * 1;
156  cre += c.replace(/,/g, '') * 1;
157  }
158  }
159 
160  $('#v_deb_sum').val(deb);
161  $('#v_cre_sum').val(cre);
162  },
163 
164  chgAmount: function(id, w) {
165 
166  var v;
167  var debv = '#v_' + id + '_deb_amount';
168  var crev = '#v_' + id + '_cre_amount';
169 
170  if (w == 'deb') {
171  v = $(debv).val();
172  $(crev).val(v);
173  } else {
174  v = $(crev).val();
175  $(debv).val(v);
176  }
177 
178  for (var i = 1; i <= this.max; i++) {
179 
180  if ($('#v_' + i + '_valid').val() > 0) {
181  if ($('#v_' + i + '_deb_name').val() == this.sundry) {
182  $('#v_' + i + '_deb_amount').val(0);
183  }
184  if ($('#v_' + i + '_cre_name').val() == this.sundry) {
185  $('#v_' + i + '_cre_amount').val(0);
186  }
187  }
188  }
189 
190  this.getSum();
191  },
192 
193  chkTax: function(id) {
194 
195  var v = $('#' + id).val();
196 
197  if (v < 1) {
198  return;
199  }
200 
201  $.ajax({
202  url: '<?= $base ?>',
203  type: 'post',
204  async: false,
205  data: {
206  'func': 'UserJournal',
207  'act': 'tax',
208  'bid': '<?= $bid ?>',
209  'val': v,
210  'eod': ''
211  }
212  })
213  .done((data) => {
214  $('#modalTaxBody').html(data);
215  })
216  .fail((data) => {
217  $('#modalTaxBody').html('error');
218  });
219 
220  $('#modalTax').modal();
221  },
222 
223  using: function(i) {
224  this.slct(i);
225  $('#v_' + i + '_valid').val(1);
226  $('#r_' + i).css('visibility', 'visible');
227  },
228 
229  plus: function() {
230 
231  if (this.last >= this.max) {
232  alert('これ以上追加できません。');
233  return;
234  }
235 
236  ++this.lines;
237  ++this.last;
238  this.using(this.last);
239  },
240 
241  drop: function(seq) {
242 
243  if (this.lines < 2) {
244  alert('これ以上削除できません。');
245  return;
246  }
247 
248  if (!confirm('行番号' + seq + 'を削除しますか?')) {
249  return;
250  }
251 
252  --this.lines;
253 
254  $('#v_' + seq + '_valid').val(0);
255  $('#r_' + seq).css('visibility', 'collapse');
256  },
257 
258  sort: function() {
259 
260  this.sid = ++this.sid % 2;
261  this.sort1.html(this.sname[this.sid]);
262  this.sort2.html(this.sname[this.sid]);
263 
264  for (var i = 1; i <= this.max; i++) {
265  if ($('#v_' + i + '_valid').val() > 0) {
266  this.slct(i);
267  }
268  }
269  },
270 
271  check: function(arg) {
272 
273  $.ajax({
274  url: '<?= $base ?>',
275  type: 'post',
276  async: false,
277  data: {
278  'func': 'UserJournal',
279  'act': 'check',
280  'insert': <?= $insert ?>,
281  'bid': '<?= $bid ?>',
282  'arg': arg,
283  'eod': ''
284  }
285  })
286  .done((data) => {
287  this.ans = {"sts": "OK", "err": ""};
288  })
289  .fail((data) => {
290  this.ans = {"sts": "NG", "err": "ajax error"};
291  });
292 
293  return this.ans.sts;
294  },
295 
296  regist: function() {
297 
298  var n;
299  var msg = '';
300  var v = {};
301  var arg = 0;
302 
303  this.getVal();
304 
305  for (var i = 1; i <= this.max; i++) {
306  if ($('#v_' + i + '_valid').val() > 0) {
307  n = 'v_' + i + '_';
308  v[i] = {};
309  v[i]['deb_amount'] = this.val[n + 'deb_amount'];
310  v[i]['deb_name'] = this.val[n + 'deb_name'];
311  v[i]['remark'] = this.val[n + 'remark'];
312  v[i]['cre_name'] = this.val[n + 'cre_name'];
313  v[i]['cre_amount'] = this.val[n + 'cre_amount'];
314  }
315  }
316 
317  arg = {
318  'jid': this.val['jid'],
319  'scd': this.val['scd'],
320  'ymd': this.val['ymd'],
321  'settled_flg': this.val['settled_flg'],
322  'not_use_flg': this.val['not_use_flg'],
323  'dat': v,
324  };
325 
326  if (!confirm("登録しますか?")) {
327  return false;
328  }
329 
330  if (this.check(arg) == 'NG') {
331 
332  for (var i in this.ans.err) {
333  msg += this.ans.err[i] + '<br>';
334  }
335 
336  this.errmsg.html(msg);
337  return false;
338  }
339 
340  $.ajax({
341  url: '<?= $base ?>',
342  type: 'post',
343  async: false,
344  data: {
345  'func': 'UserJournal',
346  'act': 'regist',
347  'insert': <?= $insert ?>,
348  'bid': '<?= $bid ?>',
349  'arg': arg,
350  'eod': ''
351  }
352  })
353  .done((data) => {
354  eval("this.ans = " + data);
355  })
356  .fail((data) => {
357  this.ans = {"sts": "NG", "err": "ajax error"};
358  });
359 
360  if (this.ans.sts == 'NG') {
361  this.errmsg.html(this.ans.err);
362  return false;
363  }
364 
365  this.gotoNext('UserJournal', 'remember');
366 
367  return false;
368  },
369 
370  init: function() {
371  this.errmsg = $('#errmsg');
372  this.next = $('#next');
373  this.func = $('#func');
374  this.act = $('#act');
375  this.jid = $('#jid');
376  this.scd = $('#scd');
377  this.ymd = $('#ymd');
378  this.settled_flg = $('#settled_flg');
379  this.not_use_flg = $('#not_use_flg');
380  this.sort1 = $('#sort1');
381  this.sort2 = $('#sort2');
382 
383  this.ymd.datepicker();
384 
385  this.sort1.html(this.sname[this.sid]);
386  this.sort2.html(this.sname[this.sid]);
387 
388  for (var i = 1; i <= this.lines; i++) {
389  this.using(i);
390  }
391  }
392  }
393 
394  $(function(){
395  my.init();
396  });
397 
398 </script>
399 
400 <form method="post" name="next" id="next" action="<?= $base ?>">
401  <input type="hidden" name="func" id="func">
402  <input type="hidden" name="act" id="act">
403 </form>
404 
405 <div id="item_name" style="visibility: hidden;">
406  <select>
407  <option value="-1">&nbsp;</option>
408 <?php
409 $c = '';
410 foreach ($item['name'] as $k => $d) {
411  $p = mb_substr($d['kana'], 0, 1);
412  if ($c != $p) {
413  if ($c != '') {
414  echo '</optgroup>';
415  }
416  echo '<optgroup label="' . $p . '">';
417  $c = $p;
418  }
419  echo '<option value="' . $view->str($k) . '">' . $view->str($d['name']) , '</option>';
420 }
421 if ($c != '') {
422  echo '</optgroup>';
423 }
424 ?>
425  </select>
426 </div>
427 
428 <div id="item_time" style="visibility: hidden;">
429  <select>
430  <option value="-1">&nbsp;</option>
431 <?php
432 foreach ($item['time'] as $k => $d) {
433  echo '<option value="' . $view->str($k) . '">' . $view->str($d) . '</option>';
434 }
435 ?>
436  </select>
437 </div>
438 
439 <table id="my_header" width="100%">
440  <tr>
441  <td>
442  &nbsp;<a onclick="return my.gotoNext('UserMenu', '');">メニュー</a>
443  &nbsp;&gt;&nbsp;<a onclick="return my.gotoNext('UserJournal', 'remember');">仕訳帳</a>
444  &nbsp;&gt;&nbsp;<?= $title ?>
445  </td>
446  <td style="text-align: right;">
447  <button type="button" class="my_magenta" style="width: 120px;" onclick="return my.gotoNext('Login', '');">ログアウト</button>
448  </td>
449  </tr>
450  <tr>
451  <td colspan="2" style="text-align: center;">
452  <?= $view->strBasic($basic) ?>
453  </td>
454  </tr>
455 </table>
456 
457 <div style="height: 5px;">&nbsp;</div>
458 
459 <table width="100%">
460  <tr>
461  <td align="center">
462  <table class="my_table" width="100%">
463  <tr>
464  <th class="my_border">仕訳帳・<?= $title ?></th>
465  </tr>
466  </table>
467 
468  <div style="height: 1px;">&nbsp;</div><hr>
469 
470  <table>
471  <tr>
472  <td align="center">
473  <table>
474  <tr>
475  <td style="padding: 8px;">
476  <button type="button" class="my_cyan" style="width: 100px;" onclick="return my.regist();">登録</button>
477  </td>
478  <td style="width: 80px;">&nbsp;</td>
479  <td>
480  <button type="button" class="my_magenta" style="width: 100px;" onclick="return my.gotoNext('UserJournal', 'remember');">戻る</button>
481  </td>
482  </tr>
483  </table>
484  </td>
485  </tr>
486  </table>
487 
488  <div style="height: 1px;">&nbsp;</div><hr>
489 
490  <table width="100%">
491  <tr>
492  <td><div id="errmsg" class="my_red"></div></td>
493  </tr>
494  </table>
495 
496  <table class="my_list" width="100%">
497  <thead>
498  <tr>
499  <th>伝票番号</th>
500  <th>部門</th>
501  <th>伝票日付</th>
502  <th>決算伝票</th>
503  <th>不使用伝票</th>
504  </tr>
505  </thead>
506  <tbody>
507  <tr>
508  <td style="text-align: center;">
509 <?php
510 $mnam = ($mode == 'edit') ? $jid : '新番号';
511 $mjid = ($mode == 'edit') ? $jid : '-1';
512 ?>
513  <?= $mnam ?><input id="jid" type="hidden" value="<?= $mjid ?>">
514  </td>
515  <td style="text-align: center;">
516  <select id="scd">
517 <?php
518 foreach ($sect as $k => $d) {
519  $slct = ($k == $scd) ? ' selected' : '';
520  echo '<option value="' . $view->str($k) . '"' . $slct . '>' . $view->str($d) . '</option>';
521 }
522 ?>
523  </select>
524  </td>
525  <td style="text-align: center;">
526  <input id="ymd" size="10" style="text-align: center;" type="text" value="<?= $ymd ?>">
527  </td>
528  <td style="text-align: center;">
529  <select id="settled_flg">
530 <?php
531 foreach ($stld as $k => $d) {
532  $slct = ($k == $settled_flg) ? ' selected' : '';
533  echo '<option value="' . $view->str($k) . '"' . $slct . '>' . $view->str($d) . '</option>';
534 }
535 ?>
536  </select>
537  </td>
538  <td style="text-align: center;">
539  <select id="not_use_flg">
540 <?php
541 $nuflg = (empty($not_use_flg)) ? ['', ' selected'] : [' selected', ''];
542 ?>
543  <option value="1"<?= $nuflg[0] ?>>不使用伝票</option>
544  <option value="0"<?= $nuflg[1] ?>>使用伝票</option>
545  </select>
546  </td>
547  </tr>
548  </tbody>
549  </table>
550 
551  <div style="height: 4px;">&nbsp;</div>
552  <!-- <button type="button" class="my_magenta" onclick="return my.debug();">debug</button> -->
553 
554  <table>
555  <tr>
556  <td align="center">
557  <table class="my_list">
558  <thead>
559  <tr>
560  <th>No.</th>
561  <th>借方金額</th>
562  <th>
563  借方科目
564  <button type="button" class="my_th" onclick="return my.sort();">
565  <div id="sort1"></div>
566  </button>
567  </th>
568  <th>摘要</th>
569  <th>
570  貸方科目
571  <button type="button" class="my_th" onclick="return my.sort();">
572  <div id="sort2"></div>
573  </button>
574  </th>
575  <th>貸方金額</th>
576  <th>削除</th>
577  </tr>
578  </thead>
579  <tbody>
580 <?php
581 $sdamnt = 0;
582 $scamnt = 0;
583 for ($i = 0; $i < $max; $i++) {
584 
585  $seq = $i + 1;
586 
587  if (empty($slip[$i])) {
588  $debit = -1;
589  $credit = -1;
590  $remark = '';
591  $damnt = 0;
592  $camnt = 0;
593  } else {
594  $amount = (int)$slip[$i]['amount'];
595  $debit = $view->str($slip[$i]['debit']);
596  $credit = $view->str($slip[$i]['credit']);
597  $remark = $view->str($slip[$i]['remark']);
598  $damnt = ($debit == $sundry) ? 0 : $amount;
599  $camnt = ($credit == $sundry) ? 0 : $amount;
600 
601  $sdamnt += $damnt;
602  $scamnt += $camnt;
603  }
604 ?>
605  <tr id="r_<?= $seq ?>" style="visibility: collapse;">
606  <td style="text-align: right;">
607  <?= $seq ?>
608  </td>
609  <td style="text-align: center;">
610  <input id="v_<?= $seq ?>_deb_amount" size="10" style="text-align: right;" type="text" value="<?= $damnt ?>" onchange="return my.chgAmount('<?= $seq ?>', 'deb')" ondblclick="my.chkTax('v_<?= $seq ?>_deb_amount')">
611  </td>
612  <td style="text-align: center;">
613  <input id="v_<?= $seq ?>_deb_name" type="hidden" value="<?= $debit ?>">
614  <div id="s_<?= $seq ?>_deb_name">&nbsp;</div>
615  </td>
616  <td style="text-align: center;">
617  <input id="v_<?= $seq ?>_remark" size="40" type="text" value="<?= $remark ?>">
618  </td>
619  <td style="text-align: center;">
620  <input id="v_<?= $seq ?>_cre_name" type="hidden" value="<?= $credit ?>">
621  <div id="s_<?= $seq ?>_cre_name">&nbsp;</div>
622  </td>
623  <td style="text-align: center;">
624  <input id="v_<?= $seq ?>_cre_amount" size="10" style="text-align: right;" type="text" value="<?= $camnt ?>" onchange="return my.chgAmount('<?= $seq ?>', 'cre')" ondblclick="my.chkTax('v_<?= $seq ?>_cre_amount')">
625  </td>
626  <td style="text-align: center;">
627  <input id="v_<?= $seq ?>_valid" type="hidden" value="0">
628  <button type="button" class="my_magenta" onclick="return my.drop(<?= $seq ?>);">削除</button>
629  </td>
630  </tr>
631 <?php
632 }
633 ?>
634  <tr>
635  <th>
636  <button type="button" class="my_th" onclick="return my.plus();">+</button>
637  </th>
638  <td style="text-align: center;">
639  <input id="v_deb_sum" size="10" style="text-align: right;" type="text" value="<?= $sdamnt ?>">
640  </td>
641  <th colspan="3" style="text-align: center;">合計</th>
642  <td style="text-align: center;">
643  <input id="v_cre_sum" size="10" style="text-align: right;" type="text" value="<?= $scamnt ?>">
644  </td>
645  <td>&nbsp;</td>
646  </tr>
647  </tbody>
648  </table>
649  </td>
650  <tr>
651  </table>
652 
653  </td>
654  </tr>
655 </table>
656 
657 <!-- モーダルダイアログ Tax -->
658 <div class="modal" id="modalTax" tabindex="-1" role="dialog" aria-labelledby="staticModalLabel" aria-hidden="true" data-show="true" data-keyboard="false" data-backdrop="static">
659  <div class="modal-dialog">
660  <div class="modal-content">
661  <div class="modal-header">
662  <button type="button" class="close" data-dismiss="modal">
663  <span aria-hidden="true">&#215;</span>
664  </button>
665  <h4 class="modal-tax-title">消費税</h4>
666  </div>
667  <div class="modal-body">
668  <div id="modalTaxBody"></div>
669  </div>
670  <div class="modal-footer">
671  <button type="button" class="my_magenta" data-dismiss="modal">閉じる</button>
672  </div>
673  </div>
674  </div>
675 </div>