diff --git a/_get_config.html b/_get_config.html index 119a20b..0ebc002 100644 --- a/_get_config.html +++ b/_get_config.html @@ -16,21 +16,13 @@ {{:assign var="nature" from="module.config.%s_nature"|args:$direction}} {{if $nature != null}} {{#foreach from=$nature item="elem"}} - {{:assign var="item" label=$label type=$type}} - {{:assign var="config.%s_nature.%s"|args:$direction:$key value=$item}} + {{:assign var="config.%s_nature.%s"|args:$direction:$key value=$elem}} {{/foreach}} {{else}} {{* pas de config enregistrée : utiliser la config par défaut *}} {{:assign var="nature" from="config_defaut.%ss"|args:$direction}} {{#foreach from=$nature item="elem"}} - {{:assign var="item" label=$label type=$type}} - {{:assign var="config.%s_nature.%s"|args:$direction:$key value=$item}} + {{:assign var="config.%s_nature.%s"|args:$direction:$key value=$elem}} {{/foreach}} {{/if}} {{/foreach}} - -{{if $module.config.loan_duration != null}} - {{:assign loan_duration=$module.config.loan_duration}} -{{else}} - {{:assign loan_duration=$config_defaut.loan_duration}} -{{/if}} diff --git a/_inventory.html b/_inventory.html index 090a01d..ce8cffc 100644 --- a/_inventory.html +++ b/_inventory.html @@ -1,40 +1,65 @@ {{* -*- brindille -*- *}} {{* - inventaire des entrées/sorties des matériels permanents + Inventaire des matériels en stock dans l'association *}} {{* filtrer selon la catégorie *}} +{{:assign saved_filters=$module.config.filters}} +{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}} + {{if $_GET.cat_key == null}} - {{:assign selected_category=$module.config.stock_cat_key}} - {{if $module.config.stock_cat_key != null}} - {{:assign cat_key=$selected_category|quote_sql}} - {{/if}} -{{elseif $_GET.cat_key == -1}} - {{:assign selected_category=null}} - {{:save key="config" stock_cat_key=null}} + {{:assign selected_category=$user_filters.stock_cat_key}} {{else}} - {{:assign selected_category=$_GET.cat_key}} - {{:assign cat_key=$selected_category|quote_sql}} - {{:save key="config" stock_cat_key=$selected_category}} + {{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}} -{{* Sélecteur catégories *}} -{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1&prop=1"}} +{{* 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"}} {{:assign var="categories.%s"|args:$key value=$name}} {{:assign var="cat_options." value=$key label=$name - href="?cat_key=%s&prop=1"|args:$key + href="?cat_key=%s"|args:$key }} {{/load}} @@ -47,8 +72,21 @@ }} +{{: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"}} + +
+ Filtrer par appartenance + {{:dropdown + title="Filtrer par appartenance" + options=$prop_options + value="%s"|args:$selected_prop + }} +
+
-

Inventaire des matériels propriété de l'association

+

Inventaire des matériels présents dans l'association

{{#list @@ -58,35 +96,32 @@ FROM @TABLE as cat WHERE cat.key = @TABLE.$$.category) AS 'Catégorie' ; $$.stock AS 'Stock' ; + (SELECT COALESCE($$.notowned, 0)) AS 'Temp' ; + (SELECT $$.stock + COALESCE($$.notowned, 0)) AS 'Total' ; $$.out AS 'Sorti' ; (SELECT $$.stock - $$.out) AS 'Disponible' " type="equipment" - where="$$.status <> 'archived' AND $$.stock NOT NULL AND %s"|args:$cat_condition + where="$$.status <> 'archived' AND %s AND %s"|args:$cat_condition:$prop_condition order=1 }} {{:assign var=cat_name from=categories.%s|args:$category}} - {{:link href="equipment_history.html?key=%s&prop=1"|args:$key" label=$name}} + {{if $selected_prop == null}} + {{:assign prop=""}} + {{else}} + {{:assign prop="&prop=%s"|args:$selected_prop}} + {{/if}} + {{:link href="equipment_history.html?key=%s&prop=%s"|args:$key:$selected_prop label=$name}} {{$cat_name}} {{$stock}} + {{$col4}} + {{$col5}} {{$out}} - {{$col5}} + {{$col7}} - {{if $col5 > 0}} - {{:linkbutton - label="Sortie" - shape="minus" - href="movements/output_equipment.html?key=%s"|args:$key - target="_dialog"}} - {{/if}} - {{:linkbutton - label="Entrée" - shape="plus" - href="movements/input_equipment.html?key=%s"|args:$key - target="_dialog"}} {{:linkbutton - label="Historique" + label="Mouvements" href="equipment_history.html?key=%s&prop=1"|args:$key shape="table"}} {{:linkbutton diff --git a/_nav.html b/_nav.html index 3a79414..c615e3d 100644 --- a/_nav.html +++ b/_nav.html @@ -3,66 +3,72 @@ diff --git a/_temp_inventory.html b/_temp_inventory.html index d4b29d4..df4f8aa 100644 --- a/_temp_inventory.html +++ b/_temp_inventory.html @@ -4,34 +4,12 @@ inventaire des entrées/sorties des matériels temporaires *}} -{{* filtrer selon la catégorie *}} -{{if $_GET.cat_key == null}} - {{:assign selected_category=$module.config.temp_cat_key}} - {{if $module.config.temp_cat_key != null}} - {{:assign cat_key=$selected_category|quote_sql}} - {{/if}} -{{elseif $_GET.cat_key == -1}} - {{:assign selected_category=null}} - {{:save key="config" temp_cat_key=null}} -{{else}} - {{:assign selected_category=$_GET.cat_key}} - {{:assign cat_key=$selected_category|quote_sql}} - {{:save key="config" temp_cat_key=$selected_category}} -{{/if}} - -{{* condition de filtrage *}} -{{if $selected_category != null}} - {{:assign cat_condition="$$.category = %s"|args:$cat_key}} -{{else}} - {{:assign cat_condition="1"}} -{{/if}} - {{* Sélecteur catégories *}} -{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1&prop=0"}} +{{:assign var="options." value="" label="Toutes les catégories" href="?prop=0"}} {{#load type="category" order="$$.name"}} {{:assign var="categories.%s"|args:$key value=$name}} {{:assign - var="cat_options." + var="options." value=$key label=$name href="?cat_key=%s&prop=0"|args:$key @@ -42,8 +20,8 @@ Filtrer par catégorie {{:dropdown title="Filtrer par catégorie" - options=$cat_options - value="%s"|args:$selected_category + options=$options + value="%s"|args:$_GET.cat_key }} @@ -51,6 +29,14 @@

Inventaire des matériels empruntés ou loués

+{{* filtrer selon la catégorie *}} +{{if $_GET.cat_key == null}} + {{:assign condition="1"}} +{{else}} + {{:assign cat_key=$_GET.cat_key|quote_sql}} + {{:assign condition="$$.category = %s"|args:$cat_key}} +{{/if}} + {{#list select=" $$.name AS 'Matériel' ; @@ -60,7 +46,7 @@ $$.notowned AS 'Quantité' " type="equipment" - where="$$.status <> 'archived' AND $$.notowned != 0 AND %s"|args:$cat_condition + where="$$.status <> 'archived' AND $$.notowned != 0 AND %s"|args:$condition order=1 }} {{:assign var=cat_name from=categories.%s|args:$category}} diff --git a/archives.html b/archives.html index 261673c..5525aab 100644 --- a/archives.html +++ b/archives.html @@ -9,11 +9,30 @@

Matériel remis en service

{{/if}} +{{* filtrer selon la catégorie *}} +{{if $_GET.cat_key == null}} + {{:assign selected_category=$module.config.archive_cat_key}} +{{elseif $_GET.cat_key == -1}} + {{:assign selected_category=null}} + {{:save key="config" archive_cat_key=null}} +{{else}} + {{:assign selected_category=$_GET.cat_key}} + {{:save key="config" archive_cat_key=$selected_category}} +{{/if}} + +{{* condition de filtrage *}} +{{if $selected_category == null}} + {{:assign cat_condition="1"}} +{{else}} + {{:assign cat_key=$selected_category|quote_sql}} + {{:assign cat_condition="$$.category == %s"|args:$cat_key}} +{{/if}} + {{* Sélecteur catégories *}} -{{:assign var="options." value="" label="Toutes les catégories" href="?prop=1"}} +{{:assign var="cat_options." value="" label="Toutes les catégories" href="?cat_key=-1"}} {{#load type="category" order="$$.name"}} {{:assign - var="options." + var="cat_options." value=$key label=$name href="?cat_key=%s"|args:$key @@ -24,8 +43,8 @@ Filtrer par catégorie {{:dropdown title="Filtrer par catégorie" - options=$options - value="%s"|args:$_GET.cat_key + options=$cat_options + value="%s"|args:$selected_category }} @@ -33,14 +52,6 @@

Matériels qui ne sont plus dans l'association

-{{* filtrer selon la catégorie *}} -{{if $_GET.cat_key == null}} - {{:assign condition="1"}} -{{else}} - {{:assign cat_key=$_GET.cat_key|quote_sql}} - {{:assign condition="$$.category == %s"|args:$cat_key}} -{{/if}} - {{* Liste des matériels archivés *}} {{#list select=" @@ -50,16 +61,16 @@ WHERE cat.key = @TABLE.$$.category) AS "Catégorie" " type="equipment" - where="$$.status='archived' AND %s"|args:$condition + where="$$.status='archived' AND %s"|args:$cat_condition order=1 }} - {{$name}} + {{:link href="equipment_history.html?key=%s&prop=1¤t=archives"|args:$key label=$name}} {{$col2}} {{:linkbutton - label="Historique" + label="Mouvements" href="equipment_history.html?key=%s&prop=1¤t=archives"|args:$key shape="table"}} {{:linkbutton diff --git a/config.html b/config.html index 9927c5e..f4bab4a 100644 --- a/config.html +++ b/config.html @@ -11,15 +11,22 @@

Configuration enregistrée.

{{/if}} -{{* lecture config (défaut ou enregistrée) *}} -{{:include file="./_get_config.html" keep="config, directions"}} +{{* lecture config *}} +{{:include file="./_get_config.html" keep="config_defaut, config, directions"}} + +{{* interdire la modification et la suppression des types de mouvement prédéfinis *}} +{{#foreach from=$directions key="direction"}} + {{:assign var="nature" from="config_defaut.%ss"|args:$direction}} + {{#foreach from=$nature item="elem"}} + {{:assign var="default_keys." value=$key}} + {{/foreach}} +{{/foreach}} {{#foreach from=$directions key="direction" item="item"}} {{* types de mouvements qui ne peuvent être supprimés *}} {{#load type="movement" where="$$.direction='%s'"|args:$direction group="$$.operation"}} - {{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}} - {{:assign var="locked_%ss."|args:$direction value=$op_label}} + {{:assign var="locked." value=$operation}} {{/load}}

{{$item|ucfirst}}s

@@ -34,15 +41,23 @@ {{:assign var="nature" from="config.%s_nature"|args:$direction}} {{#foreach from=$nature key=key}} + {{:assign sortie_temp=false}} + {{if $direction == 'output'}} + {{:assign var="type" from="nature.%s.type"|args:$key}} + {{if $type == 'temporaire'}} + {{:assign sortie_temp=true}} + {{/if}} + {{/if}} {{$label}} {{$type}} - {{:assign var="locked" from="locked_%ss"|args:$direction}} - {{if ! $locked|has:$label}} + {{if ! $default_keys|has:$key && ! $locked|has:$key}} {{:linkbutton label="Supprimer" shape="delete" href="config/delete_movement_type.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}} {{/if}} + {{if ! $default_keys|has:$key || $sortie_temp}} {{:linkbutton label="Modifier" shape="edit" href="config/modify_movement_type.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}} + {{/if}} {{/foreach}} diff --git a/config.schema.json b/config.schema.json index 8395b2f..1f9213c 100644 --- a/config.schema.json +++ b/config.schema.json @@ -36,6 +36,11 @@ "type" : { "type" : "string", "enum" : ["définitif", "temporaire", "retour"] + }, + "fee" : { + "description" : "tarif sortie temporaire", + "type" : ["string", "null"], + "enum" : ["gratuit", "payant"] } } } diff --git a/config/add_movement_type.html b/config/add_movement_type.html index 06881dc..ecf6866 100644 --- a/config/add_movement_type.html +++ b/config/add_movement_type.html @@ -12,18 +12,28 @@ {{* lecture config *}} {{:include file="../_get_config.html" keep="config, directions, config_defaut"}} +{{if ! $directions|has_key:$_GET.dir}} + {{:error message="Direction « %s » inconnue !"|args:$_GET.dir}} +{{/if}} + {{#form on="save"}} + {{if $_POST.output_fields.type == "temporaire"}} + {{* vérifier si le tarif a été choisi *}} + {{if $_POST.tarif == null}} + {{:error message="Vous n'avez pas choisi le tarif"}} + {{/if}} + {{/if}} + {{* vérifier s'il existe un libellé de même nom dans la même direction *}} {{#foreach from=$directions key="direction"}} {{:assign var="nature" from="config.%s_nature"|args:$direction}} - {{#foreach from=$nature key="key"}} + {{#foreach from=$nature key="key" item="elem"}} {{:assign var="fields" from="_POST.%s_fields"|args:$_GET.dir}} - {{if $_GET.dir == $direction && $label|trim|tolower == $fields.label|trim|tolower}} - {{:error message="Ce libellé est déjà présent"}} + {{if $_GET.dir == $direction && $fields.label|trim|tolower == $elem.label|trim|tolower}} + {{:error message="Le libellé « %s » est déjà présent"|args:$fields.label}} {{/if}} + {{:assign var="%s_nature"|args:$direction value=$elem}} {{:assign var="%s_nature.key"|args:$direction value=$key}} - {{:assign var="%s_nature.label"|args:$direction value=$label}} - {{:assign var="%s_nature.type"|args:$direction value=$type}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}} {{/foreach}} @@ -34,6 +44,13 @@ {{:assign var="%s_nature.key"|args:$direction value=""|uuid}} {{:assign var="%s_nature.label"|args:$direction value=$newlabel}} {{:assign var="%s_nature.type"|args:$direction from="_POST.%s_fields.type"|args:$direction}} + {{if $_POST.output_fields != null}} + {{if $_POST.output_fields.type == "temporaire"}} + {{:assign var="output_nature.fee" value=$_POST.tarif}} + {{else}} + {{:assign var="output_nature.fee" value=null}} + {{/if}} + {{/if}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}} {{/if}} {{/foreach}} @@ -104,34 +121,63 @@
Type de sortie
- - {{:input type="select" - label="Type de sortie" - name="output_fields[type]" - options=$output_types - default=$type - required=true - default_empty="— Choisir un type —"}} - - - {{:input - type="text" - label="Libellé de la sortie" - name="output_fields[label]" + {{:input type="select" + label="Type de sortie" + name="output_fields[type]" + options=$output_types + default=$type + required=true + default_empty="— Choisir un type —"}} + {{:input + type="text" + label="Libellé de la sortie" + name="output_fields[label]" required=true}} - +
+ {{: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}} +

Signification du type de sortie

+
+

Tarification

+ +

{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}

{{/if}} + + diff --git a/config/delete_movement_type.html b/config/delete_movement_type.html index 4f0ddaa..801f821 100644 --- a/config/delete_movement_type.html +++ b/config/delete_movement_type.html @@ -10,16 +10,28 @@ {{* lecture config (défaut ou enregistrée) *}} -{{:include file="../_get_config.html" keep="config, directions"}} +{{:include file="../_get_config.html" keep="config_defaut, config, directions"}} + +{{if ! $directions|has_key:$_GET.dir}} + {{:error message="Direction « %s » inconnue !"|args:$_GET.dir}} +{{/if}} + +{{* interdire la suppression des types de mouvement prédéfinis *}} +{{:assign var="nature" from="config_defaut.%ss"|args:$_GET.dir}} +{{#foreach from=$nature item="elem"}} + {{:assign var="default_keys." value=$key}} +{{/foreach}} +{{if $default_keys|has:$_GET.op_key}} + {{:error message="Ce type de mouvement ne peut être supprimé"}} +{{/if}} {{#form on="delete"}} {{#foreach from=$directions key="direction"}} {{:assign var="nature" from="config.%s_nature"|args:$direction}} - {{#foreach from=$nature key="key"}} + {{#foreach from=$nature key="key" item="elem"}} {{if $_GET.dir == $direction && $key != $_GET.op_key || $_GET.dir != $direction}} + {{:assign var="%s_nature"|args:$direction value=$elem}} {{:assign var="%s_nature.key"|args:$direction value=$key}} - {{:assign var="%s_nature.label"|args:$direction value=$label}} - {{:assign var="%s_nature.type"|args:$direction value=$type}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}} {{/if}} {{/foreach}} diff --git a/config/misc.html b/config/misc.html index d49ef65..7034c04 100644 --- a/config/misc.html +++ b/config/misc.html @@ -2,31 +2,35 @@ {{#restrict block=true section="accounting" level="write"}}{{/restrict}} -{{:admin_header title="Configuration" current="module_equipment"}} - {{#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 + key="config" + loan_duration=$_POST.loan_duration }} + {{/form}} -{{* barre de navigation *}} +{{:admin_header title="Configuration" current="module_equipment"}} {{:include file="../_nav.html" current="config" subcurrent="divers"}} +{{:form_errors}} {{if $_GET.ok}}

Configuration enregistrée.

{{/if}} -{{* lecture config (défaut ou enregistrée) *}} +{{* lecture config *}} {{:include file="../_get_config.html" keep="loan_duration"}}
-
+
Autres paramètres
- {{:input type="number" name="loan_duration" label="Durée de prêt par défaut" min=1 required=true default=$loan_duration help="Durée en nombre de jours"}} - + {{: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"}}

diff --git a/config/modify_movement_type.html b/config/modify_movement_type.html index 89d9970..0f7a9f7 100644 --- a/config/modify_movement_type.html +++ b/config/modify_movement_type.html @@ -5,27 +5,38 @@ {{* paramètres : - dir : input ou output - - op_key : clé du type de mouvement dont on veut modifier le libellé + - op_key : clé du type de mouvement dont on veut modifier le libellé ou le tarif *}} {{* lecture config (défaut ou enregistrée) *}} -{{:include file="../_get_config.html" keep="config, directions"}} +{{:include file="../_get_config.html" keep="config_defaut, config, directions"}} {{#form on="save"}} + {{if $_POST.tarif == null && $_POST.name == null}} + {{:redirect to="./config.html"}} + {{/if}} {{#foreach from=$directions key="direction"}} {{:assign var="nature" from="config.%s_nature"|args:$direction}} - {{#foreach from=$nature key="key"}} - {{:assign var="%s_nature.key"|args:$direction value=$key}} - {{if $_GET.dir == $direction}} - {{if $key == $_GET.op_key}} - {{:assign var="%s_nature.label"|args:$direction value=$_POST.name|trim}} - {{else}} - {{:assign var="%s_nature.label"|args:$direction value=$label}} - {{/if}} + {{#foreach from=$nature key="key" item="elem"}} + {{if $_POST.name == null}} + {{:assign label=$elem.label}} {{else}} - {{:assign var="%s_nature.label"|args:$direction value=$label}} + {{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}} + {{if $_POST.tarif != null && $key == $_GET.op_key}} + {{:assign var="%s_nature.fee"|args:$direction value=$_POST.tarif}} {{/if}} - {{:assign var="%s_nature.type"|args:$direction value=$type}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}} {{/foreach}} {{/foreach}} @@ -40,19 +51,71 @@ {{/form}} {{:admin_header title="Gestion des matériels" current="module_equipment"}} -{{* barre de navigation *}} {{if ! $dialog}} {{:include file="../_nav.html" current="config" subcurrent="typesES"}} {{/if}} {{:form_errors}} +{{* 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}}

- Modifier le libellé + Paramètres
- {{:input type="text" name="name" label="Libellé" default=$default_label required=true maxlength="100"}} + {{if $label_mod}} + {{:input type="text" name="name" label="Libellé" default=$default_label required=true maxlength="100"}} + {{/if}} + {{if $sortie_temp}} +
+ {{: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}} +
+ {{/if}}
+ {{if $sortie_temp}} +
+

Tarification

+
    +
  • Une sortie temporaire gratuite sera classée dans l'onglet Prêt
  • +
  • Une sortie temporaire payante sera classée dans l'onglet Locations
  • +
+
+ {{/if}}

{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}

diff --git a/default.json b/default.json index b9906b7..ab06a2c 100644 --- a/default.json +++ b/default.json @@ -26,13 +26,19 @@ { "key" : "c9ba00d9-26ee-448b-9f02-73e479ec2980", "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", "label" : "Retour de Location/Emprunt", "type" : "retour" } - ], - "loan_duration" : "30" + ] } diff --git a/equipment_history.html b/equipment_history.html index 82b869e..5db0fb6 100644 --- a/equipment_history.html +++ b/equipment_history.html @@ -12,14 +12,6 @@ - msg : message de retour *}} - -{{* barre de navigation *}} -{{if $_GET.prop == 1}} - {{:assign proprio="proprio"}} -{{else}} - {{:assign proprio="nonproprio"}} -{{/if}} - {{:assign equipment_key=$_GET.key|trim}} {{#load key=$equipment_key assign="equipment"}} {{else}} @@ -33,62 +25,85 @@ {{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}} +{{* barre de navigation *}} {{if $_GET.current != null}} {{:assign current=$_GET.current}} {{else}} {{:assign current="inventaire"}} {{/if}} -{{:include file="./_nav.html" current=$current subcurrent=$proprio subsubcurrent="historique" eqpmt=$equipment.name category=$category.name}} - -{{if $_GET.ok}} - {{if $_GET.msg == "modification"}} -

Modification enregistrée

- {{elseif $_GET.msg == "copie"}} -

Mouvement copié

- {{elseif $_GET.msg == "retour"}} -

Retour enregistré

- {{elseif $_GET.msg == "suppression"}} -

Mouvement supprimé

- {{else}} -

Mouvement enregistré

- {{/if}} -{{elseif $_GET.err}} - {{if $_GET.msg == "suppression"}} -

Ce mouvement ne peut être supprimé

- {{/if}} -{{/if}} {{* récupérer la config des entrées/sorties *}} {{:include file="./_get_config.html" keep="config"}} -{{* déterminer les types de mouvements selon l'affection du matériel *}} -{{#foreach from=$config.input_nature}} - {{if $_GET.prop}} +{{* filtrer selon appartenance *}} +{{:assign saved_filters=$module.config.filters}} +{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}} + +{{if $_GET.prop == null}} + {{:assign selected_prop=$user_filters.eqpmt_hist_prop}} +{{else}} + {{if $_GET.prop == -1}} + {{:assign selected_prop=null}} + {{else}} + {{:assign selected_prop=$_GET.prop}} + {{/if}} + {{:assign var="user_filters.eqpmt_hist_prop value=$selected_prop}} + {{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}} + {{:save key="config" filters=$saved_filters}} +{{/if}} + +{{* déterminer les types de mouvements selon l'appartenance du matériel *}} +{{#foreach from=$config.input_nature key="key"}} + {{if $selected_prop == null}} + {{* les deux sortes de matériel *}} + {{:assign var="mvt_keys." value=$key|quote_sql}} + {{if $type == 'temporaire'}} + {{:assign var="temp_inputs." value=$key|quote_sql}} + {{/if}} + {{elseif $selected_prop == 1}} {{* matériel propriété de l'asso *}} {{if $type != 'temporaire'}} - {{:assign var="input_types." value=$label}} + {{:assign var="mvt_keys." value=$key|quote_sql}} {{/if}} {{else}} {{* matériel non propriété de l'asso *}} {{if $type == 'temporaire'}} - {{:assign var="input_types." value=$label}} + {{:assign var="mvt_keys." value=$key|quote_sql}} + {{:assign var="temp_inputs." value=$key|quote_sql}} {{/if}} {{/if}} {{/foreach}} -{{#foreach from=$config.output_nature}} - {{if $_GET.prop}} +{{#foreach from=$config.output_nature key="key"}} + {{if $selected_prop == null}} + {{* les deux sortes de matériel *}} + {{:assign var="mvt_keys." value=$key|quote_sql}} + {{if $type == "temporaire"}} + {{:assign var="temp_outputs." value=$key|quote_sql}} + {{/if}} + {{elseif $selected_prop == 1}} {{* matériel propriété de l'asso *}} {{if $type != 'retour'}} - {{:assign var="output_types." value=$label}} + {{:assign var="mvt_keys." value=$key|quote_sql}} + {{if $type == "temporaire"}} + {{:assign var="temp_outputs." value=$key|quote_sql}} + {{/if}} {{/if}} {{else}} {{* matériel non propriété de l'asso *}} {{if $type == 'retour'}} - {{:assign var="output_types." value=$label}} + {{: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}} {{* calculer et mémoriser les quantités pour que le tri de la liste affiche les valeurs correctes *}} {{:assign stock=0}} @@ -122,27 +137,10 @@ {{:assign var="quantites.%s.nonproprio"|args:$id value=$nonproprio}} {{/load}} -{{if $current != "archives"}} - -{{/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:")"}} +{{if $selected_prop == null || $selected_prop}} + {{* calculer la quantité sortie temporairement de chaque matériel *}} + {{:assign output_ops=$temp_outputs|implode:","}} + {{:assign output_ops="("|cat:$output_ops|cat:")"}} {{#select mvt.key AS mvt_key, @@ -156,97 +154,17 @@ GROUP by mvt.key ; !table=$module.table - !op = $operations + !op = $output_ops :eqpmt_key = $_GET.key }} {{:assign var="reste.%s"|args:$mvt_key value=$reste}} {{/select}} +{{/if}} - {{#list - type="movement" - select=" - ($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date'; - CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement'; - $$.operation AS 'Opération'; - $$.amount AS 'Quantité'; - '' AS 'Stock'; - '' AS 'Sorti'; - '' AS 'Disponible'; - CASE WHEN $$.user NOT NULL - THEN (SELECT %s AS nom FROM users WHERE id = $$.user) - ELSE '' - END AS 'Dépositaire'; - CASE WHEN $$.storage NOT NULL - THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage) - ELSE '' - END AS 'Stockage'; - '' AS 'Documents'; - $$.transactions AS 'Écritures' - "|args:$config.user_fields.name_sql - equipment=$equipment_key - order=1 - }} - {{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$operation}} - {{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}} - - {{if $direction === "input" && $op_label|in:$input_types || - $direction === "output"&& $op_label|in:$output_types - }} - {{:assign var="stock" from="quantites.%s.stock"|args:$id}} - {{:assign var="exterieur" from="quantites.%s.exterieur"|args:$id}} - {{:assign var="dispo" from="quantites.%s.dispo"|args:$id}} - - {{:assign file_path="%s/%s/"|args:$module.storage_root:$key}} - {{:assign file_path=$file_path|cat:"%"}} - {{#select count(*) AS nb FROM files WHERE path LIKE :file_path ; :file_path=$file_path}} - {{:assign nb_files=$nb}} - {{/select}} - - {{$date|date_short}} - {{$col2}} - {{$op_label}} - {{$amount}} - {{$stock}} - {{$exterieur}} - {{$dispo}} - {{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$col8}} - {{$col9}} - {{if $nb_files > 0}}{{:icon shape="attach"}}{{/if}} - {{if $transactions|count > 0}}{{:icon shape="money"}}{{/if}} - - {{if $current != "archives"}} - {{if $direction == "output" && $type_mvt == "temporaire"}} - {{:assign var="temp_ext" from="reste.%s"|args:$key}} - {{if $temp_ext != null && $temp_ext > 0}} - {{:linkbutton - label="Retour" - href="movements/output_return.html?key=%s&prop=%s"|args:$key:$_GET.prop - shape="reset" - target="_dialog"}} - {{/if}} - {{/if}} - {{:linkbutton - label="Détails" - href="movements/movement_details.html?key=%s&prop=%s&from=eh"|args:$key:$_GET.prop - shape="eye" - }} - {{/if}} - - - {{/if}} - {{/list}} - {{if $dispo_final === 0}} - Il n'y a aucun matériel disponible, il n'est donc pas possible d'effectuer une sortie - {{/if}} -{{else}} +{{if $selected_prop == null || ! $selected_prop}} {{* 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:")"}} + {{:assign input_ops=$temp_inputs|implode:","}} + {{:assign input_ops="("|cat:$input_ops|cat:")"}} {{#select mvt.key AS mvt_key, @@ -260,73 +178,181 @@ GROUP by mvt.key ; !table=$module.table - !op = $operations + !op = $input_ops :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'; - '' AS 'Documents'; - $$.transactions AS 'Écritures' - " - 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}} - - {{: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}} - - {{$date|date_short}} - {{$col2}} - {{$op_label}} - {{$amount}} - {{$stock}} - {{$col6}} - {{if $nb_files > 0}}{{:icon shape="attach"}}{{/if}} - {{if $transactions|count > 0}}{{:icon shape="money"}}{{/if}} - - {{if $direction == "input" && $type_mvt == "temporaire"}} - {{:assign var="temp_in" from="present.%s"|args:$key}} - {{if $temp_in != null && $temp_in > 0}} - {{:linkbutton - label="Retour" - href="movements/input_return.html?key=%s&prop=%s"|args:$key:$_GET.prop - shape="reset" - target="_dialog"}} - {{/if}} - {{/if}} - {{:linkbutton - label="Détails" - href="movements/movement_details.html?key=%s&prop=%s&from=eh"|args:$key:$_GET.prop - shape="eye" - }} - - - {{/if}} - {{/list}} {{/if}} +{{:assign + select_debut=" + ($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date'; + CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement'; + $$.operation AS 'Opération'; + $$.amount AS 'Quantité';" +}} +{{:assign + select_prop="'' AS 'Stock'; + '' AS 'Sorti'; + '' AS 'Disponible';" +}} +{{:assign + select_depositaire="CASE WHEN $$.user NOT NULL + THEN (SELECT %s AS nom FROM users WHERE id = $$.user) + ELSE '' + END AS 'Dépositaire'; + "|args:$config.user_fields.name_sql +}} +{{:assign + select_non_prop="'' as 'Temporaire';" +}} +{{:assign select_final=" + CASE WHEN $$.storage NOT NULL + THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage) + ELSE '' + END AS 'Stockage'; + '' AS 'Documents'; + $$.transactions AS 'Écritures' + " +}} + +{{if $selected_prop == null}} + {{:assign select_clause=$select_debut|cat:$select_prop|cat:$select_non_prop|cat:$select_depositaire|cat:$select_final}} +{{elseif $selected_prop}} + {{:assign select_clause=$select_debut|cat:$select_prop|cat:$select_depositaire|cat:$select_final}} +{{else}} + {{:assign select_clause=$select_debut|cat:$select_non_prop|cat:$select_final}} +{{/if}} + +{{:assign var="prop_options." value="" label="Tous les matériels" href="?key=%s&prop=-1"|args:$_GET.key}} +{{:assign var="prop_options." value="1" label="Matériels propriété de l'association" href="?key=%s&prop=1"|args:$_GET.key}} +{{:assign var="prop_options." value="0" label="Matériels NON propriété de l'association" href="?key=%s&prop=0"|args:$_GET.key}} + +{{if $dispo_final > 0 && $selected_prop == null || $selected_prop}} + {{:assign sortie="sortie"}} +{{/if}} +{{:include file="./_nav.html" current=$current subcurrent="mouvements" eqpmt=$equipment.name category=$category.name sortie=$sortie key=$_GET.key}} + +{{if $_GET.ok}} + {{if $_GET.msg == "modification"}} +

Modification enregistrée

+ {{elseif $_GET.msg == "copie"}} +

Mouvement copié

+ {{elseif $_GET.msg == "retour"}} +

Retour enregistré

+ {{elseif $_GET.msg == "suppression"}} +

Mouvement supprimé

+ {{else}} +

Mouvement enregistré

+ {{/if}} +{{elseif $_GET.err}} + {{if $_GET.msg == "suppression"}} +

Ce mouvement ne peut être supprimé

+ {{/if}} +{{/if}} + +
+ Filtrer par appartenance + {{:dropdown + title="Filtrer par appartenance" + options=$prop_options + value="%s"|args:$selected_prop + }} +
+ +{{* lister les mouvements du matériel passé en paramètre *}} +{{#list + type="movement" + select="%s"|args:$select_clause + where="%s"|args:$prop_condition + equipment=$equipment_key + order=1 + desc=true +}} + {{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$direction:$operation}} + {{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}} + + {{:assign var="stock" from="quantites.%s.stock"|args:$id}} + {{:assign var="exterieur" from="quantites.%s.exterieur"|args:$id}} + {{:assign var="dispo" from="quantites.%s.dispo"|args:$id}} + {{:assign var="tempo" from="quantites.%s.nonproprio"|args:$id}} + + {{:assign file_path="%s/%s/"|args:$module.storage_root:$key}} + {{:assign file_path=$file_path|cat:"%"}} + {{#select count(*) AS nb FROM files WHERE path LIKE :file_path ; :file_path=$file_path}} + {{:assign nb_files=$nb}} + {{/select}} + + {{if $selected_prop == null}} + {{:assign user_details=$col9}} + {{:assign storage=$col10}} + {{elseif $selected_prop}} + {{:assign user_details=$col8}} + {{:assign storage=$col9}} + {{else}} + {{:assign user_details=$col6}} + {{:assign storage=$col6}} + {{/if}} + + + {{$date|date_short}} + {{$col2}} + {{$op_label}} + {{$amount}} + {{if $selected_prop == null || $selected_prop}} + {{$stock}} + {{$exterieur}} + {{$dispo}} + {{/if}} + {{if $selected_prop == null || ! $selected_prop}} + {{$tempo}} + {{/if}} + {{if $selected_prop == null || $selected_prop}} + {{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$user_details}} + {{/if}} + {{$storage}} + {{if $nb_files > 0}}{{$nb_files}}{{/if}} + {{if $transactions|count > 0}}{{"Oui"}}{{/if}} + + {{if $current != "archives"}} + {{if $direction == "output" && $type_mvt == "retour"}} + {{:assign prop = 0}} + {{elseif $direction == "input" && $type_mvt == "temporaire"}} + {{:assign prop = 0}} + {{else}} + {{:assign prop = 1}} + {{/if}} + {{if $direction == "output" && $type_mvt == "temporaire"}} + {{:assign var="temp_ext" from="reste.%s"|args:$key}} + {{if $temp_ext != null && $temp_ext > 0}} + {{:linkbutton + label="Retour" + href="movements/output_return.html?key=%s&prop=%s"|args:$key:$prop + shape="reset" + target="_dialog"}} + {{/if}} + {{/if}} + {{if $direction == "input" && $type_mvt == "temporaire"}} + {{:assign var="temp_in" from="present.%s"|args:$key}} + {{if $temp_in != null && $temp_in > 0}} + {{:linkbutton + label="Retour" + href="movements/input_return.html?key=%s&prop=%s"|args:$key:$prop + shape="reset" + target="_dialog"}} + {{/if}} + {{/if}} + {{:linkbutton + label="Détails" + href="movements/movement_details.html?key=%s&prop=%s&from=eh"|args:$key:$prop + shape="eye" + }} + {{/if}} + + +{{/list}} + {{:admin_footer}} diff --git a/global_history.html b/global_history.html index 75b1889..47a01ba 100644 --- a/global_history.html +++ b/global_history.html @@ -8,20 +8,26 @@ {{:admin_header title="Historique des mouvements" custom_css="./style.css" current="module_equipment"}} -{{:include file="./_nav.html" current="historique" subcurrent="tous"}} +{{:include file="./_nav.html" current="historique"}} {{* récupérer la config des entrées/sorties *}} {{:include file="./_get_config.html" keep="config"}} {{* filtrer selon la catégorie *}} +{{:assign saved_filters=$module.config.filters}} +{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}} + {{if $_GET.cat_key == null}} - {{:assign selected_category=$module.config.hist_cat_key}} -{{elseif $_GET.cat_key == -1}} - {{:assign selected_category=null}} - {{:save key="config" hist_cat_key=null}} + {{:assign selected_category=$user_filters.hist_cat_key}} {{else}} - {{:assign selected_category=$_GET.cat_key}} - {{:save key="config" hist_cat_key=$selected_category}} + {{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 *}} @@ -35,7 +41,64 @@ {{:assign cat_condition=1}} {{/if}} -{{* Sélecteur catégories *}} +{{* 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"}} {{:assign var="categories.%s"|args:$key value=$name}} @@ -56,6 +119,19 @@ }}
+{{: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"}} + +
+ Filtrer par appartenance + {{:dropdown + title="Filtrer par appartenance" + options=$prop_options + value="%s"|args:$selected_prop + }} +
+

Historique de tous les mouvements de matériel

@@ -78,9 +154,9 @@ THEN (SELECT $$.name FROM @TABLE as storage WHERE storage.key = @TABLE.$$.storage) ELSE '' END as 'Stockage'; - $$.comment AS 'Commentaire' + $$.comment AS 'Remarque' "|args:$config.user_fields.name_sql - where="%s"|args:$cat_condition + where="%s AND %s"|args:$cat_condition:$prop_condition order=1 max=50 desc=true diff --git a/index.html b/index.html index dce00cb..d05fab9 100644 --- a/index.html +++ b/index.html @@ -14,14 +14,8 @@ {{else}} {{#restrict block=true section="accounting" level="write"}}{{/restrict}} - {{if $_GET.prop == null || $_GET.prop}} - {{:assign proprio="proprio"}} - {{else}} - {{:assign proprio="nonproprio"}} - {{/if}} - - {{#load type="category" count=true assign="result"}}{{/load}} - {{:include file="_nav.html" current="inventaire" cat="%d"|args:$result.count subcurrent="%s"|args:$proprio}} + {{#load type="category" count=true limit=1 assign="result"}}{{/load}} + {{:include file="_nav.html" current="inventaire" cat="%d"|args:$result.count subcurrent="stock"}} {{if $_GET.ok}} {{if $_GET.msg == "ajout" }} @@ -40,11 +34,7 @@ {{if $result.count == 0}}

Il n'y a aucune catégorie : vous devez en ajouter.

{{else}} - {{if $_GET.prop == null || $_GET.prop == "1"}} - {{:include file="./_inventory.html"}} - {{else}} - {{:include file="./_temp_inventory.html"}} - {{/if}} + {{:include file="./_inventory.html"}} {{/if}} {{:admin_footer}} diff --git a/loan_history.html b/loan_history.html index 65fcddc..92c4ee1 100644 --- a/loan_history.html +++ b/loan_history.html @@ -2,14 +2,21 @@ {{#restrict block=true section="accounting" level="write"}}{{/restrict}} -{{:admin_header title="Matériels hors de l'asso" custom_css="../style.css" current="module_equipment"}} -{{:include file="./_nav.html" current="historique" subcurrent="prêts"}} +{{if $_GET.output_type == "loan"}} + {{:assign label="prêt"}} +{{elseif $_GET.output_type == "rent"}} + {{:assign label="location"}} +{{else}} + {{:error message="Cette page n'existe pas !"}} +{{/if}} + +{{:admin_header title="%ss en cours"|args:$label|ucfirst custom_css="../style.css" current="module_equipment"}} +{{:include file="./_nav.html" current="%s"|args:$label subcurrent="encours"}} {{* vérifier l'existence de la table du module eh oui, il se peut qu'elle ne soit pas encore créée si aucune donnée n'a été ajoutée dedans *}} - {{#load limit="1"}} {{:assign table_presente=true}} {{else}} @@ -31,20 +38,66 @@ {{/if}} {{/if}} -
-

Historique des prêts de matériel

-
- -{{* lecture config (défaut ou enregistrée) *}} +{{* 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'}} - {{:assign var="output_types." value=$key|quote_sql}} + {{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 output_ops=$output_types|implode:","}} -{{:assign output_ops="("|cat:$output_ops|cat:")"}} +{{: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}} + +
+ Filtrer par catégorie + {{:dropdown + title="Filtrer par catégorie" + options=$cat_options + value="%s"|args:$selected_category + }} +
{{:assign premier=true}} {{#select @@ -61,29 +114,29 @@ 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 + 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, nom + ORDER BY out_date DESC, nom ; !table=$module.table - !op = $output_ops + !op = $out_keys + !cat_condition=$cat_condition }} {{if $premier}} - - - - - - - - + + + + + + + + @@ -122,9 +175,14 @@ 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=lh"|args:$mvt_key + href="movements/movement_details.html?key=%s&prop=1&from=%s"|args:$mvt_key:$from shape="eye" }} diff --git a/loan_movements.html b/loan_movements.html new file mode 100644 index 0000000..cf9fcda --- /dev/null +++ b/loan_movements.html @@ -0,0 +1,228 @@ +{{* -*- 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"}} +

Modification enregistrée

+ {{elseif $_GET.msg == "copie"}} +

Mouvement copié

+ {{elseif $_GET.msg == "suppression"}} +

Mouvement supprimé

+ {{/if}} +{{elseif $_GET.err}} + {{if $_GET.msg == "suppression"}} +

Ce mouvement ne peut être supprimé

+ {{/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}} + +
+ Filtrer par catégorie + {{:dropdown + title="Filtrer par catégorie" + options=$cat_options + value="%s"|args:$selected_category + }} +
+ +{{* 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}} +
MatérielDate prêtQuantitéMembreDate retourReste à rendreRemarqueMatérielDate prêtQuantitéMembreDate retourReste à rendreRemarque
+ + + + + + + + + + + + + + + + + {{:assign premier=false}} + {{/if}} + + + + + + + + + + + + + + +{{else}} +

Aucun mouvement.

+{{/select}} + +
DateMouvementOpérationMatérielQuantitéDépositaireStockageDocumentsÉcrituresRemarque
{{$date|date_short}}{{if $direction == "input"}}Entrée{{else}}Sortie{{/if}}{{$op_label}}{{$materiel}}{{$amount}}{{:link href="/admin/users/details.php?id=%s"|args:$user_id label="%s"|args:$user}}{{$stockage}}{{if $nb_files > 0}}{{$nb_files}}{{/if}}{{if $transactions != null}}{{"Oui"}}{{/if}}{{$comment}} + {{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" + }} +
+{{else}} +

Aucun mouvement.

+{{/if}} +{{:admin_footer}} diff --git a/member_loan.html b/member_loan.html new file mode 100644 index 0000000..28f7278 --- /dev/null +++ b/member_loan.html @@ -0,0 +1,105 @@ +{{* -*- 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}} + + + + + + + + + + {{:assign premier=false}} + {{/if}} + + + + + + +{{else}} + {{if $label == "prêt"}} +

Aucun {{$label}} en cours.

+ {{elseif $label == "location"}} +

Aucune {{$label}} en cours.

+ {{/if}} +{{/select}} + +
MembreQuantitéMatériels
{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$nom}}{{$quantite}}{{$materiel}}
+{{else}} + {{if $label == "prêt"}} +

Aucun {{$label}} en cours.

+ {{elseif $label == "location"}} +

Aucune {{$label}} en cours.

+ {{/if}} +{{/if}} + +{{:admin_footer}} diff --git a/movements/add_new_equipment.html b/movements/add_new_equipment.html index 74a5f67..456cfdd 100644 --- a/movements/add_new_equipment.html +++ b/movements/add_new_equipment.html @@ -134,23 +134,23 @@
Informations obligatoires
+ {{:input type="date" name="date" label="Date" required=true default=$now|date_short}} + {{:input type="number" name="amount" label="Quantité" min=1 required=true default=1}} + {{:input type="text" name="name" label="Désignation" required=true}} {{if $input_labels|count == 1}} {{:input type="select" name="operation" label="Type" required=true options=$input_labels}} {{else}} {{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$input_labels|sort}} {{/if}} - {{:input type="date" name="date" label="Date" required=true default=$now|date_short}} - {{:input type="number" name="amount" label="Quantité" min=1 required=true default=1}} {{if $categories|count == 1}} {{:input type="select" name="category" label="Catégorie" options=$categories required=true}} {{else}} {{:input type="select" name="category" label="Catégorie" default_empty="— Aucune —" options=$categories required=true}} {{/if}} - {{:input type="text" name="name" label="Désignation" required=true}}
- Informations facultatives + Autres informations
{{if $storage != null}} {{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}} diff --git a/movements/copy_movement.html b/movements/copy_movement.html index a71ca9b..6814d88 100644 --- a/movements/copy_movement.html +++ b/movements/copy_movement.html @@ -16,7 +16,7 @@ {{/load}} {{* récupérer la config des entrées/sorties *}} -{{:include file="../_get_config.html" keep="config, directions, loan_duration"}} +{{: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}} {{* interdire de dupliquer un retour => utiliser le bouton « Retour » *}} @@ -95,8 +95,12 @@ {{:assign var="mvt_new.amount" value=$_POST.amount}} {{:assign var="mvt_new.date" value=$_POST.date|parse_date}} {{:assign var="mvt_new.comment" value=$_POST.comment}} - {{if $_POST.set_return_date != null}} - {{:assign return_date=$_POST.return_date}} + + {{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}} @@ -205,14 +209,27 @@ user=$user.id storage=$_POST.storage transactions=$transactions - return_date=$return_date|parse_date + return_date=$return_date }} - {{if $_GET.from == "lh"}} - {{:assign from="../loan_history.html"}} - {{else}} - {{:assign from="../equipment_history.html"}} + + {{if $_GET.from|substr:0:1 == "l"}} + {{:assign output_type="loan"}} + {{elseif $_GET.from|substr:0:1 == "r"}} + {{:assign output_type="rent"}} + {{/if}} + {{if $_GET.from|substr:1:1 == "h"}} + {{:assign suffix="history"}} + {{elseif $_GET.from|substr:1:1 == "m"}} + {{:assign suffix="movements"}} + {{/if}} + + {{if $_GET.from == "eh"}} + {{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=copie"|args:$eqpmt_key:$prop}} + {{elseif $suffix == null}} + {{:redirect force="../index.html"}} + {{else}} + {{:redirect force="../loan_%s.html?output_type=%s&ok=1&key=%s&prop=%s&msg=copie"|args:$suffix:$output_type:$eqpmt_key:$prop}} {{/if}} - {{:redirect force="%s?ok=1&key=%s&prop=%s&msg=copie"|args:$from:$eqpmt_key:$prop}} {{/form}} {{if $mvt_new.direction == "input"}} @@ -227,7 +244,6 @@ -------------------- Préparer la saisie -------------------- *}} -{{* récupérer les infos de la catégorie *}} {{#load key=$equipment.category assign="category"}}{{/load}} {{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}} @@ -255,17 +271,18 @@
Informations obligatoires
+ {{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}} + {{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}} {{if $mvt_new.direction == "input"}} {{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}} {{else}} {{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}} {{/if}} - {{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}} - {{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}}
+
- Informations facultatives + Autres informations
{{if $prop == 1 && $mvt_new.direction == "output"}} {{:input @@ -279,27 +296,25 @@ }} {{/if}} {{if $mvt_new.direction == "input" && $storage != null}} - {{:input type="select" name="storage" default=$mvt_new.storage label="Lieu de stockage" 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 $type_mvt != "retour"}} {{:input type="list" name="transactions" label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}} {{/if}} - {{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}} - {{if $mvt_new.direction == "output" && $type_mvt == "temporaire"}} + {{: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 checked="checked"}} - {{:assign visibility="visible"}} {{:assign return_date=$mvt_new.return_date}} {{else}} - {{:assign visibility="hidden"}} - {{:assign ts_sortie=$mvt_new.date|strtotime}} - {{:assign ts_retour="%d+%d*(60*60*24)"|math:$ts_sortie:$loan_duration}} - {{:assign return_date=$ts_retour|date_short}} + {{if $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}} - {{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour" checked="%s"|args:$checked}} -
+
{{:input type="date" name="return_date" label="Date de retour" default=$return_date}} - +
{{/if}}
@@ -314,9 +329,17 @@ {{:admin_footer}} + diff --git a/movements/delete_movement.html b/movements/delete_movement.html index 506ebe4..ce9e4c3 100644 --- a/movements/delete_movement.html +++ b/movements/delete_movement.html @@ -23,11 +23,25 @@ {{:include file="../_get_config.html" keep="config"}} {{#form on="delete"}} - {{if $_GET.from == "lh"}} - {{:assign from="../loan_history.html"}} - {{else}} - {{:assign from="../equipment_history.html"}} + {{if $_GET.from|substr:0:1 == "l"}} + {{:assign output_type="loan"}} + {{elseif $_GET.from|substr:0:1 == "r"}} + {{:assign output_type="rent"}} {{/if}} + {{if $_GET.from|substr:1:1 == "h"}} + {{:assign suffix="history"}} + {{elseif $_GET.from|substr:1:1 == "m"}} + {{:assign suffix="movements"}} + {{/if}} + {{if $_GET.from == "eh"}} + {{:assign from="../equipment_history.html"}} + {{elseif $suffix == null}} + {{:assign from="../index.html"}} + {{else}} + {{:assign from="../loan_%s.html"|args:$suffix}} + {{:assign param="&output_type=%s"|args:$output_type}} + {{/if}} + {{* vérifier s'il est possible de supprimer le mouvement *}} {{if $mvt_suppr.direction == 'input'}} {{:assign var="type_operation" from="config.input_nature.%s.type"|args:$mvt_suppr.operation}} @@ -36,7 +50,7 @@ {{:assign link_key=$key}} {{/load}} {{if $link_key != null}} - {{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression"|args:$from:$mvt_suppr.equipment:$_GET.prop}} + {{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}} {{/if}} {{else}} {{:assign dispo=0}} @@ -69,7 +83,7 @@ {{* problème ? *}} {{if $dispo < 0 || $nonprop < 0}} - {{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression"|args:$from:$mvt_suppr.equipment:$_GET.prop}} + {{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}} {{/if}} {{/if}} {{/load}} @@ -90,7 +104,7 @@ {{:assign link_key=$key}} {{/load}} {{if $link_key != null}} - {{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression"|args:$from:$mvt_suppr.equipment:$_GET.prop}} + {{:redirect force="%s?key=%s&prop=%s&err=1&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}} {{/if}} {{elseif $type_operation == 'retour'}} {{#load type="link" where="$$.return = :key" :key=$_GET.key}} @@ -155,11 +169,11 @@ out=$curr_eqpmt.out notowned=$curr_eqpmt.notowned }} - {{:redirect force="%s?ok=1&key=%s&prop=%s&msg=suppression"|args:$from:$mvt_suppr.equipment:$_GET.prop}} + {{:redirect force="%s?ok=1&key=%s&prop=%s&msg=suppression%s"|args:$from:$mvt_suppr.equipment:$_GET.prop:$param}} {{else}} {{* supprimer le matériel *}} {{:delete key=$curr_eqpmt.key}} - {{:redirect force="../index.html?ok=1&msg=supprmvtmat"}} + {{:redirect force="../index.html?ok=1&msg=supprmvtmat"|args}} {{/if}} {{/form}} diff --git a/movements/input_equipment.html b/movements/input_equipment.html index 1f687bf..502580e 100644 --- a/movements/input_equipment.html +++ b/movements/input_equipment.html @@ -106,17 +106,17 @@
Informations obligatoires
+ {{:input type="date" name="date" label="Date" required=true default=$now|date_short}} + {{:input type="number" name="amount" label="Quantité" required=true min=1 default=1}} {{if $input_labels|count == 1}} {{:input type="select" name="operation" label="Type d'entrée" required=true options=$input_labels}} {{else}} {{:input type="select" name="operation" label="Type d'entrée" required=true default_empty="— Aucun —" options=$input_labels|sort}} {{/if}} - {{: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}}
- Informations facultatives + Autres informations
{{if $storage != null}} {{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}} diff --git a/movements/input_return.html b/movements/input_return.html index 4512516..3b984b3 100644 --- a/movements/input_return.html +++ b/movements/input_return.html @@ -204,9 +204,9 @@
Retour de matériel
- {{:input type="select" name="operation" label="Type de mouvement" required=true options=$return_label}} {{:input type="date" name="date" label="Date" required=true default=$now|date_short}} {{:input type="number" name="amount" label="Quantité" min=1 max=$present required=true default=1}} + {{:input type="select" name="operation" label="Type de mouvement" required=true options=$return_label}} {{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false}}
diff --git a/movements/modify_movement.html b/movements/modify_movement.html index 542267f..7dd87d0 100644 --- a/movements/modify_movement.html +++ b/movements/modify_movement.html @@ -15,22 +15,7 @@ {{/load}} {{* récupérer la config des entrées/sorties *}} -{{:include file="../_get_config.html" keep="config, directions, loan_duration"}} -{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}} - -{{if $mvt_new.direction == "input"}} - {{if $type_mvt == "temporaire"}} - {{:assign prop=0}} - {{else}} - {{:assign prop=1}} - {{/if}} -{{else}} - {{if $type_mvt == "retour"}} - {{:assign prop=0}} - {{else}} - {{:assign prop=1}} - {{/if}} -{{/if}} +{{:include file="../_get_config.html" keep="config, directions"}} {{* infos pour affichage *}} {{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}} @@ -45,25 +30,15 @@ {{:error message="Aucun matériel avec la clé « %s »"|args:$eqpmt_key}} {{/load}} -{{#foreach from=$directions key="direction"}} - {{:assign var="nature" from="config.%s_nature"|args:$direction}} - {{#foreach from=$nature key="key"}} - {{if $type_mvt != "retour" && $type != "retour" || - $type_mvt == "retour" && $type == "retour"}} - {{:assign var="%s_labels.%s"|args:$direction:$key value=$label}} - {{/if}} - {{/foreach}} -{{/foreach}} - {{* -------------------- Traiter la saisie -------------------- *}} {{#form on="save"}} + {{* vérifier la validité de la saisie *}} {{if $_POST.amount <= 0}} {{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}} {{/if}} - {{* vérifier validité des données *}} {{if $_POST.date|parse_date|strtotime > $now}} {{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}} {{/if}} @@ -86,8 +61,13 @@ {{:assign var="mvt_new.amount" value=$_POST.amount}} {{:assign var="mvt_new.date" value=$_POST.date|parse_date}} {{:assign var="mvt_new.comment" value=$_POST.comment}} - {{if $_POST.set_return_date != null}} - {{:assign return_date=$_POST.return_date}} + {{: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}} @@ -99,10 +79,7 @@ *}} {{:assign insere=false}} {{#load - where=" - $$.type = 'movement' - AND - $$.equipment = :eqpmt_key" + where="$$.type = 'movement' AND $$.equipment = :eqpmt_key" :eqpmt_key=$eqpmt_key order="$$.date" assign="movement" @@ -222,14 +199,41 @@ user=$user_id storage=$_POST.storage transactions=$transactions - return_date=$return_date|parse_date + return_date=$return_date }} - {{if $_GET.from == "lh"}} - {{:assign from="../loan_history.html"}} - {{else}} - {{:assign from="../equipment_history.html"}} + + {{if $_GET.from|substr:0:1 == "l"}} + {{:assign output_type="loan"}} + {{elseif $_GET.from|substr:0:1 == "r"}} + {{:assign output_type="rent"}} + {{/if}} + {{if $_GET.from|substr:1:1 == "h"}} + {{:assign suffix="history"}} + {{elseif $_GET.from|substr:1:1 == "m"}} + {{:assign suffix="movements"}} + {{/if}} + + {{if $mvt_new.direction == "input"}} + {{if $type_mvt == "temporaire"}} + {{:assign prop=0}} + {{else}} + {{:assign prop=1}} + {{/if}} + {{else}} + {{if $type_mvt == "retour"}} + {{:assign prop=0}} + {{else}} + {{:assign prop=1}} + {{/if}} + {{/if}} + + {{if $_GET.from == "eh"}} + {{:redirect force="../equipment_history.html?ok=1&key=%s&prop=%s&msg=modification"|args:$eqpmt_key:$prop}} + {{elseif $suffix == null}} + {{:redirect force="../index.html"}} + {{else}} + {{:redirect force="../loan_%s.html?output_type=%s&ok=1&key=%s&prop=%s&msg=modification"|args:$suffix:$output_type:$eqpmt_key:$prop}} {{/if}} - {{:redirect force="%s?ok=1&key=%s&prop=%s&msg=modification"|args:$from:$eqpmt_key:$prop}} {{/form}} {{if $mvt_new.direction == "input"}} @@ -238,14 +242,26 @@ {{:assign mvt_label="sortie"}} {{/if}} {{:admin_header title="Modifier une %s"|args:$mvt_label custom_css="./../style.css" current="module_equipment"}} - {{:form_errors}} + {{* -------------------- Préparer la saisie -------------------- *}} {{#load key=$equipment.category assign="category"}}{{/load}} +{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}} +{{#foreach from=$directions key="direction"}} + {{:assign var="nature" from="config.%s_nature"|args:$direction}} + {{#foreach from=$nature key="key"}} + {{if $type_mvt != "retour" && $type != "retour" || + $type_mvt == "retour" && $type == "retour"}} + {{:assign var="%s_labels.%s"|args:$direction:$key value=$label}} + {{/if}} + {{/foreach}} +{{/foreach}} + + {{if $mvt_new.user != null}} {{#select id, !name as nom FROM users WHERE id=:id; !name=$config.user_fields.name_sql :id=$mvt_new.user}} {{:assign var="user.%s"|args:$id value=$nom}} @@ -278,20 +294,20 @@
Informations obligatoires
+ {{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}} + {{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}} {{if $mvt_new.direction == "input"}} {{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}} {{else}} {{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort default=$mvt_new.operation}} {{/if}} - {{:input type="date" name="date" label="Date" required=true default=$mvt_new.date}} - {{:input type="number" name="amount" label="Quantité" min=1 required=true default=$mvt_new.amount}}
- Informations facultatives + Autres informations
- {{if $prop == 1 && $mvt_new.direction == "output"}} + {{if $mvt_new.direction == "output" && $type_mvt != "retour"}} {{:input type="list" name="user" @@ -302,30 +318,26 @@ max=1 }} {{/if}} - {{if $mvt_new.direction == "input"}} - {{if $storage != null}} - {{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}} - {{/if}} + {{if $mvt_new.direction == "input" && $storage != null}} + {{:input type="select" name="storage" label="Lieu de stockage" default=$mvt_new.storage default_empty="— Aucun —" options=$storage required=false}} {{/if}} {{if $type_mvt != "retour"}} - {{:input type="list" name="transactions" default=$mvt_new.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" default=$mvt_new.transactions target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}} {{/if}} {{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}} - {{if $mvt_new.direction == "output" && $type_mvt == "temporaire"}} + {{if $mvt_new.direction == "output"}} {{if $mvt_new.return_date != null}} - {{:assign checked="checked"}} - {{:assign visibility="visible"}} {{:assign return_date=$mvt_new.return_date}} {{else}} - {{:assign visibility="hidden"}} - {{:assign ts_sortie=$mvt_new.date|strtotime}} - {{:assign ts_retour="%d+%d*(60*60*24)"|math:$ts_sortie:$loan_duration}} - {{:assign return_date=$ts_retour|date_short}} + {{if $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}} - {{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour" checked="%s"|args:$checked}} -
+
{{:input type="date" name="return_date" label="Date de retour" default=$return_date}} - +
{{/if}}
@@ -340,9 +352,17 @@ {{:admin_footer}} + diff --git a/movements/movement_details.html b/movements/movement_details.html index 94dabc7..7011d81 100644 --- a/movements/movement_details.html +++ b/movements/movement_details.html @@ -9,6 +9,7 @@ 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"}} diff --git a/movements/output_equipment.html b/movements/output_equipment.html index 95ac3cd..7a1958a 100644 --- a/movements/output_equipment.html +++ b/movements/output_equipment.html @@ -5,14 +5,25 @@ {{* paramètres : - key : clé du matériel à sortir + - output_type : loan (prêt), rent (location), rien (cas général) *}} {{* récupérer la config des entrées/sorties *}} -{{:include file="../_get_config.html" keep="config, loan_duration"}} +{{:include file="../_get_config.html" keep="config"}} {{* types de sorties *}} {{#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}} {{/if}} {{/foreach}} @@ -22,22 +33,27 @@ {{* Traiter l'envoi du formulaire *}} {{#form on="save"}} + {{* vérifier la validité de la saisie *}} + {{* interdire date dans le futur *}} {{if $_POST.date|parse_date|strtotime > $now}} {{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}} {{/if}} - {{* vérifier les infos saisies *}} {{if $_POST.operation == ""}} {{:error message="Vous devez choisir un type de sortie"}} {{/if}} {{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}} - {{if $type_mvt != "temporaire" && $_POST.set_return_date != null}} + {{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.set_return_date != null}} - {{:assign return_date=$_POST.return_date}} + + {{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}} @@ -158,7 +174,7 @@ date=$_POST.date|parse_date comment=$_POST.remarques|trim user=$user.id - return_date=$return_date|parse_date + return_date=$return_date transactions=$transactions }} {{:redirect force="../equipment_history.html?ok=1&key=%s&prop=1&msg=sortie"|args:$_GET.key}} @@ -169,13 +185,16 @@ {{* barre de navigation *}} {{:include file="../_nav.html" current="sorties"}} {{/if}} +{{:form_errors}} {{#load key=$equipment.category assign="category"}}{{/load}} {{:assign dispo="%d-%d"|math:$equipment.stock:$equipment.out}} {{if $dispo > 0}} - {{:assign ts_retour="%d+%d*(60*60*24)"|math:$now:$loan_duration}} - {{:assign date_retour=$ts_retour|date_short}} + {{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 *}} @@ -193,17 +212,17 @@
Informations obligatoires
+ {{:input type="date" name="date" label="Date de sortie" required=true default=$now|date_short}} + {{:input type="number" name="amount" label="Quantité" required=true default=1 min=1 max=$dispo}} {{if $output_labels|count == 1}} {{:input type="select" name="operation" label="Type de sortie" required=true options=$output_labels}} {{else}} {{:input type="select" name="operation" label="Type de sortie" required=true default_empty="— Aucun —" options=$output_labels|sort}} {{/if}} - {{: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}}
- Informations facultatives + Autres informations
{{:input type="list" @@ -215,10 +234,9 @@ }} {{: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 id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour"}} -
@@ -230,13 +248,20 @@

Il n'y a aucune unité de ce matériel disponible à la date du {{$now|date_short}}

{{/if}} -{{:form_errors}} {{:admin_footer}} + diff --git a/movements/output_return.html b/movements/output_return.html index 162fc37..b5c5e9c 100644 --- a/movements/output_return.html +++ b/movements/output_return.html @@ -214,13 +214,13 @@
Informations obligatoires
- {{:input type="select" name="operation" label="Type de mouvement" required=true options=$return_label}} {{:input type="date" name="date" label="Date" required=true default=$now|date_short}} {{:input type="number" name="amount" label="Quantité" min=1 max=$exterieur required=true default=1}} + {{:input type="select" name="operation" label="Type de mouvement" required=true options=$return_label}}
- Informations facultatives + Autres informations
{{if $storage != null}} {{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}} diff --git a/scripts.js b/scripts.js index 2de1a45..c913078 100644 --- a/scripts.js +++ b/scripts.js @@ -26,18 +26,6 @@ function disableColumSort(liste) { } } -function toggleVisibility(idcheck, fields) { - const elem = document.getElementById(idcheck); - for (let id of fields) { - const field = document.getElementById(id); - if (elem.checked) { - field.style.visibility = "visible"; - } else { - field.style.visibility = "hidden"; - } - } -} - /** * renvoyer la valeur en secondes d'une date au format j/m/a * @param {string} date @@ -59,7 +47,29 @@ function getDate(idelem) { function setReturnDate(id_date, id_return_date, id_loan_duration) { const loan_duration = document.getElementById(id_loan_duration).value; - let nbsec = getDate(id_date) + loan_duration*24*60*60; - const date_retour = new Date(nbsec * 1000); - document.getElementById(id_return_date).value = date_retour.toLocaleDateString(); + 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; + } } diff --git a/snippets/_details.html b/snippets/_details.html index 9ab9458..10a1fe1 100644 --- a/snippets/_details.html +++ b/snippets/_details.html @@ -135,9 +135,9 @@ {{if $retard < 0}} {{:assign delai="abs(%d)"|math:$retard}} {{"Reste %s jours"|args:$delai}} - {{elseif $retard >0 }} + {{elseif $retard > 0 }} {{:tag color="darkred" label="Retard %s jours"|args:$retard}} - {{else}} + {{elseif $return_date != null}} {{:tag color="darkgreen" label="À rendre aujourdh'ui"}} {{/if}} diff --git a/style.css b/style.css index 39ae075..9b112b6 100644 --- a/style.css +++ b/style.css @@ -24,3 +24,7 @@ table.list > thead th[class~=nosort] a:hover { background-color : rgba(var(--gSecondColor), 0.); } + +.nombre { + text-align: right !important; +}