index.html.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. /**
  3. * The index view file of weekly module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2025 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  5. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  6. * @author Yidong Wang <wangyidong@chandao.com>
  7. * @package weekly
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. $exportBtn = null;
  12. if(hasPriv('weekly', 'exportreport'))
  13. {
  14. $exportBtn = div
  15. (
  16. btn
  17. (
  18. setID('exportWeeklyBtn'),
  19. setClass('pull-right mb-2 secondary'),
  20. setData('toggle', 'modal'),
  21. setData('selectedweekbegin', $date),
  22. set::url($this->createLink('weekly', 'exportweeklyreport', "module=weekly&projectID={$project->id}")),
  23. $lang->export
  24. )
  25. );
  26. }
  27. detailHeader
  28. (
  29. set::backBtn(),
  30. set::suffix($exportBtn)
  31. );
  32. /* Build overview. */
  33. h::table
  34. (
  35. setClass('table bordered bg-white'),
  36. h::tr
  37. (
  38. h::th(setClass('w-1/4'), $lang->weekly->term),
  39. h::td(setClass('w-1/4'), $monday . ' ~ ' . $lastDay),
  40. h::th(setClass('w-1/4'), $lang->weekly->master),
  41. h::td(setClass('w-1/4'), zget($users, $project->PM, ''))
  42. ),
  43. h::tr
  44. (
  45. h::th($lang->weekly->project),
  46. h::td(setClass('projectName'), set::title($project->name), $project->name),
  47. h::th($lang->weekly->staff),
  48. h::td($staff)
  49. )
  50. );
  51. /* Build summary. */
  52. $projectCost = zget($this->config->custom, 'cost', 1);
  53. div(setClass('page-title'), h::h4(setClass('m-2.5 text-center'), $lang->weekly->summary));
  54. h::table(setClass('table bordered bg-white text-center'), h::tr
  55. (
  56. h::td
  57. (
  58. $lang->weekly->progress,
  59. span(setClass('pl-1'), setData(array('toggle' => 'dropdown', 'trigger' => 'hover')), icon('help')),
  60. h::menu(setClass("dropdown-menu custom p-1 h-44 overflow-auto text-left"), setID('helpDropdown'), setStyle(array('font-weight' => 'normal', 'font-size' => '12px', 'line-height' => '1.5')), html($lang->weekly->reportHelpNotice))
  61. ),
  62. h::td(),
  63. h::td($lang->weekly->analysisResult),
  64. h::td()
  65. ), h::tr
  66. (
  67. h::td($lang->weekly->pv),
  68. h::td($pv),
  69. h::td(set::rowspan(4), $lang->weekly->progress),
  70. h::td(set::rowspan(4), html($this->weekly->getTips('progress', $sv) . '<br/>' . $this->weekly->getTips('cost', $cv)))
  71. ), h::tr(h::td($lang->weekly->ev), h::td($ev)), h::tr(h::td($lang->weekly->ac), h::td($ac)), h::tr(h::td($lang->weekly->sv), h::td($sv ? $sv . '%' : '')), h::tr
  72. (
  73. h::td($lang->weekly->cv),
  74. h::td($cv ? $cv . '%' : ''),
  75. h::td($lang->weekly->cost),
  76. h::td(setClass('projectCost'), empty($projectCost) ? 0 : $ac * $projectCost)
  77. ));
  78. /* Build table. */
  79. $buildTable = function($title, $cols, $data, $total = array(), $tableClass = '')
  80. {
  81. $thead = h::thead
  82. (
  83. h::tr(array_map(function($col) { return h::th(setClass(zget($col, 'class', '')), $col['name']); }, $cols))
  84. );
  85. $trList = array();
  86. foreach($data as $row)
  87. {
  88. $trList[] = '<tr>' . implode(array_map(function($col) { return '<td class="' . zget($col, 'class', '') . '">' . $col['value'] . '</td>'; }, $row)) . '</tr>';
  89. }
  90. if($total) $trList[] = '<tr><td colspan="' . count($cols) . '" class="' . zget($total, 'class', '') . '">' . $total['content'] . '</td></tr>';
  91. $tbody = h::tbody(html(implode($trList)));
  92. return div
  93. (
  94. div(setClass('page-title'), h::h4(setClass('m-2.5 text-center'), $title)),
  95. h::table(setClass("table bg-white {$tableClass}"), $thead, $tbody)
  96. );
  97. };
  98. /* Build finished table. */
  99. $cols = array();
  100. $cols[] = array('name' => $lang->idAB, 'class' => 'w-24');
  101. $cols[] = array('name' => $lang->task->name, 'class' => 'text-left');
  102. $cols[] = array('name' => $lang->task->estStarted, 'class' => 'text-left w-32');
  103. $cols[] = array('name' => $lang->task->deadline, 'class' => 'text-left w-32');
  104. $cols[] = array('name' => $lang->task->realStarted, 'class' => 'text-left w-32');
  105. $cols[] = array('name' => $lang->task->finishedBy, 'class' => 'text-left w-32');
  106. $data = array();
  107. foreach($finished as $task)
  108. {
  109. $data[] = array
  110. (
  111. array('class' => 'text-center', 'value' => sprintf('%03d', $task->id)),
  112. array('class' => 'text-left', 'value' => html::a($this->createLink('task', 'view', "id={$task->id}"), $task->name, '', "title='{$task->name}'")),
  113. array('class' => 'text-left', 'value' => $task->estStarted),
  114. array('class' => 'text-left', 'value' => $task->deadline),
  115. array('class' => 'text-left', 'value' => !helper::isZeroDate($task->realStarted) ? substr($task->realStarted, 0, 11) : ''),
  116. array('class' => 'text-left', 'value' => zget($users, $task->finishedBy, ''))
  117. );
  118. }
  119. $buildTable($lang->weekly->finished, $cols, $data, array('content' => sprintf($lang->weekly->totalCount, count($finished)), 'class' => 'text-right font-bold'));
  120. /* Build postponed table. */
  121. $cols = array();
  122. $cols[] = array('name' => $lang->idAB, 'class' => 'w-24');
  123. $cols[] = array('name' => $lang->task->name, 'class' => 'text-left');
  124. $cols[] = array('name' => $lang->task->assignedTo, 'class' => 'text-left w-24');
  125. $cols[] = array('name' => $lang->task->estStarted, 'class' => 'text-left w-32');
  126. $cols[] = array('name' => $lang->task->deadline, 'class' => 'text-left w-32');
  127. $cols[] = array('name' => $lang->task->realStarted, 'class' => 'text-left w-32');
  128. $cols[] = array('name' => $lang->task->progress, 'class' => 'text-left w-24');
  129. $data = array();
  130. foreach($postponed as $task)
  131. {
  132. $data[] = array
  133. (
  134. array('class' => 'text-center', 'value' => sprintf('%03d', $task->id)),
  135. array('class' => 'text-left', 'value' => html::a($this->createLink('task', 'view', "id={$task->id}"), $task->name, '', "title='{$task->name}'")),
  136. array('class' => 'text-left', 'value' => zget($users, $task->assignedTo)),
  137. array('class' => 'text-left', 'value' => $task->estStarted),
  138. array('class' => 'text-left', 'value' => $task->deadline),
  139. array('class' => 'text-left', 'value' => !helper::isZeroDate($task->realStarted) ? substr($task->realStarted, 0, 11) : ''),
  140. array('class' => 'text-left', 'value' => $task->progress . '%')
  141. );
  142. }
  143. $buildTable($lang->weekly->postponed, $cols, $data, array('content' => sprintf($lang->weekly->totalCount, count($postponed)), 'class' => 'text-right font-bold'));
  144. /* Build next week data table. */
  145. $cols = array();
  146. $cols[] = array('name' => $lang->idAB, 'class' => 'w-24');
  147. $cols[] = array('name' => $lang->task->name, 'class' => 'text-left');
  148. $cols[] = array('name' => $lang->task->assignedTo, 'class' => 'text-left w-24');
  149. $cols[] = array('name' => $lang->task->estStarted, 'class' => 'text-left w-32');
  150. $cols[] = array('name' => $lang->task->deadline, 'class' => 'text-left w-32');
  151. $data = array();
  152. foreach($nextWeek as $task)
  153. {
  154. $data[] = array
  155. (
  156. array('class' => 'text-center', 'value' => sprintf('%03d', $task->id)),
  157. array('class' => 'text-left', 'value' => html::a($this->createLink('task', 'view', "id={$task->id}"), $task->name, '', "title='{$task->name}'")),
  158. array('class' => 'text-left', 'value' => zget($users, $task->assignedTo)),
  159. array('class' => 'text-left', 'value' => $task->estStarted),
  160. array('class' => 'text-left', 'value' => $task->deadline)
  161. );
  162. }
  163. $buildTable($lang->weekly->nextWeek, $cols, $data, array('content' => sprintf($lang->weekly->totalCount, count($nextWeek)), 'class' => 'text-right font-bold'));
  164. /* Build workload by type table. */
  165. $cols = array();
  166. $cols[] = array('name' => $lang->task->type);
  167. foreach(array_filter($lang->task->typeList) as $type) $cols[] = array('name' => $type);
  168. $cols[] = array('name' => $lang->weekly->total);
  169. $data = array();
  170. $total = 0;
  171. $data[0][] = array('value' => $lang->weekly->workload);
  172. foreach(array_keys(array_filter($lang->task->typeList)) as $type)
  173. {
  174. $worktimes = zget($workload, $type, 0);
  175. $total += $worktimes;
  176. $data[0][] = array('value' => $worktimes);
  177. }
  178. $data[0][] = array('value' => $total);
  179. $buildTable($lang->weekly->workloadByType, $cols, $data, array(), 'mb-5 text-center');