Release 1.19.4 (#3255)

* login redirects to homepage if already being logged-in
* fix budget check for entries that were moved to another moth
* invoice: fix amount should be decimal if decimal template is used
* added new month grouped by project/activity/user report
This commit is contained in:
Kevin Papst
2022-04-18 12:41:45 +02:00
committed by GitHub
parent a179719c3e
commit bc908b4534
20 changed files with 729 additions and 56 deletions

View File

@@ -0,0 +1,52 @@
{% extends 'reporting/layout.html.twig' %}
{% block report_title %}{{ report_title|trans({}, 'reporting') }}{% endblock %}
{% block report %}
{% embed '@AdminLTE/Widgets/box-widget.html.twig' %}
{% from "macros/widgets.html.twig" import nothing_found %}
{% block box_before %}
{{ form_start(form, {'attr': {'class': 'form-inline form-reporting', 'id': 'report-toolbar-form'}}) }}
{% endblock %}
{% block box_after %}
{{ form_end(form) }}
{% endblock %}
{% block box_title %}
{{ form_widget(form.date) }}
{% if form.sumType.vars.choices|length > 1 %}
<div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="{{ 'display'|icon }}"></i> <span class="caret"></span>
</button>
<ul class="dropdown-menu checkbox-menu">
<li>
{{ form_widget(form.sumType) }}
</li>
</ul>
</div>
{% endif %}
<button class="btn btn-primary" formaction="{{ path(export_route) }}" type="submit"><i class="{{ 'download'|icon }}"></i></button>
{% endblock %}
{% block box_body_class %} table-responsive {% if stats is not empty %}no-padding{% endif %}{% endblock %}
{% block box_body %}
{% if stats is empty %}
{{ nothing_found() }}
{% else %}
{% embed 'reporting/customer/monthly_projects_data.html.twig' with {'dataTypeFormat': null, 'stats': stats, 'dataType': dataType, 'decimal': decimal} only %}
{% set rowspanStyle = 'vertical-align: middle' %}
{% endembed %}
{% endif %}
{% endblock %}
{% endembed %}
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script type="text/javascript">
jQuery('#report-toolbar-form').on('change', function(ev) {
jQuery(this).submit();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,100 @@
{%- set absoluteDuration = 0 -%}
{%- set absoluteInternalRate = 0 -%}
{%- set absoluteRate = 0 -%}
{%- set totalsDuration = {} -%}
{%- set totalsInternalRate = {} -%}
{%- set totalsRate = {} -%}
{% if dataType == 'rate' %}
{% set dataTypeTitle = 'stats.amountTotal' %}
{% elseif dataType == 'internalRate' %}
{% set dataTypeTitle = 'label.rate_internal' %}
{% else %}
{% set dataTypeTitle = 'stats.durationTotal' %}
{% endif %}
<table class="table table-bordered dataTable">
<thead>
<tr>
<th rowspan="2" style="{{ rowspanStyle }}">{{ 'label.project'|trans }}</th>
{% for activity in stats.activities %}
<th colspan="3" class="text-center">{{ activity.name }}</th>
{% endfor %}
<th rowspan="2" style="{{ rowspanStyle }}">{{ dataTypeTitle|trans }}</th>
</tr>
<tr>
{% for activity in stats.activities %}
<th class="text-center">{{ 'label.user'|trans }}</th>
<th class="text-center">{{ dataTypeTitle|trans }}</th>
<th class="text-center">{{ 'sum.total'|trans }}</th>
{% endfor %}
</tr>
</thead>
{% set customer = null %}
{% set maxLength = (stats.activities|length) * 3 + 2 %}
<tbody>
{% for project in stats.stats %}
{% set activityId = null %}
{% set rowspan = project['max_users'] %}
{% set currency = stats.projects[project.id]['currency'] %}
{% if customer != stats.projects[project.id]['customer_id'] %}
<tr class="summary">
<td colspan="{{ maxLength }}">{{ stats.projects[project.id]['customer'] }}</td>
</tr>
{% set customer = stats.projects[project.id]['customer_id'] %}
{% endif %}
{% for i in 1..rowspan %}
<tr>
{% if loop.first %}
<th{% if rowspan > 1 %} rowspan="{{ rowspan }}" style="{{ rowspanStyle }}"{% endif %}>{{ project.name }}</th>
{% endif %}
{% for activity in stats.activities %}
{% if project.activities[activity.id] is defined and i <= project.activities[activity.id]['users']|length %}
{% set user = project.activities[activity.id]['users']|slice(-i) %}
<td>{{ user.0.name }}</td>
<td class="text-center"{% if dataTypeFormat is not null %} data-format="{{ dataTypeFormat }}"{% endif %}>
{% set value = user.0[dataType] %}
{% block user_activity %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{{ value|money(currency) }}
{% else %}
{{ value|duration(decimal) }}
{% endif %}
{% endblock %}
</td>
{% if loop.parent.loop.first %}
<td{% if rowspan > 1 %} rowspan="{{ rowspan }}"{% endif %} class="text-center text-nowrap"{% if dataTypeFormat is not null %} data-format="{{ dataTypeFormat }}"{% endif %}>
{% set value = project.activities[activity.id][dataType] %}
{% block project_activity %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{{ value|money(currency) }}
{% else %}
{{ value|duration(decimal) }}
{% endif %}
{% endblock %}
</td>
{% endif %}
{% else %}
<td class="text-center"></td>
<td class="text-center"></td>
{% if loop.parent.loop.first %}
<td{% if rowspan > 1 %} rowspan="{{ rowspan }}"{% endif %}></td>
{% endif %}
{% endif %}
{% endfor %}
{% if loop.first %}
<th{% if rowspan > 1 %} rowspan="{{ rowspan }}" style="{{ rowspanStyle }}"{% endif %} class="text-center text-nowrap"{% if dataTypeFormat is not null %} data-format="{{ dataTypeFormat }}"{% endif %}>
{% set value = project[dataType] %}
{% block project_total %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{{ value|money(currency) }}
{% else %}
{{ value|duration(decimal) }}
{% endif %}
{% endblock %}
</th>
{% endif %}
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>

View File

@@ -0,0 +1,30 @@
{% embed 'reporting/customer/monthly_projects_data.html.twig' with {'decimal': true, 'stats': stats, 'dataType': dataType} only %}
{% set dataTypeFormat = null %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{% set dataTypeFormat = constant('App\\Export\\Base\\AbstractSpreadsheetRenderer::RATE_FORMAT_NO_CURRENCY') %}
{% elseif dataType == 'duration' %}
{% set dataTypeFormat = constant('App\\Export\\Base\\AbstractSpreadsheetRenderer::DURATION_DECIMAL') %}
{% endif %}
{% set rowspanStyle = 'vertical-align:center' %}
{% block user_activity %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{{ value|money(currency) }}
{% else %}
{{ value / 3600 }}
{% endif %}
{% endblock %}
{% block project_activity %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{{ value|money(currency) }}
{% else %}
{{ value / 3600 }}
{% endif %}
{% endblock %}
{% block project_total %}
{% if dataType == 'rate' or dataType == 'internalRate' %}
{{ value|money(currency) }}
{% else %}
{{ value / 3600 }}
{% endif %}
{% endblock %}
{% endembed %}