export user-list reports in excel (#3154)
This commit is contained in:
@@ -15,67 +15,15 @@
|
||||
{% block box_title %}
|
||||
{{ form_widget(form.date) }}
|
||||
{% endblock %}
|
||||
{% block box_tools %}
|
||||
<button class="btn btn-default btn-sm" formaction="{{ path(export_route) }}" type="submit"><i class="{{ 'download'|icon }}"></i></button>
|
||||
{% endblock %}
|
||||
{% block box_body_class %}{{ box_id }} table-responsive {% if hasData %}no-padding{% endif %}{% endblock %}
|
||||
{% block box_body %}
|
||||
{% if not hasData %}
|
||||
{{ widgets.nothing_found() }}
|
||||
{% else %}
|
||||
{% set absoluteTotals = 0 %}
|
||||
{% set totals = {} %}
|
||||
<table class="table table-bordered table-hover dataTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
{% for day in stats.0.getDateTimes() %}
|
||||
<th class="text-center text-nowrap{% if day is weekend %} weekend{% endif %}{% if day is today %} today{% endif %}">
|
||||
{{ day|date_weekday }}
|
||||
</th>
|
||||
{% set totals = totals|merge({(day|report_date): 0}) %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for userDay in stats %}
|
||||
{% set usersTotalDuration = 0 %}
|
||||
<tr class="user">
|
||||
<td class="text-nowrap">
|
||||
{{ widgets.label_dot(userDay.user.displayName, userDay.user.color) }}
|
||||
</td>
|
||||
{% for day in userDay.days %}
|
||||
{% if day.totalDuration > 0 %}
|
||||
{% set usersTotalDuration = usersTotalDuration + day.totalDuration %}
|
||||
{% set absoluteTotals = absoluteTotals + day.totalDuration %}
|
||||
{% endif %}
|
||||
{% set totals = totals|merge({(day.date|report_date): (totals[day.date|report_date] + day.totalDuration)}) %}
|
||||
{% endfor %}
|
||||
<th class="text-nowrap text-center total">
|
||||
<a href="{{ path(subReportRoute, {'date': subReportDate|report_date, 'user': userDay.user.id}) }}">{{ usersTotalDuration|duration }}</a>
|
||||
</th>
|
||||
{% for day in userDay.days %}
|
||||
<td class="text-nowrap text-center day-total{% if day.date is weekend %} weekend{% endif %}{% if day.date is today %} today{% endif %}">
|
||||
{% if day.totalDuration > 0 %}
|
||||
{{ day.totalDuration|duration }}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr class="summary">
|
||||
<td>{{ 'stats.durationTotal'|trans }}</td>
|
||||
<td class="text-center text-nowrap">
|
||||
{{ absoluteTotals|duration }}
|
||||
</td>
|
||||
{% for id, duration in totals %}
|
||||
<td class="text-center text-nowrap">
|
||||
{{ duration|duration }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
{% embed 'reporting/report_user_list_data.html.twig' %}{% endembed %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% endembed %}
|
||||
|
||||
69
templates/reporting/report_user_list_data.html.twig
Normal file
69
templates/reporting/report_user_list_data.html.twig
Normal file
@@ -0,0 +1,69 @@
|
||||
{% set absoluteTotals = 0 %}
|
||||
{% set totals = {} %}
|
||||
<table class="table table-bordered table-hover dataTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th class="text-center">{{ 'stats.durationTotal'|trans }}</th>
|
||||
{% for day in stats.0.getDateTimes() %}
|
||||
<th class="text-center text-nowrap{% if day is weekend %} weekend{% endif %}{% if day is today %} today{% endif %}">
|
||||
{% block period_name %}
|
||||
{{ day|date_weekday }}
|
||||
{% endblock %}
|
||||
</th>
|
||||
{% set totals = totals|merge({(day|report_date): 0}) %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for userPeriod in stats %}
|
||||
{% set usersTotalDuration = 0 %}
|
||||
<tr class="user">
|
||||
<td class="text-nowrap">
|
||||
{% block user_column %}
|
||||
{% from "macros/widgets.html.twig" import label_dot %}
|
||||
{{ label_dot(userPeriod.user.displayName, userPeriod.user.color) }}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% for period in userPeriod.days %}
|
||||
{% if period.totalDuration > 0 %}
|
||||
{% set usersTotalDuration = usersTotalDuration + period.totalDuration %}
|
||||
{% set absoluteTotals = absoluteTotals + period.totalDuration %}
|
||||
{% endif %}
|
||||
{% set totals = totals|merge({(period.date|report_date): (totals[period.date|report_date] + period.totalDuration)}) %}
|
||||
{% endfor %}
|
||||
<th class="text-nowrap text-center total">
|
||||
{% block total_duration_user %}
|
||||
<a href="{{ path(subReportRoute, {'date': subReportDate|report_date, 'user': userPeriod.user.id}) }}">{{ usersTotalDuration|duration(decimal) }}</a>
|
||||
{% endblock %}
|
||||
</th>
|
||||
{% for period in userPeriod.days %}
|
||||
<td class="text-nowrap text-center day-total{% if period.date is weekend %} weekend{% endif %}{% if period.date is today %} today{% endif %}">
|
||||
{% if period.totalDuration > 0 %}
|
||||
{% block duration %}
|
||||
{{ period.totalDuration|duration(decimal) }}
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr class="summary">
|
||||
<td>{{ 'stats.durationTotal'|trans }}</td>
|
||||
<td class="text-center text-nowrap">
|
||||
{% block total_duration %}
|
||||
{{ absoluteTotals|duration(decimal) }}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% for id, total in totals %}
|
||||
<td class="text-center text-nowrap">
|
||||
{% block total_duration_period %}
|
||||
{{ total|duration(decimal) }}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
20
templates/reporting/report_user_list_export.html.twig
Normal file
20
templates/reporting/report_user_list_export.html.twig
Normal file
@@ -0,0 +1,20 @@
|
||||
{% embed 'reporting/report_user_list_data.html.twig' %}
|
||||
{% block user_column %}
|
||||
{{ userPeriod.user.displayName }}
|
||||
{% endblock %}
|
||||
{% block duration -%}
|
||||
=VALUE("{{ period.totalDuration|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block total_duration_user -%}
|
||||
=VALUE("{{ usersTotalDuration|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block total_duration -%}
|
||||
=VALUE("{{ absoluteTotals|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block total_duration_period -%}
|
||||
=VALUE("{{ total|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block period_name %}
|
||||
{{ day|date_short }}
|
||||
{% endblock %}
|
||||
{% endembed %}
|
||||
@@ -5,78 +5,25 @@
|
||||
{% block report %}
|
||||
|
||||
{% embed '@AdminLTE/Widgets/box-widget.html.twig' %}
|
||||
{% import "macros/widgets.html.twig" as widgets %}
|
||||
{% from "macros/widgets.html.twig" import nothing_found, action_button %}
|
||||
{% block box_before %}
|
||||
{{ form_start(form, {'attr': {'class': 'form-inline form-reporting'}}) }}
|
||||
{% endblock %}
|
||||
{% block box_after %}
|
||||
{{ form_end(form) }}
|
||||
{% endblock %}
|
||||
{% block box_tools %}
|
||||
<button class="btn btn-default btn-sm" formaction="{{ path(export_route) }}" type="submit"><i class="{{ 'download'|icon }}"></i></button>
|
||||
{% endblock %}
|
||||
{% block box_title %}
|
||||
{{ form_widget(form.date) }}
|
||||
{% endblock %}
|
||||
{% block box_body_class %}{{ box_id }} table-responsive {% if hasData %}no-padding{% endif %}{% endblock %}
|
||||
{% block box_body %}
|
||||
{% if not hasData %}
|
||||
{{ widgets.nothing_found() }}
|
||||
{{ nothing_found() }}
|
||||
{% else %}
|
||||
{% set totals = {} %}
|
||||
<table class="table table-bordered table-hover dataTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
{% for month in stats.0.getDateTimes() %}
|
||||
<th class="text-center text-nowrap">
|
||||
<a href="{{ path('report_monthly_users', {'date': month|report_date}) }}">
|
||||
{{ month|month_name }}<br>
|
||||
{{ month|date_format('Y') }}
|
||||
</a>
|
||||
</th>
|
||||
{% set totals = totals|merge({(month|report_date): 0}) %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for userYear in stats|filter(row => row.user is not null) %}
|
||||
{% set usersTotalDuration = 0 %}
|
||||
<tr class="user">
|
||||
<td class="text-nowrap">
|
||||
{{ widgets.label_dot(userYear.user.displayName, userYear.user.color) }}
|
||||
</td>
|
||||
{% for mid, month in userYear.months %}
|
||||
{% if month.totalDuration > 0 %}
|
||||
{% set usersTotalDuration = usersTotalDuration + month.totalDuration %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<th class="text-nowrap text-center total">
|
||||
{{ usersTotalDuration|duration }}
|
||||
</th>
|
||||
{% for mid, month in userYear.getMonths() %}
|
||||
<td class="text-nowrap text-center day-total">
|
||||
{% if month.totalDuration > 0 %}
|
||||
<a href="{{ path('report_user_month', {'date': create_date(month.date.format('Y') ~'-'~month.date.format('m')~'-01')|report_date, 'user': userYear.user.id}) }}" data-toggle="tooltip" title="{{ 'label.billable'|trans }}: {{ month.billableDuration|duration }}">
|
||||
{{ month.totalDuration|duration }}
|
||||
</a>
|
||||
{% set totals = totals|merge({(month.date|report_date): (totals[month.date|report_date] + month.totalDuration)}) %}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr class="summary">
|
||||
<td>{{ 'stats.durationTotal'|trans }}</td>
|
||||
<td> </td>
|
||||
{% for id, total in totals %}
|
||||
<td class="text-center text-nowrap">
|
||||
{{ total|duration }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
{% embed 'reporting/report_user_list_monthly_data.html.twig' %}{% endembed %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% endembed %}
|
||||
|
||||
74
templates/reporting/report_user_list_monthly_data.html.twig
Normal file
74
templates/reporting/report_user_list_monthly_data.html.twig
Normal file
@@ -0,0 +1,74 @@
|
||||
{% set absoluteTotals = 0 %}
|
||||
{% set totals = {} %}
|
||||
<table class="table table-bordered table-hover dataTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th class="text-center">{{ 'stats.durationTotal'|trans }}</th>
|
||||
{% for month in stats.0.getDateTimes() %}
|
||||
<th class="text-center text-nowrap">
|
||||
{% block period_name %}
|
||||
<a href="{{ path('report_monthly_users', {'date': month|report_date}) }}">
|
||||
{{ month|month_name }}<br>
|
||||
{{ month|date_format('Y') }}
|
||||
</a>
|
||||
{% endblock %}
|
||||
</th>
|
||||
{% set totals = totals|merge({(month|report_date): 0}) %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for userPeriod in stats|filter(row => row.user is not null) %}
|
||||
{% set usersTotalDuration = 0 %}
|
||||
<tr class="user">
|
||||
<td class="text-nowrap">
|
||||
{% block user_column %}
|
||||
{% from "macros/widgets.html.twig" import label_dot %}
|
||||
{{ label_dot(userPeriod.user.displayName, userPeriod.user.color) }}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% for mid, period in userPeriod.months %}
|
||||
{% if period.totalDuration > 0 %}
|
||||
{% set usersTotalDuration = usersTotalDuration + period.totalDuration %}
|
||||
{% set absoluteTotals = absoluteTotals + period.totalDuration %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<th class="text-nowrap text-center total">
|
||||
{% block total_duration_user %}
|
||||
{{ usersTotalDuration|duration(decimal) }}
|
||||
{% endblock %}
|
||||
</th>
|
||||
{% for mid, period in userPeriod.months %}
|
||||
<td class="text-nowrap text-center day-total">
|
||||
{% if period.totalDuration > 0 %}
|
||||
{% block duration %}
|
||||
<a href="{{ path('report_user_month', {'date': create_date(period.date.format('Y') ~'-'~period.date.format('m')~'-01')|report_date, 'user': userPeriod.user.id}) }}" data-toggle="tooltip" title="{{ 'label.billable'|trans }}: {{ period.billableDuration|duration(decimal) }}">
|
||||
{{ period.totalDuration|duration(decimal) }}
|
||||
</a>
|
||||
{% endblock %}
|
||||
{% set totals = totals|merge({(period.date|report_date): (totals[period.date|report_date] + period.totalDuration)}) %}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr class="summary">
|
||||
<td>{{ 'stats.durationTotal'|trans }}</td>
|
||||
<td class="text-center text-nowrap">
|
||||
{% block total_duration %}
|
||||
{{ absoluteTotals|duration(decimal) }}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% for id, total in totals %}
|
||||
<td class="text-center text-nowrap">
|
||||
{% block total_duration_period %}
|
||||
{{ total|duration(decimal) }}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -0,0 +1,20 @@
|
||||
{% embed 'reporting/report_user_list_monthly_data.html.twig' %}
|
||||
{% block user_column %}
|
||||
{{ userPeriod.user.displayName }}
|
||||
{% endblock %}
|
||||
{% block duration -%}
|
||||
=VALUE("{{ period.totalDuration|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block total_duration_user -%}
|
||||
=VALUE("{{ usersTotalDuration|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block total_duration -%}
|
||||
=VALUE("{{ absoluteTotals|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block total_duration_period -%}
|
||||
=VALUE("{{ total|duration(true) }}")
|
||||
{%- endblock %}
|
||||
{% block period_name %}
|
||||
{{ month|month_name }} {{ month|date_format('Y') }}
|
||||
{% endblock %}
|
||||
{% endembed %}
|
||||
Reference in New Issue
Block a user