Compare commits

..

No commits in common. "main" and "return_date" have entirely different histories.

45 changed files with 836 additions and 1999 deletions

View file

@ -12,14 +12,11 @@ compta ou un fichier.
Un matériel appartenant à l'association peut sortir :
- temporairement (prêt, ...) : il est possible de lui associer un lieu
de stockage ainsi qu'un membre dépositaire du matériel et une date
de retour ; il peut ensuite revenir dans l'association.
de stockage ainsi qu'un membre dépositaire du matériel ; il peut
ensuite revenir dans l'association.
- définitivement (vente, ...) : il est possible de lui associer un
membre bénéficiaire du matériel.
Il est possible de suivre les matériels prêtés ou loués et de savoir
si la date de retour est proche ou dépassée.
Un matériel présent temporairement dans l'association peut être
retourné à son propriétaire.

View file

@ -16,13 +16,21 @@
{{:assign var="nature" from="module.config.%s_nature"|args:$direction}}
{{if $nature != null}}
{{#foreach from=$nature item="elem"}}
{{:assign var="config.%s_nature.%s"|args:$direction:$key value=$elem}}
{{:assign var="item" label=$label type=$type}}
{{:assign var="config.%s_nature.%s"|args:$direction:$key value=$item}}
{{/foreach}}
{{else}}
{{* pas de config enregistrée : utiliser la config par défaut *}}
{{:assign var="nature" from="config_defaut.%ss"|args:$direction}}
{{#foreach from=$nature item="elem"}}
{{:assign var="config.%s_nature.%s"|args:$direction:$key value=$elem}}
{{:assign var="item" label=$label type=$type}}
{{:assign var="config.%s_nature.%s"|args:$direction:$key value=$item}}
{{/foreach}}
{{/if}}
{{/foreach}}
{{if $module.config.loan_duration != null}}
{{:assign loan_duration=$module.config.loan_duration}}
{{else}}
{{:assign loan_duration=$config_defaut.loan_duration}}
{{/if}}

View file

@ -1,65 +1,18 @@
{{* -*- brindille -*- *}}
{{*
Inventaire des matériels en stock dans l'association
inventaire des entrées/sorties des matériels permanents
*}}
{{* filtrer selon la catégorie *}}
{{:assign saved_filters=$module.config.filters}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}}
{{if $_GET.cat_key == null}}
{{:assign selected_category=$user_filters.stock_cat_key}}
{{else}}
{{if $_GET.cat_key == -1}}
{{:assign selected_category=null}}
{{else}}
{{:assign selected_category=$_GET.cat_key}}
{{/if}}
{{:assign var="user_filters.stock_cat_key" value=$selected_category}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{* condition de filtrage *}}
{{if $selected_category != null}}
{{:assign cat_key=$selected_category|quote_sql}}
{{:assign cat_condition="$$.category = %s"|args:$cat_key}}
{{else}}
{{:assign cat_condition="1"}}
{{/if}}
{{* filtrer selon appartenance *}}
{{if $_GET.prop == null}}
{{:assign selected_prop=$user_filters.stock_prop}}
{{else}}
{{if $_GET.prop == -1}}
{{:assign selected_prop=null}}
{{else}}
{{:assign selected_prop=$_GET.prop}}
{{/if}}
{{:assign var="user_filters.stock_prop" value=$selected_prop}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{if $selected_prop == null}}
{{:assign prop_condition="1"}}
{{elseif $selected_prop == 1}}
{{:assign prop_condition="$$.stock NOT NULL"}}
{{else}}
{{:assign prop_condition="$$.notowned != 0"}}
{{/if}}
{{* sélecteurs de catégorie et d'appartenance *}}
{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1"}}
{{* Sélecteur catégories *}}
{{:assign var="options." value="" label="Toutes les catégories" href="?prop=1"}}
{{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}}
{{:assign
var="cat_options."
var="options."
value=$key
label=$name
href="?cat_key=%s"|args:$key
href="?cat_key=%s&prop=1"|args:$key
}}
{{/load}}
@ -67,28 +20,23 @@
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$cat_options
value="%s"|args:$selected_category
}}
</fieldset>
{{:assign var="prop_options." value="" label="Tous les matériels" href="?prop=-1"}}
{{:assign var="prop_options." value="1" label="Matériels propriété de l'association" href="?prop=1"}}
{{:assign var="prop_options." value="0" label="Matériels NON propriété de l'association" href="?prop=0"}}
<fieldset class="shortFormRight">
<legend>Filtrer par appartenance</legend>
{{:dropdown
title="Filtrer par appartenance"
options=$prop_options
value="%s"|args:$selected_prop
options=$options
value="%s"|args:$_GET.cat_key
}}
</fieldset>
<div class="shortFormLeft">
<p class="help">Inventaire des matériels présents dans l'association</p>
<p class="help">Inventaire des matériels propriété de l'association</p>
</div>
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign condition="1"}}
{{else}}
{{:assign cat_key=$_GET.cat_key|quote_sql}}
{{:assign condition="$$.category = %s"|args:$cat_key}}
{{/if}}
{{#list
select="
$$.name AS 'Matériel' ;
@ -96,32 +44,35 @@
FROM @TABLE as cat
WHERE cat.key = @TABLE.$$.category) AS 'Catégorie' ;
$$.stock AS 'Stock' ;
(SELECT COALESCE($$.notowned, 0)) AS 'Temp' ;
(SELECT $$.stock + COALESCE($$.notowned, 0)) AS 'Total' ;
$$.out AS 'Sorti' ;
(SELECT $$.stock - $$.out) AS 'Disponible'
"
type="equipment"
where="$$.status <> 'archived' AND %s AND %s"|args:$cat_condition:$prop_condition
where="$$.status <> 'archived' AND $$.stock NOT NULL AND %s"|args:$condition
order=1
}}
{{:assign var=cat_name from=categories.%s|args:$category}}
<tr>
{{if $selected_prop == null}}
{{:assign prop=""}}
{{else}}
{{:assign prop="&prop=%s"|args:$selected_prop}}
{{/if}}
<td>{{:link href="equipment_history.html?key=%s&prop=%s"|args:$key:$selected_prop label=$name}}</td>
<td>{{:link href="equipment_history.html?key=%s&prop=1"|args:$key" label=$name}}</td>
<td>{{$cat_name}}</td>
<td class="num">{{$stock}}</td>
<td class="num">{{$col4}}</td>
<td class="num">{{$col5}}
<td class="num">{{$out}}</td>
<td class="num">{{$col7}}</td>
<td class="num">{{$col5}}</td>
<td class="actions">
{{if $col5 > 0}}
{{:linkbutton
label="Sortie"
shape="minus"
href="movements/output_equipment.html?key=%s"|args:$key
target="_dialog"}}
{{/if}}
{{:linkbutton
label="Entrée"
shape="plus"
href="movements/input_equipment.html?key=%s"|args:$key
target="_dialog"}}
{{:linkbutton
label="Mouvements"
label="Historique"
href="equipment_history.html?key=%s&prop=1"|args:$key
shape="table"}}
{{:linkbutton

View file

@ -3,72 +3,63 @@
<nav class="tabs">
{{if $current == 'inventaire'}}
<aside>
{{if $subcurrent == 'stock'}}
{{if $cat == 0}}
{{:linkbutton label="Ajouter une catégorie" shape="plus" href="categories/add_category.html" target="_dialog"}}
{{else}}
{{:exportmenu right=true}}
{{:linkbutton label="Ajouter un nouveau matériel" shape="plus" href="movements/add_new_equipment.html" target="_dialog"}}
{{/if}}
{{elseif $subcurrent == "mouvements"}}
{{if $sortie != null}}
{{:linkbutton label="Sortie" shape="minus" href="movements/output_equipment.html?key=%s"|args:$key target="_dialog"}}
{{/if}}
{{:linkbutton label="Entrée" shape="plus" href="movements/input_equipment.html?key=%s"|args:$key target="_dialog"}}
{{/if}}
</aside>
{{elseif $current == 'config'}}
<aside>
{{if $subcurrent == 'categories'}}
{{:linkbutton label="Ajouter une catégorie" shape="plus" href="add_category.html" target="_dialog"}}
{{elseif $subcurrent == 'storage'}}
{{:linkbutton label="Ajouter un lieu de stockage" shape="plus" href="add_storage.html" target="_dialog"}}
{{elseif $subcurrent == 'typesES'}}
{{:linkbutton label="Ajouter un type d'entrée" shape="plus" href="config/add_movement_type.html?dir=input" target="_dialog"}}
{{:linkbutton label="Ajouter un type de sortie" shape="plus" href="config/add_movement_type.html?dir=output" target="_dialog"}}
{{if $subsubcurrent == null && $cat == 0}}
{{:linkbutton label="Ajouter une catégorie" shape="plus" href="categories/add_category.html" target="_dialog"}}
{{else}}
{{:linkbutton label="Ajouter un nouveau matériel" shape="plus" href="movements/add_new_equipment.html" target="_dialog"}}
{{/if}}
</aside>
{{/if}}
<ul>
<li {{if $current == 'inventaire'}} class="current"{{/if}}><a href="{{$module.url}}index.html">Inventaire</a></li>
<li {{if $current == 'inventaire'}} class="current"{{/if}}><a href="{{$module.url}}index.html?prop=1">Inventaire</a></li>
<li {{if $current == 'historique'}} class="current"{{/if}}><a href="{{$module.url}}global_history.html">Historique</a></li>
<li {{if $current == 'prêt'}} class="current"{{/if}}><a href="{{$module.url}}loan_history.html?output_type=loan">Prêts</a></li>
<li {{if $current == 'location'}} class="current"{{/if}}><a href="{{$module.url}}loan_history.html?output_type=rent">Locations</a></li>
<li {{if $current == 'archives'}} class="current"{{/if}}><a href="{{$module.url}}archives.html">Archives</a></li>
<li {{if $current == 'config'}} class="current"{{/if}}><a href="{{$module.url}}categories/index.html">Configuration</a></li>
</ul>
{{if $current == 'inventaire'}}
{{if $subcurrent == 'mouvements'}}
<ul class="sub">
<li {{if $subcurrent == 'proprio'}} class="current"{{/if}}><a href="{{$module.url}}index.html?prop=1">Matériels permanents</a></li>
<li {{if $subcurrent == 'nonproprio'}} class="current"{{/if}}><a href="{{$module.url}}index.html?prop=0">Matériels temporaires</a></li>
</ul>
{{if $subsubcurrent == 'historique'}}
<ul class="sub">
<li class="title"><strong>Mouvements — {{$eqpmt}} ({{$category}})</strong></li>
<li class="title"><strong>Historique — {{$eqpmt}} ({{$category}})</strong></li>
</ul>
{{/if}}
{{elseif $current == 'prêt'}}
{{elseif $current == 'historique'}}
<ul class="sub">
<li {{if $subcurrent == 'encours'}} class="current"{{/if}}><a href="{{$module.url}}loan_history.html?output_type=loan">En cours</a></li>
<li {{if $subcurrent == 'historique'}} class="current"{{/if}}><a href="{{$module.url}}loan_movements.html?output_type=loan">Historique</a></li>
<li {{if $subcurrent == 'membres'}} class="current"{{/if}}><a href="{{$module.url}}member_loan.html?output_type=loan">Prêts en cours aux membres</a></li>
</ul>
{{elseif $current == 'location'}}
<ul class="sub">
<li {{if $subcurrent == 'encours'}} class="current"{{/if}}><a href="{{$module.url}}loan_history.html?output_type=rent">En cours</a></li>
<li {{if $subcurrent == 'historique'}} class="current"{{/if}}><a href="{{$module.url}}loan_movements.html?output_type=rent">Historique</a></li>
<li {{if $subcurrent == 'membres'}} class="current"{{/if}}><a href="{{$module.url}}member_loan.html?output_type=rent">Locations en cours aux membres</a></li>
<li {{if $subcurrent == 'tous'}} class="current"{{/if}}><a href="{{$module.url}}global_history.html">Tous</a></li>
<li {{if $subcurrent == 'prêts'}} class="current"{{/if}}><a href="{{$module.url}}loan_history.html">Prêts</a></li>
</ul>
{{elseif $current == 'archives'}}
{{if $subcurrent == 'mouvements'}}
{{if $subsubcurrent == 'historique'}}
<ul class="sub">
<li class="title"><strong>Historique — {{$eqpmt}} ({{$category}})</strong></li>
</ul>
{{/if}}
{{elseif $current == 'config'}}
{{if $subcurrent == 'categories'}}
<aside>
{{:linkbutton label="Ajouter une catégorie" shape="plus" href="add_category.html" target="_dialog"}}
</aside>
{{elseif $subcurrent == 'storage'}}
<aside>
{{:linkbutton label="Ajouter un lieu de stockage" shape="plus" href="add_storage.html" target="_dialog"}}
</aside>
{{elseif $subcurrent == 'typesES'}}
<aside>
{{:linkbutton label="Ajouter un type d'entrée" shape="plus" href="config/add_movement_type.html?dir=input" target="_dialog"}}
{{:linkbutton label="Ajouter un type de sortie" shape="plus" href="config/add_movement_type.html?dir=output" target="_dialog"}}
</aside>
{{/if}}
<ul class="sub">
<li {{if $subcurrent == 'categories'}} class="current"{{/if}}><a href="{{$module.url}}categories/index.html">Catégories</a></li>
<li {{if $subcurrent == 'storage'}} class="current"{{/if}}><a href="{{$module.url}}storage/index.html">Lieux de stockage</a></li>
<li {{if $subcurrent == 'typesES'}} class="current"{{/if}}><a href="{{$module.url}}config.html">Types d'entrées/sorties</a></li>
<li {{if $subcurrent == 'divers'}} class="current"{{/if}}><a href="{{$module.url}}config/misc.html">Divers</a></li>
<li {{if $subcurrent == 'storage'}} class="current"{{/if}}><a href="{{$module.url}}storage/index.html">Lieux de stockage</a></li>
<li {{if $subcurrent == 'typesES'}} class="current"{{/if}}><a href="{{$module.url}}config.html">Types d'entrées/sorties</a></li>
<li {{if $subcurrent == 'divers'}} class="current"{{/if}}><a href="{{$module.url}}config/misc.html">Divers</a></li>
</ul>
{{/if}}
</nav>

View file

@ -4,34 +4,12 @@
inventaire des entrées/sorties des matériels temporaires
*}}
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign selected_category=$module.config.temp_cat_key}}
{{if $module.config.temp_cat_key != null}}
{{:assign cat_key=$selected_category|quote_sql}}
{{/if}}
{{elseif $_GET.cat_key == -1}}
{{:assign selected_category=null}}
{{:save key="config" temp_cat_key=null}}
{{else}}
{{:assign selected_category=$_GET.cat_key}}
{{:assign cat_key=$selected_category|quote_sql}}
{{:save key="config" temp_cat_key=$selected_category}}
{{/if}}
{{* condition de filtrage *}}
{{if $selected_category != null}}
{{:assign cat_condition="$$.category = %s"|args:$cat_key}}
{{else}}
{{:assign cat_condition="1"}}
{{/if}}
{{* Sélecteur catégories *}}
{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1&prop=0"}}
{{:assign var="options." value="" label="Toutes les catégories" href="?prop=0"}}
{{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}}
{{:assign
var="cat_options."
var="options."
value=$key
label=$name
href="?cat_key=%s&prop=0"|args:$key
@ -42,8 +20,8 @@
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$cat_options
value="%s"|args:$selected_category
options=$options
value="%s"|args:$_GET.cat_key
}}
</fieldset>
@ -51,6 +29,14 @@
<p class="help">Inventaire des matériels empruntés ou loués</p>
</div>
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign condition="1"}}
{{else}}
{{:assign cat_key=$_GET.cat_key|quote_sql}}
{{:assign condition="$$.category = %s"|args:$cat_key}}
{{/if}}
{{#list
select="
$$.name AS 'Matériel' ;
@ -60,7 +46,7 @@
$$.notowned AS 'Quantité'
"
type="equipment"
where="$$.status <> 'archived' AND $$.notowned != 0 AND %s"|args:$cat_condition
where="$$.status <> 'archived' AND $$.notowned != 0 AND %s"|args:$condition
order=1
}}
{{:assign var=cat_name from=categories.%s|args:$category}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Matériels archivés" current="module_equipment"}}
{{:include file="_nav.html" current="archives"}}
@ -9,30 +7,11 @@
<p class="block confirm">Matériel remis en service</p>
{{/if}}
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign selected_category=$module.config.archive_cat_key}}
{{elseif $_GET.cat_key == -1}}
{{:assign selected_category=null}}
{{:save key="config" archive_cat_key=null}}
{{else}}
{{:assign selected_category=$_GET.cat_key}}
{{:save key="config" archive_cat_key=$selected_category}}
{{/if}}
{{* condition de filtrage *}}
{{if $selected_category == null}}
{{:assign cat_condition="1"}}
{{else}}
{{:assign cat_key=$selected_category|quote_sql}}
{{:assign cat_condition="$$.category == %s"|args:$cat_key}}
{{/if}}
{{* Sélecteur catégories *}}
{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1"}}
{{:assign var="options." value="" label="Toutes les catégories" href="?prop=1"}}
{{#load type="category" order="$$.name"}}
{{:assign
var="cat_options."
var="options."
value=$key
label=$name
href="?cat_key=%s"|args:$key
@ -43,14 +22,18 @@
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$cat_options
value="%s"|args:$selected_category
options=$options
value="%s"|args:$_GET.cat_key
}}
</fieldset>
<div class="shortFormLeft">
<p class="help">Matériels qui ne sont plus dans l'association</p>
</div>
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign condition="1"}}
{{else}}
{{:assign cat_key=$_GET.cat_key|quote_sql}}
{{:assign condition="$$.category == %s"|args:$cat_key}}
{{/if}}
{{* Liste des matériels archivés *}}
{{#list
@ -61,16 +44,16 @@
WHERE cat.key = @TABLE.$$.category) AS "Catégorie"
"
type="equipment"
where="$$.status='archived' AND %s"|args:$cat_condition
where="$$.status='archived' AND %s"|args:$condition
order=1
}}
<tr>
<td>{{:link href="equipment_history.html?key=%s&prop=1&current=archives"|args:$key label=$name}}</td>
<td>{{$name}}</td>
<td>{{$col2}}</td>
<td class="actions">
{{:linkbutton
label="Mouvements"
label="Historique"
href="equipment_history.html?key=%s&prop=1&current=archives"|args:$key
shape="table"}}
{{:linkbutton

View file

@ -1,6 +1,9 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="categories"}}
{{/if}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
@ -22,11 +25,6 @@
{{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="categories"}}
{{/if}}
{{:form_errors}}
{{* formulaire d'ajout de catégorie *}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{#load key=$_GET.key assign="category"}}
{{else}}
{{:error message="Catégorie introuvable"}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Configuration" current="module_equipment"}}
{{* barre de navigation *}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{#load key=$_GET.key assign="category"}}
{{else}}
{{:error message="Catégorie introuvable"}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Configuration" current="module_equipment"}}
{{* barre de navigation *}}
@ -11,22 +9,15 @@
<p class="block confirm">Configuration enregistrée.</p>
{{/if}}
{{* lecture config *}}
{{:include file="./_get_config.html" keep="config_defaut, config, directions"}}
{{* interdire la modification et la suppression des types de mouvement prédéfinis *}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config_defaut.%ss"|args:$direction}}
{{#foreach from=$nature item="elem"}}
{{:assign var="default_keys." value=$key}}
{{/foreach}}
{{/foreach}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="./_get_config.html" keep="config, directions"}}
{{#foreach from=$directions key="direction" item="item"}}
{{* types de mouvements qui ne peuvent être supprimés *}}
{{#load type="movement" where="$$.direction='%s'"|args:$direction group="$$.operation"}}
{{:assign var="locked." value=$operation}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{:assign var="locked_%ss."|args:$direction value=$op_label}}
{{/load}}
<h2 class="ruler">{{$item|ucfirst}}s</h2>
@ -41,23 +32,15 @@
<tbody>
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key=key}}
{{:assign sortie_temp=false}}
{{if $direction == 'output'}}
{{:assign var="type" from="nature.%s.type"|args:$key}}
{{if $type == 'temporaire'}}
{{:assign sortie_temp=true}}
{{/if}}
{{/if}}
<tr>
<td>{{$label}}</td>
<td>{{$type}}</td>
<td class="actions">
{{if ! $default_keys|has:$key && ! $locked|has:$key}}
{{:assign var="locked" from="locked_%ss"|args:$direction}}
{{if ! $locked|has:$label}}
{{:linkbutton label="Supprimer" shape="delete" href="config/delete_movement_type.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}}
{{/if}}
{{if ! $default_keys|has:$key || $sortie_temp}}
{{:linkbutton label="Modifier" shape="edit" href="config/modify_movement_type.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}}
{{/if}}
</td>
</tr>
{{/foreach}}

View file

@ -36,11 +36,6 @@
"type" : {
"type" : "string",
"enum" : ["définitif", "temporaire", "retour"]
},
"fee" : {
"description" : "tarif sortie temporaire",
"type" : ["string", "null"],
"enum" : ["gratuit", "payant"]
}
}
}

View file

@ -1,39 +1,32 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
paramètres :
- dir : input ou output
*}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{* Traiter l'envoi du formulaire *}}
{{* lecture config *}}
{{:include file="../_get_config.html" keep="config, directions, config_defaut"}}
{{if ! $directions|has_key:$_GET.dir}}
{{:error message="Direction « %s » inconnue !"|args:$_GET.dir}}
{{/if}}
{{#form on="save"}}
{{if $_POST.output_fields.type == "temporaire"}}
{{* vérifier si le tarif a été choisi *}}
{{if $_POST.tarif == null}}
{{:error message="Vous n'avez pas choisi le tarif"}}
{{/if}}
{{/if}}
{{* vérifier s'il existe un libellé de même nom dans la même direction *}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key" item="elem"}}
{{#foreach from=$nature key="key"}}
{{:assign var="fields" from="_POST.%s_fields"|args:$_GET.dir}}
{{if $_GET.dir == $direction && $fields.label|trim|tolower == $elem.label|trim|tolower}}
{{:error message="Le libellé « %s » est déjà présent"|args:$fields.label}}
{{if $_GET.dir == $direction && $label|trim|tolower == $fields.label|trim|tolower}}
{{:error message="Ce libellé est déjà présent"}}
{{/if}}
{{:assign var="%s_nature"|args:$direction value=$elem}}
{{:assign var="%s_nature.key"|args:$direction value=$key}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{:assign var="%s_nature.type"|args:$direction value=$type}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/foreach}}
@ -44,13 +37,6 @@
{{:assign var="%s_nature.key"|args:$direction value=""|uuid}}
{{:assign var="%s_nature.label"|args:$direction value=$newlabel}}
{{:assign var="%s_nature.type"|args:$direction from="_POST.%s_fields.type"|args:$direction}}
{{if $_POST.output_fields != null}}
{{if $_POST.output_fields.type == "temporaire"}}
{{:assign var="output_nature.fee" value=$_POST.tarif}}
{{else}}
{{:assign var="output_nature.fee" value=null}}
{{/if}}
{{/if}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/if}}
{{/foreach}}
@ -65,11 +51,6 @@
{{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{:form_errors}}
{{if $_GET.dir == 'input'}}
@ -121,63 +102,34 @@
<fieldset>
<legend>Type de sortie</legend>
<dl>
{{:input type="select"
label="Type de sortie"
name="output_fields[type]"
options=$output_types
default=$type
required=true
default_empty="— Choisir un type —"}}
{{:input
type="text"
label="Libellé de la sortie"
name="output_fields[label]"
<td>
{{:input type="select"
label="Type de sortie"
name="output_fields[type]"
options=$output_types
default=$type
required=true
default_empty="— Choisir un type —"}}
</td>
<td>
{{:input
type="text"
label="Libellé de la sortie"
name="output_fields[label]"
required=true}}
<div id="tarif">
{{:input type="radio-btn" name="tarif" value="gratuit" label="Gratuit" required=true prefix_title="Tarification"}}
{{:input type="radio-btn" name="tarif" value="payant" label="Payant" required=true}}
</div>
</td>
</dl>
<div class="help block">
<h3>Signification du type de sortie</h3>
<ul>
<li><b>définitif</b> : le matériel n'appartient plus à l'asso (ex : vente, casse, perte, vol, ...)</li>
<li><b>temporaire</b> : le matériel sort temporairement de l'asso qui en reste propriétaire (ex : location, prêt) ; dans ce cas, il faut indiquer si ce type de sortie est gratuit ou payant</li>
<li><b>temporaire</b> : le matériel sort temporairement de l'asso qui en reste propriétaire (ex : location, prêt)</li>
<li><b>retour</b> : le matériel <strong>non propriété de l'asso</strong> est rendu à son propriétaire (ex : retour de location ou d'emprunt)</li>
</ul>
</div>
<div class="help block tarif">
<h3>Tarification</h3>
<ul>
<li>Une sortie temporaire gratuite sera classée dans l'onglet Prêt</li>
<li>Une sortie temporaire payante sera classée dans l'onglet Locations</li>
</ul>
</div>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{/if}}
<script type="text/javascript">
// afficher/masquer le choix du tarif
function toggleTarif(event) {
const output_fieldstype = document.getElementById('f_output_fieldstype');
const value = output_fieldstype.value;
if (value == 'temporaire') {
g.toggle('#tarif', true);
g.toggle('div.tarif', true);
} else {
g.toggle('#tarif', false);
g.toggle('div.tarif', false);
}
}
toggleTarif();
(function () {
const output_fieldstype = document.getElementById('f_output_fieldstype');
output_fieldstype.addEventListener("change", toggleTarif);
})();
</script>

View file

@ -1,37 +1,27 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
paramètres :
- dir : input ou output
- op_key : clé du type de mouvement à supprimer
*}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config_defaut, config, directions"}}
{{if ! $directions|has_key:$_GET.dir}}
{{:error message="Direction « %s » inconnue !"|args:$_GET.dir}}
{{/if}}
{{* interdire la suppression des types de mouvement prédéfinis *}}
{{:assign var="nature" from="config_defaut.%ss"|args:$_GET.dir}}
{{#foreach from=$nature item="elem"}}
{{:assign var="default_keys." value=$key}}
{{/foreach}}
{{if $default_keys|has:$_GET.op_key}}
{{:error message="Ce type de mouvement ne peut être supprimé"}}
{{/if}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{#form on="delete"}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key" item="elem"}}
{{#foreach from=$nature key="key"}}
{{if $_GET.dir == $direction && $key != $_GET.op_key || $_GET.dir != $direction}}
{{:assign var="%s_nature"|args:$direction value=$elem}}
{{:assign var="%s_nature.key"|args:$direction value=$key}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{:assign var="%s_nature.type"|args:$direction value=$type}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/if}}
{{/foreach}}
@ -47,10 +37,6 @@
{{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{:form_errors}}
{{:assign var="mvt_label" from="config.%s_nature.%s.label"|args:$_GET.dir:$_GET.op_key}}

View file

@ -1,40 +0,0 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{#form on="save"}}
{{* vérifier la validité de la durée saisie *}}
{{if $_POST.loan_duration < 0}}
{{:error message="Durée (%s) erronée ; doit être >= 0"|args:$_POST.loan_duration}}
{{/if}}
{{:save
key="config"
loan_duration=$_POST.loan_duration
}}
{{/form}}
{{:admin_header title="Configuration" current="module_equipment"}}
{{:include file="../_nav.html" current="config" subcurrent="divers"}}
{{:form_errors}}
{{if $_GET.ok}}
<p class="block confirm">Configuration enregistrée.</p>
{{/if}}
{{* lecture config *}}
{{:include file="../_get_config.html" keep="loan_duration"}}
<form method="post" action="" data-focus="1">
<fieldset>
<legend>Autres paramètres</legend>
<dl>
{{:input type="number" name="loan_duration" label="Durée de prêt par défaut" min=0 default=$module.config.loan_duration help="Durée en nombre de jours ; mettre 0 pour supprimer la durée par défaut"}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}

View file

@ -1,42 +1,34 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
paramètres :
- dir : input ou output
- op_key : clé du type de mouvement dont on veut modifier le libellé ou le tarif
- op_key : clé du type de mouvement dont on veut modifier le libellé
*}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config_defaut, config, directions"}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{#form on="save"}}
{{if $_POST.tarif == null && $_POST.name == null}}
{{:redirect to="./config.html"}}
{{/if}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key" item="elem"}}
{{if $_POST.name == null}}
{{:assign label=$elem.label}}
{{else}}
{{if $_GET.dir == $direction && $key != $_GET.op_key &&
$_POST.name|trim|tolower == $elem.label|trim|tolower}}
{{:error message="Le libellé « %s » est déjà présent"|args:$_POST.name}}
{{/if}}
{{if $_GET.dir == $direction && $key == $_GET.op_key}}
{{:assign label=$_POST.name|trim}}
{{else}}
{{:assign label=$elem.label}}
{{/if}}
{{/if}}
{{:assign var="%s_nature"|args:$direction value=$elem}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{#foreach from=$nature key="key"}}
{{:assign var="%s_nature.key"|args:$direction value=$key}}
{{if $_POST.tarif != null && $key == $_GET.op_key}}
{{:assign var="%s_nature.fee"|args:$direction value=$_POST.tarif}}
{{if $_GET.dir == $direction}}
{{if $key == $_GET.op_key}}
{{:assign var="%s_nature.label"|args:$direction value=$_POST.name|trim}}
{{else}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{/if}}
{{else}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{/if}}
{{:assign var="%s_nature.type"|args:$direction value=$type}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/foreach}}
{{/foreach}}
@ -51,71 +43,14 @@
{{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{:form_errors}}
{{* vérifier que $_GET.dir est bien une direction connue *}}
{{if ! $directions|has_key:$_GET.dir}}
{{:error message="Direction « %s » inconnue !"|args:$_GET.dir}}
{{/if}}
{{* vérifier que $_GET.op_key est bien dans la liste des opérations *}}
{{:assign var="config_nature" from="config.%s_nature"|args:$_GET.dir}}
{{if ! $config_nature|keys|has:$_GET.op_key}}
{{:error message="Type de mouvement inconnu !"}}
{{/if}}
{{* sortie temporaire ? *}}
{{:assign sortie_temp=false}}
{{if $_GET.dir == 'output'}}
{{:assign var="elem" from="config_nature.%s"|args:$_GET.op_key}}
{{if $elem.type == 'temporaire'}}
{{:assign sortie_temp=true}}
{{:assign fee=$elem.fee}}
{{/if}}
{{/if}}
{{* mouvement prédéfini ? *}}
{{:assign var="default_nature" from="config_defaut.%ss"|args:$_GET.dir}}
{{#foreach from=$default_nature item="elem"}}
{{:assign var="default_keys." value=$key}}
{{/foreach}}
{{:assign label_mod=true}}
{{if $default_keys|has:$_GET.op_key}}
{{:assign label_mod=false}}
{{/if}}
{{if ! $label_mod && ! $sortie_temp}}
{{:error message="Ce type de mouvement ne peut être modifié"}}
{{/if}}
{{:assign var="default_label" from="config.%s_nature.%s.label"|args:$_GET.dir:$_GET.op_key}}
<form method="post" action="" data-focus="1">
<fieldset>
<legend>Paramètres</legend>
<legend>Modifier le libellé</legend>
<dl>
{{if $label_mod}}
{{:input type="text" name="name" label="Libellé" default=$default_label required=true maxlength="100"}}
{{/if}}
{{if $sortie_temp}}
<div>
{{:input type="radio-btn" name="tarif" value="gratuit" label="Gratuit" required=true default=$fee prefix_title=Tarif}}
{{:input type="radio-btn" name="tarif" value="payant" label="Payant" required=true default=$fee}}
</div>
{{/if}}
{{:input type="text" name="name" label="Libellé" default=$default_label required=true maxlength="100"}}
</dl>
{{if $sortie_temp}}
<div class="help block">
<h3>Tarification</h3>
<ul>
<li>Une sortie temporaire gratuite sera classée dans l'onglet Prêt</li>
<li>Une sortie temporaire payante sera classée dans l'onglet Locations</li>
</ul>
</div>
{{/if}}
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>

View file

@ -26,19 +26,13 @@
{
"key" : "c9ba00d9-26ee-448b-9f02-73e479ec2980",
"label" : "Prêt",
"type" : "temporaire",
"fee" : "gratuit"
},
{
"key" : "5c6c20bf-53e9-49dc-bcd6-e3cac23a6786",
"label" : "Location",
"type" : "temporaire",
"fee" : "payant"
"type" : "temporaire"
},
{
"key" : "fefefa51-1a85-46ca-ab78-b594b10390ff",
"label" : "Retour de Location/Emprunt",
"type" : "retour"
}
]
],
"loan_duration" : "30"
}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Afficher l'historique des mouvements d'un matériel
paramètres
@ -12,6 +10,14 @@
- msg : message de retour
*}}
{{* barre de navigation *}}
{{if $_GET.prop == 1}}
{{:assign proprio="proprio"}}
{{else}}
{{:assign proprio="nonproprio"}}
{{/if}}
{{:assign equipment_key=$_GET.key|trim}}
{{#load key=$equipment_key assign="equipment"}}
{{else}}
@ -25,85 +31,62 @@
{{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}}
{{* barre de navigation *}}
{{if $_GET.current != null}}
{{:assign current=$_GET.current}}
{{else}}
{{:assign current="inventaire"}}
{{/if}}
{{:include file="./_nav.html" current=$current subcurrent=$proprio subsubcurrent="historique" eqpmt=$equipment.name category=$category.name}}
{{if $_GET.ok}}
{{if $_GET.msg == "modification"}}
<p class="block confirm">Modification enregistrée</p>
{{elseif $_GET.msg == "copie"}}
<p class="block confirm">Mouvement copié</p>
{{elseif $_GET.msg == "retour"}}
<p class="block confirm">Retour enregistré</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block confirm">Mouvement supprimé</p>
{{else}}
<p class="block confirm">Mouvement enregistré</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
<p class="block error">Ce mouvement ne peut être supprimé</p>
{{/if}}
{{/if}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{* filtrer selon appartenance *}}
{{:assign saved_filters=$module.config.filters}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}}
{{if $_GET.prop == null}}
{{:assign selected_prop=$user_filters.eqpmt_hist_prop}}
{{else}}
{{if $_GET.prop == -1}}
{{:assign selected_prop=null}}
{{else}}
{{:assign selected_prop=$_GET.prop}}
{{/if}}
{{:assign var="user_filters.eqpmt_hist_prop value=$selected_prop}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{* déterminer les types de mouvements selon l'appartenance du matériel *}}
{{#foreach from=$config.input_nature key="key"}}
{{if $selected_prop == null}}
{{* les deux sortes de matériel *}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{if $type == 'temporaire'}}
{{:assign var="temp_inputs." value=$key|quote_sql}}
{{/if}}
{{elseif $selected_prop == 1}}
{{* déterminer les types de mouvements selon l'affection du matériel *}}
{{#foreach from=$config.input_nature}}
{{if $_GET.prop}}
{{* matériel propriété de l'asso *}}
{{if $type != 'temporaire'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{:assign var="input_types." value=$label}}
{{/if}}
{{else}}
{{* matériel non propriété de l'asso *}}
{{if $type == 'temporaire'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{:assign var="temp_inputs." value=$key|quote_sql}}
{{:assign var="input_types." value=$label}}
{{/if}}
{{/if}}
{{/foreach}}
{{#foreach from=$config.output_nature key="key"}}
{{if $selected_prop == null}}
{{* les deux sortes de matériel *}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{if $type == "temporaire"}}
{{:assign var="temp_outputs." value=$key|quote_sql}}
{{/if}}
{{elseif $selected_prop == 1}}
{{#foreach from=$config.output_nature}}
{{if $_GET.prop}}
{{* matériel propriété de l'asso *}}
{{if $type != 'retour'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{if $type == "temporaire"}}
{{:assign var="temp_outputs." value=$key|quote_sql}}
{{/if}}
{{:assign var="output_types." value=$label}}
{{/if}}
{{else}}
{{* matériel non propriété de l'asso *}}
{{if $type == 'retour'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{:assign var="output_types." value=$label}}
{{/if}}
{{/if}}
{{/foreach}}
{{:assign key_cond=$mvt_keys|implode:","}}
{{:assign key_cond="("|cat:$key_cond|cat:")"}}
{{if $selected_prop == null}}
{{:assign prop_condition="1"}}
{{else}}
{{:assign prop_condition="$$.operation in %s"|args:$key_cond}}
{{/if}}
{{* calculer et mémoriser les quantités pour que le tri de la liste affiche les valeurs correctes *}}
{{:assign stock=0}}
@ -137,221 +120,208 @@
{{:assign var="quantites.%s.nonproprio"|args:$id value=$nonproprio}}
{{/load}}
{{if $selected_prop == null || $selected_prop}}
{{* calculer la quantité sortie temporairement de chaque matériel *}}
{{:assign output_ops=$temp_outputs|implode:","}}
{{:assign output_ops="("|cat:$output_ops|cat:")"}}
{{if $current != "archives"}}
<nav class="tabs">
<aside>
{{if $_GET.prop && $dispo_final > 0}}
{{:linkbutton label="Sortie" shape="minus" href="movements/output_equipment.html?key=%s"|args:$_GET.key target="_dialog"}}
{{/if}}
{{:linkbutton label="Entrée" shape="plus" href="movements/input_equipment.html?key=%s"|args:$_GET.key target="_dialog"}}
</aside>
</nav>
{{/if}}
{{* lister tous les mouvements du matériel passé en paramètre *}}
{{if $_GET.prop}}
{{* calculer la quantité temporairement l'extérieur de chaque matériel *}}
{{#foreach from=$config.output_nature key=key}}
{{if $type == "temporaire"}}
{{:assign var="temp_outputs." value=$key|quote_sql}}
{{/if}}
{{/foreach}}
{{:assign operations=$temp_outputs|implode:","}}
{{:assign operations="("|cat:$operations|cat:")"}}
{{#select
mvt.key AS mvt_key,
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS reste
FROM !table AS mvt
LEFT JOIN !table AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN !table AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
FROM {!$module.table} AS mvt
LEFT JOIN {!$module.table} AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN {!$module.table} AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
WHERE
json_extract(mvt.document, '$.operation') IN !op
AND json_extract(mvt.document, '$.equipment') = :eqpmt_key
GROUP by mvt.key
;
!table=$module.table
!op = $output_ops
!op = $operations
:eqpmt_key = $_GET.key
}}
{{:assign var="reste.%s"|args:$mvt_key value=$reste}}
{{/select}}
{{/if}}
{{if $selected_prop == null || ! $selected_prop}}
{{#list
type="movement"
select="
($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement';
$$.operation AS 'Opération';
$$.amount AS 'Quantité';
'' AS 'Stock';
'' AS 'Sorti';
'' AS 'Disponible';
CASE WHEN $$.user NOT NULL
THEN (SELECT %s AS nom FROM users WHERE id = $$.user)
ELSE ''
END AS 'Dépositaire';
CASE WHEN $$.storage NOT NULL
THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage)
ELSE ''
END AS 'Stockage';
'' AS 'Documents';
$$.transactions AS 'Écritures'
"|args:$config.user_fields.name_sql
equipment=$equipment_key
order=1
}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$operation}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{if $direction === "input" && $op_label|in:$input_types ||
$direction === "output"&& $op_label|in:$output_types
}}
{{:assign var="stock" from="quantites.%s.stock"|args:$id}}
{{:assign var="exterieur" from="quantites.%s.exterieur"|args:$id}}
{{:assign var="dispo" from="quantites.%s.dispo"|args:$id}}
{{:assign file_path="%s/%s/"|args:$module.storage_root:$key}}
{{:assign file_path=$file_path|cat:"%"}}
{{#select count(*) AS nb FROM files WHERE path LIKE :file_path ; :file_path=$file_path}}
{{:assign nb_files=$nb}}
{{/select}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$col2}}</td>
<td class="nosort">{{$op_label}}</td>
<td class="num">{{$amount}}</td>
<td class="num nosort">{{$stock}}</td>
<td class="num nosort">{{$exterieur}}</td>
<td class="num nosort">{{$dispo}}</td>
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$col8}}</td>
<td>{{$col9}}</td>
<td class="num nosort">{{if $nb_files > 0}}{{:icon shape="attach"}}{{/if}}</td>
<td class="num">{{if $transactions|count > 0}}{{:icon shape="money"}}{{/if}}</td>
<td class="actions">
{{if $current != "archives"}}
{{if $direction == "output" && $type_mvt == "temporaire"}}
{{:assign var="temp_ext" from="reste.%s"|args:$key}}
{{if $temp_ext != null && $temp_ext > 0}}
{{:linkbutton
label="Retour"
href="movements/output_return.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="reset"
target="_dialog"}}
{{/if}}
{{/if}}
{{:linkbutton
label="Détails"
href="movements/movement_details.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="eye"
}}
{{/if}}
</td>
</tr>
{{/if}}
{{/list}}
{{if $dispo_final === 0}}
<span class="help">Il n'y a aucun matériel disponible, il n'est donc pas possible d'effectuer une sortie</span>
{{/if}}
{{else}}
{{* calculer la quantité présente temporairement de chaque matériel *}}
{{:assign input_ops=$temp_inputs|implode:","}}
{{:assign input_ops="("|cat:$input_ops|cat:")"}}
{{#foreach from=$config.input_nature key=key}}
{{if $type == "temporaire"}}
{{:assign var="temp_inputs." value=$key|quote_sql}}
{{/if}}
{{/foreach}}
{{:assign operations=$temp_inputs|implode:","}}
{{:assign operations="("|cat:$operations|cat:")"}}
{{#select
mvt.key AS mvt_key,
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS present
FROM !table AS mvt
LEFT JOIN !table AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN !table AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
FROM {!$module.table} AS mvt
LEFT JOIN {!$module.table} AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN {!$module.table} AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
WHERE
json_extract(mvt.document, '$.operation') IN !op
AND json_extract(mvt.document, '$.equipment') = :eqpmt_key
GROUP by mvt.key
;
!table=$module.table
!op = $input_ops
!op = $operations
:eqpmt_key = $_GET.key
}}
{{:assign var="present.%s"|args:$mvt_key value=$present}}
{{/select}}
{{/if}}
{{:assign
select_debut="
($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement';
$$.operation AS 'Opération';
$$.amount AS 'Quantité';"
}}
{{:assign
select_prop="'' AS 'Stock';
'' AS 'Sorti';
'' AS 'Disponible';"
}}
{{:assign
select_depositaire="CASE WHEN $$.user NOT NULL
THEN (SELECT %s AS nom FROM users WHERE id = $$.user)
ELSE ''
END AS 'Dépositaire';
"|args:$config.user_fields.name_sql
}}
{{:assign
select_non_prop="'' as 'Temporaire';"
}}
{{:assign select_final="
CASE WHEN $$.storage NOT NULL
THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage)
ELSE ''
END AS 'Stockage';
'' AS 'Documents';
$$.transactions AS 'Écritures'
"
}}
{{if $selected_prop == null}}
{{:assign select_clause=$select_debut|cat:$select_prop|cat:$select_non_prop|cat:$select_depositaire|cat:$select_final}}
{{elseif $selected_prop}}
{{:assign select_clause=$select_debut|cat:$select_prop|cat:$select_depositaire|cat:$select_final}}
{{else}}
{{:assign select_clause=$select_debut|cat:$select_non_prop|cat:$select_final}}
{{/if}}
{{:assign var="prop_options." value="" label="Tous les matériels" href="?key=%s&prop=-1"|args:$_GET.key}}
{{:assign var="prop_options." value="1" label="Matériels propriété de l'association" href="?key=%s&prop=1"|args:$_GET.key}}
{{:assign var="prop_options." value="0" label="Matériels NON propriété de l'association" href="?key=%s&prop=0"|args:$_GET.key}}
{{if $dispo_final > 0 && $selected_prop == null || $selected_prop}}
{{:assign sortie="sortie"}}
{{/if}}
{{:include file="./_nav.html" current=$current subcurrent="mouvements" eqpmt=$equipment.name category=$category.name sortie=$sortie key=$_GET.key}}
{{if $_GET.ok}}
{{if $_GET.msg == "modification"}}
<p class="block confirm">Modification enregistrée</p>
{{elseif $_GET.msg == "copie"}}
<p class="block confirm">Mouvement copié</p>
{{elseif $_GET.msg == "retour"}}
<p class="block confirm">Retour enregistré</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block confirm">Mouvement supprimé</p>
{{else}}
<p class="block confirm">Mouvement enregistré</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
<p class="block error">Ce mouvement ne peut être supprimé</p>
{{/if}}
{{/if}}
<fieldset class="shortFormRight">
<legend>Filtrer par appartenance</legend>
{{:dropdown
title="Filtrer par appartenance"
options=$prop_options
value="%s"|args:$selected_prop
{{#list
type="movement"
select="($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement';
$$.operation AS 'Opération';
$$.amount AS 'Quantité';
"" as 'Présent';
CASE WHEN $$.storage NOT NULL
THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage)
ELSE ''
END as 'Stockage';
'' AS 'Documents';
$$.transactions AS 'Écritures'
"
equipment=$equipment_key
order=1
}}
</fieldset>
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$col3}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{* lister les mouvements du matériel passé en paramètre *}}
{{#list
type="movement"
select="%s"|args:$select_clause
where="%s"|args:$prop_condition
equipment=$equipment_key
order=1
desc=true
}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$operation}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{if $direction === "input" && $op_label|in:$input_types ||
$direction === "output"&& $op_label|in:$output_types
}}
{{:assign var="stock" from="quantites.%s.nonproprio"|args:$id}}
{{:assign var="stock" from="quantites.%s.stock"|args:$id}}
{{:assign var="exterieur" from="quantites.%s.exterieur"|args:$id}}
{{:assign var="dispo" from="quantites.%s.dispo"|args:$id}}
{{:assign var="tempo" from="quantites.%s.nonproprio"|args:$id}}
{{:assign file_path="%s/%s/"|args:$module.storage_root:$key}}
{{:assign file_path=$file_path|cat:"%"}}
{{#select count(*) AS nb FROM files WHERE path LIKE :file_path ; :file_path=$file_path}}
{{:assign nb_files=$nb}}
{{/select}}
{{if $selected_prop == null}}
{{:assign user_details=$col9}}
{{:assign storage=$col10}}
{{elseif $selected_prop}}
{{:assign user_details=$col8}}
{{:assign storage=$col9}}
{{else}}
{{:assign user_details=$col6}}
{{:assign storage=$col6}}
{{/if}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$col2}}</td>
<td class="nosort">{{$op_label}}</td>
<td class="num">{{$amount}}</td>
{{if $selected_prop == null || $selected_prop}}
<td class="num nosort">{{$stock}}</td>
<td class="num nosort">{{$exterieur}}</td>
<td class="num nosort">{{$dispo}}</td>
{{/if}}
{{if $selected_prop == null || ! $selected_prop}}
<td class="num nosort">{{$tempo}}</td>
{{/if}}
{{if $selected_prop == null || $selected_prop}}
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$user_details}}</td>
{{/if}}
<td>{{$storage}}</td>
<td class="num nosort">{{if $nb_files > 0}}{{$nb_files}}{{/if}}</td>
<td class="num">{{if $transactions|count > 0}}{{"Oui"}}{{/if}}</td>
<td class="actions">
{{if $current != "archives"}}
{{if $direction == "output" && $type_mvt == "retour"}}
{{:assign prop = 0}}
{{elseif $direction == "input" && $type_mvt == "temporaire"}}
{{:assign prop = 0}}
{{else}}
{{:assign prop = 1}}
{{/if}}
{{if $direction == "output" && $type_mvt == "temporaire"}}
{{:assign var="temp_ext" from="reste.%s"|args:$key}}
{{if $temp_ext != null && $temp_ext > 0}}
{{:linkbutton
label="Retour"
href="movements/output_return.html?key=%s&prop=%s"|args:$key:$prop
shape="reset"
target="_dialog"}}
{{:assign file_path="%s/%s/"|args:$module.storage_root:$key}}
{{:assign file_path=$file_path|cat:"%"}}
{{#select count(*) AS nb FROM files WHERE path LIKE :file_path ; :file_path=$file_path}}
{{:assign nb_files=$nb}}
{{/select}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$col2}}</td>
<td class="nosort">{{$op_label}}</td>
<td class="num">{{$amount}}</td>
<td class="num nosort">{{$stock}}</td>
<td>{{$col6}}</td>
<td class="num nosort">{{if $nb_files > 0}}{{:icon shape="attach"}}{{/if}}</td>
<td class="num">{{if $transactions|count > 0}}{{:icon shape="money"}}{{/if}}</td>
<td class="actions">
{{if $direction == "input" && $type_mvt == "temporaire"}}
{{:assign var="temp_in" from="present.%s"|args:$key}}
{{if $temp_in != null && $temp_in > 0}}
{{:linkbutton
label="Retour"
href="movements/input_return.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="reset"
target="_dialog"}}
{{/if}}
{{/if}}
{{/if}}
{{if $direction == "input" && $type_mvt == "temporaire"}}
{{:assign var="temp_in" from="present.%s"|args:$key}}
{{if $temp_in != null && $temp_in > 0}}
{{:linkbutton
label="Retour"
href="movements/input_return.html?key=%s&prop=%s"|args:$key:$prop
shape="reset"
target="_dialog"}}
{{/if}}
{{/if}}
{{:linkbutton
label="Détails"
href="movements/movement_details.html?key=%s&prop=%s&from=eh"|args:$key:$prop
shape="eye"
}}
{{/if}}
</td>
</tr>
{{/list}}
{{:linkbutton
label="Détails"
href="movements/movement_details.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="eye"
}}
</td>
</tr>
{{/if}}
{{/list}}
{{/if}}
{{:admin_footer}}

View file

@ -1,109 +1,22 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Afficher l'historique de tous les mouvements
*}}
{{:admin_header title="Historique des mouvements" custom_css="./style.css" current="module_equipment"}}
{{:include file="./_nav.html" current="historique"}}
{{:include file="./_nav.html" current="historique" subcurrent="tous"}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{* filtrer selon la catégorie *}}
{{:assign saved_filters=$module.config.filters}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}}
{{if $_GET.cat_key == null}}
{{:assign selected_category=$user_filters.hist_cat_key}}
{{else}}
{{if $_GET.cat_key == -1}}
{{:assign selected_category=null}}
{{else}}
{{:assign selected_category=$_GET.cat_key}}
{{/if}}
{{:assign var="user_filters.hist_cat_key" value=$selected_category}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{* condition de filtrage *}}
{{if $selected_category != null}}
{{:assign cat_condition="(SELECT key
FROM @TABLE AS cat
WHERE cat.key = (SELECT $$.category
FROM @TABLE AS mat
WHERE mat.key = @TABLE.$$.equipment)) = '%s'"|args:$selected_category}}
{{else}}
{{:assign cat_condition=1}}
{{/if}}
{{* filtrer selon appartenance *}}
{{if $_GET.prop == null}}
{{:assign selected_prop=$user_filters.hist_prop}}
{{else}}
{{if $_GET.prop == -1}}
{{:assign selected_prop=null}}
{{else}}
{{:assign selected_prop=$_GET.prop}}
{{/if}}
{{:assign var="user_filters.hist_prop" value=$selected_prop}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{* déterminer les types de mouvements selon l'appartenance du matériel *}}
{{#foreach from=$config.input_nature key="key"}}
{{if $selected_prop == null}}
{{* les deux sortes de matériel *}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{elseif $selected_prop == 1}}
{{* matériel propriété de l'asso *}}
{{if $type != 'temporaire'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{/if}}
{{else}}
{{* matériel non propriété de l'asso *}}
{{if $type == 'temporaire'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{/if}}
{{/if}}
{{/foreach}}
{{#foreach from=$config.output_nature key="key"}}
{{if $selected_prop == null}}
{{* les deux sortes de matériel *}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{elseif $selected_prop == 1}}
{{* matériel propriété de l'asso *}}
{{if $type != 'retour'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{/if}}
{{else}}
{{* matériel non propriété de l'asso *}}
{{if $type == 'retour'}}
{{:assign var="mvt_keys." value=$key|quote_sql}}
{{/if}}
{{/if}}
{{/foreach}}
{{:assign key_cond=$mvt_keys|implode:","}}
{{:assign key_cond="("|cat:$key_cond|cat:")"}}
{{if $selected_prop == null}}
{{:assign prop_condition="1"}}
{{else}}
{{:assign prop_condition="$$.operation in %s"|args:$key_cond}}
{{/if}}
{{* sélecteurs de catégorie et d'appartenance *}}
{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1"}}
{{* Sélecteur catégories *}}
{{:assign var="options." value="" label="Toutes les catégories" href="?"}}
{{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}}
{{:assign
var="cat_options."
var="options."
value=$key
label=$name
href="?cat_key=%s"|args:$key
@ -114,29 +27,23 @@
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$cat_options
value="%s"|args:$selected_category
options=$options
value="%s"|args:$_GET.cat_key
}}
</fieldset>
{{:assign var="prop_options." value="" label="Tous les matériels" href="?prop=-1"}}
{{:assign var="prop_options." value="1" label="Matériels propriété de l'association" href="?prop=1"}}
{{:assign var="prop_options." value="0" label="Matériels NON propriété de l'association" href="?prop=0"}}
{{* condition de filtrage *}}
{{if $_GET.cat_key != null}}
{{:assign condition="(SELECT key
FROM @TABLE AS cat
WHERE cat.key = (SELECT $$.category
FROM @TABLE AS mat
WHERE mat.key = @TABLE.$$.equipment)) = '%s'"|args:$_GET.cat_key}}
{{else}}
{{:assign condition=1}}
{{/if}}
<fieldset class="shortFormRight">
<legend>Filtrer par appartenance</legend>
{{:dropdown
title="Filtrer par appartenance"
options=$prop_options
value="%s"|args:$selected_prop
}}
</fieldset>
<div class="shortFormLeft">
<p class="help">Historique de tous les mouvements de matériel</p>
</div>
{{* lister les mouvements *}}
{{* lister tous les mouvements *}}
{{#list
type="movement"
select="($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
@ -154,9 +61,9 @@
THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage)
ELSE ''
END as 'Stockage';
$$.comment AS 'Remarque'
$$.comment AS 'Commentaire'
"|args:$config.user_fields.name_sql
where="%s AND %s"|args:$cat_condition:$prop_condition
where="%s"|args:$condition
order=1
max=50
desc=true

View file

@ -1,41 +1,39 @@
{{* -*- brindille -*- *}}
{{#restrict section="accounting" level="write"}}
{{:assign is_admin=true}}
{{else}}
{{:assign is_admin=false}}
{{/restrict}}
{{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}}
{{if ! $is_admin}}
{{:assign var="user.id" value=$logged_user.id}}
{{:include file="snippets/my_details.html"}}
{{* barre de navigation *}}
{{if $_GET.prop == null || $_GET.prop}}
{{:assign proprio="proprio"}}
{{else}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{#load type="category" count=true limit=1 assign="result"}}{{/load}}
{{:include file="_nav.html" current="inventaire" cat="%d"|args:$result.count subcurrent="stock"}}
{{if $_GET.ok}}
{{if $_GET.msg == "ajout" }}
<p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "modification" }}
<p class="block confirm">Modification effectuée</p>
{{elseif $_GET.msg == "suppression" }}
<p class="block confirm">Suppression effectuée</p>
{{elseif $_GET.msg == "supprmvtmat" }}
<p class="block confirm">Mouvement supprimé - Matériel supprimé</p>
{{/if}}
{{elseif $_GET.err}}
<p class="block error">Modification refusée</p>
{{/if}}
{{if $result.count == 0}}
<p class="block alert">Il n'y a aucune catégorie : vous devez en ajouter.</p>
{{else}}
{{:include file="./_inventory.html"}}
{{/if}}
{{:admin_footer}}
{{:assign proprio="nonproprio"}}
{{/if}}
{{#load type="category" count=true assign="result"}}{{/load}}
{{:include file="_nav.html" current="inventaire" cat="%d"|args:$result.count subcurrent="%s"|args:$proprio}}
{{if $_GET.ok}}
{{if $_GET.msg == "ajout" }}
<p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "modification" }}
<p class="block confirm">Modification effectuée</p>
{{elseif $_GET.msg == "suppression" }}
<p class="block confirm">Suppression effectuée</p>
{{elseif $_GET.msg == "supprmvtmat" }}
<p class="block confirm">Mouvement supprimé - Matériel supprimé</p>
{{/if}}
{{elseif $_GET.err}}
<p class="block error">Modification refusée</p>
{{/if}}
{{if $result.count == 0}}
<p class="block alert">Il n'y a aucune catégorie : vous devez en ajouter.</p>
{{else}}
{{if $_GET.prop == null || $_GET.prop == "1"}}
{{:include file="./_inventory.html"}}
{{else}}
{{:include file="./_temp_inventory.html"}}
{{/if}}
{{/if}}
{{:admin_footer}}

View file

@ -1,103 +1,18 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Matériels hors de l'asso" custom_css="../style.css" current="module_equipment"}}
{{:include file="./_nav.html" current="historique" subcurrent="prêts"}}
{{if $_GET.output_type == "loan"}}
{{:assign label="prêt"}}
{{elseif $_GET.output_type == "rent"}}
{{:assign label="location"}}
{{else}}
{{:error message="Cette page n'existe pas !"}}
{{/if}}
{{:admin_header title="%ss en cours"|args:$label|ucfirst custom_css="../style.css" current="module_equipment"}}
{{:include file="./_nav.html" current="%s"|args:$label subcurrent="encours"}}
{{*
vérifier l'existence de la table du module
eh oui, il se peut qu'elle ne soit pas encore créée si aucune donnée n'a été ajoutée dedans
*}}
{{#load limit="1"}}
{{:assign table_presente=true}}
{{else}}
{{:assign table_presente=false}}
{{/load}}
{{if $table_presente}}
{{if $_GET.ok}}
{{if $_GET.msg == "modification"}}
<p class="block confirm">Modification enregistrée</p>
{{elseif $_GET.msg == "copie"}}
<p class="block confirm">Mouvement copié</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block confirm">Mouvement supprimé</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
<p class="block error">Ce mouvement ne peut être supprimé</p>
{{/if}}
{{/if}}
{{* lecture config *}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="./_get_config.html" keep="config"}}
{{* filtrer selon la catégorie *}}
{{:assign saved_filters=$module.config.filters}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}}
{{if $_GET.cat_key == null}}
{{:assign var="selected_category" from="user_filters.%s_hist_cat_key"|args:$_GET.output_type}}
{{else}}
{{if $_GET.cat_key == -1}}
{{:assign selected_category=null}}
{{else}}
{{:assign selected_category=$_GET.cat_key}}
{{/if}}
{{:assign var="user_filters.%s_hist_cat_key"|args:$_GET.output_type value=$selected_category}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{* condition de filtrage *}}
{{if $selected_category != null}}
{{:assign cat_key=$selected_category|quote_sql}}
{{:assign cat_condition="json_extract(mat.document, '$.category') = %s"|args:$cat_key}}
{{else}}
{{:assign cat_condition=1}}
{{/if}}
{{#foreach from=$config.output_nature key="key"}}
{{if $type != 'temporaire'}}
{{:continue}}
{{/if}}
{{if $_GET.output_type == "loan" && $fee != 'payant'}}
{{:assign var="out_keys." value=$key|quote_sql}}
{{elseif $_GET.output_type == "rent" && $fee == 'payant'}}
{{:assign var="out_keys." value=$key|quote_sql}}
{{if $type == 'temporaire'}}
{{:assign var="output_types." value=$key|quote_sql}}
{{/if}}
{{/foreach}}
{{:assign out_keys=$out_keys|implode:","}}
{{:assign out_keys="("|cat:$out_keys|cat:")"}}
{{* sélecteur de catégorie *}}
{{:assign var="cat_options." value="" label="Toutes les catégories" href="?output_type=%s&cat_key=-1"|args:$_GET.output_type}}
{{#load type="category" order="$$.name"}}
{{:assign
var="cat_options."
value=$key
label=$name
href="?output_type=%s&cat_key=%s"|args:$_GET.output_type:$key
}}
{{/load}}
<fieldset class="shortFormRight">
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$cat_options
value="%s"|args:$selected_category
}}
</fieldset>
{{:assign output_ops=$output_types|implode:","}}
{{:assign output_ops="("|cat:$output_ops|cat:")"}}
{{:assign premier=true}}
{{#select
@ -109,34 +24,33 @@
json_extract(mvt.document, '$.amount') AS out_amount,
json_extract(mvt.document, '$.return_date') AS return_date,
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(retour.document, '$.amount')), 0) AS remain
FROM !table AS mvt
LEFT JOIN users ON json_extract(mvt.document, '$.user') = users.id
LEFT JOIN !table AS links ON mvt.key = json_extract(links.document, '$.temp_key')
LEFT JOIN !table AS retour ON retour.key = json_extract(links.document, '$.return')
INNER JOIN !table AS mat ON mat.key = json_extract(mvt.document, '$.equipment')
WHERE json_extract(mvt.document, '$.type') = 'movement'
AND json_extract(mvt.document, '$.operation') IN !op
AND !cat_condition
FROM module_data_equipment AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
LEFT JOIN module_data_equipment AS links ON mvt.key = json_extract(links.document, '$.temp_key')
LEFT JOIN module_data_equipment AS retour ON retour.key = json_extract(links.document, '$.return')
INNER JOIN module_data_equipment AS mat ON mat.key = json_extract(mvt.document, '$.equipment')
WHERE
json_extract(mvt.document, '$.type') = 'movement'
AND
json_extract(mvt.document, '$.operation') IN !op
GROUP BY mvt.key
HAVING remain != 0
ORDER BY out_date DESC, nom
ORDER BY out_date, nom
;
!table=$module.table
!op = $out_keys
!cat_condition=$cat_condition
!op = $output_ops
}}
{{if $premier}}
<table class="list">
<thead>
<tr>
<td>Matériel</td>
<td>Date prêt</td>
<td>Quantité</td>
<td>Membre</td>
<td>Date retour</td>
<td>Reste à rendre</td>
<td>Remarque</td>
<td class="actions"></td>
<th>Matériel</th>
<th>Date sortie</th>
<th>Quantité</th>
<th>Membre</th>
<th>Date retour</th>
<th>Reste à rendre</th>
<th>Remarque</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
@ -156,35 +70,22 @@
<td>{{$remain}}</td>
<td>
{{if $return_date != null}}
{{:assign jour="jour}}
{{if $nb_jours > 0}}
{{if $nb_jours > 1}}{{:assign jour="jours"}}{{/if}}
{{:tag color="darkred" label="Retard %s %s"|args:$nb_jours:$jour}}
{{elseif $nb_jours < 0}}
{{:assign delai="abs(%d)"|math:$nb_jours}}
{{if $nb_jours < -1}}{{:assign jour="jours"}}{{/if}}
{{"Reste %s %s"|args:$delai:$jour}}
{{else}}
{{:tag color="darkgreen" label="À rendre aujourd'hui"}}
{{/if}}
{{if $nb_jours > 0}}
{{:tag color="darkred" label="Retard %s jours"|args:$nb_jours}}
{{elseif $nb_jours < 0}}
{{:assign delai="abs(%d)"|math:$nb_jours}}
{{"Reste %s jours"|args:$delai}}
{{else}}
{{:tag color="darkgreen" label="À rendre aujourdh'ui"}}
{{/if}}
{{/if}}
</td>
<td class="actions">
<td>
{{:linkbutton
label="Retour"
href="movements/output_return.html?key=%s&prop=1"|args:$mvt_key
shape="reset"
target="_dialog"}}
{{if $_GET.output_type == "loan"}}
{{:assign from="lh"}}
{{elseif $_GET.output_type == "rent"}}
{{:assign from="rh"}}
{{/if}}
{{:linkbutton
label="Détails"
href="movements/movement_details.html?key=%s&prop=1&from=%s"|args:$mvt_key:$from
shape="eye"
}}
</td>
</tr>
{{else}}
@ -192,8 +93,5 @@
{{/select}}
</tbody>
</table>
{{else}}
<p class="block alert">Aucun mouvement.</p>
{{/if}}
{{:admin_footer}}

View file

@ -1,228 +0,0 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Afficher l'historique des prêts ou locations
*}}
{{if $_GET.output_type == "loan"}}
{{:assign label="prêt"}}
{{elseif $_GET.output_type == "rent"}}
{{:assign label="location"}}
{{else}}
{{:error message="Cette page n'existe pas !"}}
{{/if}}
{{:admin_header title="Historique des %ss"|args:$label custom_css="./style.css" current="module_equipment"}}
{{:include file="./_nav.html" current="%s"|args:$label subcurrent="historique"}}
{{*
vérifier l'existence de la table du module
eh oui, il se peut qu'elle ne soit pas encore créée si aucune donnée n'a été ajoutée dedans
*}}
{{#load limit="1"}}
{{:assign table_presente=true}}
{{else}}
{{:assign table_presente=false}}
{{/load}}
{{if $table_presente}}
{{if $_GET.ok}}
{{if $_GET.msg == "modification"}}
<p class="block confirm">Modification enregistrée</p>
{{elseif $_GET.msg == "copie"}}
<p class="block confirm">Mouvement copié</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block confirm">Mouvement supprimé</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
<p class="block error">Ce mouvement ne peut être supprimé</p>
{{/if}}
{{/if}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{* filtrer selon la catégorie *}}
{{:assign saved_filters=$module.config.filters}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}}
{{if $_GET.cat_key == null}}
{{:assign var="selected_category" from="user_filters.%s_cat_key"|args:$_GET.output_type}}
{{else}}
{{if $_GET.cat_key == -1}}
{{:assign selected_category=null}}
{{else}}
{{:assign selected_category=$_GET.cat_key}}
{{/if}}
{{:assign var="user_filters.%s_cat_key"|args:$_GET.output_type value=$selected_category}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{* condition de filtrage *}}
{{if $selected_category != null}}
{{:assign cat_key=$selected_category|quote_sql}}
{{:assign cat_condition="category = %s"|args:$cat_key}}
{{else}}
{{:assign cat_condition=1}}
{{/if}}
{{* déterminer les types de mouvements *}}
{{#foreach from=$config.output_nature key="key"}}
{{if $type != 'temporaire'}}
{{:continue}}
{{/if}}
{{if $_GET.output_type == "loan" && $fee != 'payant'}}
{{:assign var="out_keys." value=$key|quote_sql}}
{{elseif $_GET.output_type == "rent" && $fee == 'payant'}}
{{:assign var="out_keys." value=$key|quote_sql}}
{{/if}}
{{/foreach}}
{{:assign out_keys=$out_keys|implode:","}}
{{:assign out_keys="("|cat:$out_keys|cat:")"}}
{{* sélecteur de catégorie *}}
{{:assign var="cat_options." value="" label="Toutes les catégories" href="?output_type=%s&cat_key=-1"|args:$_GET.output_type}}
{{#load type="category" order="$$.name"}}
{{:assign
var="cat_options."
value=$key
label=$name
href="?output_type=%s&cat_key=%s"|args:$_GET.output_type:$key
}}
{{/load}}
<fieldset class="shortFormRight">
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$cat_options
value="%s"|args:$selected_category
}}
</fieldset>
{{* lister les mouvements *}}
{{:assign premier=true}}
{{#select * FROM
(WITH
sorties AS
(SELECT
mvt.key,
json_extract(mvt.document, '$.date') AS date,
json_extract(mvt.document, '$.direction') AS direction,
json_extract(mvt.document, '$.operation') AS operation,
json_extract(mat.document, '$.name') AS materiel,
json_extract(mat.document, '$.category') AS category,
json_extract(mvt.document, '$.amount') AS amount,
users.id AS user_id,
users.nom AS user,
json_extract(storage.document, '$.name') AS stockage,
json_extract(mvt.document, '$.transactions') AS transactions,
json_extract(mvt.document, '$.comment') AS comment,
json_extract(mvt.document, '$.return_date') AS return_date
FROM !table AS mvt
INNER JOIN !table AS mat ON mat.key = json_extract(mvt.document, '$.equipment')
LEFT JOIN users ON users.id = json_extract(mvt.document, '$.user')
LEFT JOIN !table AS storage ON storage.key = json_extract(mvt.document, '$.storage')
WHERE json_extract(mvt.document, '$.type') = 'movement'
AND json_extract(mvt.document, '$.operation') IN !op
AND !cat_condition
),
entrees AS
(SELECT
mvt.key,
json_extract(mvt.document, '$.date') AS date,
json_extract(mvt.document, '$.direction') AS direction,
json_extract(mvt.document, '$.operation') AS operation,
json_extract(mat.document, '$.name') AS materiel,
json_extract(mat.document, '$.category') AS category,
json_extract(mvt.document, '$.amount') AS amount,
users.id AS user_id,
users.nom AS user,
json_extract(storage.document, '$.name') AS stockage,
json_extract(mvt.document, '$.transactions') AS transactions,
json_extract(mvt.document, '$.comment') AS comment,
json_extract(mvt.document, '$.return_date') AS return_date
FROM !table AS mvt
INNER JOIN !table AS mat ON mat.key = json_extract(mvt.document, '$.equipment')
LEFT JOIN users ON users.id = json_extract(mvt.document, '$.user')
LEFT JOIN !table AS storage ON storage.key = json_extract(mvt.document, '$.storage')
INNER JOIN (
SELECT json_extract(links.document, '$.return') AS return_key
FROM !table AS links
INNER JOIN sorties ON json_extract(links.document, '$.temp_key') = sorties.key
) AS filtered_links ON filtered_links.return_key = mvt.key
WHERE !cat_condition
)
SELECT * FROM sorties UNION SELECT * FROM entrees
)
ORDER BY date DESC, user
;
!table=$module.table
!op = $out_keys
!cat_condition=$cat_condition
}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{:assign file_path="%s/%s/"|args:$module.storage_root:$key}}
{{:assign file_path=$file_path|cat:"%"}}
{{#select count(*) AS nb FROM files WHERE path LIKE :file_path ; :file_path=$file_path}}
{{:assign nb_files=$nb}}
{{/select}}
{{if $premier}}
<table class="list">
<thead>
<tr>
<td>Date</td>
<td>Mouvement</td>
<td>Opération</td>
<td>Matériel</td>
<td class="num">Quantité</td>
<td>Dépositaire</td>
<td>Stockage</td>
<td>Documents</td>
<td>Écritures</td>
<td>Remarque</td>
<td class="actions"></td>
</tr>
</thead>
<tbody>
{{:assign premier=false}}
{{/if}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{if $direction == "input"}}Entrée{{else}}Sortie{{/if}}</td>
<td>{{$op_label}}</td>
<td>{{$materiel}}</td>
<td class="num">{{$amount}}</td>
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user_id label="%s"|args:$user}}</td>
<td>{{$stockage}}</td>
<td class="num">{{if $nb_files > 0}}{{$nb_files}}{{/if}}</td>
<td class="num">{{if $transactions != null}}{{"Oui"}}{{/if}}</td>
<td>{{$comment}}</td>
<td class="actions">
{{if $_GET.output_type == "loan"}}
{{:assign from="lm"}}
{{elseif $_GET.output_type == "rent"}}
{{:assign from="rm"}}
{{/if}}
{{:linkbutton
label="Détails"
href="movements/movement_details.html?key=%s&prop=1&from=%s"|args:$key:$from
shape="eye"
}}
</td>
</tr>
{{else}}
<p class="block alert">Aucun mouvement.</p>
{{/select}}
</tbody>
</table>
{{else}}
<p class="block alert">Aucun mouvement.</p>
{{/if}}
{{:admin_footer}}

View file

@ -1,127 +0,0 @@
{{* -*- brindille -*- *}}
{{*
Afficher l'historique des mouvements d'un matériel pour un membre
paramètres
- key : clé du matériel
- id : id du membre
*}}
{{#restrict}}{{/restrict}}
{{:admin_header title="Historique membre" custom_css="./style.css" current="module_equipment"}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="./_get_config.html" keep="config, directions"}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key=key}}
{{:assign var="types.%s.%s."|args:$direction:$type value=$key|quote_sql}}
{{/foreach}}
{{:assign var="io_types" from="types.%s"|args:$direction}}
{{#foreach from=$io_types key=key}}
{{:assign var=elem from="io_types.%s"|args:$key}}
{{:assign elem=$elem|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="%s_types.%s"|args:$direction:$key value=$elem}}
{{/foreach}}
{{/foreach}}
{{#users id=$_GET.id}}
{{:assign user_name=$nom}}
{{else}}
{{:error message="Il n'existe aucun membre avec l'identifiant %s !"|args:$_GET.id}}
{{/users}}
{{#load key=$_GET.key|trim}}
{{:assign eqpmt_name=$name}}
{{else}}
{{:error message="Il n'existe aucun matériel avec la clé %s !"|args:$_GET.key|trim}}
{{/load}}
<h3>Historique des mouvements de « {{$eqpmt_name}} » du membre « {{$user_name}} »</h3>
{{:assign otk=null}}
{{#select
mvt.key AS mvt_key,
json_extract(mvt.document, '$.direction') as direction,
json_extract(mvt.document, '$.operation') as operation,
json_extract(mvt.document, '$.date') as date,
json_extract(mvt.document, '$.amount') as amount,
COALESCE((SELECT
json_extract(links.document, '$.temp_key')
FROM !table AS links
WHERE json_extract(links.document, '$.temp_key') = mvt.key
OR json_extract(links.document, '$.return') = mvt.key), mvt.key)
AS out_temp_key
FROM !table AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN !table AS eqpmt
ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE users.id = :user
AND eqpmt.key = :eqpmt_key
AND (json_extract(mvt.document, '$.operation') IN !output_types
OR json_extract(mvt.document, '$.operation') IN !input_types)
ORDER BY out_temp_key, date
;
!table=$module.table
:user = $_GET.id
:eqpmt_key = $_GET.key|trim
!output_types=$output_types.temporaire
!input_types=$input_types.retour
}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$operation}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{:assign var="total" from="reste.%s"|args:$out_temp_key}}
{{if $total == null}}
{{:assign total=0}}
{{/if}}
{{if $otk != null && $otk != $out_temp_key}}
</tbody>
</table>
{{/if}}
{{if $otk == null || $otk != $out_temp_key}}
<table class="list">
<thead>
<tr>
<td>Date</td>
<td>Opération</td>
<td>Quantité</td>
<td>Total</td>
<td class="actions"></td>
</tr>
</thead>
<tbody>
{{:assign otk=$out_temp_key}}
{{/if}}
{{if $direction == 'input' && $type_mvt == 'retour'}}
{{:assign var="reste.%s"|args:$out_temp_key value="%d-%d"|math:$total:$amount}}
{{elseif $direction == 'output' && $type_mvt == 'temporaire'}}
{{:assign var="reste.%s"|args:$out_temp_key value="%d+%d"|math:$total:$amount}}
{{/if}}
{{:assign var="total" from="reste.%s"|args:$out_temp_key}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$op_label}}</td>
<td>{{$amount}}</td>
<td>{{$total}}</td>
<td class="actions">
{{#restrict section="accounting" level="write"}}
{{if $direction == "output" && $type_mvt == "temporaire"}}
{{:linkbutton
label="Retour"
href="%smovements/output_return.html?key=%s&prop=0&user=%s"|args:$module.url:$mvt_key:$_GET.id
shape="history"
target="_dialog"}}
{{/if}}
{{/restrict}}
</td>
</tr>
{{/select}}
</tbody>
</table>

View file

@ -1,105 +0,0 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
paramètres :
- id : id membre
*}}
{{if $_GET.output_type == "loan"}}
{{:assign label="prêt"}}
{{elseif $_GET.output_type == "rent"}}
{{:assign label="location"}}
{{else}}
{{:error message="Cette page n'existe pas !"}}
{{/if}}
{{:admin_header title="%ss aux membres"|args:$label|ucfirst custom_css="./style.css" current="module_equipment"}}
{{:include file="./_nav.html" current="%s"|args:$label subcurrent="membres"}}
{{* vérifier l'existence de la table du module *}}
{{#load limit="1"}}
{{:assign table_presente=true}}
{{else}}
{{:assign table_presente=false}}
{{/load}}
{{if $table_presente}}
{{:include file="./_get_config.html" keep="config"}}
{{* déterminer les types de mouvements *}}
{{#foreach from=$config.output_nature key="key"}}
{{if $type != 'temporaire'}}
{{:continue}}
{{/if}}
{{if $_GET.output_type == "loan" && $fee != 'payant'}}
{{:assign var="out_keys." value=$key|quote_sql}}
{{elseif $_GET.output_type == "rent" && $fee == 'payant'}}
{{:assign var="out_keys." value=$key|quote_sql}}
{{/if}}
{{/foreach}}
{{:assign out_keys=$out_keys|implode:","}}
{{:assign out_keys="("|cat:$out_keys|cat:")"}}
{{:assign premier=true}}
{{#select
nom, user, GROUP_CONCAT(mat_name, ", ") AS materiel, SUM(remain) AS quantite
FROM
(SELECT users.nom AS nom,
users.id AS user,
json_extract(mat.document, '$.name') AS mat_name,
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(retour.document, '$.amount')), 0) AS remain
FROM !table AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
LEFT JOIN !table AS links ON mvt.key = json_extract(links.document, '$.temp_key')
LEFT JOIN !table AS retour ON retour.key = json_extract(links.document, '$.return')
INNER JOIN !table AS mat ON mat.key = json_extract(mvt.document, '$.equipment')
WHERE json_extract(mvt.document, '$.type') = 'movement'
AND json_extract(mvt.document, '$.operation') IN !op
GROUP BY mvt.key
HAVING remain != 0
)
GROUP BY user
ORDER BY nom
;
!table=$module.table
!op = $out_keys
}}
{{if $premier}}
<table class="list">
<thead>
<tr>
<td>Membre</td>
<td class="nombre">Quantité</td>
<td>Matériels</td>
</tr>
</thead>
<tbody>
{{:assign premier=false}}
{{/if}}
<tr>
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$nom}}</td>
<td class="nombre">{{$quantite}}</td>
<td>{{$materiel}}</td>
</tr>
{{else}}
{{if $label == "prêt"}}
<p class="block alert">Aucun {{$label}} en cours.</p>
{{elseif $label == "location"}}
<p class="block alert">Aucune {{$label}} en cours.</p>
{{/if}}
{{/select}}
</tbody>
</table>
{{else}}
{{if $label == "prêt"}}
<p class="block alert">Aucun {{$label}} en cours.</p>
{{elseif $label == "location"}}
<p class="block alert">Aucune {{$label}} en cours.</p>
{{/if}}
{{/if}}
{{:admin_footer}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Paramètres :
- key : clé du matériel à modifier

View file

@ -1,10 +1,8 @@
name="Gestion des matériels"
description="Permet de gérer un inventaire de matériels, ainsi que de suivre les prêts.\nversion 0.7"
description="Permet de gérer un inventaire de matériels, ainsi que de suivre les prêts."
author="Jean-Christophe Engel"
author_url="https://gitea.zaclys.com/lesanges"
home_button=true
menu=true
restrict_section="connect"
restrict_level="read"
restrict_details="Les membres connectés peuvent consulter l'historique de leurs prêts ; les membres ayant accès en lecture aux membres peuvent consulter l'historique des prêts des autres membres ; seuls les membres ayant accès en écriture à la comptabilité peuvent utiliser l'ensemble des fonctionnalités du module."
allow_user_restrict=false
restrict_section="accounting"
restrict_level="write"

View file

@ -1,6 +1,9 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="entrees"}}
{{/if}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
@ -117,10 +120,6 @@
{{/form}}
{{:admin_header title="Entrée de matériel" current="module_equipment"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="entrees"}}
{{/if}}
{{:form_errors}}
{{if $categories != null}}
@ -134,23 +133,23 @@
<fieldset class="entree">
<legend>Informations obligatoires</legend>
<dl>
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" min=1 required=true default=1}}
{{:input type="text" name="name" label="Désignation" required=true}}
{{if $input_labels|count == 1}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels}}
{{else}}
{{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$input_labels|sort}}
{{/if}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" min=1 required=true default=1}}
{{if $categories|count == 1}}
{{:input type="select" name="category" label="Catégorie" options=$categories required=true}}
{{else}}
{{:input type="select" name="category" label="Catégorie" default_empty="— Aucune —" options=$categories required=true}}
{{/if}}
{{:input type="text" name="name" label="Désignation" required=true}}
</dl>
</fieldset>
<fieldset>
<legend>Autres informations</legend>
<legend>Informations facultatives</legend>
<dl>
{{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Dupliquer un mouvement
paramètres :
@ -16,7 +14,7 @@
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{:include file="../_get_config.html" keep="config, directions, loan_duration"}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{* interdire de dupliquer un retour => utiliser le bouton « Retour » *}}
@ -95,12 +93,8 @@
{{:assign var="mvt_new.amount" value=$_POST.amount}}
{{:assign var="mvt_new.date" value=$_POST.date|parse_date}}
{{:assign var="mvt_new.comment" value=$_POST.comment}}
{{if $_POST.return_date != null}}
{{:assign return_date=$_POST.return_date|parse_date}}
{{if $return_date < $_POST.date|parse_date}}
{{:error message="La date de retour doit être postérieure à la date de sortie !"}}
{{/if}}
{{if $_POST.set_return_date != null}}
{{:assign return_date=$_POST.return_date}}
{{else}}
{{:assign return_date=null}}
{{/if}}
@ -209,27 +203,9 @@
user=$user.id
storage=$_POST.storage
transactions=$transactions
return_date=$return_date
return_date=$return_date|parse_date
}}
{{if $_GET.from|substr:0:1 == "l"}}
{{:assign output_type="loan"}}
{{elseif $_GET.from|substr:0:1 == "r"}}
{{:assign output_type="rent"}}
{{/if}}
{{if $_GET.from|substr:1:1 == "h"}}
{{:assign suffix="history"}}
{{elseif $_GET.from|substr:1:1 == "m"}}
{{:assign suffix="movements"}}
{{/if}}
{{if $_GET.from == "eh"}}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=copie"|args:$eqpmt_key:$prop}}
{{elseif $suffix == null}}
{{:redirect force="../index.html"}}
{{else}}
{{:redirect force="../loan_%s.html?output_type=%s&ok=1&key=%s&prop=%s&msg=copie"|args:$suffix:$output_type:$eqpmt_key:$prop}}
{{/if}}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=copie"|args:$eqpmt_key:$prop}}
{{/form}}
{{if $mvt_new.direction == "input"}}
@ -244,6 +220,7 @@
-------------------- Préparer la saisie --------------------
*}}
{{* récupérer les infos de la catégorie *}}
{{#load key=$equipment.category assign="category"}}{{/load}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}}
@ -271,18 +248,17 @@
<fieldset>
<legend>Informations obligatoires</legend>
<dl>
{{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}}
{{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}}
{{if $mvt_new.direction == "input"}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}}
{{else}}
{{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}}
{{/if}}
{{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}}
{{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}}
</dl>
</fieldset>
<fieldset class="entree">
<legend>Autres informations</legend>
<legend>Informations facultatives</legend>
<dl>
{{if $prop == 1 && $mvt_new.direction == "output"}}
{{:input
@ -295,26 +271,27 @@
max=1
}}
{{/if}}
{{if $mvt_new.direction == "input" && $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}}
{{if $mvt_new.direction == "input"}}
{{:input type="select" name="storage" default=$mvt_new.storage label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}
{{if $type_mvt != "retour"}}
{{:input type="list" name="transactions" label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}}
{{/if}}
{{/if}}
{{if $type_mvt != "retour"}}
{{:input type="list" name="transactions" label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}}
{{/if}}
{{:input type="textarea" name="comment" label="Remarques" cols="40" rows="3" required=false default=$mvt_new.comment}}
{{if $mvt_new.direction == "output"}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
{{if $mvt_new.direction == "output" && $type_mvt == "temporaire"}}
{{if $mvt_new.return_date != null}}
{{:assign checked="checked"}}
{{:assign visibility="visible"}}
{{:assign return_date=$mvt_new.return_date}}
{{else}}
{{if $module.config.loan_duration != null && $module.config.loan_duration > 0}}
{{:assign ts_sortie=$mvt_new.date|strtotime}}
{{:assign ts_retour="%d+%d*(60*60*24)"|math:$ts_sortie:$module.config.loan_duration}}
{{:assign return_date=$ts_retour|date_short}}
{{/if}}
{{:assign visibility="hidden"}}
{{:assign ts_sortie=$mvt_new.date|strtotime}}
{{:assign ts_retour="%d+%d*(60*60*24)"|math:$ts_sortie:$loan_duration}}
{{:assign return_date=$ts_retour|date_short}}
{{/if}}
<div id="div_return_date">
{{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour" checked="%s"|args:$checked}}
<div id="div_return_date" style="visibility:{{$visibility}}">
{{:input type="date" name="return_date" label="Date de retour" default=$return_date}}
<input type="hidden" id="loan_duration" name="loan_duration" value="{{$module.config.loan_duration}}">
</div>
{{/if}}
</dl>
@ -329,27 +306,12 @@
{{:admin_footer}}
<script type="text/javascript" src="../scripts.js"></script>
<script type="text/javascript">
let output_nature = {{$config.output_nature|json_encode|raw}};
function changeVisibility(evt,
id_date = 'f_date',
id_type = 'f_operation',
div = 'div_return_date',
id_return_date = 'f_return_date')
{
toggleVisibility(id_date, id_type, div, id_return_date);
}
function changeReturnDate(evt, id_date = 'f_date', id_return_date = 'f_return_date', id_loan_duration='loan_duration')
{
setReturnDate(id_date, id_return_date, id_loan_duration);
function changeVisibility(evt, idcheck = 'f_set_return_date_1', fields = ['div_return_date']) {
toggleVisibility(idcheck, fields);
}
(function () {
document.getElementById('f_operation').onchange = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange();
document.getElementById('f_set_return_date_1').onclick = changeVisibility;
})();
</script>

View file

@ -1,6 +1,4 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* -*- brindille -*-}}
{{*
paramètres GET :
@ -23,25 +21,6 @@
{{:include file="../_get_config.html" keep="config"}}
{{#form on="delete"}}
{{if $_GET.from|substr:0:1 == "l"}}
{{:assign output_type="loan"}}
{{elseif $_GET.from|substr:0:1 == "r"}}
{{:assign output_type="rent"}}
{{/if}}
{{if $_GET.from|substr:1:1 == "h"}}
{{:assign suffix="history"}}
{{elseif $_GET.from|substr:1:1 == "m"}}
{{:assign suffix="movements"}}
{{/if}}
{{if $_GET.from == "eh"}}
{{:assign from="../equipment_history.html"}}
{{elseif $suffix == null}}
{{:assign from="../index.html"}}
{{else}}
{{:assign from="../loan_%s.html"|args:$suffix}}
{{:assign param="&output_type=%s"|args:$output_type}}
{{/if}}
{{* vérifier s'il est possible de supprimer le mouvement *}}
{{if $mvt_suppr.direction == 'input'}}
{{:assign var="type_operation" from="config.input_nature.%s.type"|args:$mvt_suppr.operation}}
@ -50,7 +29,7 @@
{{:assign link_key=$key}}
{{/load}}
{{if $link_key != null}}
{{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}}
{{:redirect force="../equipment_history.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{else}}
{{:assign dispo=0}}
@ -83,7 +62,7 @@
{{* problème ? *}}
{{if $dispo < 0 || $nonprop < 0}}
{{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}}
{{:redirect force="../equipment_history.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{/if}}
{{/load}}
@ -104,7 +83,7 @@
{{:assign link_key=$key}}
{{/load}}
{{if $link_key != null}}
{{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}}
{{:redirect force="../equipment_history.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{elseif $type_operation == 'retour'}}
{{#load type="link" where="$$.return = :key" :key=$_GET.key}}
@ -169,11 +148,11 @@
out=$curr_eqpmt.out
notowned=$curr_eqpmt.notowned
}}
{{:redirect force="%s?ok=1&key=%s&prop=%s&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{else}}
{{* supprimer le matériel *}}
{{:delete key=$curr_eqpmt.key}}
{{:redirect force="../index.html?ok=1&msg=supprmvtmat"|args}}
{{:redirect force="../index.html?ok=1&msg=supprmvtmat"}}
{{/if}}
{{/form}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Enregistrer une entrée de matériel
paramètres :
@ -44,7 +42,7 @@
{{:assign var="equipment.notowned" value="%d+%d"|math:$equipment.notowned:$_POST.amount|intval}}
{{/if}}
{{* écritures liées *}}
{{* documents liés *}}
{{#foreach from=$_POST.transactions item="value"}}
{{:assign var="transactions." value=$value|intval}}
{{/foreach}}
@ -106,17 +104,17 @@
<fieldset class="entree">
<legend>Informations obligatoires</legend>
<dl>
{{if $input_labels|count == 1}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels}}
{{else}}
{{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$input_labels|sort}}
{{/if}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" required=true min=1 default=1}}
{{if $input_labels|count == 1}}
{{:input type="select" name="operation" label="Type d'entrée" required=true options=$input_labels}}
{{else}}
{{:input type="select" name="operation" label="Type d'entrée" required=true default_empty="— Aucun —" options=$input_labels|sort}}
{{/if}}
</dl>
</fieldset>
<fieldset class="entree">
<legend>Autres informations</legend>
<legend>Informations facultatives</legend>
<dl>
{{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Enregistrer un retour d'entrée temporaire
paramètres :
@ -34,15 +32,14 @@
{{#select
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS present
FROM !table AS mvt
LEFT JOIN !table AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN !table AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
FROM {!$module.table} AS mvt
LEFT JOIN {!$module.table} AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN {!$module.table} AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
WHERE
json_extract(mvt.document, '$.operation') IN !op
AND mvt.key = :mvt_key
GROUP by mvt.key
;
!table=$module.table
!op = $operations
:mvt_key = $_GET.key
}}
@ -204,9 +201,9 @@
<fieldset>
<legend>Retour de matériel</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$return_label}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" min=1 max=$present required=true default=1}}
{{:input type="select" name="operation" label="Type de mouvement" required=true options=$return_label}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false}}
</dl>
</fieldset>

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Modifier un mouvement
paramètres :
@ -15,7 +13,22 @@
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{:include file="../_get_config.html" keep="config, directions, loan_duration"}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{if $mvt_new.direction == "input"}}
{{if $type_mvt == "temporaire"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{else}}
{{if $type_mvt == "retour"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{/if}}
{{* infos pour affichage *}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}}
@ -30,15 +43,25 @@
{{:error message="Aucun matériel avec la clé « %s »"|args:$eqpmt_key}}
{{/load}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key"}}
{{if $type_mvt != "retour" && $type != "retour" ||
$type_mvt == "retour" && $type == "retour"}}
{{:assign var="%s_labels.%s"|args:$direction:$key value=$label}}
{{/if}}
{{/foreach}}
{{/foreach}}
{{*
-------------------- Traiter la saisie --------------------
*}}
{{#form on="save"}}
{{* vérifier la validité de la saisie *}}
{{if $_POST.amount <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{/if}}
{{* vérifier validité des données *}}
{{if $_POST.date|parse_date|strtotime > $now}}
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}}
@ -61,13 +84,8 @@
{{:assign var="mvt_new.amount" value=$_POST.amount}}
{{:assign var="mvt_new.date" value=$_POST.date|parse_date}}
{{:assign var="mvt_new.comment" value=$_POST.comment}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{if $_POST.return_date != null}}
{{:assign return_date=$_POST.return_date|parse_date}}
{{if $return_date < $_POST.date|parse_date}}
{{:error message="La date de retour doit être postérieure à la date de sortie !"}}
{{/if}}
{{if $_POST.set_return_date != null}}
{{:assign return_date=$_POST.return_date}}
{{else}}
{{:assign return_date=null}}
{{/if}}
@ -79,7 +97,10 @@
*}}
{{:assign insere=false}}
{{#load
where="$$.type = 'movement' AND $$.equipment = :eqpmt_key"
where="
$$.type = 'movement'
AND
$$.equipment = :eqpmt_key"
:eqpmt_key=$eqpmt_key
order="$$.date"
assign="movement"
@ -181,7 +202,7 @@
{{* enregistrer le mouvement modifié *}}
{{if $user == null}}
{{:assign user_id=null}}
{{:assign user_id=$mvt_new.user}}
{{else}}
{{:assign user_id=$user.id}}
{{/if}}
@ -199,41 +220,9 @@
user=$user_id
storage=$_POST.storage
transactions=$transactions
return_date=$return_date
return_date=$return_date|parse_date
}}
{{if $_GET.from|substr:0:1 == "l"}}
{{:assign output_type="loan"}}
{{elseif $_GET.from|substr:0:1 == "r"}}
{{:assign output_type="rent"}}
{{/if}}
{{if $_GET.from|substr:1:1 == "h"}}
{{:assign suffix="history"}}
{{elseif $_GET.from|substr:1:1 == "m"}}
{{:assign suffix="movements"}}
{{/if}}
{{if $mvt_new.direction == "input"}}
{{if $type_mvt == "temporaire"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{else}}
{{if $type_mvt == "retour"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{/if}}
{{if $_GET.from == "eh"}}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=modification"|args:$eqpmt_key:$prop}}
{{elseif $suffix == null}}
{{:redirect force="../index.html"}}
{{else}}
{{:redirect force="../loan_%s.html?output_type=%s&ok=1&key=%s&prop=%s&msg=modification"|args:$suffix:$output_type:$eqpmt_key:$prop}}
{{/if}}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=modification"|args:$eqpmt_key:$prop}}
{{/form}}
{{if $mvt_new.direction == "input"}}
@ -250,18 +239,6 @@
{{#load key=$equipment.category assign="category"}}{{/load}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key"}}
{{if $type_mvt != "retour" && $type != "retour" ||
$type_mvt == "retour" && $type == "retour"}}
{{:assign var="%s_labels.%s"|args:$direction:$key value=$label}}
{{/if}}
{{/foreach}}
{{/foreach}}
{{if $mvt_new.user != null}}
{{#select id, !name as nom FROM users WHERE id=:id; !name=$config.user_fields.name_sql :id=$mvt_new.user}}
{{:assign var="user.%s"|args:$id value=$nom}}
@ -294,20 +271,20 @@
<fieldset>
<legend>Informations obligatoires</legend>
<dl>
{{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}}
{{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}}
{{if $mvt_new.direction == "input"}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}}
{{else}}
{{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}}
{{/if}}
{{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}}
{{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}}
</dl>
</fieldset>
<fieldset class="entree">
<legend>Autres informations</legend>
<legend>Informations facultatives</legend>
<dl>
{{if $mvt_new.direction == "output" && $type_mvt != "retour"}}
{{if $prop == 1 && $mvt_new.direction == "output"}}
{{:input
type="list"
name="user"
@ -318,26 +295,30 @@
max=1
}}
{{/if}}
{{if $mvt_new.direction == "input" && $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}}
{{/if}}
{{if $type_mvt != "retour"}}
{{:input type="list" name="transactions" label="Écritures liées" default=$mvt_new.transactions target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}}
{{if $mvt_new.direction == "input"}}
{{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}}
{{/if}}
{{if $type_mvt != "retour"}}
{{:input type="list" name="transactions" default=$mvt_new.transactions label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}}
{{/if}}
{{/if}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
{{if $mvt_new.direction == "output"}}
{{if $mvt_new.direction == "output" && $type_mvt == "temporaire"}}
{{if $mvt_new.return_date != null}}
{{:assign checked="checked"}}
{{:assign visibility="visible"}}
{{:assign return_date=$mvt_new.return_date}}
{{else}}
{{if $module.config.loan_duration != null && $module.config.loan_duration > 0}}
{{:assign ts_sortie=$mvt_new.date|strtotime}}
{{:assign ts_retour="%d+%d*(60*60*24)"|math:$ts_sortie:$module.config.loan_duration}}
{{:assign return_date=$ts_retour|date_short}}
{{/if}}
{{:assign visibility="hidden"}}
{{:assign ts_sortie=$mvt_new.date|strtotime}}
{{:assign ts_retour="%d+%d*(60*60*24)"|math:$ts_sortie:$loan_duration}}
{{:assign return_date=$ts_retour|date_short}}
{{/if}}
<div id="div_return_date">
{{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour" checked="%s"|args:$checked}}
<div id="div_return_date" style="visibility:{{$visibility}}">
{{:input type="date" name="return_date" label="Date de retour" default=$return_date}}
<input type="hidden" id="loan_duration" name="loan_duration" value="{{$module.config.loan_duration}}">
<input type="hidden" id="loan_duration" name="loan_duration" value="{{$loan_duration}}">
</div>
{{/if}}
</dl>
@ -352,27 +333,20 @@
{{:admin_footer}}
<script type="text/javascript" src="../scripts.js"></script>
<script type="text/javascript">
let output_nature = {{$config.output_nature|json_encode|raw}};
function changeVisibility(evt,
id_date = 'f_date',
id_type = 'f_operation',
div = 'div_return_date',
id_return_date = 'f_return_date')
{
toggleVisibility(id_date, id_type, div, id_return_date);
function changeVisibility(evt, idcheck = 'f_set_return_date_1', fields = ['div_return_date']) {
toggleVisibility(idcheck, fields);
}
function changeReturnDate(evt, id_date = 'f_date', id_return_date = 'f_return_date', id_loan_duration='loan_duration')
{
setReturnDate(id_date, id_return_date, id_loan_duration);
function changeReturnDate(evt, id_date = 'f_date', id_return_date = 'f_return_date', id_loan_duration='loan_duration') {
const loan_duration = document.getElementById(id_loan_duration).value;
let nbsec = getDate(id_date) + loan_duration*24*60*60;
const date_retour = new Date(nbsec * 1000);
document.getElementById(id_return_date).value = date_retour.toLocaleDateString();
}
(function () {
document.getElementById('f_operation').onchange = changeVisibility;
document.getElementById('f_set_return_date_1').onclick = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange();
})();
</script>

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Afficher les détails d'un mouvement et donner la possibilité :
- d'associer des fichiers
@ -9,7 +7,6 @@
paramètres :
- key : clé du mouvement
- prop = 1 si matériel appartient à l'asso
- from = page d'appel
*}}
{{:admin_header title="Détails du mouvement" custom_css="../style.css" current="module_equipment"}}
@ -45,18 +42,18 @@
<nav class="tabs">
{{:linkbutton
label="Modifier ce mouvement"
href="modify_movement.html?key=%s&from=%s"|args:$_GET.key:$_GET.from
href="modify_movement.html?key=%s"|args:$_GET.key
shape="edit"
target="_dialog"}}
{{:linkbutton
label="Supprimer ce mouvement"
href="delete_movement.html?key=%s&prop=%s&from=%s"|args:$_GET.key:$_GET.prop:$_GET.from
href="delete_movement.html?key=%s&prop=%s"|args:$_GET.key:$_GET.prop
shape="delete"
target="_dialog"}}
{{if $type_mvt != "retour"}}
{{:linkbutton
label="Dupliquer ce mouvement"
href="copy_movement.html?key=%s&prop=%s&from=%s"|args:$_GET.key:$_GET.prop:$_GET.from
href="copy_movement.html?key=%s&prop=%s"|args:$_GET.key:$_GET.prop
shape="plus"
target="_dialog"}}
{{/if}}
@ -66,9 +63,9 @@
<dt>Opération</dt>
<dd>{{$op_label}}</dd>
<dt>Matériel</dt>
<dd>{{:link href="../equipment_history.html?key=%s&prop=%s"|args:$equipment.key:$_GET.prop label=$equipment.name}}</dd>
<dd>{{$equipment.name}}</dd>
<dt>Catégorie</dt>
<dd>{{:link href="../index.html?cat_key=%s&prop=1"|args:$category.key label=$category.name}}</dd>
<dd>{{$category.name}}</dd>
<dt>Date</dt>
<dd>{{$mvt.date|date_short}}</dd>
<dt>Quantité</dt>
@ -77,7 +74,7 @@
<dt>Membre destinataire</dt>
<dd>
{{if $mvt.user != null}}
{{:link href="/admin/users/details.php?id=%s"|args:$mvt.user label=$user_name}}
{{$user_name}}
{{else}}—
{{/if}}
</dd>
@ -98,22 +95,19 @@
{{else}}—
{{/foreach}}
</dd>
{{if $mvt.direction == "output" && $type_mvt != "retour"}}
<dt>Date de retour</dt>
<dd>
{{if $mvt.return_date != null}}
{{$mvt.return_date|date_short}}
{{else}}—
{{/if}}
</dd>
{{/if}}
<dt>Remarques</dt>
<dd>{{if $mvt.comment != null}}
{{$mvt.comment}}
{{else}}—
{{/if}}
</dd>
{{if $mvt.return_date != null}}
<dt>Date de retour</dt>
<dd>{{$mvt.return_date|date_short}}</dd>
{{/if}}
</dl>
{{:admin_files path=$mvt.key upload=true edit=true use_trash=false}}
<form method="post" action="">
{{:admin_files path=$_GET.key upload=true edit=true use_trash=false}}
</form>
{{:admin_footer}}

View file

@ -1,29 +1,16 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
paramètres :
- key : clé du matériel à sortir
- output_type : loan (prêt), rent (location), rien (cas général)
*}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
{{:include file="../_get_config.html" keep="config, loan_duration"}}
{{* types de sorties *}}
{{#foreach from=$config.output_nature key=key}}
{{if $type == 'retour'}}
{{:continue}}
{{/if}}
{{if $type == 'temporaire' && $fee == 'payant'}}
{{:assign var="paid_keys." value=$key}}
{{/if}}
{{if $_GET.output_type == null}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{elseif $type == 'temporaire' && $_GET.output_type == "loan" && $fee != 'payant'}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{elseif $type == 'temporaire' && $_GET.output_type == "rent" && $fee == 'payant'}}
{{if $type != 'retour'}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{/if}}
{{/foreach}}
@ -33,27 +20,22 @@
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* vérifier la validité de la saisie *}}
{{* interdire date dans le futur *}}
{{if $_POST.date|parse_date|strtotime > $now}}
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}}
{{* vérifier les infos saisies *}}
{{if $_POST.operation == ""}}
{{:error message="Vous devez choisir un type de sortie"}}
{{/if}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt != "temporaire" && $_POST.return_date != null}}
{{if $type_mvt != "temporaire" && $_POST.set_return_date != null}}
{{:error message="On ne peut associer une date de retour qu'à une sortie temporaire"}}
{{/if}}
{{if $_POST.return_date != null}}
{{:assign return_date=$_POST.return_date|parse_date}}
{{if $return_date < $_POST.date|parse_date}}
{{:error message="La date de retour doit être postérieure à la date de sortie !"}}
{{/if}}
{{if $_POST.set_return_date != null}}
{{:assign return_date=$_POST.return_date}}
{{else}}
{{:assign return_date=null}}
{{/if}}
@ -144,11 +126,6 @@
{{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$_POST.amount|intval}}
{{/if}}
{{* écritures liées *}}
{{#foreach from=$_POST.transactions item="value"}}
{{:assign var="transactions." value=$value|intval}}
{{/foreach}}
{{:save
key=$equipment.key
validate_schema="../equipment.schema.json"
@ -174,8 +151,7 @@
date=$_POST.date|parse_date
comment=$_POST.remarques|trim
user=$user.id
return_date=$return_date
transactions=$transactions
return_date=$return_date|parse_date
}}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=1&msg=sortie"|args:$_GET.key}}
{{/form}}
@ -185,16 +161,13 @@
{{* barre de navigation *}}
{{:include file="../_nav.html" current="sorties"}}
{{/if}}
{{:form_errors}}
{{#load key=$equipment.category assign="category"}}{{/load}}
{{:assign dispo="%d-%d"|math:$equipment.stock:$equipment.out}}
{{if $dispo > 0}}
{{if $module.config.loan_duration != null && $module.config.loan_duration > 0}}
{{:assign ts_retour="%d+%d*(60*60*24)"|math:$now:$module.config.loan_duration}}
{{:assign date_retour=$ts_retour|date_short}}
{{/if}}
{{:assign ts_retour="%d+%d*(60*60*24)"|math:$now:$loan_duration}}
{{:assign date_retour=$ts_retour|date_short}}
{{* formulaire de sortie de matériel *}}
<form method="post" action="">
@ -212,17 +185,17 @@
<fieldset class="sortie">
<legend>Informations obligatoires</legend>
<dl>
{{if $output_labels|count == 1}}
{{:input type="select" name="operation" label="Type" required=true options=$output_labels}}
{{else}}
{{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$output_labels|sort}}
{{/if}}
{{:input type="date" name="date" label="Date de sortie" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" required=true default=1 min=1 max=$dispo}}
{{if $output_labels|count == 1}}
{{:input type="select" name="operation" label="Type de sortie" required=true options=$output_labels}}
{{else}}
{{:input type="select" name="operation" label="Type de sortie" required=true default_empty="— Aucun —" options=$output_labels|sort}}
{{/if}}
</dl>
</fieldset>
<fieldset class="entree">
<legend>Autres informations</legend>
<legend>Informations facultatives</legend>
<dl>
{{:input
type="list"
@ -232,11 +205,11 @@
multiple=true
max=1
}}
{{:input type="list" name="transactions" label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}}
<div id="div_return_date">
{{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour"}}
<div id="div_return_date" style="visibility:hidden">
{{:input type="date" id="return_date" name="return_date" label="Date de retour" default=$date_retour}}
<input type="hidden" id="loan_duration" name="loan_duration" value="{{$module.config.loan_duration}}">
<input type="hidden" id="loan_duration" name="loan_duration" value="{{$loan_duration}}">
</div>
</dl>
</fieldset>
@ -248,30 +221,25 @@
<p class="block error">Il n'y a aucune unité de ce matériel disponible à la date du {{$now|date_short}}</p>
{{/if}}
{{:form_errors}}
{{:admin_footer}}
<script type="text/javascript" src="../scripts.js"></script>
<script type="text/javascript">
let output_nature = {{$config.output_nature|json_encode|raw}};
function changeVisibility(evt,
id_date = 'f_date',
id_type = 'f_operation',
div = 'div_return_date',
id_return_date = 'f_return_date')
{
toggleVisibility(id_date, id_type, div, id_return_date);
function changeVisibility(evt, idcheck = 'f_set_return_date_1', fields = ['div_return_date']) {
toggleVisibility(idcheck, fields);
}
function changeReturnDate(evt, id_date = 'f_date', id_return_date = 'f_return_date', id_loan_duration='loan_duration')
{
setReturnDate(id_date, id_return_date, id_loan_duration);
function changeReturnDate(evt, id_date = 'f_date', id_return_date = 'f_return_date', id_loan_duration='loan_duration') {
const loan_duration = document.getElementById(id_loan_duration).value;
let nbsec = getDate(id_date) + loan_duration*24*60*60;
const date_retour = new Date(nbsec * 1000);
document.getElementById(id_return_date).value = date_retour.toLocaleDateString();
}
(function () {
document.getElementById('f_operation').onchange = changeVisibility;
document.getElementById('f_set_return_date_1').checked = false;
document.getElementById('f_set_return_date_1').onclick = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange();
})();
</script>

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Enregistrer un retour de sortie temporaire
paramètres :
@ -34,15 +32,14 @@
{{#select
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS exterieur
FROM !table AS mvt
LEFT JOIN !table AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN !table AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
FROM {!$module.table} AS mvt
LEFT JOIN {!$module.table} AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN {!$module.table} AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
WHERE
json_extract(mvt.document, '$.operation') IN !op
AND mvt.key = :mvt_key
GROUP by mvt.key
;
!table=$module.table
!op = $operations
:mvt_key = $_GET.key
}}
@ -214,13 +211,13 @@
<fieldset>
<legend>Informations obligatoires</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$return_label}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" min=1 max=$exterieur required=true default=1}}
{{:input type="select" name="operation" label="Type de mouvement" required=true options=$return_label}}
</dl>
</fieldset>
<fieldset class="entree">
<legend>Autres informations</legend>
<legend>Informations facultatives</legend>
<dl>
{{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}

View file

@ -26,6 +26,18 @@ function disableColumSort(liste) {
}
}
function toggleVisibility(idcheck, fields) {
const elem = document.getElementById(idcheck);
for (let id of fields) {
const field = document.getElementById(id);
if (elem.checked) {
field.style.visibility = "visible";
} else {
field.style.visibility = "hidden";
}
}
}
/**
* renvoyer la valeur en secondes d'une date au format j/m/a
* @param {string} date
@ -40,36 +52,3 @@ function str2sec(date) {
function getDate(idelem) {
return str2sec(document.getElementById(idelem).value);
}
/**
* modifier la date de retour en fonction de la date de sortie et de la durée du prêt
*/
function setReturnDate(id_date, id_return_date, id_loan_duration)
{
const loan_duration = document.getElementById(id_loan_duration).value;
if (loan_duration !== undefined && loan_duration > 0) {
let nbsec = getDate(id_date) + loan_duration*24*60*60;
const date_retour = new Date(nbsec * 1000);
document.getElementById(id_return_date).value = date_retour.toLocaleDateString();
}
}
/**
* changer la visibilité de la date de retour
*/
function toggleVisibility(id_date, id_type, div, id_return_date)
{
const key = document.getElementById(id_type).value;
let type_sortie;
if (key !== undefined && key != '') {
type_sortie = output_nature[key].type;
}
const div_date = document.getElementById(div);
if (type_sortie == 'temporaire') {
div_date.style.visibility = "visible";
document.getElementById(id_date).onchange();
} else {
div_date.style.visibility = "hidden";
document.getElementById(id_return_date).value = null;
}
}

View file

@ -1,210 +0,0 @@
{{* -*- brindille -*- *}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key=key}}
{{:assign var="types.%s.%s."|args:$direction:$type value=$key|quote_sql}}
{{/foreach}}
{{:assign var="io_types" from="types.%s"|args:$direction}}
{{#foreach from=$io_types key=key}}
{{:assign var=elem from="io_types.%s"|args:$key}}
{{:assign elem=$elem|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="%s_types.%s"|args:$direction:$key value=$elem}}
{{/foreach}}
{{/foreach}}
{{*
vérifier l'existence de la table du module
eh oui, il se peut qu'elle ne soit pas encore créée si aucune donnée n'a été ajoutée dedans
*}}
{{#load limit="1"}}
{{:assign table_presente=true}}
{{else}}
{{:assign table_presente=false}}
{{/load}}
{{if $table_presente}}
{{* Matériels attribués temporairement *}}
{{* vérifier la présence des types d'entrées et de sorties requis *}}
{{if $output_types|has_key:"temporaire" && $input_types|has_key:"retour"}}
{{*
Calculer les quantités de matériel en prêt
*}}
{{:assign premier=true}}
{{#select
json_extract(mvt.document, '$.direction') AS direction,
json_extract(mvt.document, '$.date') AS date,
eqpmt.key as eqpmt_key,
json_extract(eqpmt.document, '$.name') AS eqpmt_name,
json_extract(mvt.document, '$.amount') AS qte,
json_extract(mvt.document, '$.return_date') AS return_date,
json_extract(mvt.document, '$.operation') AS operation
FROM !table AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN !table AS eqpmt ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE
users.id = :user
AND
json_extract(mvt.document, '$.type') = 'movement'
AND
(json_extract(mvt.document, '$.operation') IN !output_types
OR
json_extract(mvt.document, '$.operation') IN !input_types)
ORDER BY eqpmt_name, date
;
!table=$module.table
:user = $user.id
!output_types=$output_types.temporaire
!input_types=$input_types.retour
}}
{{if $premier}}
{{:assign premier=false}}
{{:assign total=0}}
{{:assign nb_jours=0}}
{{:assign old_eqpmt_key=$eqpmt_key}}
{{:assign var="ligne.date" value=$date}}
{{:assign var="ligne.eqpmt_key" value=$eqpmt_key}}
{{:assign var="ligne.materiel" value=$eqpmt_name}}
{{:assign var="ligne.return_date" value=$return_date}}
{{:assign var="ligne.retard" value="0"}}
{{if $return_date != null}}
{{:assign ts_retour=$return_date|strtotime}}
{{:assign nb_jours="floor((%d-%d)/(60*60*24))"|math:$now:$ts_retour}}
{{:assign var="ligne.retard" value=$nb_jours}}
{{/if}}
{{/if}}
{{if $eqpmt_key != $old_eqpmt_key}}
{{if $total > 0}}
{{:assign var="ligne.qte" value=$total}}
{{:assign var="lignes." value=$ligne}}
{{/if}}
{{:assign total=0}}
{{:assign nb_jours=0}}
{{:assign old_eqpmt_key=$eqpmt_key}}
{{:assign var="ligne.date" value=$date}}
{{:assign var="ligne.eqpmt_key" value=$eqpmt_key}}
{{:assign var="ligne.materiel" value=$eqpmt_name}}
{{:assign var="ligne.return_date" value=$return_date}}
{{:assign var="ligne.retard" value="0"}}
{{if $return_date != null}}
{{:assign ts_retour=$return_date|strtotime}}
{{:assign nb_jours="floor((%d-%d)/(60*60*24))"|math:$now:$ts_retour}}
{{:assign var="ligne.retard" value=$nb_jours}}
{{/if}}
{{/if}}
{{if $direction == "output"}}
{{:assign total="%d+%d"|math:$total:$qte}}
{{else}}
{{:assign total="%d-%d"|math:$total:$qte}}
{{/if}}
{{/select}}
{{if $total > 0}}
{{:assign var="ligne.qte" value=$total}}
{{:assign var="lignes." value=$ligne}}
{{/if}}
{{if $lignes|count > 0}}
<h3 class="ruler">Matériels attribués temporairement</h3>
<table class="list" id="liste_temporaires">
<thead>
<tr>
<th>Date</th>
<th>Matériel</th>
<th>Quantité</th>
<th>Date de retour</th>
<th>Remarque</th>
<th class="actions">
</tr>
</thead>
<tbody>
{{#foreach from=$lignes}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$materiel}}</td>
<td>{{$qte}}</td>
<td>{{$return_date|date_short}}</td>
<td>
{{if $retard < 0}}
{{:assign delai="abs(%d)"|math:$retard}}
{{"Reste %s jours"|args:$delai}}
{{elseif $retard > 0 }}
{{:tag color="darkred" label="Retard %s jours"|args:$retard}}
{{elseif $return_date != null}}
{{:tag color="darkgreen" label="À rendre aujourdh'ui"}}
{{/if}}
</td>
<td class="actions">
{{:linkbutton
label="Historique"
href="%smember_history.html?key=%s&id=%s"|args:$module.url:$eqpmt_key:$user.id
shape="table"
target="_dialog"
}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/if}}
{{/if}}
{{* Matériels attribués définitivement *}}
{{* vérifier la présence des types de sorties requis *}}
{{if $output_types|has_key:"définitif"}}
{{#select
eqpmt.key as eqpmt_key,
json_extract(eqpmt.document, '$.name') as eqpmt_name,
json_extract(mvt.document, '$.direction') as direction,
json_extract(mvt.document, '$.operation') as operation,
MIN(json_extract(mvt.document, '$.date')) as date,
SUM(json_extract(mvt.document, '$.amount')) as amount
FROM !table AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN !table AS eqpmt
ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE users.id = :user
AND json_extract(mvt.document, '$.operation') IN !output_types
GROUP BY eqpmt_key, operation
ORDER BY eqpmt_name, date
;
!table=$module.table
:user = $user.id
!output_types=$output_types.définitif
assign="def_mat."
}}
{{/select}}
{{/if}}
{{if $def_mat|count != 0}}
<h3 class="ruler">Matériels attribués définitivement</h3>
<table class="list">
<thead>
<tr>
<th>Date</th>
<th>Matériel</th>
<th>Opération</th>
<th>Quantité</th>
</tr>
</thead>
<tbody>
{{#foreach from=$def_mat}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$eqpmt_name}}</td>
<td>{{$op_label}}</td>
<td>{{$amount}}</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/if}}
{{/if}}

View file

@ -1,3 +0,0 @@
{{* -*- brindille -*- *}}
{{:include file="./_details.html"}}

View file

@ -1,4 +1,199 @@
{{* -*- brindille -*- *}}
{{#restrict section="users" level="read"}}{{/restrict}}
{{:include file="./_details.html"}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key=key}}
{{:assign var="types.%s.%s."|args:$direction:$type value=$key|quote_sql}}
{{/foreach}}
{{:assign var="io_types" from="types.%s"|args:$direction}}
{{#foreach from=$io_types key=key}}
{{:assign var=elem from="io_types.%s"|args:$key}}
{{:assign elem=$elem|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="%s_types.%s"|args:$direction:$key value=$elem}}
{{/foreach}}
{{/foreach}}
{{*
vérifier l'existence de la table du module
eh oui, il se peut qu'elle ne soit pas encore créée si aucune donnée n'a été ajoutée dedans
*}}
{{#load limit="1"}}
{{:assign table_presente=true}}
{{else}}
{{:assign table_presente=false}}
{{/load}}
{{if $table_presente}}
{{* Matériels attribués temporairement *}}
{{* vérifier la présence des types d'entrées et de sorties requis *}}
{{if $output_types|has_key:"temporaire" && $input_types|has_key:"retour"}}
{{*
Calculer les quantités de matériel en prêt
*}}
{{:assign premier=true}}
{{#select
json_extract(mvt.document, '$.direction') AS direction,
json_extract(mvt.document, '$.date') AS date,
eqpmt.key as eqpmt_key,
json_extract(eqpmt.document, '$.name') AS eqpmt_name,
json_extract(mvt.document, '$.amount') AS qte,
json_extract(mvt.document, '$.return_date') AS return_date,
json_extract(mvt.document, '$.operation') AS operation
FROM {!$module.table} AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN {!$module.table} AS eqpmt ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE
users.id = :user
AND
json_extract(mvt.document, '$.type') = 'movement'
AND
(json_extract(mvt.document, '$.operation') IN !output_types
OR
json_extract(mvt.document, '$.operation') IN !input_types)
ORDER BY eqpmt_name, date
;
:user = $user.id
!output_types=$output_types.temporaire
!input_types=$input_types.retour
}}
{{if $premier}}
{{:assign premier=false}}
{{:assign total=0}}
{{:assign nb_jours=0}}
{{:assign old_eqpmt_key=$eqpmt_key}}
{{:assign var="ligne.date" value=$date}}
{{:assign var="ligne.materiel" value=$eqpmt_name}}
{{:assign var="ligne.return_date" value=$return_date}}
{{:assign var="ligne.retard" value="0"}}
{{if $return_date != null}}
{{:assign ts_retour=$return_date|strtotime}}
{{:assign nb_jours="floor((%d-%d)/(60*60*24))"|math:$now:$ts_retour}}
{{:assign var="ligne.retard" value=$nb_jours}}
{{/if}}
{{/if}}
{{if $eqpmt_key != $old_eqpmt_key}}
{{if $total > 0}}
{{:assign var="ligne.qte" value=$total}}
{{:assign var="lignes." value=$ligne}}
{{/if}}
{{:assign total=0}}
{{:assign nb_jours=0}}
{{:assign old_eqpmt_key=$eqpmt_key}}
{{:assign var="ligne.date" value=$date}}
{{:assign var="ligne.materiel" value=$eqpmt_name}}
{{:assign var="ligne.return_date" value=$return_date}}
{{:assign var="ligne.retard" value="0"}}
{{if $return_date != null}}
{{:assign ts_retour=$return_date|strtotime}}
{{:assign nb_jours="floor((%d-%d)/(60*60*24))"|math:$now:$ts_retour}}
{{:assign var="ligne.retard" value=$nb_jours}}
{{/if}}
{{/if}}
{{if $direction == "output"}}
{{:assign total="%d+%d"|math:$total:$qte}}
{{else}}
{{:assign total="%d-%d"|math:$total:$qte}}
{{/if}}
{{/select}}
{{if $total > 0}}
{{:assign var="ligne.qte" value=$total}}
{{:assign var="lignes." value=$ligne}}
{{/if}}
{{if $lignes|count > 0}}
<h3 class="ruler">Matériels attribués temporairement</h3>
<table class="list" id="liste_temporaires">
<thead>
<tr>
<th>Date</th>
<th>Matériel</th>
<th>Quantité</th>
<th>Date de retour</th>
<th>Remarque</th>
</tr>
</thead>
<tbody>
{{#foreach from=$lignes}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$materiel}}</td>
<td>{{$qte}}</td>
<td>{{$return_date|date_short}}</td>
<td>
{{if $retard < 0}}
{{:assign delai="abs(%d)"|math:$retard}}
{{"Reste %s jours"|args:$delai}}
{{elseif $retard >0 }}
{{:tag color="darkred" label="Retard %s jours"|args:$retard}}
{{else}}
{{:tag color="darkgreen" label="À rendre aujourdh'ui"}}
{{/if}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/if}}
{{/if}}
{{* Matériels attribués définitivement *}}
{{* vérifier la présence des types de sorties requis *}}
{{if $output_types|has_key:"définitif"}}
{{#select
eqpmt.key as eqpmt_key,
json_extract(eqpmt.document, '$.name') as eqpmt_name,
json_extract(mvt.document, '$.direction') as direction,
json_extract(mvt.document, '$.operation') as operation,
MIN(json_extract(mvt.document, '$.date')) as date,
SUM(json_extract(mvt.document, '$.amount')) as amount
FROM {!$module.table} AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN {!$module.table} AS eqpmt
ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE users.id = :user
AND json_extract(mvt.document, '$.operation') IN !output_types
GROUP BY eqpmt_key, operation
ORDER BY eqpmt_name, date
;
:user = $user.id
!output_types=$output_types.définitif
assign="def_mat."
}}
{{/select}}
{{/if}}
{{if $def_mat|count != 0}}
<h3 class="ruler">Matériels attribués définitivement</h3>
<table class="list">
<thead>
<tr>
<th>Date</th>
<th>Matériel</th>
<th>Opération</th>
<th>Quantité</th>
</tr>
</thead>
<tbody>
{{#foreach from=$def_mat}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$eqpmt_name}}</td>
<td>{{$op_label}}</td>
<td>{{$amount}}</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/if}}
{{/if}}

View file

@ -1,8 +1,6 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
paramètres :
- key : clé du stockage à supprimer

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Afficher les lieux de stockage
*}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* récupérer les infos du lieu de stockage *}}
{{#load key=$_GET.key assign="storage"}}
{{else}}

View file

@ -24,7 +24,3 @@
table.list > thead th[class~=nosort] a:hover {
background-color : rgba(var(--gSecondColor), 0.);
}
.nombre {
text-align: right !important;
}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Remettre le matériel en service
Paramètres :