Compare commits

..

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

46 changed files with 719 additions and 2296 deletions

View file

@ -3,23 +3,16 @@
Ce module permet de gérer les matériels de l'association: stock, Ce module permet de gérer les matériels de l'association: stock,
entrées, sorties, classés par catégorie. entrées, sorties, classés par catégorie.
Un matériel peut entrer dans l'association : Un matériel peut entrer temporairement (location, emprunt, ...) ou
- temporairement (location, emprunt, ...) définitivement dans l'association (achat, ...).
- définitivement (achat, ...)
Dans les deux cas, il est possible de lui associer une écriture de la
compta ou un fichier.
Un matériel appartenant à l'association peut sortir : Un matériel appartenant à l'association peut sortir :
- temporairement (prêt, ...) : il est possible de lui associer un lieu - 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 stockage ainsi qu'un membre dépositaire du matériel ; il peut
de retour ; il peut ensuite revenir dans l'association. ensuite revenir dans l'association.
- définitivement (vente, ...) : il est possible de lui associer un - définitivement (vente, ...) : il est possible de lui associer un
membre bénéficiaire du matériel. 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 Un matériel présent temporairement dans l'association peut être
retourné à son propriétaire. retourné à son propriétaire.

View file

@ -1,8 +1,9 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{* {{*
Récupérer la config Récupérer soit la config enregistrée, soit la config par défaut
résultat : config_defaut, directions, config.input_nature et config.output_nature @param : default = true si config par défaut
résultat : config.input_nature et config.output_nature
*}} *}}
{{* config par défaut *}} {{* config par défaut *}}
@ -14,15 +15,17 @@
{{#foreach from=$directions key="direction"}} {{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="module.config.%s_nature"|args:$direction}} {{:assign var="nature" from="module.config.%s_nature"|args:$direction}}
{{if $nature != null}} {{if $nature != null && ! $default}}
{{#foreach from=$nature item="elem"}} {{#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}} {{/foreach}}
{{else}} {{else}}
{{* pas de config enregistrée : utiliser la config par défaut *}} {{* pas de config enregistrée : utiliser la config par défaut *}}
{{:assign var="nature" from="config_defaut.%ss"|args:$direction}} {{:assign var="nature" from="config_defaut.%ss"|args:$direction}}
{{#foreach from=$nature item="elem"}} {{#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}} {{/foreach}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}

View file

@ -1,65 +1,18 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{* {{*
Inventaire des matériels en stock dans l'association inventaire des entrées/sorties des matériels permanents
*}} *}}
{{* filtrer selon la catégorie *}} {{* Sélecteur catégories *}}
{{:assign saved_filters=$module.config.filters}} {{:assign var="options." value="" label="Toutes les catégories" href="?prop=1"}}
{{: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"}}
{{#load type="category" order="$$.name"}} {{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}} {{:assign var="categories.%s"|args:$key value=$name}}
{{:assign {{:assign
var="cat_options." var="options."
value=$key value=$key
label=$name label=$name
href="?cat_key=%s"|args:$key href="?cat_key=%s&prop=1"|args:$key
}} }}
{{/load}} {{/load}}
@ -67,28 +20,23 @@
<legend>Filtrer par catégorie</legend> <legend>Filtrer par catégorie</legend>
{{:dropdown {{:dropdown
title="Filtrer par catégorie" title="Filtrer par catégorie"
options=$cat_options options=$options
value="%s"|args:$selected_category 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"}}
<fieldset class="shortFormRight">
<legend>Filtrer par appartenance</legend>
{{:dropdown
title="Filtrer par appartenance"
options=$prop_options
value="%s"|args:$selected_prop
}} }}
</fieldset> </fieldset>
<div class="shortFormLeft"> <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> </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 {{#list
select=" select="
$$.name AS 'Matériel' ; $$.name AS 'Matériel' ;
@ -96,34 +44,33 @@
FROM @TABLE as cat FROM @TABLE as cat
WHERE cat.key = @TABLE.$$.category) AS 'Catégorie' ; WHERE cat.key = @TABLE.$$.category) AS 'Catégorie' ;
$$.stock AS 'Stock' ; $$.stock AS 'Stock' ;
(SELECT COALESCE($$.notowned, 0)) AS 'Temp' ;
(SELECT $$.stock + COALESCE($$.notowned, 0)) AS 'Total' ;
$$.out AS 'Sorti' ; $$.out AS 'Sorti' ;
(SELECT $$.stock - $$.out) AS 'Disponible' (SELECT $$.stock - $$.out) AS 'Disponible'
" "
type="equipment" 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 order=1
}} }}
{{:assign var=cat_name from=categories.%s|args:$category}} {{:assign var=cat_name from=categories.%s|args:$category}}
<tr> <tr>
{{if $selected_prop == null}} <td>{{:link href="equipment_history.html?key=%s&prop=1"|args:$key" label=$name}}</td>
{{: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>{{$cat_name}}</td> <td>{{$cat_name}}</td>
<td class="num">{{$stock}}</td> <td class="num">{{$stock}}</td>
<td class="num">{{$col4}}</td>
<td class="num">{{$col5}}
<td class="num">{{$out}}</td> <td class="num">{{$out}}</td>
<td class="num">{{$col7}}</td> <td class="num">{{$col5}}</td>
<td class="actions"> <td class="actions">
{{if $col5 > 0}}
{{:linkbutton {{:linkbutton
label="Mouvements" label="Sortie"
href="equipment_history.html?key=%s&prop=1"|args:$key shape="minus"
shape="table"}} 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 {{:linkbutton
label="Modifier" label="Modifier"
href="modify_equipment.html?key=%s&prop=1"|args:$key href="modify_equipment.html?key=%s&prop=1"|args:$key
@ -137,10 +84,7 @@
<script type="text/javascript" src="scripts.js"></script> <script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript"> <script type="text/javascript">
(function () { (function () {
let table = document.querySelector("table[class=list]"); disableColumSort(document.querySelector("table[class=list]"));
if (table != null) { })();
disableColumSort(table);
}
})();
</script> </script>

View file

@ -3,72 +3,57 @@
<nav class="tabs"> <nav class="tabs">
{{if $current == 'inventaire'}} {{if $current == 'inventaire'}}
<aside> <aside>
{{if $subcurrent == 'stock'}} {{if $subsubcurrent == null && $cat == 0}}
{{if $cat == 0}}
{{:linkbutton label="Ajouter une catégorie" shape="plus" href="categories/add_category.html" target="_dialog"}} {{:linkbutton label="Ajouter une catégorie" shape="plus" href="categories/add_category.html" target="_dialog"}}
{{else}} {{else}}
{{:exportmenu right=true}}
{{:linkbutton label="Ajouter un nouveau matériel" shape="plus" href="movements/add_new_equipment.html" target="_dialog"}} {{:linkbutton label="Ajouter un nouveau matériel" shape="plus" href="movements/add_new_equipment.html" target="_dialog"}}
{{/if}} {{/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}}
</aside> </aside>
{{/if}} {{/if}}
<ul> <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 == '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 == '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> <li {{if $current == 'config'}} class="current"{{/if}}><a href="{{$module.url}}categories/index.html">Configuration</a></li>
</ul> </ul>
{{if $current == 'inventaire'}} {{if $current == 'inventaire'}}
{{if $subcurrent == 'mouvements'}}
<ul class="sub"> <ul class="sub">
<li class="title"><strong>Mouvements — {{$eqpmt}} ({{$category}})</strong></li> <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>Historique — {{$eqpmt}} ({{$category}})</strong></li>
</ul> </ul>
{{/if}} {{/if}}
{{elseif $current == 'prêt'}}
<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>
</ul>
{{elseif $current == 'archives'}} {{elseif $current == 'archives'}}
{{if $subcurrent == 'mouvements'}} {{if $subsubcurrent == 'historique'}}
<ul class="sub"> <ul class="sub">
<li class="title"><strong>Historique — {{$eqpmt}} ({{$category}})</strong></li> <li class="title"><strong>Historique — {{$eqpmt}} ({{$category}})</strong></li>
</ul> </ul>
{{/if}} {{/if}}
{{elseif $current == 'config'}} {{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"> <ul class="sub">
<li {{if $subcurrent == 'categories'}} class="current"{{/if}}><a href="{{$module.url}}categories/index.html">Catégories</a></li> <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 == '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 == '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> </ul>
{{/if}} {{/if}}
</nav> </nav>

View file

@ -4,34 +4,12 @@
inventaire des entrées/sorties des matériels temporaires 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 *}} {{* 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"}} {{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}} {{:assign var="categories.%s"|args:$key value=$name}}
{{:assign {{:assign
var="cat_options." var="options."
value=$key value=$key
label=$name label=$name
href="?cat_key=%s&prop=0"|args:$key href="?cat_key=%s&prop=0"|args:$key
@ -42,8 +20,8 @@
<legend>Filtrer par catégorie</legend> <legend>Filtrer par catégorie</legend>
{{:dropdown {{:dropdown
title="Filtrer par catégorie" title="Filtrer par catégorie"
options=$cat_options options=$options
value="%s"|args:$selected_category value="%s"|args:$_GET.cat_key
}} }}
</fieldset> </fieldset>
@ -51,6 +29,14 @@
<p class="help">Inventaire des matériels empruntés ou loués</p> <p class="help">Inventaire des matériels empruntés ou loués</p>
</div> </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 {{#list
select=" select="
$$.name AS 'Matériel' ; $$.name AS 'Matériel' ;
@ -60,7 +46,7 @@
$$.notowned AS 'Quantité' $$.notowned AS 'Quantité'
" "
type="equipment" 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 order=1
}} }}
{{:assign var=cat_name from=categories.%s|args:$category}} {{:assign var=cat_name from=categories.%s|args:$category}}
@ -75,10 +61,6 @@
href="movements/input_equipment.html?key=%s"|args:$key href="movements/input_equipment.html?key=%s"|args:$key
target="_dialog"}} target="_dialog"}}
{{:linkbutton {{:linkbutton
label="Historique"
href="equipment_history.html?key=%s&prop=0"|args:$key
shape="table"}}
{{:linkbutton
label="Modifier" label="Modifier"
href="modify_equipment.html?key=%s&prop=0"|args:$key href="modify_equipment.html?key=%s&prop=0"|args:$key
shape="edit" shape="edit"

View file

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

View file

@ -1,6 +1,9 @@
{{* -*- brindille -*- *}} {{* -*- 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 *}} {{* Traiter l'envoi du formulaire *}}
{{#form on="save"}} {{#form on="save"}}
@ -22,11 +25,6 @@
{{/form}} {{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}} {{: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}} {{:form_errors}}
{{* formulaire d'ajout de catégorie *}} {{* formulaire d'ajout de catégorie *}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{#load key=$_GET.key assign="category"}} {{#load key=$_GET.key assign="category"}}
{{else}} {{else}}
{{:error message="Catégorie introuvable"}} {{:error message="Catégorie introuvable"}}
@ -9,7 +7,7 @@
{{#form on="delete"}} {{#form on="delete"}}
{{* Vérifier s'il reste des matériels dans cette catégorie *}} {{* Vérifier s'il reste des matériels dans cette catégorie *}}
{{#load type="equipment" category=$_GET.key limit="1"}} {{#load type="equipment" category=$_GET.key assign="equipment"}}
{{:redirect force="./index.html?err=1&msg=suppression"}} {{:redirect force="./index.html?err=1&msg=suppression"}}
{{else}} {{else}}
{{* supprimer la catégorie sélectionnée*}} {{* supprimer la catégorie sélectionnée*}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Configuration" current="module_equipment"}} {{:admin_header title="Configuration" current="module_equipment"}}
{{* barre de navigation *}} {{* barre de navigation *}}
@ -29,17 +27,15 @@
{{:assign category_key=$key}} {{:assign category_key=$key}}
{{* voir s'il y a des matériels dans cette catégorie *}} {{* voir s'il y a des matériels dans cette catégorie *}}
{{:assign materiel_present=true}} {{:assign materiel_present=true}}
{{#load type="equipment" where="$$.category = :category_key" :category_key=$category_key limit=1}} {{#load type="equipment" where="$$.category = :category_key" :category_key=$category_key}}
{{else}} {{else}}
{{:assign materiel_present=false}} {{:assign materiel_present=false}}
{{/load}} {{/load}}
<tr> <tr>
<th>{{$name}}</th> <th>{{$name}}</th>
<td class="actions"> <td class="actions">
{{if ! $materiel_present}}
{{:linkbutton label="Supprimer" href="delete_category.html?key=%s"|args:$key shape="delete" target="_dialog"}}
{{/if}}
{{:linkbutton label="Modifier" href="modify_category.html?key=%s"|args:$key shape="edit" target="_dialog"}} {{:linkbutton label="Modifier" href="modify_category.html?key=%s"|args:$key shape="edit" target="_dialog"}}
{{:linkbutton label="Supprimer" href="delete_category.html?key=%s"|args:$key shape="delete" target="_dialog"}}
</td> </td>
</tr> </tr>
{{else}} {{else}}

View file

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

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Configuration" current="module_equipment"}} {{:admin_header title="Configuration" current="module_equipment"}}
{{* barre de navigation *}} {{* barre de navigation *}}
@ -11,22 +9,15 @@
<p class="block confirm">Configuration enregistrée.</p> <p class="block confirm">Configuration enregistrée.</p>
{{/if}} {{/if}}
{{* lecture config *}} {{* 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"}}
{{* 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}}
{{#foreach from=$directions key="direction" item="item"}} {{#foreach from=$directions key="direction" item="item"}}
{{* types de mouvements qui ne peuvent être supprimés *}} {{* types de mouvements qui ne peuvent être supprimés *}}
{{#load type="movement" where="$$.direction='%s'"|args:$direction group="$$.operation"}} {{#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}} {{/load}}
<h2 class="ruler">{{$item|ucfirst}}s</h2> <h2 class="ruler">{{$item|ucfirst}}s</h2>
@ -41,23 +32,15 @@
<tbody> <tbody>
{{:assign var="nature" from="config.%s_nature"|args:$direction}} {{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key=key}} {{#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> <tr>
<td>{{$label}}</td> <td>{{$label}}</td>
<td>{{$type}}</td> <td>{{$type}}</td>
<td class="actions"> <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"}} {{:linkbutton label="Supprimer" shape="delete" href="config/delete_movement_type.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}}
{{/if}} {{/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"}} {{:linkbutton label="Modifier" shape="edit" href="config/modify_movement_type.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}}
{{/if}}
</td> </td>
</tr> </tr>
{{/foreach}} {{/foreach}}

View file

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

View file

@ -1,39 +1,32 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
paramètres : paramètres :
- dir : input ou output - dir : input ou output
*}} *}}
{{* Traiter l'envoi du formulaire *}} {{* barre de navigation *}}
{{if ! $dialog}}
{{* lecture config *}} {{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{: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}} {{/if}}
{{#form on="save"}} {{* Traiter l'envoi du formulaire *}}
{{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 *}} {{* lecture config par défaut *}}
{{:include file="../_get_config.html" keep="config, directions" default=true}}
{{#form on="save"}}
{{* vérifier s'il existe un type de mouvement de même nom *}}
{{#foreach from=$directions key="direction"}} {{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$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}} {{:assign var="fields" from="_POST.%s_fields"|args:$_GET.dir}}
{{if $_GET.dir == $direction && $fields.label|trim|tolower == $elem.label|trim|tolower}} {{if $label|trim|tolower == $fields.label|trim|tolower}}
{{:error message="Le libellé « %s » est déjà présent"|args:$fields.label}} {{:error message="Ce libellé est déjà présent"}}
{{/if}} {{/if}}
{{:assign var="%s_nature"|args:$direction value=$elem}}
{{:assign var="%s_nature.key"|args:$direction value=$key}} {{: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}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/foreach}} {{/foreach}}
@ -44,15 +37,9 @@
{{:assign var="%s_nature.key"|args:$direction value=""|uuid}} {{:assign var="%s_nature.key"|args:$direction value=""|uuid}}
{{:assign var="%s_nature.label"|args:$direction value=$newlabel}} {{:assign var="%s_nature.label"|args:$direction value=$newlabel}}
{{:assign var="%s_nature.type"|args:$direction from="_POST.%s_fields.type"|args:$direction}} {{: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}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
{{:save {{:save
@ -65,16 +52,11 @@
{{/form}} {{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}} {{: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}} {{:form_errors}}
{{if $_GET.dir == 'input'}} {{if $_GET.dir == 'input'}}
{{* types d'entrées *}} {{* types d'entrées *}}
{{#foreach from=$config_defaut.inputs}} {{#foreach from=$config.input_nature}}
{{:assign var='input_types.%s'|args:$type value=$type}} {{:assign var='input_types.%s'|args:$type value=$type}}
{{/foreach}} {{/foreach}}
<form method="post" action=""> <form method="post" action="">
@ -113,7 +95,7 @@
</form> </form>
{{else}} {{else}}
{{* types de sorties *}} {{* types de sorties *}}
{{#foreach from=$config_defaut.outputs}} {{#foreach from=$config.output_nature}}
{{:assign var='output_types.%s'|args:$type value=$type}} {{:assign var='output_types.%s'|args:$type value=$type}}
{{/foreach}} {{/foreach}}
@ -121,6 +103,7 @@
<fieldset> <fieldset>
<legend>Type de sortie</legend> <legend>Type de sortie</legend>
<dl> <dl>
<td>
{{:input type="select" {{:input type="select"
label="Type de sortie" label="Type de sortie"
name="output_fields[type]" name="output_fields[type]"
@ -128,56 +111,26 @@
default=$type default=$type
required=true required=true
default_empty="— Choisir un type —"}} default_empty="— Choisir un type —"}}
</td>
<td>
{{:input {{:input
type="text" type="text"
label="Libellé de la sortie" label="Libellé de la sortie"
name="output_fields[label]" name="output_fields[label]"
required=true}} required=true}}
<div id="tarif"> </td>
{{: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>
</dl> </dl>
<div class="help block"> <div class="help block">
<h3>Signification du type de sortie</h3> <h3>Signification du type de sortie</h3>
<ul> <ul>
<li><b>définitif</b> : le matériel n'appartient plus à l'asso (ex : vente, casse, perte, vol, ...)</li> <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> <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> </ul>
</div> </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> </fieldset>
<p class="submit"> <p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}} {{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p> </p>
</form> </form>
{{/if}} {{/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 -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
paramètres : paramètres :
- dir : input ou output - dir : input ou output
- op_key : clé du type de mouvement à supprimer - 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) *}} {{* 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"}}
{{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}}
{{#form on="delete"}} {{#form on="delete"}}
{{#foreach from=$directions key="direction"}} {{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$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}} {{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.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}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
@ -47,10 +37,6 @@
{{/form}} {{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}} {{: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}} {{:form_errors}}
{{:assign var="mvt_label" from="config.%s_nature.%s.label"|args:$_GET.dir:$_GET.op_key}} {{: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 -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
paramètres : paramètres :
- dir : input ou output - 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) *}} {{* 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"}} {{#form on="save"}}
{{if $_POST.tarif == null && $_POST.name == null}}
{{:redirect to="./config.html"}}
{{/if}}
{{#foreach from=$directions key="direction"}} {{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}} {{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key" item="elem"}} {{#foreach from=$nature key="key"}}
{{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}}
{{:assign var="%s_nature.key"|args:$direction value=$key}} {{:assign var="%s_nature.key"|args:$direction value=$key}}
{{if $_POST.tarif != null && $key == $_GET.op_key}} {{if $_GET.dir == $direction}}
{{:assign var="%s_nature.fee"|args:$direction value=$_POST.tarif}} {{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}} {{/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}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/foreach}} {{/foreach}}
{{/foreach}} {{/foreach}}
@ -51,71 +43,14 @@
{{/form}} {{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}} {{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
{{/if}}
{{:form_errors}} {{: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}} {{:assign var="default_label" from="config.%s_nature.%s.label"|args:$_GET.dir:$_GET.op_key}}
<form method="post" action="" data-focus="1"> <form method="post" action="" data-focus="1">
<fieldset> <fieldset>
<legend>Paramètres</legend> <legend>Modifier le libellé</legend>
<dl> <dl>
{{if $label_mod}}
{{:input type="text" name="name" label="Libellé" default=$default_label required=true maxlength="100"}} {{: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}}
</dl> </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"> <p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}} {{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p> </p>

View file

@ -26,14 +26,7 @@
{ {
"key" : "c9ba00d9-26ee-448b-9f02-73e479ec2980", "key" : "c9ba00d9-26ee-448b-9f02-73e479ec2980",
"label" : "Prêt", "label" : "Prêt",
"type" : "temporaire", "type" : "temporaire"
"fee" : "gratuit"
},
{
"key" : "5c6c20bf-53e9-49dc-bcd6-e3cac23a6786",
"label" : "Location",
"type" : "temporaire",
"fee" : "payant"
}, },
{ {
"key" : "fefefa51-1a85-46ca-ab78-b594b10390ff", "key" : "fefefa51-1a85-46ca-ab78-b594b10390ff",

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
Afficher l'historique des mouvements d'un matériel Afficher l'historique des mouvements d'un matériel
paramètres paramètres
@ -12,6 +10,14 @@
- msg : message de retour - 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}} {{:assign equipment_key=$_GET.key|trim}}
{{#load key=$equipment_key assign="equipment"}} {{#load key=$equipment_key assign="equipment"}}
{{else}} {{else}}
@ -22,88 +28,64 @@
{{else}} {{else}}
{{:error message="Le matériel %s n'appartient à aucune catégorie"|args:$equipment.name}} {{:error message="Le matériel %s n'appartient à aucune catégorie"|args:$equipment.name}}
{{/load}} {{/load}}
{{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}} {{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}}
{{* barre de navigation *}}
{{if $_GET.current != null}} {{if $_GET.current != null}}
{{:assign current=$_GET.current}} {{:assign current=$_GET.current}}
{{else}} {{else}}
{{:assign current="inventaire"}} {{:assign current="inventaire"}}
{{/if}} {{/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 *}} {{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}} {{:include file="./_get_config.html" keep="config"}}
{{* filtrer selon appartenance *}} {{* déterminer les types de mouvements selon l'affection du matériel *}}
{{:assign saved_filters=$module.config.filters}} {{#foreach from=$config.input_nature}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}} {{if $_GET.prop}}
{{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}}
{{* matériel propriété de l'asso *}} {{* matériel propriété de l'asso *}}
{{if $type != 'temporaire'}} {{if $type != 'temporaire'}}
{{:assign var="mvt_keys." value=$key|quote_sql}} {{:assign var="input_types." value=$label}}
{{/if}} {{/if}}
{{else}} {{else}}
{{* matériel non propriété de l'asso *}} {{* matériel non propriété de l'asso *}}
{{if $type == 'temporaire'}} {{if $type == 'temporaire'}}
{{:assign var="mvt_keys." value=$key|quote_sql}} {{:assign var="input_types." value=$label}}
{{:assign var="temp_inputs." value=$key|quote_sql}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
{{#foreach from=$config.output_nature key="key"}} {{#foreach from=$config.output_nature}}
{{if $selected_prop == null}} {{if $_GET.prop}}
{{* 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}}
{{* matériel propriété de l'asso *}} {{* matériel propriété de l'asso *}}
{{if $type != 'retour'}} {{if $type != 'retour'}}
{{:assign var="mvt_keys." value=$key|quote_sql}} {{:assign var="output_types." value=$label}}
{{if $type == "temporaire"}}
{{:assign var="temp_outputs." value=$key|quote_sql}}
{{/if}}
{{/if}} {{/if}}
{{else}} {{else}}
{{* matériel non propriété de l'asso *}} {{* matériel non propriété de l'asso *}}
{{if $type == 'retour'}} {{if $type == 'retour'}}
{{:assign var="mvt_keys." value=$key|quote_sql}} {{:assign var="output_types." value=$label}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{/foreach}} {{/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 *}} {{* calculer et mémoriser les quantités pour que le tri de la liste affiche les valeurs correctes *}}
{{:assign stock=0}} {{:assign stock=0}}
@ -130,237 +112,232 @@
{{:assign nonproprio="%d-%d"|math:$nonproprio:$amount}} {{:assign nonproprio="%d-%d"|math:$nonproprio:$amount}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{:assign dispo_final="%d-%d"|math:$stock:$exterieur}} {{:assign dispo="%d-%d"|math:$stock:$exterieur}}
{{:assign var="quantites.%s.stock"|args:$id value=$stock}} {{:assign var="quantites.%s.stock"|args:$id value=$stock}}
{{:assign var="quantites.%s.exterieur"|args:$id value=$exterieur}} {{:assign var="quantites.%s.exterieur"|args:$id value=$exterieur}}
{{:assign var="quantites.%s.dispo"|args:$id value=$dispo_final}} {{:assign var="quantites.%s.dispo"|args:$id value=$dispo}}
{{:assign var="quantites.%s.nonproprio"|args:$id value=$nonproprio}} {{:assign var="quantites.%s.nonproprio"|args:$id value=$nonproprio}}
{{/load}} {{/load}}
{{if $selected_prop == null || $selected_prop}} {{if $current != "archives"}}
{{* calculer la quantité sortie temporairement de chaque matériel *}} <nav class="tabs">
{{:assign output_ops=$temp_outputs|implode:","}} <aside>
{{:assign output_ops="("|cat:$output_ops|cat:")"}} {{if $_GET.prop && $equipment.stock > 0}}
{{:linkbutton label="Sortie" title="Enregistrer une sortie de ce matériel" shape="minus" href="movements/output_equipment.html?key=%s"|args:$_GET.key target="_dialog"}}
{{/if}}
{{:linkbutton label="Entrée" title="Enregistrer une entrée de ce matériel" 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 {{#select
mvt.key AS mvt_key, mvt.key AS mvt_key,
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS reste json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS reste
FROM !table AS mvt FROM module_data_equipment AS mvt
LEFT JOIN !table AS link ON mvt.key = json_extract(link.document, '$.temp_key') LEFT JOIN module_data_equipment AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN !table AS mvt2 ON mvt2.key = json_extract(link.document, '$.return') LEFT JOIN module_data_equipment AS mvt2 ON mvt2.key = json_extract(link.document, '$.return')
WHERE WHERE
json_extract(mvt.document, '$.operation') IN !op json_extract(mvt.document, '$.operation') IN !op
AND json_extract(mvt.document, '$.equipment') = :eqpmt_key AND json_extract(mvt.document, '$.equipment') = :eqpmt_key
GROUP by mvt.key GROUP by mvt.key
; ;
!table=$module.table !op = $operations
!op = $output_ops
:eqpmt_key = $_GET.key :eqpmt_key = $_GET.key
}} }}
{{:assign var="reste.%s"|args:$mvt_key value=$reste}} {{:assign var="reste.%s"|args:$mvt_key value=$reste}}
{{/select}} {{/select}}
{{/if}}
{{if $selected_prop == null || ! $selected_prop}} {{#list
{{* calculer la quantité présente temporairement de chaque matériel *}} type="movement"
{{:assign input_ops=$temp_inputs|implode:","}} select="
{{:assign input_ops="("|cat:$input_ops|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')
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
: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'; ($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement'; CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement';
$$.operation AS 'Opération'; $$.operation AS 'Opération';
$$.amount AS 'Quantité';" $$.amount AS 'Quantité';
}} '' AS 'Stock';
{{:assign
select_prop="'' AS 'Stock';
'' AS 'Sorti'; '' AS 'Sorti';
'' AS 'Disponible';" '' AS 'Disponible';
}} CASE WHEN $$.user NOT NULL
{{:assign
select_depositaire="CASE WHEN $$.user NOT NULL
THEN (SELECT %s AS nom FROM users WHERE id = $$.user) THEN (SELECT %s AS nom FROM users WHERE id = $$.user)
ELSE '' ELSE ''
END AS 'Dépositaire'; END AS 'Dépositaire';
"|args:$config.user_fields.name_sql
}}
{{:assign
select_non_prop="'' as 'Temporaire';"
}}
{{:assign select_final="
CASE WHEN $$.storage NOT NULL CASE WHEN $$.storage NOT NULL
THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage) THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage)
ELSE '' ELSE ''
END AS 'Stockage'; END AS 'Stockage';
'' AS 'Documents'; $$.comment AS 'Commentaire'
$$.transactions AS 'Écritures' "|args:$config.user_fields.name_sql
"
}}
{{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
}}
</fieldset>
{{* 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 equipment=$equipment_key
order=1 order=1
desc=true }}
}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$operation}} {{: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="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="stock" from="quantites.%s.stock"|args:$id}}
{{:assign var="exterieur" from="quantites.%s.exterieur"|args:$id}} {{:assign var="exterieur" from="quantites.%s.exterieur"|args:$id}}
{{:assign var="dispo" from="quantites.%s.dispo"|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> <tr>
<td>{{$date|date_short}}</td> <td>{{$date|date_short}}</td>
<td>{{$col2}}</td> <td>{{$col2}}</td>
<td class="nosort">{{$op_label}}</td> <td>{{$op_label}}</td>
<td class="num">{{$amount}}</td> <td class="num">{{$amount}}</td>
{{if $selected_prop == null || $selected_prop}}
<td class="num nosort">{{$stock}}</td> <td class="num nosort">{{$stock}}</td>
<td class="num nosort">{{$exterieur}}</td> <td class="num nosort">{{$exterieur}}</td>
<td class="num nosort">{{$dispo}}</td> <td class="num nosort">{{$dispo}}</td>
{{/if}} <td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$col8}}</td>
{{if $selected_prop == null || ! $selected_prop}} <td>{{$col9}}</td>
<td class="num nosort">{{$tempo}}</td> <td>{{$comment}}</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"> <td class="actions">
{{if $current != "archives"}} {{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"}} {{if $direction == "output" && $type_mvt == "temporaire"}}
{{:assign var="temp_ext" from="reste.%s"|args:$key}} {{:assign var="temp_ext" from="reste.%s"|args:$key}}
{{if $temp_ext != null && $temp_ext > 0}} {{if $temp_ext != null && $temp_ext > 0}}
{{:linkbutton {{:linkbutton
label="Retour" label="Retour"
href="movements/output_return.html?key=%s&prop=%s"|args:$key:$prop title="Enregistrer un retour de sortie temporaire"
href="movements/output_return.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="reset" shape="reset"
target="_dialog"}} target="_dialog"}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{if $direction == "input" && $type_mvt == "retour"}}
{{* interdire dupliquer *}}
{{else}}
{{:linkbutton
label="Dupliquer"
href="movements/copy_movement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="plus"
target="_dialog"}}
{{/if}}
{{:linkbutton
label="Modifier"
href="movements/modify_movement.html?key=%s"|args:$key
shape="edit"
target="_dialog"}}
{{:linkbutton
label="Supprimer"
href="movements/delete_movement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="delete"
target="_dialog"}}
{{/if}}
</td>
</tr>
{{/if}}
{{/list}}
{{else}}
{{* calculer la quantité présente temporairement de chaque matériel *}}
{{#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 module_data_equipment AS mvt
LEFT JOIN module_data_equipment AS link ON mvt.key = json_extract(link.document, '$.temp_key')
LEFT JOIN module_data_equipment 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
;
!op = $operations
:eqpmt_key = $_GET.key
}}
{{:assign var="present.%s"|args:$mvt_key value=$present}}
{{/select}}
{{#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';
$$.comment AS 'Commentaire'"
equipment=$equipment_key
order=1
}}
{{: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}}
{{if $direction === "input" && $op_label|in:$input_types ||
$direction === "output"&& $op_label|in:$output_types
}}
{{:assign var="stock" from="quantites.%s.nonproprio"|args:$id}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$col2}}</td>
<td>{{$op_label}}</td>
<td class="num">{{$amount}}</td>
<td class="num nosort">{{$stock}}</td>
<td>{{$col6}}</td>
<td>{{$comment}}</td>
<td class="actions">
{{if $direction == "input" && $type_mvt == "temporaire"}} {{if $direction == "input" && $type_mvt == "temporaire"}}
{{:assign var="temp_in" from="present.%s"|args:$key}} {{:assign var="temp_in" from="present.%s"|args:$key}}
{{if $temp_in != null && $temp_in > 0}} {{if $temp_in != null && $temp_in > 0}}
{{:linkbutton {{:linkbutton
label="Retour" label="Retour"
href="movements/input_return.html?key=%s&prop=%s"|args:$key:$prop title="Enregistrer un retour d'entrée temporaire"
href="movements/input_return.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="reset" shape="reset"
target="_dialog"}} target="_dialog"}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{if $direction == "output" && $type_mvt == "retour"}}
{{* interdire dupliquer *}}
{{else}}
{{:linkbutton {{:linkbutton
label="Détails" label="Dupliquer"
href="movements/movement_details.html?key=%s&prop=%s&from=eh"|args:$key:$prop href="movements/copy_movement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="eye" shape="plus"
}} target="_dialog"}}
{{/if}} {{/if}}
{{:linkbutton
label="Modifier"
href="movements/modify_movement.html?key=%s"|args:$key
shape="edit"
target="_dialog"}}
{{:linkbutton
label="Supprimer"
href="movements/delete_movement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="delete"
target="_dialog"}}
</td> </td>
</tr> </tr>
{{/list}} {{/if}}
{{/list}}
{{/if}}
{{:admin_footer}} {{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script> <script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript"> <script type="text/javascript">
(function () { (function () {
let table = document.querySelector("table[class=list]"); disableColumSort(document.querySelector("table[class=list]"));
if (table != null) { })();
disableColumSort(table);
}
})();
</script> </script>

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
Afficher l'historique de tous les mouvements Afficher l'historique de tous les mouvements
*}} *}}
@ -13,97 +11,12 @@
{{* récupérer la config des entrées/sorties *}} {{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}} {{:include file="./_get_config.html" keep="config"}}
{{* filtrer selon la catégorie *}} {{* Sélecteur catégories *}}
{{:assign saved_filters=$module.config.filters}} {{:assign var="options." value="" label="Toutes les catégories" href="?"}}
{{: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"}}
{{#load type="category" order="$$.name"}} {{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}} {{:assign var="categories.%s"|args:$key value=$name}}
{{:assign {{:assign
var="cat_options." var="options."
value=$key value=$key
label=$name label=$name
href="?cat_key=%s"|args:$key href="?cat_key=%s"|args:$key
@ -114,29 +27,23 @@
<legend>Filtrer par catégorie</legend> <legend>Filtrer par catégorie</legend>
{{:dropdown {{:dropdown
title="Filtrer par catégorie" title="Filtrer par catégorie"
options=$cat_options options=$options
value="%s"|args:$selected_category value="%s"|args:$_GET.cat_key
}} }}
</fieldset> </fieldset>
{{:assign var="prop_options." value="" label="Tous les matériels" href="?prop=-1"}} {{* condition de filtrage *}}
{{:assign var="prop_options." value="1" label="Matériels propriété de l'association" href="?prop=1"}} {{if $_GET.cat_key != null}}
{{:assign var="prop_options." value="0" label="Matériels NON propriété de l'association" href="?prop=0"}} {{: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"> {{* lister tous les mouvements *}}
<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 *}}
{{#list {{#list
type="movement" type="movement"
select="($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date'; 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) THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage)
ELSE '' ELSE ''
END as 'Stockage'; END as 'Stockage';
$$.comment AS 'Remarque' $$.comment AS 'Commentaire'
"|args:$config.user_fields.name_sql "|args:$config.user_fields.name_sql
where="%s AND %s"|args:$cat_condition:$prop_condition where="%s"|args:$condition
order=1 order=1
max=50 max=50
desc=true desc=true
@ -181,10 +88,7 @@
<script type="text/javascript" src="scripts.js"></script> <script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript"> <script type="text/javascript">
(function () { (function () {
let table = document.querySelector("table[class=list]"); disableColumSort(document.querySelector("table[class=list]"));
if (table != null) { })();
disableColumSort(table);
}
})();
</script> </script>

View file

@ -1,23 +1,18 @@
{{* -*- brindille -*- *}} {{* -*- 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"}} {{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}}
{{if ! $is_admin}} {{* barre de navigation *}}
{{:assign var="user.id" value=$logged_user.id}} {{if $_GET.prop == null || $_GET.prop}}
{{:include file="snippets/my_details.html"}} {{:assign proprio="proprio"}}
{{else}} {{else}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}} {{:assign proprio="nonproprio"}}
{{/if}}
{{#load type="category" count=true limit=1 assign="result"}}{{/load}} {{#load type="category" count=true assign="result"}}{{/load}}
{{:include file="_nav.html" current="inventaire" cat="%d"|args:$result.count subcurrent="stock"}} {{:include file="_nav.html" current="inventaire" cat="%d"|args:$result.count subcurrent="%s"|args:$proprio}}
{{if $_GET.ok}} {{if $_GET.ok}}
{{if $_GET.msg == "ajout" }} {{if $_GET.msg == "ajout" }}
<p class="block confirm">Ajout effectué</p> <p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "modification" }} {{elseif $_GET.msg == "modification" }}
@ -27,15 +22,18 @@
{{elseif $_GET.msg == "supprmvtmat" }} {{elseif $_GET.msg == "supprmvtmat" }}
<p class="block confirm">Mouvement supprimé - Matériel supprimé</p> <p class="block confirm">Mouvement supprimé - Matériel supprimé</p>
{{/if}} {{/if}}
{{elseif $_GET.err}} {{elseif $_GET.err}}
<p class="block error">Modification refusée</p> <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}}
{{/if}} {{/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,199 +0,0 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{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 *}}
{{: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}}
{{/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 premier=true}}
{{#select
users.nom AS nom,
users.id AS user,
mvt.key AS mvt_key,
json_extract(mat.document, '$.name') AS mat_name,
json_extract(mvt.document, '$.date') AS out_date,
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
GROUP BY mvt.key
HAVING remain != 0
ORDER BY out_date DESC, nom
;
!table=$module.table
!op = $out_keys
!cat_condition=$cat_condition
}}
{{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>
</tr>
</thead>
<tbody>
{{:assign premier=false}}
{{/if}}
{{if $return_date != null}}
{{:assign ts_retour=$return_date|strtotime}}
{{:assign nb_jours="floor((%d-%d)/(60*60*24))"|math:$now:$ts_retour}}
{{/if}}
<tr>
<td>{{$mat_name}}</td>
<td>{{$out_date|date_short}}</td>
<td>{{$out_amount}}</td>
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$nom}}</td>
<td>{{$return_date|date_short}}</td>
<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}}
</td>
<td class="actions">
{{: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}}
<p class="block alert">Aucun mouvement.</p>
{{/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 -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
Paramètres : Paramètres :
- key : clé du matériel à modifier - key : clé du matériel à modifier

View file

@ -1,10 +1,8 @@
name="Gestion des matériels" 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 (en test)."
author="Jean-Christophe Engel" author="Jean-Christophe Engel"
author_url="https://gitea.zaclys.com/lesanges" author_url="https://gitea.zaclys.com/lesanges"
home_button=true home_button=true
menu=true menu=true
restrict_section="connect" restrict_section="accounting"
restrict_level="read" restrict_level="write"
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

View file

@ -1,6 +1,9 @@
{{* -*- brindille -*- *}} {{* -*- 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 *}} {{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}} {{:include file="../_get_config.html" keep="config"}}
@ -117,10 +120,6 @@
{{/form}} {{/form}}
{{:admin_header title="Entrée de matériel" current="module_equipment"}} {{: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}} {{:form_errors}}
{{if $categories != null}} {{if $categories != null}}
@ -134,23 +133,23 @@
<fieldset class="entree"> <fieldset class="entree">
<legend>Informations obligatoires</legend> <legend>Informations obligatoires</legend>
<dl> <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}} {{if $input_labels|count == 1}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels}} {{:input type="select" name="operation" label="Type" required=true options=$input_labels}}
{{else}} {{else}}
{{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$input_labels|sort}} {{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$input_labels|sort}}
{{/if}} {{/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}} {{if $categories|count == 1}}
{{:input type="select" name="category" label="Catégorie" options=$categories required=true}} {{:input type="select" name="category" label="Catégorie" options=$categories required=true}}
{{else}} {{else}}
{{:input type="select" name="category" label="Catégorie" default_empty="— Aucune —" options=$categories required=true}} {{:input type="select" name="category" label="Catégorie" default_empty="— Aucune —" options=$categories required=true}}
{{/if}} {{/if}}
{{:input type="text" name="name" label="Désignation" required=true}}
</dl> </dl>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Autres informations</legend> <legend>Informations facultatives</legend>
<dl> <dl>
{{if $storage != null}} {{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}} {{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
Dupliquer un mouvement Dupliquer un mouvement
paramètres : paramètres :
@ -96,15 +94,6 @@
{{:assign var="mvt_new.date" value=$_POST.date|parse_date}} {{:assign var="mvt_new.date" value=$_POST.date|parse_date}}
{{:assign var="mvt_new.comment" value=$_POST.comment}} {{: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}}
{{else}}
{{:assign return_date=null}}
{{/if}}
{{* {{*
lister les mouvements lister les mouvements
- insérer le mvt copié à sa place par date croissante - insérer le mvt copié à sa place par date croissante
@ -209,41 +198,18 @@
user=$user.id user=$user.id
storage=$_POST.storage storage=$_POST.storage
transactions=$transactions transactions=$transactions
return_date=$return_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}} {{: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}}
{{/form}} {{/form}}
{{if $mvt_new.direction == "input"}} {{:admin_header title="Dupliquer un mouvement" custom_css="./../style.css" current="module_equipment"}}
{{:assign mvt_label="entrée"}}
{{else}}
{{:assign mvt_label="sortie"}}
{{/if}}
{{:admin_header title="Dupliquer une %s"|args:$mvt_label custom_css="./../style.css" current="module_equipment"}}
{{:form_errors}} {{:form_errors}}
{{* {{*
-------------------- Préparer la saisie -------------------- -------------------- Préparer la saisie --------------------
*}} *}}
{{* récupérer les infos de la catégorie *}}
{{#load key=$equipment.category assign="category"}}{{/load}} {{#load key=$equipment.category assign="category"}}{{/load}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}} {{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}}
@ -271,18 +237,17 @@
<fieldset> <fieldset>
<legend>Informations obligatoires</legend> <legend>Informations obligatoires</legend>
<dl> <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"}} {{if $mvt_new.direction == "input"}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}} {{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}}
{{else}} {{else}}
{{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}} {{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}}
{{/if}} {{/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> </dl>
</fieldset> </fieldset>
<fieldset class="entree"> <fieldset class="entree">
<legend>Autres informations</legend> <legend>Informations facultatives</legend>
<dl> <dl>
{{if $prop == 1 && $mvt_new.direction == "output"}} {{if $prop == 1 && $mvt_new.direction == "output"}}
{{:input {{:input
@ -295,28 +260,15 @@
max=1 max=1
}} }}
{{/if}} {{/if}}
{{if $mvt_new.direction == "input" && $storage != null}} {{if $mvt_new.direction == "input"}}
{{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}} {{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}
{{/if}} {{/if}}
{{if $type_mvt != "retour"}} {{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"}} {{:input type="list" name="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.return_date != null}}
{{: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}}
{{/if}}
<div id="div_return_date">
{{: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}} {{/if}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
</dl> </dl>
</fieldset> </fieldset>
@ -327,29 +279,3 @@
</form> </form>
{{:admin_footer}} {{: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 () {
document.getElementById('f_operation').onchange = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange();
})();
</script>

View file

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

View file

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

View file

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

View file

@ -1,7 +1,5 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
Modifier un mouvement Modifier un mouvement
paramètres : paramètres :
@ -16,6 +14,21 @@
{{* récupérer la config des entrées/sorties *}} {{* 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"}}
{{: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 *}} {{* infos pour affichage *}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}} {{: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}} {{:error message="Aucun matériel avec la clé « %s »"|args:$eqpmt_key}}
{{/load}} {{/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 -------------------- -------------------- Traiter la saisie --------------------
*}} *}}
{{#form on="save"}} {{#form on="save"}}
{{* vérifier la validité de la saisie *}}
{{if $_POST.amount <= 0}} {{if $_POST.amount <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}} {{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{/if}} {{/if}}
{{* vérifier validité des données *}}
{{if $_POST.date|parse_date|strtotime > $now}} {{if $_POST.date|parse_date|strtotime > $now}}
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}} {{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}} {{/if}}
@ -61,16 +84,6 @@
{{:assign var="mvt_new.amount" value=$_POST.amount}} {{:assign var="mvt_new.amount" value=$_POST.amount}}
{{:assign var="mvt_new.date" value=$_POST.date|parse_date}} {{:assign var="mvt_new.date" value=$_POST.date|parse_date}}
{{:assign var="mvt_new.comment" value=$_POST.comment}} {{: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}}
{{else}}
{{:assign return_date=null}}
{{/if}}
{{* {{*
lister les mouvements lister les mouvements
@ -79,7 +92,10 @@
*}} *}}
{{:assign insere=false}} {{:assign insere=false}}
{{#load {{#load
where="$$.type = 'movement' AND $$.equipment = :eqpmt_key" where="
$$.type = 'movement'
AND
$$.equipment = :eqpmt_key"
:eqpmt_key=$eqpmt_key :eqpmt_key=$eqpmt_key
order="$$.date" order="$$.date"
assign="movement" assign="movement"
@ -181,7 +197,7 @@
{{* enregistrer le mouvement modifié *}} {{* enregistrer le mouvement modifié *}}
{{if $user == null}} {{if $user == null}}
{{:assign user_id=null}} {{:assign user_id=$mvt_new.user}}
{{else}} {{else}}
{{:assign user_id=$user.id}} {{:assign user_id=$user.id}}
{{/if}} {{/if}}
@ -199,49 +215,11 @@
user=$user_id user=$user_id
storage=$_POST.storage storage=$_POST.storage
transactions=$transactions transactions=$transactions
return_date=$return_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}} {{: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}}
{{/form}} {{/form}}
{{if $mvt_new.direction == "input"}} {{:admin_header title="Modifier un mouvement" custom_css="./../style.css" current="module_equipment"}}
{{:assign mvt_label="entrée"}}
{{else}}
{{:assign mvt_label="sortie"}}
{{/if}}
{{:admin_header title="Modifier une %s"|args:$mvt_label custom_css="./../style.css" current="module_equipment"}}
{{:form_errors}} {{:form_errors}}
{{* {{*
@ -250,22 +228,15 @@
{{#load key=$equipment.category assign="category"}}{{/load}} {{#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}} {{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}} {{#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}} {{:assign var="user.%s"|args:$id value=$nom}}
{{/select}} {{/select}}
{{#load type="link" where="$$.direction="output" AND $$.temp_key = :mvt_key" :mvt_key=$mvt_new.key limit=1}}
{{:assign retour=true}}
{{else}}
{{:assign retour=false}}
{{/load}}
{{/if}} {{/if}}
{{#load type="storage" order="$$.name"}} {{#load type="storage" order="$$.name"}}
@ -294,20 +265,19 @@
<fieldset> <fieldset>
<legend>Informations obligatoires</legend> <legend>Informations obligatoires</legend>
<dl> <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"}} {{if $mvt_new.direction == "input"}}
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}} {{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}}
{{else}} {{else}}
{{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}} {{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}}
{{/if}} {{/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> </dl>
</fieldset> </fieldset>
<fieldset class="entree"> <fieldset class="entree">
<legend>Autres informations</legend> <legend>Informations facultatives</legend>
<dl> <dl>
{{if $mvt_new.direction == "output" && $type_mvt != "retour"}} {{if $prop == 1 && $mvt_new.direction == "output" && ! $retour}}
{{:input {{:input
type="list" type="list"
name="user" name="user"
@ -318,28 +288,15 @@
max=1 max=1
}} }}
{{/if}} {{/if}}
{{if $mvt_new.direction == "input" && $storage != null}} {{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}} {{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}}
{{/if}} {{/if}}
{{if $type_mvt != "retour"}} {{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"}} {{: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}} {{/if}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}} {{: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.return_date != null}}
{{: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}}
{{/if}}
<div id="div_return_date">
{{: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> </dl>
</fieldset> </fieldset>
@ -350,29 +307,3 @@
</form> </form>
{{:admin_footer}} {{: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 () {
document.getElementById('f_operation').onchange = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange();
})();
</script>

View file

@ -46,11 +46,6 @@
"items": { "items": {
"type": "integer" "type": "integer"
} }
},
"return_date" : {
"description": "Date de retour du matériel",
"type" : ["null", "string"],
"format" : "date"
} }
}, },
"required": ["type", "direction", "operation", "amount", "equipment", "date", "comment"] "required": ["type", "direction", "operation", "amount", "equipment", "date", "comment"]

View file

@ -1,119 +0,0 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{*
Afficher les détails d'un mouvement et donner la possibilité :
- d'associer des fichiers
- de modifier, supprimer ou dupliquer le mouvement
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"}}
{{:form_errors}}
{{* récupérer les infos du mouvement *}}
{{#load key=$_GET.key assign="mvt"}}
{{else}}
{{:error message="Aucun mouvement avec la clé %s"|args:$_GET.key}}
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt.direction:$mvt.operation}}
{{* récupérer les infos du matériel associé *}}
{{#load key=$mvt.equipment assign="equipment"}}
{{else}}
{{:error message="Aucun matériel avec la clé « %s »"|args:$mvt.equipment}}
{{/load}}
{{*
-------------------- Afficher les informations du mouvement --------------------
*}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt.direction:$mvt.operation}}
{{#load key=$equipment.category assign="category"}}{{/load}}
{{#load key=$mvt.storage assign="storage"}}{{/load}}
{{#select !name as nom FROM users WHERE id=:id; !name=$config.user_fields.name_sql :id=$mvt.user}}
{{:assign user_name=$nom}}
{{/select}}
<nav class="tabs">
{{:linkbutton
label="Modifier ce mouvement"
href="modify_movement.html?key=%s&from=%s"|args:$_GET.key:$_GET.from
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
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
shape="plus"
target="_dialog"}}
{{/if}}
</nav>
<dl class="describe">
<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>
<dt>Catégorie</dt>
<dd>{{:link href="../index.html?cat_key=%s&prop=1"|args:$category.key label=$category.name}}</dd>
<dt>Date</dt>
<dd>{{$mvt.date|date_short}}</dd>
<dt>Quantité</dt>
<dd>{{$mvt.amount}}</dd>
{{if $mvt.direction == "output" && $type_mvt != "retour"}}
<dt>Membre destinataire</dt>
<dd>
{{if $mvt.user != null}}
{{:link href="/admin/users/details.php?id=%s"|args:$mvt.user label=$user_name}}
{{else}}—
{{/if}}
</dd>
{{/if}}
{{if $mvt.direction == "input"}}
<dt>Lieu de stockage</dt>
<dd>
{{if $storage != null}}
{{$storage.name}}
{{else}}—
{{/if}}
</dd>
{{/if}}
<dt>Écritures liées</dt>
<dd>
{{#foreach from=$mvt.transactions item="trans"}}
{{:link class="num" href="!acc/transactions/details.php?id=%d"|args:$trans label=$trans}}
{{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>
</dl>
{{:admin_files path=$mvt.key upload=true edit=true use_trash=false}}
{{:admin_footer}}

View file

@ -1,11 +1,8 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{* {{*
paramètres : paramètres :
- key : clé du matériel à sortir - 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 *}} {{* récupérer la config des entrées/sorties *}}
@ -13,17 +10,7 @@
{{* types de sorties *}} {{* types de sorties *}}
{{#foreach from=$config.output_nature key=key}} {{#foreach from=$config.output_nature key=key}}
{{if $type == 'retour'}} {{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'}}
{{:assign var="output_labels.%s"|args:$key value=$label}} {{:assign var="output_labels.%s"|args:$key value=$label}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
@ -33,31 +20,17 @@
{{* Traiter l'envoi du formulaire *}} {{* Traiter l'envoi du formulaire *}}
{{#form on="save"}} {{#form on="save"}}
{{* vérifier la validité de la saisie *}}
{{* interdire date dans le futur *}} {{* interdire date dans le futur *}}
{{if $_POST.date|parse_date|strtotime > $now}} {{if $_POST.date|parse_date|strtotime > $now}}
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}} {{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}} {{/if}}
{{* vérifier les infos saisies *}}
{{if $_POST.operation == ""}} {{if $_POST.operation == ""}}
{{:error message="Vous devez choisir un type de sortie"}} {{:error message="Vous devez choisir un type de sortie"}}
{{/if}} {{/if}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}} {{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt != "temporaire" && $_POST.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}}
{{else}}
{{:assign return_date=null}}
{{/if}}
{{if $_POST.user|count > 1}} {{if $_POST.user|count > 1}}
{{:error message="Un membre au plus peut être associé à une sortie"}} {{:error message="Un membre au plus peut être associé à une sortie"}}
{{/if}} {{/if}}
@ -144,11 +117,6 @@
{{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$_POST.amount|intval}} {{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$_POST.amount|intval}}
{{/if}} {{/if}}
{{* écritures liées *}}
{{#foreach from=$_POST.transactions item="value"}}
{{:assign var="transactions." value=$value|intval}}
{{/foreach}}
{{:save {{:save
key=$equipment.key key=$equipment.key
validate_schema="../equipment.schema.json" validate_schema="../equipment.schema.json"
@ -174,8 +142,6 @@
date=$_POST.date|parse_date date=$_POST.date|parse_date
comment=$_POST.remarques|trim comment=$_POST.remarques|trim
user=$user.id user=$user.id
return_date=$return_date
transactions=$transactions
}} }}
{{:redirect force="../equipment_history.html?ok=1&key=%s&prop=1&msg=sortie"|args:$_GET.key}} {{:redirect force="../equipment_history.html?ok=1&key=%s&prop=1&msg=sortie"|args:$_GET.key}}
{{/form}} {{/form}}
@ -185,16 +151,11 @@
{{* barre de navigation *}} {{* barre de navigation *}}
{{:include file="../_nav.html" current="sorties"}} {{:include file="../_nav.html" current="sorties"}}
{{/if}} {{/if}}
{{:form_errors}}
{{#load key=$equipment.category assign="category"}}{{/load}} {{#load key=$equipment.category assign="category"}}{{/load}}
{{:assign dispo="%d-%d"|math:$equipment.stock:$equipment.out}} {{:assign dispo="%d-%d"|math:$equipment.stock:$equipment.out}}
{{if $dispo > 0}} {{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}}
{{* formulaire de sortie de matériel *}} {{* formulaire de sortie de matériel *}}
<form method="post" action=""> <form method="post" action="">
@ -212,17 +173,17 @@
<fieldset class="sortie"> <fieldset class="sortie">
<legend>Informations obligatoires</legend> <legend>Informations obligatoires</legend>
<dl> <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="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}} {{: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> </dl>
</fieldset> </fieldset>
<fieldset class="entree"> <fieldset class="entree">
<legend>Autres informations</legend> <legend>Informations facultatives</legend>
<dl> <dl>
{{:input {{:input
type="list" type="list"
@ -232,12 +193,7 @@
multiple=true multiple=true
max=1 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}} {{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}}
<div id="div_return_date">
{{: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}}">
</div>
</dl> </dl>
</fieldset> </fieldset>
<p class="submit"> <p class="submit">
@ -248,30 +204,5 @@
<p class="block error">Il n'y a aucune unité de ce matériel disponible à la date du {{$now|date_short}}</p> <p class="block error">Il n'y a aucune unité de ce matériel disponible à la date du {{$now|date_short}}</p>
{{/if}} {{/if}}
{{:form_errors}}
{{:admin_footer}} {{: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 () {
document.getElementById('f_operation').onchange = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange();
})();
</script>

View file

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

View file

@ -25,51 +25,3 @@ function disableColumSort(liste) {
} }
} }
} }
/**
* renvoyer la valeur en secondes d'une date au format j/m/a
* @param {string} date
*/
function str2sec(date) {
const jma = date.split('/');
const dd = new Date(jma[2], jma[1]-1, jma[0]);
return dd.getTime()/1000;
}
// renvoyer la valeur en secondes d'un champ 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,167 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{#restrict section="users" level="read"}}{{/restrict}} {{#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}}
{{* 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"}}
{{#select
eqpmt.key as eqpmt_key,
json_extract(eqpmt.document, '$.name') as eqpmt_name,
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
FROM module_data_equipment AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN module_data_equipment AS eqpmt
ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE users.id = :user
AND (json_extract(mvt.document, '$.operation') IN !output_types
OR json_extract(mvt.document, '$.operation') IN !input_types)
ORDER BY date
;
:user = $user.id
!output_types=$output_types.temporaire
!input_types=$input_types.retour
assign="temp_mat."
}}
{{/select}}
{{/if}}
{{if $temp_mat|count != 0}}
<h3 class="ruler">Matériels attribués temporairement</h3>
<table class="list">
<thead>
<tr>
<td>Date</td>
<td>Opération</td>
<td>Matériel</td>
<td>Quantité</td>
<td>Total</td>
<td class="actions"></td>
</tr>
</thead>
<tbody>
{{#foreach from=$temp_mat}}
{{: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:$eqpmt_key}}
{{if $total == null}}
{{:assign total=0}}
{{/if}}
{{if $direction == 'input' && $type_mvt == 'retour'}}
{{:assign var="reste.%s"|args:$eqpmt_key value="%d-%d"|math:$total:$amount}}
{{elseif $direction == 'output' && $type_mvt == 'temporaire'}}
{{:assign var="reste.%s"|args:$eqpmt_key value="%d+%d"|math:$total:$amount}}
{{/if}}
{{:assign var="total" from="reste.%s"|args:$eqpmt_key}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$op_label}}</td>
<td>{{$eqpmt_name}}</td>
<td>{{$amount}}</td>
<td>{{$total}}</td>
<td class="actions">
{{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:$user.id
shape="history"
target="_dialog"}}
{{/if}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/if}}
{{* vérifier la présence des types d'entrées et 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,
json_extract(mvt.document, '$.date') as date,
json_extract(mvt.document, '$.amount') as amount
FROM module_data_equipment AS mvt
INNER JOIN users ON json_extract(mvt.document, '$.user') = users.id
INNER JOIN module_data_equipment AS eqpmt
ON json_extract(mvt.document, '$.equipment') = eqpmt.key
WHERE users.id = :user
AND json_extract(mvt.document, '$.operation') IN !output_types
ORDER BY date DESC
;
: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>
<td>Date</td>
<td>Opération</td>
<td>Matériel</td>
<td>Quantité</td>
<td>Total</td>
</tr>
</thead>
<tbody>
{{#foreach from=$def_mat}}
{{: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:$eqpmt_key}}
{{if $total == null}}
{{:assign total=0}}
{{/if}}
{{if $direction == 'output' && $type_mvt == 'définitif'}}
{{:assign var="reste.%s"|args:$eqpmt_key value="%d+%d"|math:$total:$amount}}
{{/if}}
{{:assign var="total" from="reste.%s"|args:$eqpmt_key}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$op_label}}</td>
<td>{{$eqpmt_name}}</td>
<td>{{$amount}}</td>
<td>{{$total}}</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/if}}
{{/if}}

View file

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

View file

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

View file

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

View file

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

View file

@ -21,10 +21,6 @@
} }
/* désactiver rétroaction pour colonnes non triables */ /* désactiver rétroaction pour colonnes non triables */
table.list > thead th[class~=nosort] a:hover { table.list > thead td[class~=nosort] a:hover {
background-color : rgba(var(--gSecondColor), 0.); background-color : rgba(var(--gSecondColor), 0.);
} }
.nombre {
text-align: right !important;
}

View file

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