Compare commits

..

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

44 changed files with 1080 additions and 1738 deletions

View File

@ -3,26 +3,52 @@
Ce module permet de gérer les matériels de l'association: stock,
entrées, sorties, classés par catégorie.
Un matériel peut entrer temporairement (location, emprunt, ...) ou
définitivement dans l'association (achat, ...).
## Configuration
- Il y a plusieurs types d'entrée et de sorties prédéfinies (Achat,
Location, Vente, ...) mais il est possible d'en ajouter d'autres.
Un matériel appartenant à l'association peut sortir :
- temporairement (prêt, ...) : il est possible de lui associer un lieu
de stockage ainsi qu'un membre dépositaire du matériel ; il peut
ensuite revenir dans l'association.
- définitivement (vente, ...) : il est possible de lui associer un
membre bénéficiaire du matériel.
## Démarrage
- Il faut commencer par créer des catégories de matériel (ex:
Audiovisuel, Informatique, Mobilier, ...).
- On peut ensuite ajouter des matériels à l'aide du bouton « Ajouter
un nouveau matériel ».
Un matériel présent temporairement dans l'association peut être
retourné à son propriétaire.
## Matériels permanents
- Inventaire des matériels propriété de l'association (achat, don reçu, ...).
Un matériel dont il n'existe plus d'exemplaire en stock peut être archivé.
Pour chaque matériel appartenant à l'association on trouve plusieurs
boutons :
- « Modifier » permet de changer la catégorie ou de corriger le
libellé du matériel.
- « Mouvements » affiche l'historique des mouvement d'un matériel.
- « Entrée » permet de saisir une nouvelle entrée d'un matériel
- « Sortie » permet de saisir une nouvelle sortie d'un matériel ; ce
bouton n'est visible que si la quantité disponible dans l'association
est positive.
- « Retour » permet de saisir un retour de matériel sorti
temporairement de l'association ; ce bouton n'est visible que si la
quantité de matériel sorti temporairement est positive.
On peut lister l'ensemble des mouvements des matériels ou seulement
ceux d'un matériel donné.
## Matériels temporaires
- Inventaire des matériels présents temporairement dans l'association
(location, emprunt, ...).
Il est possible de créer des catégories de matériels, des types
d'entrées et sorties, des lieux de stockage.
Pour chaque matériel présent dans l'association on trouve plusieurs
boutons :
- « Modifier » permet de changer la catégorie ou de corriger le
libellé du matériel.
- « Mouvements » affiche l'historique des mouvement d'un matériel.
- « Entrée » permet de saisir une nouvelle entrée d'un matériel
- « Retour » permet de saisir un retour de matériel entré
temporairement dans l'association.
## Historique des mouvements
- Historique des mouvement d'un matériel
Pour chaque mouvement, on trouve 3 boutons :
- « Supprimer » le mouvement.
- « Modifier » certains informations du mouvement.
- « Dupliquer » permet de faire une copie d'un mouvement en modifiant
certains éléments.
## Droits d'accès
Le module est accessible uniquement pour les membres ayant au moins le

122
_calcul_dispo.html Normal file
View File

@ -0,0 +1,122 @@
{{* -*- brindille -*- *}}
{{*
Calcul des entrées/sorties de matériels à une date donnée
paramètres :
- key : clé du matériel concerné
- cat_key : clé de la catégorie des matériels concernés
- date
résultat :
- categories : tableau clé => nom
- equipments : tableau clé => { clé cat, libellé mat, stock, exter, nonproprio }
*}}
{{* liste des matériels *}}
{{:assign equipments=null}}
{{if $_GET.key}}
{{* le matériel paramètre *}}
{{#load key=$_GET.key}}
{{:assign var="equipments.%s.category"|args:$key value=$category}}
{{:assign var="equipments.%s.name"|args:$key value=$name}}
{{:assign var="in_equipments." value="'%s'"|args:$key}}
{{/load}}
{{elseif $_GET.cat_key}}
{{* matériels de la catégorie paramètre *}}
{{#load type="equipment" where="$$.category = :category_key" :category_key=$_GET.cat_key}}
{{:assign var="equipments.%s.category"|args:$key value=$category}}
{{:assign var="equipments.%s.name"|args:$key value=$name}}
{{:assign var="equipments.%s.status"|args:$key value=$status}}
{{:assign var="in_equipments." value="'%s'"|args:$key}}
{{/load}}
{{else}}
{{* tous les matériels *}}
{{#load type="equipment"}}
{{:assign var="equipments.%s.category"|args:$key value=$category}}
{{:assign var="equipments.%s.name"|args:$key value=$name}}
{{:assign var="equipments.%s.status"|args:$key value=$status}}
{{:assign var="in_equipments." value="'%s'"|args:$key}}
{{/load}}
{{/if}}
{{:assign in_equipments=$in_equipments|implode:","}}
{{:assign in_equipments="("|cat:$in_equipments|cat:")"}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{* parcourir les mouvements et cumuler les entrées/sorties *}}
{{if $date == null}}
{{:assign condition="$$.equipment IN %s"|args:$in_equipments}}
{{else}}
{{:assign condition="$$.equipment IN %s AND $$.date <= '%s'"|args:$in_equipments:$date}}
{{/if}}
{{#load type="movement" where="%s"|args:$condition assign="mvt" order="$$.date ASC"}}
{{* matériel propriété de l'asso en stock *}}
{{:assign
var="stock"
from="equipments.%s.stock"|args:$mvt.equipment}}
{{if $stock == null}}
{{:assign stock=0}}
{{/if}}
{{* matériel propriété de l'asso à l'extérieur *}}
{{:assign
var="exterieur"
from="equipments.%s.exterieur"|args:$mvt.equipment}}
{{if $exterieur == null}}
{{:assign exterieur=0}}
{{/if}}
{{* matériel non propriété de l'asso *}}
{{:assign
var="nonproprio"
from="equipments.%s.nonproprio"|args:$mvt.equipment}}
{{if $nonproprio == null}}
{{:assign nonproprio=0}}
{{/if}}
{{if $mvt.direction === 'input'}}
{{* déterminer le type de mouvement *}}
{{:assign var=type_mvt from="config.input_nature.%s.type"|args:$mvt.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign stock="%d+%d"|math:$stock:$mvt.amount}}
{{:assign
var="equipments.%s.stock"|args:$mvt.equipment
from=stock}}
{{elseif $type_mvt == 'retour'}}
{{:assign exterieur="%d-%d"|math:$exterieur:$mvt.amount}}
{{:assign
var="equipments.%s.exterieur"|args:$mvt.equipment
from=exterieur}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign nonproprio="%d+%d"|math:$nonproprio:$mvt.amount}}
{{:assign
var="equipments.%s.nonproprio"|args:$mvt.equipment
from=nonproprio}}
{{/if}}
{{elseif $mvt.direction === 'output'}}
{{* déterminer le type de mouvement *}}
{{:assign var=type_mvt from="config.output_nature.%s.type"|args:$mvt.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign stock="%d-%d"|math:$stock:$mvt.amount}}
{{:assign
var="equipments.%s.stock"|args:$mvt.equipment
from=stock}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign exterieur="%d+%d"|math:$exterieur:$mvt.amount}}
{{:assign
var="equipments.%s.exterieur"|args:$mvt.equipment
from=exterieur}}
{{elseif $type_mvt == 'retour'}}
{{:assign nonproprio="%d-%d"|math:$nonproprio:$mvt.amount}}
{{:assign
var="equipments.%s.nonproprio"|args:$mvt.equipment
from=nonproprio}}
{{/if}}
{{/if}}
{{/load}}
{{* catégories *}}
{{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}}
{{/load}}

View File

@ -9,22 +9,28 @@
{{:read file="./defaut.json" assign="config_defaut"}}
{{:assign config_defaut=$config_defaut|json_decode}}
{{:assign var="directions.input" value="entrée"}}
{{:assign var="directions.output" value="sortie"}}
{{if $module.config.input_nature != null}}
{{#foreach from=$module.config.input_nature item="elem"}}
{{:assign var="item" label=$label type=$type}}
{{:assign var="config.input_nature.%s"|args:$key value=$item}}
{{/foreach}}
{{else}}
{{* pas de config enregistrée : utiliser la config par défaut *}}
{{#foreach from=$config_defaut.inputs item="elem"}}
{{:assign var="item" label=$label type=$type}}
{{:assign var="config.input_nature.%s"|args:$key value=$item}}
{{/foreach}}
{{/if}}
{{#foreach from=$directions key="direction"}}
{{: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}}
{{/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}}
{{/foreach}}
{{/if}}
{{/foreach}}
{{if $module.config.output_nature != null}}
{{#foreach from=$module.config.output_nature item="elem"}}
{{:assign var="item" label=$label type=$type}}
{{:assign var="config.output_nature.%s"|args:$key value=$item}}
{{/foreach}}
{{else}}
{{* pas de config enregistrée : utiliser la config par défaut *}}
{{#foreach from=$config_defaut.outputs item="elem"}}
{{:assign var="item" label=$label type=$type}}
{{:assign var="config.output_nature.%s"|args:$key value=$item}}
{{/foreach}}
{{/if}}

View File

@ -40,19 +40,14 @@
<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/ajouter_type_mouvement.html?dir=input" target="_dialog"}}
{{:linkbutton label="Ajouter un type de sortie" shape="plus" href="config/ajouter_type_mouvement.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 == '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>
</ul>
{{/if}}

View File

@ -27,6 +27,10 @@
}}
</fieldset>
<div class="shortFormLeft">
<p class="help">Inventaire des matériels archivés</p>
</div>
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign condition="1"}}

View File

@ -14,14 +14,15 @@
{{/load}}
{{:assign key=""|uuid}}
{{:assign cat_name=$_POST.name|trim}}
{{:assign cat_name=$_POST.name|trim|tolower|ucfirst}}
{{:save
key=$key
validate_schema="./category.schema.json"
type="category"
name=$cat_name
}}
{{:redirect force="./index.html?ok=1&msg=ajout"}}
{{:assign msg="Catégorie « %s » enregistrée"|args:$cat_name}}
{{:redirect force="./index.html?ok=1&msg=%s"|args:$msg}}
{{/form}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}}

View File

@ -12,7 +12,8 @@
{{else}}
{{* supprimer la catégorie sélectionnée*}}
{{:delete where="key = :key" :key=$category.key}}
{{:redirect force="./index.html?ok=1&msg=suppression"|args:$msg}}
{{:assign msg="Catégorie « %s » supprimée"|args:$category.name}}
{{:redirect force="./index.html?ok=1&msg=%s"|args:$msg}}
{{/load}}
{{/form}}

View File

@ -10,11 +10,13 @@
<p class="block confirm">Modification enregistrée</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block confirm">Catégorie supprimée</p>
{{elseif $_GET.msg == "ajout"}}
<p class="block confirm">Catégorie ajoutée</p>
{{else}}
<p class="block confirm">{{$_GET.msg}}</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
{{if $_GET.msg == "modification"}}
<p class="block error">{{$_GET.msg}}</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block error">
Cette catégorie ne peut être supprimée car elle contient encore des matériels
</p>

View File

@ -8,7 +8,7 @@
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* Vérifier s'il existe déjà une catégorie avec le même nom *}}
{{#load type="category" where="$$.name = :name COLLATE U_NOCASE" :name=$_POST.name|trim limit=1}}
{{#load type="category" where="$$.name = :name" :name=$_POST.name|trim|tolower|ucfirst limit=1}}
{{:error message="Modification impossible car ce nom de catégorie (« %s ») existe déjà !"|args:$name|trim}}
{{/load}}
@ -16,7 +16,7 @@
key=$category.key
validate_schema="./category.schema.json"
type="category"
name=$_POST.name|trim
name=$_POST.name|trim|tolower|ucfirst
}}
{{:redirect force="./index.html?ok=1&msg=modification"}}
{{/form}}

View File

@ -10,43 +10,68 @@
{{/if}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="./_get_config.html" keep="config, directions"}}
{{:include file="./_get_config.html" keep="config"}}
{{#foreach from=$directions key="direction" item="item"}}
{{* types d'entrées qui ne peuvent être supprimées *}}
{{#load type="movement" where="$$.direction='input'" group="$$.operation"}}
{{:assign var="op_label" from="config.input_nature.%s.label"|args:$operation}}
{{:assign var="locked_inputs." value=$op_label}}
{{/load}}
{{* 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}}
{{/load}}
{{* types de sorties qui ne peuvent être supprimées *}}
{{#load type="movement" where="$$.direction='output'" group="$$.output_nature"}}
{{:assign var="op_label" from="config.output_nature.%s.label"|args:$operation}}
{{:assign var="locked_outputs." value=$op_label}}
{{/load}}
<h2 class="ruler">{{$item|ucfirst}}s</h2>
<table class="list">
<thead>
<h2>Types d'entrées</h2>
<table class="list">
<thead>
<tr>
<th>Libellé</th>
<th>Type</th>
<th></th>
</tr>
</thead>
<tbody>
{{#foreach from=$config.input_nature key=key}}
<tr>
<th>Libellé</th>
<th>Type</th>
<th></th>
<td>{{$label}}</td>
<td>{{$type}}</td>
<td class="actions">
{{if ! $locked_inputs|has:$label}}
{{:linkbutton label="Supprimer" shape="delete" href="config/supprimer_type_mouvement.html?dir=input&op_key=%s"|args:$key target="_dialog"}}
{{/if}}
{{:linkbutton label="Modifier" shape="edit" href="config/modifier_type_mouvement.html?dir=input&op_key=%s"|args:$key target="_dialog"}}
</td>
</tr>
</thead>
<tbody>
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key=key}}
<tr>
<td>{{$label}}</td>
<td>{{$type}}</td>
<td class="actions">
{{:assign var="locked" from="locked_%ss"|args:$direction}}
{{if ! $locked|has:$label}}
{{:linkbutton label="Supprimer" shape="delete" href="config/supprimer_type_mouvement.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}}
{{/if}}
{{:linkbutton label="Modifier" shape="edit" href="config/modifier_type_mouvement.html?dir=%s&op_key=%s"|args:$direction:$key target="_dialog"}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{/foreach}}
</tbody>
</table>
{{/foreach}}
<h2>Types de sorties</h2>
<table class="list">
<thead>
<tr>
<th>Libellé</th>
<th>Type</th>
<th></th>
</tr>
</thead>
<tbody>
{{#foreach from=$config.output_nature key=key}}
<tr>
<td>{{$label}}</td>
<td>{{$type}}</td>
<td class="actions">
{{if ! $locked_outputs|has:$label}}
{{:linkbutton label="Supprimer" shape="delete" href="config/supprimer_type_mouvement.html?dir=output&op_key=%s"|args:$key target="_dialog"}}
{{/if}}
{{:linkbutton label="Modifier" shape="edit" href="config/modifier_type_mouvement.html?dir=output&op_key=%s"|args:$key target="_dialog"}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{:admin_footer}}

View File

@ -1,10 +1,5 @@
{{* -*- brindille -*- *}}
{{*
paramètres :
- dir : input ou output
*}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="config" subcurrent="typesES"}}
@ -13,35 +8,49 @@
{{* Traiter l'envoi du formulaire *}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{:include file="../_get_config.html" keep="config"}}
{{#form on="save"}}
{{* vérifier s'il existe un type de mouvement de même nom *}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key"}}
{{:assign var="fields" from="_POST.%s_fields"|args:$_GET.dir}}
{{if $label|trim|tolower == $fields.label|trim|tolower}}
{{:error message="Ce libellé est déjà présent"}}
{{/if}}
{{: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}}
{{* ajouter le nouveau type de mouvement *}}
{{if $_GET.dir == $direction}}
{{:assign var="newlabel" from="_POST.%s_fields.label"|args:$direction}}
{{:assign newlabel=$newlabel|trim}}
{{: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}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{* vérifier l'existence d'une entrée de même nom et générer le résultat *}}
{{#foreach from=$config.input_nature key=key}}
{{if $label|trim|tolower == $_POST.input_fields.label|trim|tolower}}
{{:error message="Ce libellé d'entrée est déjà présent"}}
{{/if}}
{{:assign var="input_nature.key" value=$key}}
{{:assign var="input_nature.label" value=$label}}
{{:assign var="input_nature.type" value=$type}}
{{:assign var="input_natures." from=input_nature}}
{{/foreach}}
{{* ajouter la nouvelle entrée *}}
{{if $_GET.dir == 'input'}}
{{:assign input_label=$_POST.input_fields.label|trim|tolower|ucfirst}}
{{:assign var="input_nature.key" value=""|uuid}}
{{:assign var="input_nature.label" value=$_POST.input_fields.label|trim|tolower|ucfirst}}
{{:assign var="input_nature.type" value=$_POST.input_fields.type}}
{{:assign var="input_natures." from=input_nature}}
{{/if}}
{{* vérifier l'existence d'une sortie de même nom et générer le résultat *}}
{{#foreach from=$config.output_nature key=key}}
{{if $label|trim|tolower == $_POST.output_fields.label|trim|tolower}}
{{:error message="Ce libellé de sortie est déjà présent"}}
{{/if}}
{{:assign var="output_nature.key" value=$key}}
{{:assign var="output_nature.label" value=$label}}
{{:assign var="output_nature.type" value=$type}}
{{:assign var="output_natures." from=output_nature}}
{{/foreach}}
{{* ajouter la nouvelle sortie *}}
{{if $_GET.dir == 'output'}}
{{:assign output_label=$_POST.output_fields.label|trim|tolower|ucfirst}}
{{:assign var="output_nature.key" value=""|uuid}}
{{:assign var="output_nature.label" value=$_POST.output_fields.label|trim|tolower|ucfirst}}
{{:assign var="output_nature.type" value=$_POST.output_fields.type}}
{{:assign var="output_natures." from=output_nature}}
{{/if}}
{{:save
key="config"
validate_schema="../config.schema.json"

View File

@ -12,25 +12,38 @@
{{/if}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{:include file="../_get_config.html" keep="config"}}
{{#form on="save"}}
{{#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}}
{{:assign input_nature=null}}
{{#foreach from=$config.input_nature key=key}}
{{:assign var="input_nature.key" value=$key}}
{{if $_GET.dir == 'input'}}
{{if $key == $_GET.op_key}}
{{:assign var="input_nature.label" value=$_POST.name|trim|tolower|ucfirst}}
{{else}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{:assign var="input_nature.label" value=$label}}
{{/if}}
{{:assign var="%s_nature.type"|args:$direction value=$type}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/foreach}}
{{else}}
{{:assign var="input_nature.label" value=$label}}
{{/if}}
{{:assign var="input_nature.type" value=$type}}
{{:assign var="input_natures." from=input_nature}}
{{/foreach}}
{{#foreach from=$config.output_nature key=key}}
{{:assign var="output_nature.key" value=$key}}
{{if $_GET.dir == 'output'}}
{{if $key == $_GET.op_key}}
{{:assign var="output_nature.label" value=$_POST.name|trim|tolower|ucfirst}}
{{else}}
{{:assign var="output_nature.label" value=$label}}
{{/if}}
{{else}}
{{:assign var="output_nature.label" value=$label}}
{{/if}}
{{:assign var="output_nature.type" value=$type}}
{{:assign var="output_natures." from=output_nature}}
{{/foreach}}
{{:save

View File

@ -12,19 +12,25 @@
{{/if}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="config, directions"}}
{{:include file="../_get_config.html" keep="config"}}
{{#form on="delete"}}
{{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key"}}
{{if $_GET.dir == $direction && $key != $_GET.op_key || $_GET.dir != $direction}}
{{: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}}
{{#foreach from=$config.input_nature key=key}}
{{if $_GET.dir == 'input' && $key != $_GET.op_key || $_GET.dir == 'output'}}
{{:assign var="input_nature.key" value=$key}}
{{:assign var="input_nature.label" value=$label}}
{{:assign var="input_nature.type" value=$type}}
{{:assign var="input_natures." from=input_nature}}
{{/if}}
{{/foreach}}
{{#foreach from=$config.output_nature key=key}}
{{if $_GET.dir == 'output' && $key != $_GET.op_key || $_GET.dir == 'input'}}
{{:assign var="output_nature.key" value=$key}}
{{:assign var="output_nature.label" value=$label}}
{{:assign var="output_nature.type" value=$type}}
{{:assign var="output_natures." from=output_nature}}
{{/if}}
{{/foreach}}
{{:save
@ -39,11 +45,16 @@
{{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{:form_errors}}
{{:assign var="mvt_label" from="config.%s_nature.%s.label"|args:$_GET.dir:$_GET.op_key}}
{{:assign var="dir_label" from="directions.%s"|args:$_GET.dir}}
{{:delete_form
legend="Supprimer cette %s ?"|args:$dir_label
warning="Supprimer « %s » ?"|args:$mvt_label
}}
{{if $_GET.dir == 'input'}}
{{:delete_form
legend="Supprimer cette entrée ?"
warning="Supprimer l'entrée « %s » ?"|args:$_GET.mvt
}}
{{else}}
{{:delete_form
legend="Supprimer cette sortie ?"
warning="Supprimer la sortie « %s » ?"|args:$_GET.mvt
}}
{{/if}}
{{:admin_footer}}

View File

@ -18,22 +18,7 @@
"description": "État du matériel",
"type": "string",
"enum": ["available", "archived"]
},
"stock": {
"description": "Quantité en stock",
"type" : ["integer", "null"],
"minimum": 0
},
"out": {
"description": "Quantité sortie temporairement",
"type" : ["integer", "null"],
"minimum": 0
},
"notowned": {
"description": "Quantité présente temporairement",
"type" : ["integer", "null"],
"minimum": 0
}
},
"required": ["type", "category", "name", "status", "stock", "out", "notowned"]
"required": ["type", "category", "name", "status"]
}

View File

@ -4,91 +4,38 @@
Afficher l'historique de tous les mouvements
*}}
{{:admin_header title="Historique des mouvements" custom_css="./style.css" current="module_equipment"}}
{{:admin_header title="Historique des mouvements" current="module_equipment"}}
{{:include file="./_nav.html" current="historique"}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{* Sélecteur catégories *}}
{{:assign var="options." value="" label="Toutes les catégories" href="?"}}
{{#load type="category" order="$$.name"}}
{{:assign var="categories.%s"|args:$key value=$name}}
{{:assign
var="options."
value=$key
label=$name
href="?cat_key=%s"|args:$key
}}
{{/load}}
<fieldset class="shortFormRight">
<legend>Filtrer par catégorie</legend>
{{:dropdown
title="Filtrer par catégorie"
options=$options
value="%s"|args:$_GET.cat_key
}}
</fieldset>
{{* condition de filtrage *}}
{{if $_GET.cat_key != null}}
{{:assign condition="(SELECT key
FROM @TABLE AS cat
WHERE cat.key = (SELECT $$.category
FROM @TABLE AS mat
WHERE mat.key = @TABLE.$$.equipment)) = '%s'"|args:$_GET.cat_key}}
{{else}}
{{:assign condition=1}}
{{/if}}
{{* lister tous les mouvements *}}
{{#list
type="movement"
select="($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
select="$$.date AS 'Date';
CASE $$.direction WHEN 'input' THEN 'Entrée' WHEN 'output' THEN 'Sortie' END AS 'Mouvement';
$$.operation AS 'Opération';
(SELECT $$.name
FROM @TABLE AS mat
WHERE mat.key = @TABLE.$$.equipment) AS 'Matériel' ;
FROM @TABLE AS b
WHERE b.key = @TABLE.$$.equipment) AS 'Matériel' ;
$$.amount AS 'Quantité';
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';
$$.comment AS 'Commentaire'
"|args:$config.user_fields.name_sql
where="%s"|args:$condition
$$.comment AS 'Commentaire'"
order=1
max=50
desc=true
}}
}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
<tr>
<td>{{$date|date_short}}</td>
<td>{{$col2}}</td>
<td class="nosort">{{$op_label}}</td>
<td>{{$op_label}}</td>
<td>{{$col4}}</td>
<td class="num">{{$amount}}</td>
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$col6}}</td>
<td>{{$col7}}</td>
<td>{{$comment}}</td>
<td></td>
</tr>
{{else}}
<p class="block alert">Aucun mouvement.</p>
{{/list}}
{{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript">
(function () {
disableColumSort(document.querySelector("table[class=list]"));
})();
</script>

View File

@ -28,7 +28,7 @@
{{else}}
{{:error message="Le matériel %s n'appartient à aucune catégorie"|args:$equipment.name}}
{{/load}}
{{:admin_header title="Gestion des matériels" custom_css="./style.css" current="module_equipment"}}
{{:admin_header title="Gestion des matériels" current="module_equipment"}}
{{if $_GET.current != null}}
{{:assign current=$_GET.current}}
@ -42,16 +42,16 @@
<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>
<p class="block confirm">{{$_GET.msg}}</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
<p class="block error">Ce mouvement ne peut être supprimé</p>
{{else}}
<p class="block error">{{$_GET.msg}}</p>
{{/if}}
{{/if}}
@ -119,69 +119,18 @@
{{:assign var="quantites.%s.nonproprio"|args:$id value=$nonproprio}}
{{/load}}
{{if $current != "archives"}}
<nav class="tabs">
<aside>
{{if $_GET.prop}}
{{if $equipment.stock > 0}}
{{:linkbutton label="Sortie" shape="minus" href="mouvements/sorties/stock_disponible.html?key=%s"|args:$_GET.key target="_dialog"}}
{{/if}}
{{:linkbutton label="Entrée" shape="plus" href="mouvements/entrees/repertorie.html?key=%s"|args:$_GET.key target="_dialog"}}
{{else}}
{{:linkbutton label="Entrée" shape="plus" href="mouvements/entrees/repertorie.html?key=%s"|args:$_GET.key target="_dialog"}}
{{/if}}
</aside>
</nav>
{{/if}}
{{* lister tous les mouvements du matériel passé en paramètre *}}
{{if $_GET.prop}}
{{* calculer la quantité temporairement l'extérieur de chaque matériel *}}
{{#foreach from=$config.output_nature key=key}}
{{if $type == "temporaire"}}
{{:assign var="temp_outputs." value=$key|quote_sql}}
{{/if}}
{{/foreach}}
{{:assign operations=$temp_outputs|implode:","}}
{{:assign operations="("|cat:$operations|cat:")"}}
{{#select
mvt.key AS mvt_key,
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS reste
FROM 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="reste.%s"|args:$mvt_key value=$reste}}
{{/select}}
{{#list
type="movement"
select="
($$.date || '_' || substr('000000' || id, -6, 6)) AS 'Date';
select="$$.date 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';
$$.comment AS 'Commentaire'
"|args:$config.user_fields.name_sql
"" as 'Stock';
"" as 'Sorti';
"" as 'Disponible';
$$.comment AS 'Commentaire'"
equipment=$equipment_key
order=1
}}
@ -202,30 +151,14 @@
<td class="num nosort">{{$stock}}</td>
<td class="num nosort">{{$exterieur}}</td>
<td class="num nosort">{{$dispo}}</td>
<td>{{:link href="/admin/users/details.php?id=%s"|args:$user label="%s"|args:$col8}}</td>
<td>{{$col9}}</td>
<td>{{$comment}}</td>
<td class="actions">
{{if $current != "archives"}}
{{if $direction == "output" && $type_mvt == "temporaire"}}
{{:assign var="temp_ext" from="reste.%s"|args:$key}}
{{if $temp_ext != null && $temp_ext > 0}}
{{:linkbutton
label="Retour"
href="mouvements/output_return.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="reset"
target="_dialog"}}
{{/if}}
{{/if}}
{{if $direction == "input" && $type_mvt == "retour"}}
{{* interdire dupliquer *}}
{{else}}
{{:linkbutton
label="Dupliquer"
href="mouvements/dupliquer_mouvement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="plus"
target="_dialog"}}
{{/if}}
{{:linkbutton
label="Dupliquer"
href="mouvements/dupliquer_mouvement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="plus"
target="_dialog"}}
{{:linkbutton
label="Modifier"
href="mouvements/modifier_mouvement.html?key=%s"|args:$key
@ -236,55 +169,25 @@
href="mouvements/supprimer_mouvement.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="delete"
target="_dialog"}}
{{/if}}
{{/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';
select="$$.date 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="type_mvt" from="config.%s_nature.%s"|args:$direction:$col3}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$direction:$operation}}
{{if $direction === "input" && $op_label|in:$input_types ||
@ -297,19 +200,8 @@
<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"}}
{{:assign var="temp_in" from="present.%s"|args:$key}}
{{if $temp_in != null && $temp_in > 0}}
{{:linkbutton
label="Retour"
href="mouvements/input_return.html?key=%s&prop=%s"|args:$key:$_GET.prop
shape="reset"
target="_dialog"}}
{{/if}}
{{/if}}
{{:linkbutton
label="Dupliquer"
href="mouvements/dupliquer_mouvement.html?key=%s&prop=%s"|args:$key:$_GET.prop

View File

@ -17,10 +17,8 @@
<p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "modification" }}
<p class="block confirm">Modification effectuée</p>
{{elseif $_GET.msg == "suppression" }}
<p class="block confirm">Suppression effectuée</p>
{{elseif $_GET.msg == "supprmvtmat" }}
<p class="block confirm">Mouvement supprimé - Matériel supprimé</p>
{{else}}
<p class="block confirm">{{$_GET.msg}}</p>
{{/if}}
{{elseif $_GET.err}}
<p class="block error">Modification refusée</p>

View File

@ -29,6 +29,31 @@
<p class="help">Inventaire des matériels propriété de l'association</p>
</div>
{{* types d'entrées et sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{#foreach from=$config.input_nature key=key}}
{{:assign var="types.input.%s."|args:$type value=$key}}
{{/foreach}}
{{#foreach from=$types.input key=key}}
{{:assign var=elem from="types.input.%s"|args:$key}}
{{:assign elem=$elem|quote_sql|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="input_types.%s"|args:$key value=$elem}}
{{/foreach}}
{{#foreach from=$config.output_nature key=key}}
{{:assign var="types.output.%s."|args:$type value=$key}}
{{/foreach}}
{{#foreach from=$types.output key=key}}
{{:assign var=elem from="types.output.%s"|args:$key}}
{{:assign elem=$elem|quote_sql|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="output_types.%s"|args:$key value=$elem}}
{{/foreach}}
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign condition="1"}}
@ -43,23 +68,72 @@
(SELECT $$.name
FROM @TABLE as cat
WHERE cat.key = @TABLE.$$.category) AS 'Catégorie' ;
$$.stock AS 'Stock' ;
$$.out AS 'Sorti' ;
(SELECT $$.stock - $$.out) AS 'Disponible'
"
(SELECT
SUM($$.amount)
FROM module_data_equipment AS mvt
WHERE
$$.type = 'movement'
AND
$$.operation IN %s
AND
$$.equipment = module_data_equipment.key
) -
(SELECT
COALESCE(SUM($$.amount), 0)
FROM module_data_equipment AS mvt
WHERE
$$.type = 'movement'
AND
$$.operation IN %s
AND
$$.equipment = module_data_equipment.key
) AS 'Stock' ;
(SELECT
COALESCE(SUM($$.amount), 0)
FROM module_data_equipment AS mvt
WHERE
$$.type = 'movement'
AND
$$.operation IN %s
AND
$$.equipment = module_data_equipment.key
) -
(SELECT
COALESCE(SUM($$.amount), 0)
FROM module_data_equipment AS mvt
WHERE
$$.type = 'movement'
AND
$$.operation IN %s
AND
$$.equipment = module_data_equipment.key
) AS 'Sorti' ;
'' AS 'Disponible'
"|args:$input_types.définitif:$output_types.définitif:$output_types.temporaire:$input_types.retour
type="equipment"
where="$$.status <> 'archived' AND $$.stock NOT NULL AND %s"|args:$condition
where="$$.status <> 'archived' AND %s"|args:$condition
group="col1 HAVING col3 NOT NULL"
order=1
}}
{{:assign var=cat_name from=categories.%s|args:$category}}
{{:assign dispo="%d-%d"|math:$col3:$col4}}
<tr>
<td>{{$name}}</td>
<td>{{$cat_name}}</td>
<td class="num">{{$stock}}</td>
<td class="num">{{$out}}</td>
<td class="num">{{$col5}}</td>
<td class="num">{{$col3}}</td>
<td class="num">{{$col4}}</td>
<td class="num nosort">{{$dispo}}</td>
<td class="actions">
{{if $col5 > 0}}
{{if $col4 > 0}}
{{:linkbutton
label="Retour"
href="mouvements/entrees/retour.html?key=%s"|args:$key
shape="history"
target="_dialog"}}
{{/if}}
{{if $dispo > 0}}
{{:linkbutton
label="Sortie"
shape="minus"

View File

@ -26,9 +26,34 @@
</fieldset>
<div class="shortFormLeft">
<p class="help">Inventaire des matériels empruntés ou loués</p>
<p class="help shortFormLeft">Inventaire des matériels empruntés ou loués</p>
</div>
{{* types d'entrées et sorties *}}
{{:include file="./_get_config.html" keep="config"}}
{{#foreach from=$config.input_nature key=key}}
{{:assign var="types.input.%s."|args:$type value=$key}}
{{/foreach}}
{{#foreach from=$types.input key=key}}
{{:assign var=elem from="types.input.%s"|args:$key}}
{{:assign elem=$elem|quote_sql|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="input_types.%s"|args:$key value=$elem}}
{{/foreach}}
{{#foreach from=$config.output_nature key=key}}
{{:assign var="types.output.%s."|args:$type value=$key}}
{{/foreach}}
{{#foreach from=$types.output key=key}}
{{:assign var=elem from="types.output.%s"|args:$key}}
{{:assign elem=$elem|quote_sql|implode:","}}
{{:assign elem="("|cat:$elem|cat:")"}}
{{:assign var="output_types.%s"|args:$key value=$elem}}
{{/foreach}}
{{* filtrer selon la catégorie *}}
{{if $_GET.cat_key == null}}
{{:assign condition="1"}}
@ -43,18 +68,47 @@
(SELECT $$.name
FROM @TABLE as cat
WHERE cat.key = @TABLE.$$.category) AS 'Catégorie' ;
$$.notowned AS 'Quantité'
"
(SELECT
SUM($$.amount)
FROM module_data_equipment AS mvt
WHERE
$$.type = 'movement'
AND
$$.operation IN %s
AND
$$.equipment = module_data_equipment.key
) -
(SELECT
COALESCE(SUM($$.amount), 0)
FROM module_data_equipment AS mvt
WHERE
$$.type = 'movement'
AND
$$.operation IN %s
AND
$$.equipment = module_data_equipment.key
) AS 'Quantité'
"|args:$input_types.temporaire:$output_types.retour
type="equipment"
where="$$.status <> 'archived' AND $$.notowned != 0 AND %s"|args:$condition
where="$$.status <> 'archived' AND %s"|args:$condition
group="col1 HAVING (col3 NOT NULL AND col3 > 0)"
order=1
}}
{{:assign var=cat_name from=categories.%s|args:$category}}
<tr>
<td>{{$name}}</td>
<td>{{$cat_name}}</td>
<td class="num">{{$col3}}</td>
<td class="actions">
{{if $col3 > 0}}
{{:linkbutton
label="Retour"
href="mouvements/sorties/emprunte.html?key=%s"|args:$key
shape="history"
target="_dialog"}}
{{/if}}
{{:linkbutton
label="Entrée"
shape="plus"

View File

@ -39,7 +39,7 @@
{{#load key=$equipment_key}}
{{if $name|trim|tolower != $_POST.name|trim|tolower}}
{{* le nom change => vérifier l'existence d'un matériel du même nom *}}
{{#load type="equipment" where="$$.name = :name COLLATE U_NOCASE" :name=$_POST.name|trim limit=1}}
{{#load type="equipment" where="$$.name = :name" :name=$_POST.name|trim|tolower|ucfirst limit=1}}
{{:assign chgt_ok=false}}
{{/load}}
{{else}}
@ -49,7 +49,7 @@
{{else}}
{{* catégorie ne change pas => vérifier le nom *}}
{{#load type="equipment" where="$$.name = :name COLLATE U_NOCASE" :name=$_POST.name|trim limit=1}}
{{#load type="equipment" where="$$.name = :name" :name=$_POST.name|trim|tolower|ucfirst limit=1}}
{{:assign chgt_ok=false}}
{{/load}}
{{/if}}
@ -62,7 +62,7 @@
{{:save
key=$equipment_key
category=$category.key
name=$_POST.name|trim
name=$_POST.name|trim|tolower|ucfirst
}}
{{/if}}

View File

@ -24,9 +24,9 @@
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* vérifier la quantité saisie *}}
{{if $_POST.amount <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{* vérifier la quantité saisie (UTILE ? : fait par la navigateur) *}}
{{if $_POST.quantite <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.quantite}}
{{/if}}
{{* interdire date dans le futur *}}
@ -35,47 +35,25 @@
{{/if}}
{{* vérifier l'existence d'un matériel de même nom *}}
{{#load type="equipment" where="$$.name = :name COLLATE U_NOCASE" :name=$_POST.name|trim limit=1 assign="equipment"}}
{{#load type="equipment" where="$$.name = :name COLLATE U_NOCASE" :name=$_POST.name|trim limit=1}}}}
{{:assign equipment_key=$key}}
{{:assign var=nom_cat from="categories.%s"|args:$category}}
{{:assign present=true}}
{{/load}}
{{:assign var=nom_cat from="categories.%s"|args:$equipment.category}}
{{:assign var=post_cat from="categories.%s"|args:$_POST.category}}
{{:assign post_mat=$_POST.name|trim}}
{{:assign var="type_mvt" from="config.input_nature.%s.type"|args:$_POST.operation}}
{{:assign post_mat=$_POST.name|trim|tolower|ucfirst}}
{{if $present}}
{{* voir si le matériel existe dans une autre catégorie *}}
{{if $nom_cat != $post_cat}}
{{:error message="Le matériel « %s » est déjà présent dans la catégorie « %s » ..."|args:$post_mat:$nom_cat}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{if $type_mvt == 'définitif'}}
{{:assign var="equipment.stock" value="%d+%d"|math:$equipment.stock:$_POST.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="equipment.notowned" value="%d+%d"|math:$equipment.notowned:$_POST.amount|intval}}
{{/if}}
{{:assign equipment_key=$equipment.key}}
{{:save
key=$equipment_key
validate_schema="../equipment.schema.json"
type="equipment"
category=$_POST.category
name=$post_mat
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* utiliser la clé du matériel trouvé *}}
{{else}}
{{* enregistrer un nouveau matériel *}}
{{* nouveau matériel => nouvelle clé *}}
{{:assign equipment_key=""|uuid}}
{{if $type_mvt == 'définitif'}}
{{:assign stock=$_POST.amount|intval}}
{{:assign notowned=null}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign notowned=$_POST.amount|intval}}
{{:assign stock=null}}
{{/if}}
{{* enregistrer un nouveau matériel *}}
{{:save
key=$equipment_key
validate_schema="../equipment.schema.json"
@ -83,11 +61,9 @@
category=$_POST.category
name=$post_mat
status="available"
stock=$stock
out=0
notowned=$notowned
}}
{{/if}}
{{* Enregistrer le mouvement *}}
{{:assign mvt_key=""|uuid}}
{{:assign var="operation" from="input_labels.%d"|args:$_POST.type_operation}}
@ -97,49 +73,44 @@
type="movement"
direction="input"
operation=$_POST.operation
amount=$_POST.amount|intval
amount=$_POST.quantite|intval
equipment=$equipment_key
date=$_POST.date|parse_date
comment=$_POST.remarques|trim
storage=$_POST.storage
}}
{{if $type_mvt == "temporaire"}}
{{:assign msg="Ajout de l'entrée « %s (%d) en date du %s » effectué"|args:$post_mat:$_POST.quantite:$_POST.date}}
{{:assign var=type_entree from="config.input_nature.%s"|args:$operation}}
{{if $type_entree == "temporaire"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{:redirect force="../index.html?prop=%s&ok=1&msg=ajout"|args:$prop}}
{{:redirect force="../index.html?prop=%s&ok=1&msg=%s"|args:$prop:$msg}}
{{/form}}
{{:admin_header title="Entrée de matériel" current="module_equipment"}}
{{:form_errors}}
{{if $categories != null}}
{{#load type="storage" order="$$.name"}}
{{:assign var="storage.%s"|args:$key value=$name}}
{{/load}}
{{* formulaire ajout matériel *}}
<form method="post" action="">
<fieldset class="entree">
<legend>Enregistrer une entrée de matériel</legend>
<legend>Ajouter une entrée de matériel</legend>
<dl>
{{: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 options=$input_labels|sort}}
{{: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="number" name="quantite" label="Quantité" min=1 required=true default=1}}
</dl>
</fieldset>
<fieldset>
<legend>Sélectionner une catégorie et indiquer le nom du nouveau matériel</legend>
<dl>
{{:input type="select" name="category" label="Catégorie" default_empty="— Aucune —" options=$categories required=true}}
{{:input type="select" name="category" label="Catégorie" options=$categories required=true}}
{{:input type="text" name="name" label="Désignation" required=true}}
{{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}
{{/if}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40", rows="3" required=false}}
</dl>
</fieldset>

View File

@ -13,35 +13,20 @@
{{: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_new.direction:$mvt_new.operation}}
{{if $mvt_new.direction == "input"}}
{{if $type_mvt == "temporaire"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{else}}
{{if $type_mvt == "retour"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{/if}}
{{* infos pour affichage *}}
{{:assign amount_init=$mvt_new.amount}}
{{:assign date_init=$mvt_new.date|date_short}}
{{:assign eqpmt_key=$mvt_new.equipment}}
{{* récupérer les infos du matériel associé *}}
{{#load key=$eqpmt_key assign="equipment"}}
{{#load key=$eqpmt_key assign="eqpmt"}}
{{else}}
{{:error message="Aucun matériel avec la clé « %s »"|args:$eqpmt_key}}
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
{{* limiter les opérations possibles *}}
{{if $mvt_new.direction == "input"}}
{{* types d'entrées *}}
@ -62,6 +47,7 @@
{{/if}}
{{/foreach}}
{{/if}}
{{*
-------------------- Traiter la saisie --------------------
*}}
@ -70,26 +56,30 @@
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{/if}}
{{* 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}}
{{if $mvt_new.direction == "input" && $_POST.user != null}}
{{:error message="Un membre ne peut être associé qu'à une sortie"}}
{{/if}}
{{if $_POST.user|count > 1}}
{{:error message="Un membre au plus peut être associé à une sortie"}}
{{/if}}
{{#foreach from=$_POST.user key="id" item="name"}}
{{:assign var="user.id" value=$id}}
{{:assign var="user.name" value=$name}}
{{/foreach}}
{{* préparer le mouvement copié *}}
{{:assign var="mvt_new.operation" value=$_POST.operation}}
{{if $mvt_new.direction == "input"}}
{{:assign var="mvt_new.input_nature" value=$_POST.operation}}
{{:assign var="type_mvt" from="config.input_nature.%s.type"|args:$mvt_new.operation}}
{{if $type_mvt == "temporaire"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{else}}
{{:assign var="mvt_new.output_nature" value=$_POST.operation}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$mvt_new.operation}}
{{if $type_mvt == "retour"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{/if}}
{{: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}}
@ -108,23 +98,13 @@
order="$$.date"
assign="movement"
}}
{{if ! $insere}}
{{if $mvt_new.date < $date}}
{{if! $insere}}
{{if
$mvt_new.direction == "input" && $date >= $mvt_new.date ||
$mvt_new.direction == "output" && $date > $mvt_new.date
}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.date == $date}}
{{if $mvt_new.direction == "input" && $type_mvt != "retour"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.direction == "output" && $type_mvt == "temporaire"}}
{{if $movement.direction == "input"}}
{{:assign var="type_mvt_crt" from="config.input_nature.%s.type"|args::$movement.operation}}
{{if $type_mvt_crt == "retour"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{:assign var="movements_new." from=movement}}
@ -139,60 +119,33 @@
keep="erreur"
movements=$movements_new
}}
{{if $erreur}}
{{:assign var="mvt_label" from="%s_labels.%s"|args:$mvt_new.direction:$mvt_new.operation}}
{{:assign new_date=$mvt_new.date|date_short}}
{{:error message="Impossible d'enregistrer ce mouvement : « %s de %s (qté : %s) à la date du %s »"|args:$mvt_label:$equipment.name:$mvt_new.amount:$new_date}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{if $mvt_new.direction == "input"}}
{{:assign var="type_mvt" from="config.input_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign var="equipment.stock" value="%d+%d"|math:$equipment.stock:$_POST.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="equipment.notowned" value="%d+%d"|math:$equipment.notowned:$_POST.amount|intval}}
{{elseif $type_mvt == 'retour'}}
{{:assign var="equipment.out" value="%d-%d"|math:$equipment.out:$_POST.amount|intval}}
{{/if}}
<p class="block error">
Impossible d'enregistrer ce mouvement :
{{if $mvt_new.direction == "input"}}
« {{$mvt_new.input_nature}}
{{else}}
« {{$mvt_new.output_nature}}
{{/if}}
de {{$eqpmt.name}} (qté : {{$mvt_new.amount}}) à la date du {{$mvt_new.date|date_short}} »
</p>
{{else}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign var="equipment.stock" value="%d-%d"|math:$equipment.stock:$_POST.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$_POST.amount|intval}}
{{elseif $type_mvt == 'retour'}}
{{:assign var="equipment.notowned" value="%d-%d"|math:$equipment.notowned:$_POST.amount|intval}}
{{/if}}
{{* vérification réussie : enregistrer le mouvement modifié *}}
{{:assign mvt_key=""|uuid}}
{{:save
key=$mvt_key
validate_schema="movement.schema.json"
type="movement"
direction=$mvt_new.direction
operation=$_POST.operation
amount=$mvt_new.amount|intval
equipment=$eqpmt_key
date=$mvt_new.date
comment=$mvt_new.comment
}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=%s&msg=copie"|args:$eqpmt_key:$prop}}
{{/if}}
{{:save
key=$equipment.key
validate_schema="../equipment.schema.json"
type="equipment"
category=$equipment.category
name=$equipment.name
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* vérification réussie : enregistrer le nouveau mouvement *}}
{{:assign mvt_key=""|uuid}}
{{:save
key=$mvt_key
validate_schema="movement.schema.json"
type="movement"
direction=$mvt_new.direction
operation=$_POST.operation
amount=$mvt_new.amount|intval
equipment=$eqpmt_key
date=$mvt_new.date
comment=$mvt_new.comment
user=$user.id
storage=$_POST.storage
}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=%s&msg=copie"|args:$eqpmt_key:$prop}}
{{/form}}
{{:admin_header title="Dupliquer un mouvement" current="module_equipment"}}
@ -203,49 +156,24 @@
*}}
{{* récupérer les infos de la catégorie *}}
{{#load key=$equipment.category assign="category"}}{{/load}}
{{#load key=$eqpmt.category assign="category"}}{{/load}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}}
{{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}}
{{/select}}
{{/if}}
{{#load type="storage" order="$$.name"}}
{{:assign var="storage.%s"|args:$key value=$name}}
{{/load}}
{{* formulaire de copie du mouvement *}}
<form method="post" action="">
<fieldset>
<legend>Créer une copie de « {{$op_label}} {{$equipment.name}} (Catégorie : {{$category.name}}) »</legend>
<dl>
{{if $mvt_new.direction == "input"}}
<legend>Créer une copie de « {{$op_label}} {{$eqpmt.name}} (Catégorie : {{$category.name}}) »</legend>
{{if $mvt_new.direction == "input"}}
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}}
{{else}}
{{else}}
<dl>
{{: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}}
{{if $prop == 1 && $mvt_new.direction == "output"}}
{{:input
type="list"
name="user"
label="Membre destinataire"
default=$user
target="!users/selector.php"
multiple=true
max=1
}}
{{/if}}
{{if $mvt_new.direction == "input"}}
{{if $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}
{{/if}}
{{/if}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
</dl>
{{/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}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
</dl>
</fieldset>
<p class="submit">

View File

@ -0,0 +1,14 @@
{{* -*- brindille -*- *}}
{{* déterminer la quantité des matériels sortis temporairement *}}
{{#foreach from=$cumul_mvt key="cat_key" item="cat_elem"}}
{{#foreach from=$cat_elem.eqpmt key="eqpmt_key" item="eqpmt"}}
{{:assign quantite=$eqpmt.exterieur}}
{{if $quantite != 0}}
{{:assign
var="temporaire.%s.%s"|args:$cat_elem.name:$eqpmt_key
value="%s (quantité : %d)"|args:$eqpmt.name:$quantite
}}
{{/if}}
{{/foreach}}
{{/foreach}}

View File

@ -1,7 +1,7 @@
{{* -*- brindille -*- *}}
{{*
Enregistrer une entrée de matériel
Ajouter une entrée de matériel
paramètres :
- key : clé du matériel à ajouter
*}}
@ -31,8 +31,8 @@
{{#form on="save"}}
{{* vérifier la quantité saisie *}}
{{if $_POST.amount <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{if $_POST.quantite <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.quantite}}
{{/if}}
{{* interdire date dans le futur *}}
@ -40,26 +40,6 @@
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{:assign var="type_mvt" from="config.input_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign var="equipment.stock" value="%d+%d"|math:$equipment.stock:$_POST.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="equipment.notowned" value="%d+%d"|math:$equipment.notowned:$_POST.amount|intval}}
{{/if}}
{{:save
key=$equipment.key
validate_schema="../../equipment.schema.json"
type="equipment"
category=$equipment.category
name=$equipment.name
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* Enregistrer le mouvement *}}
{{:assign mvt_key=""|uuid}}
{{:save
@ -68,11 +48,10 @@
type="movement"
direction="input"
operation=$_POST.operation
amount=$_POST.amount|intval
amount=$_POST.quantite|intval
equipment=$equipment.key
date=$_POST.date|parse_date
comment=$_POST.remarques|trim
storage=$_POST.storage
}}
{{:assign var=type_entree from="config.input_nature.%s.type"|args:$_POST.operation}}
{{if $type_entree == "temporaire"}}
@ -80,16 +59,13 @@
{{else}}
{{:assign prop=1}}
{{/if}}
{{:redirect force="../../historique.html?key=%s&ok=1&msg=entrée&prop=%s"|args:$equipment.key:$prop}}
{{:redirect force="../../index.html?ok=1&msg=entrée&prop=%s"|args:$prop}}
{{/form}}
{{:admin_header title="Entrée de matériel" custom_css="./../../style.css" current="module_equipment"}}
{{:form_errors}}
{{* formulaire de saisie d'une entrée de matériel *}}
{{#load type="storage" order="$$.name"}}
{{:assign var="storage.%s"|args:$key value=$name}}
{{/load}}
<form method="post" action="">
<fieldset class="informations">
<legend>Informations matériel</legend>
@ -101,14 +77,11 @@
</dl>
</fieldset>
<fieldset class="entree">
<legend>Enregistrer une entrée de matériel</legend>
<legend>Ajouter une entrée de matériel</legend>
<dl>
{{: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 options=$input_labels|sort}}
{{: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 $storage != null}}
{{:input type="select" name="storage" label="Lieu de stockage" default_empty="— Aucun —" options=$storage required=false}}
{{/if}}
{{:input type="number" name="quantite" label="Quantité" required=true min=1 default=1}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}}
</dl>
</fieldset>

View File

@ -0,0 +1,110 @@
{{* -*- brindille -*- *}}
{{*
paramètres :
- key : clé du matériel qui revient
*}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../../_nav.html" current="entrees"}}
{{/if}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../../_get_config.html" keep="config"}}
{{* types d'entrées *}}
{{#foreach from=$config.input_nature key=key}}
{{if $type == 'retour'}}
{{:assign var="input_labels.%s"|args:$key value=$label}}
{{/if}}
{{/foreach}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* 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}}
{{* récupérer les infos du matériel *}}
{{#load type="equipment" key=$_GET.key assign="equipment"}}
{{:assign name=$equipment.name}}
{{/load}}
{{* Extraire et compiler les infos de la base *}}
{{:include
file="../../_calcul_dispo.html"
keep="equipments"
date=$_POST.date|parse_date
}}
{{* déterminer la quantité sortie temporairement de ce matériel à la date donnée *}}
{{:assign var=sorti from="equipments.%s.exterieur"|args:$_GET.key}}
{{if $_POST.quantite|intval > $sorti}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle sortie (%d) à la date du %s"|args:$_POST.quantite:$sorti:$_POST.date}}
{{/if}}
{{* Enregistrer le mouvement *}}
{{:assign mvt_key=""|uuid}}
{{:save
key=$mvt_key
validate_schema="../movement.schema.json"
type="movement"
direction="input"
operation=$_POST.operation
amount=$_POST.quantite|intval
equipment=$equipment.key
date=$_POST.date|parse_date
comment=$_POST.remarques|trim
}}
{{:redirect force="../../historique.html?ok=1&key=%s&prop=1&msg=retour"|args:$_GET.key}}
{{/form}}
{{:admin_header title="Retour de matériel" custom_css="./../../style.css" current="module_equipment"}}
{{:form_errors}}
{{* Extraire et compiler les infos de la base *}}
{{:include file="../../_calcul_dispo.html" keep="categories, equipments"}}
{{:assign var=sorti from="equipments.%s.exterieur"|args:$_GET.key}}
{{if $sorti > 0}}
{{* déterminer le matériel concerné par le mouvement *}}
{{#load key=$_GET.key assign="equipment"}}
{{/load}}
{{:assign var=cat_name from=categories.%s|args:$equipment.category}}
{{* formulaire d'entrée de matériel *}}
<form method="post" action="">
<fieldset class="informations">
<legend>Informations matériel</legend>
<dl class="describe">
<dt>Matériel</dt>
<dd>{{$equipment.name}}</dd>
<dt>Catégorie</dt>
<dd>{{$cat_name}}</dd>
<dt>Quantité sortie</dt>
<dd>{{$sorti}}</dd>
</dl>
</fieldset>
<fieldset class="entree">
<legend>Ajouter un retour de matériel</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="quantite" label="Quantité" min=1 required=true default=$sorti max=$sorti}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40", rows="3" required=false}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{else}}
<p class="block error">Il n'y a aucun matériel</p>
{{/if}}
{{:admin_footer}}

View File

@ -1,205 +0,0 @@
{{* -*- brindille -*- *}}
{{*
Enregistrer un retour d'entrée temporaire
paramètres :
- key : clé de l'entrée temporaire
*}}
{{* infos du mouvement *}}
{{#load key=$_GET.key assign="mvt_new"}}
{{else}}
{{:error message="Aucun mouvement avec la clé %s"|args:$_GET.key}}
{{/load}}
{{* infos du matériel associé *}}
{{#load key=$mvt_new.equipment assign="equipment"}}
{{else}}
{{:error message="Aucun matériel avec la clé « %s »"|args:$key}}
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
{{* calculer la quantité entrée temporairement *}}
{{#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
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 mvt.key = :mvt_key
GROUP by mvt.key
;
!op = $operations
:mvt_key = $_GET.key
}}
{{:assign present=$present}}
{{/select}}
{{*
-------------------- Traiter la saisie --------------------
*}}
{{#form on="save"}}
{{* vérifier validité des données *}}
{{if $_POST.amount <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{/if}}
{{if $_POST.amount > $present}}
{{:error message="La quantité (%s) doit être inférieure à la quantité présente (%s) !!"|args:$_POST.amount:$present}}
{{/if}}
{{if $_POST.date|parse_date|strtotime > $now}}
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}}
{{* préparer le nouveau mouvement *}}
{{:assign var="mvt_new.key" value=""|uuid}}
{{:assign var="mvt_new.direction" value="output"}}
{{:assign var="mvt_new.date" value=$_POST.date|parse_date}}
{{:assign var="mvt_new.operation" value=$_POST.operation}}
{{:assign var="mvt_new.amount" value=$_POST.amount}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{*
lister les mouvements
- insérer le nouveau mvt à sa place par date croissante
*}}
{{:assign insere=false}}
{{#load
where="
$$.type = 'movement'
AND
$$.equipment = :eqpmt_key"
:eqpmt_key=$equipment.key
order="$$.date"
assign="movement"
}}
{{if ! $insere}}
{{if $mvt_new.date < $date}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.date == $date}}
{{if $mvt_new.direction == "input" && $type_mvt != "retour"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.direction == "output" && $type_mvt == "temporaire"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{/if}}
{{/if}}
{{/if}}
{{:assign var="movements_new." from=movement}}
{{/load}}
{{if ! $insere}}
{{:assign var="movements_new." from=mvt_new}}
{{/if}}
{{* Vérifier la cohérence des mouvements du matériel *}}
{{:include
file="./valider_modification.html"
keep="erreur, pb"
movements=$movements_new
}}
{{if $erreur}}
{{:assign message="Impossible d'enregistrer ce mouvement."}}
{{if $pb.mvt.key != $mvt_new.key}}
{{:assign var="err_mvt_label" from="config.output_nature.%s.label"|args:$pb.mvt.operation}}
{{:assign date_pb=$pb.mvt.date|date_short}}
{{:assign var=message2 value=" Mouvement incompatible avec « %s » : « %s (qté : %s) en date du %s »."|args:$err_mvt_label:$equipment.name:$pb.mvt.amount:$date_pb}}
{{:assign message=$message|cat:$message2}}
{{/if}}
{{:error message=$message}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{:assign var="equipment.notowned" value="%d-%d"|math:$equipment.notowned:$_POST.amount|intval}}
{{:save
key=$equipment.key
validate_schema="../equipment.schema.json"
type="equipment"
category=$equipment.category
name=$equipment.name
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* vérification réussie : enregistrer le mouvement modifié *}}
{{:assign mvt_key=""|uuid}}
{{:save
key=$mvt_key
validate_schema="movement.schema.json"
type="movement"
direction="output"
operation=$_POST.operation
amount=$_POST.amount|intval
equipment=$equipment.key
date=$_POST.date|parse_date
comment=$_POST.comment|trim
}}
{{* enregistrer la liaison entre le retour et la sortie temporaire *}}
{{:save
key=""|uuid
validate_schema="link.schema.json"
type="link"
direction="input"
temp_key=$_GET.key
return=$mvt_key
}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=0&msg=retour"|args:$mvt_new.equipment}}
{{/form}}
{{:admin_header title="Retour de matériel" custom_css="./../../style.css" current="module_equipment"}}
{{:form_errors}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="entrees"}}
{{/if}}
{{*
-------------------- Préparer la saisie --------------------
*}}
{{#foreach from=$config.output_nature key=key}}
{{if $type == "retour"}}
{{:assign var="return_label.%s"|args:$key value=$label}}
{{:break}}
{{/if}}
{{/foreach}}
{{* infos de la catégorie *}}
{{#load key=$equipment.category assign="category"}}{{/load}}
<form method="post" action="">
<fieldset>
<legend>Retour de « {{$equipment.name}} (Catégorie : {{$category.name}}) »</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$return_label}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" min=1 max=$present required=true default=$present}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}

View File

@ -1,23 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["link"]
},
"direction" : {
"type" : "string",
"enum" : ["input", "output"]
},
"temp_key" : {
"description": "clé d'une entrée ou sortie temporaire",
"type": "string"
},
"return": {
"description": "clé du retour associé",
"type": "string"
}
},
"required": ["type", "direction", "temp_key", "return"]
}

View File

@ -13,42 +13,31 @@
{{/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_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"}}
{{* infos pour affichage *}}
{{:assign var="op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}}
{{:assign amount_init=$mvt_new.amount}}
{{:assign operation_init=$mvt_new.operation}}
{{:assign date_init=$mvt_new.date|date_short}}
{{:assign eqpmt_key=$mvt_new.equipment}}
{{* récupérer les infos du matériel associé *}}
{{#load key=$eqpmt_key assign="equipment"}}
{{#load key=$eqpmt_key assign="eqpmt"}}
{{else}}
{{: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"}}
{{:assign var="%s_labels.%s"|args:$direction:$key value=$label}}
{{if $mvt_new.direction == "input"}}
{{* types d'entrées *}}
{{#foreach from=$config.input_nature key=key}}
{{:assign var="input_labels.%s"|args:$key value=$label}}
{{/foreach}}
{{/foreach}}
{{else}}
{{* types de sorties *}}
{{#foreach from=$config.output_nature key=key}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{/foreach}}
{{/if}}
{{*
-------------------- Traiter la saisie --------------------
@ -58,26 +47,30 @@
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{/if}}
{{* vérifier validité des données *}}
{{* 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}}
{{if $mvt_new.direction == "input" && $_POST.user != null}}
{{:error message="Un membre ne peut être associé qu'à une sortie"}}
{{/if}}
{{if $_POST.user|count > 1}}
{{:error message="Un membre au plus peut être associé à une sortie"}}
{{/if}}
{{#foreach from=$_POST.user key="id" item="name"}}
{{:assign var="user.id" value=$id}}
{{:assign var="user.name" value=$name}}
{{/foreach}}
{{* préparer le mouvement modifié *}}
{{:assign var="mvt_new.operation" value=$_POST.operation}}
{{if $mvt_new.direction == "input"}}
{{:assign var="mvt_new.input_nature" value=$_POST.operation}}
{{:assign var="type_mvt" from="config.input_nature.%s.type"|args:$mvt_new.operation}}
{{if $type_mvt == "temporaire"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{else}}
{{:assign var="mvt_new.output_nature" value=$_POST.operation}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$mvt_new.operation}}
{{if $type_mvt == "retour"}}
{{:assign prop=0}}
{{else}}
{{:assign prop=1}}
{{/if}}
{{/if}}
{{: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}}
@ -98,23 +91,13 @@
assign="movement"
}}
{{if $key != $_GET.key}}
{{if ! $insere}}
{{if $mvt_new.date < $date}}
{{if! $insere}}
{{if
$mvt_new.direction == "input" && $date >= $mvt_new.date ||
$mvt_new.direction == "output" && $date > $mvt_new.date
}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.date == $date}}
{{if $mvt_new.direction == "input" && $type_mvt != "retour"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.direction == "output" && $type_mvt == "temporaire"}}
{{if $movement.direction == "input"}}
{{:assign var="type_mvt_crt" from="config.input_nature.%s.type"|args::$movement.operation}}
{{if $type_mvt_crt == "retour"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{:assign var="movements_new." from=movement}}
@ -133,100 +116,27 @@
{{if $erreur}}
{{:assign var="new_op_label" from="config.%s_nature.%s.label"|args:$mvt_new.direction:$mvt_new.operation}}
{{:assign new_date=$mvt_new.date|date_short}}
{{:error message="Modification impossible : « %s de %s (qté : %s) en date du %s » vers « %s de %s (qté : %s) à la date du %s »"|args:$op_label:$equipment.name:$amount_init:$date_init:$new_op_label:$equipment.name:$mvt_new.amount:$new_date}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{:assign var="type_mvt_init" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$operation_init}}
{{:assign var="type_mvt_final" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{if $mvt_new.direction == 'input'}}
{{if $type_mvt_init == 'définitif'}}
{{:assign var="equipment.stock" value="%d-%d"|math:$equipment.stock:$amount_init}}
{{elseif $type_mvt_init == 'temporaire'}}
{{:assign var="equipment.notowned" value="%d-%d"|math:$equipment.notowned:$amount_init}}
{{elseif $type_mvt_init == 'retour'}}
{{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$amount_init}}
{{/if}}
{{if $type_mvt_final == 'définitif'}}
{{:assign var="equipment.stock" value="%d+%d"|math:$equipment.stock:$mvt_new.amount|intval}}
{{elseif $type_mvt_final == 'temporaire'}}
{{:assign var="equipment.notowned" value="%d+%d"|math:$equipment.notowned:$mvt_new.amount|intval}}
{{elseif $type_mvt_final == 'retour'}}
{{:assign var="equipment.out" value="%d-%d"|math:$equipment.out:$mvt_new.amount|intval}}
{{/if}}
<p class="block error">
Modification demandée impossible :
« {{$op_label}} de {{$eqpmt.name}} (qté : {{$amount_init}}) en date du {{$date_init}} » vers
« {{$new_op_label}}
de {{$eqpmt.name}} (qté : {{$mvt_new.amount}}) à la date du {{$mvt_new.date|date_short}} »
</p>
{{else}}
{{if $type_mvt_init == 'définitif'}}
{{:assign var="equipment.stock" value="%d+%d"|math:$equipment.stock:$amount_init}}
{{elseif $type_mvt_init == 'temporaire'}}
{{:assign var="equipment.out" value="%d-%d"|math:$equipment.out:$amount_init}}
{{elseif $type_mvt_init == 'retour'}}
{{:assign var="equipment.notowned" value="%d+%d"|math:$equipment.notowned:$amount_init}}
{{/if}}
{{if $type_mvt_final == 'définitif'}}
{{:assign var="equipment.stock" value="%d-%d"|math:$equipment.stock:$mvt_new.amount|intval}}
{{elseif $type_mvt_final == 'temporaire'}}
{{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$mvt_new.amount|intval}}
{{elseif $type_mvt_final == 'retour'}}
{{:assign var="equipment.notowned" value="%d-%d"|math:$equipment.notowned:$mvt_new.amount|intval}}
{{/if}}
{{* vérification réussie : enregistrer le mouvement modifié *}}
{{:save
key=$_GET.key
validate_schema="movement.schema.json"
type="movement"
direction=$mvt_new.direction
operation=$_POST.operation
amount=$mvt_new.amount|intval
equipment=$eqpmt_key
date=$mvt_new.date
comment=$mvt_new.comment
}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=%s&msg=modification"|args:$eqpmt_key:$prop}}
{{/if}}
{{if $equipment.stock == 0}}
{{* vérifier s'il y a au moins une entrée définitive *}}
{{:assign entree_def=false}}
{{#foreach from=$config.input_nature key=key}}
{{if $type == 'définitif'}}
{{:assign var="input_types." value=$key}}
{{/if}}
{{/foreach}}
{{#foreach from=$movements_new}}
{{if $operation|in:$input_types}}
{{:assign entree_def=true}}
{{:break}}
{{/if}}
{{/foreach}}
{{if ! $entree_def}}
{{:assign var="equipment.stock" value=null}}
{{/if}}
{{/if}}
{{:save
key=$equipment.key
validate_schema="../equipment.schema.json"
type="equipment"
category=$equipment.category
name=$equipment.name
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* enregistrer le mouvement modifié *}}
{{if $user == null}}
{{:assign user_id=$mvt_new.user}}
{{else}}
{{:assign user_id=$user.id}}
{{/if}}
{{:save
key=$_GET.key
validate_schema="movement.schema.json"
type="movement"
direction=$mvt_new.direction
operation=$_POST.operation
amount=$mvt_new.amount|intval
equipment=$eqpmt_key
date=$mvt_new.date
comment=$mvt_new.comment
user=$user_id
storage=$_POST.storage
}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=%s&msg=modification"|args:$eqpmt_key:$prop}}
{{/form}}
{{:admin_header title="Modifier un mouvement" current="module_equipment"}}
@ -236,53 +146,24 @@
-------------------- Préparer la saisie --------------------
*}}
{{#load key=$equipment.category assign="category"}}{{/load}}
{{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}}
{{/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}}
{{#load type="storage" order="$$.name"}}
{{:assign var="storage.%s"|args:$key value=$name}}
{{/load}}
{{* récupérer les infos de la catégorie *}}
{{#load key=$eqpmt.category assign="category"}}{{/load}}
{{* formulaire de modification du mouvement *}}
<form method="post" action="">
<fieldset>
<legend>Modifier « {{$op_label}} {{$equipment.name}} (Catégorie : {{$category.name}}) »</legend>
<dl>
{{if $mvt_new.direction == "input"}}
<legend>Modifier « {{$op_label}} {{$eqpmt.name}} (Catégorie : {{$category.name}}) »</legend>
{{if $mvt_new.direction == "input"}}
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$input_labels|sort default=$mvt_new.operation}}
{{else}}
{{else}}
<dl>
{{: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}}
{{if $prop == 1 && $mvt_new.direction == "output" && ! $retour}}
{{:input
type="list"
name="user"
label="Membre destinataire"
default=$user
target="!users/selector.php"
multiple=true
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}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
</dl>
{{/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}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false default=$mvt_new.comment}}
</dl>
</fieldset>
<p class="submit">

View File

@ -32,14 +32,6 @@
"comment": {
"description": "Commentaire additionnel",
"type": ["null", "string"]
},
"user": {
"description": "identifiant membre dépositaire",
"type": ["integer", "null"]
},
"storage": {
"description": "clé du lieu de stockage",
"type": ["string", "null"]
}
},
"required": ["type", "direction", "operation", "amount", "equipment", "date", "comment"]

View File

@ -1,209 +0,0 @@
{{* -*- brindille -*- *}}
{{*
Enregistrer un retour de sortie temporaire
paramètres :
- key : clé de la sortie temporaire
*}}
{{* infos du mouvement *}}
{{#load key=$_GET.key assign="mvt_new"}}
{{else}}
{{:error message="Aucun mouvement avec la clé %s"|args:$_GET.key}}
{{/load}}
{{* infos du matériel associé *}}
{{#load key=$mvt_new.equipment assign="equipment"}}
{{else}}
{{:error message="Aucun matériel avec la clé « %s »"|args:$key}}
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
{{* calculer la quantité sortie temporairement *}}
{{#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
json_extract(mvt.document, '$.amount') - IFNULL(SUM(json_extract(mvt2.document, '$.amount')), 0) AS exterieur
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 mvt.key = :mvt_key
GROUP by mvt.key
;
!op = $operations
:mvt_key = $_GET.key
}}
{{:assign exterieur=$exterieur}}
{{/select}}
{{*
-------------------- Traiter la saisie --------------------
*}}
{{#form on="save"}}
{{* vérifier validité des données *}}
{{if $_POST.amount <= 0}}
{{:error message="La quantité (%s) doit être strictement positive !!"|args:$_POST.amount}}
{{/if}}
{{if $_POST.amount > $exterieur}}
{{:error message="La quantité (%s) doit être inférieure à la quantité sortie (%s) !!"|args:$_POST.amount:$exterieur}}
{{/if}}
{{if $_POST.date|parse_date|strtotime > $now}}
{{:error message="Impossible de saisir une date dans le futur (%s)"|args:$_POST.date}}
{{/if}}
{{* préparer le nouveau mouvement *}}
{{:assign var="mvt_new.key" value=""|uuid}}
{{:assign var="mvt_new.direction" value="input"}}
{{:assign var="mvt_new.date" value=$_POST.date|parse_date}}
{{:assign var="mvt_new.operation" value=$_POST.operation}}
{{:assign var="mvt_new.amount" value=$_POST.amount}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_new.direction:$mvt_new.operation}}
{{*
lister les mouvements
- insérer le nouveau mvt à sa place par date croissante
*}}
{{:assign insere=false}}
{{#load
where="
$$.type = 'movement'
AND
$$.equipment = :eqpmt_key"
:eqpmt_key=$equipment.key
order="$$.date"
assign="movement"
}}
{{if ! $insere}}
{{if $mvt_new.date < $date}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.date == $date}}
{{if $mvt_new.direction == "input" && $type_mvt != "retour"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{elseif $mvt_new.direction == "output" && $type_mvt == "temporaire"}}
{{:assign var="movements_new." from=mvt_new}}
{{:assign insere=true}}
{{/if}}
{{/if}}
{{/if}}
{{:assign var="movements_new." from=movement}}
{{/load}}
{{if ! $insere}}
{{:assign var="movements_new." from=mvt_new}}
{{/if}}
{{* Vérifier la cohérence des mouvements du matériel *}}
{{:include
file="./valider_modification.html"
keep="erreur, pb"
movements=$movements_new
}}
{{if $erreur}}
{{:assign message="Impossible d'enregistrer ce mouvement."}}
{{if $pb.mvt.key != $mvt_new.key}}
{{:assign var="err_mvt_label" from="config.input_nature.%s.label"|args:$pb.mvt.operation}}
{{:assign date_pb=$pb.mvt.date|date_short}}
{{:assign var=message2 value=" Mouvement incompatible avec « %s » : « %s (qté : %s) en date du %s »."|args:$err_mvt_label:$equipment.name:$pb.mvt.amount:$date_pb}}
{{:assign message=$message|cat:$message2}}
{{/if}}
{{:error message=$message}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{:assign var="type_mvt" from="config.input_nature.%s.type"|args:$_POST.operation}}
{{:assign var="equipment.out" value="%d-%d"|math:$equipment.out:$_POST.amount|intval}}
{{:save
key=$equipment.key
validate_schema="../equipment.schema.json"
type="equipment"
category=$equipment.category
name=$equipment.name
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* enregistrer le mouvement modifié *}}
{{:assign mvt_key=""|uuid}}
{{:save
key=$mvt_key
validate_schema="movement.schema.json"
type="movement"
direction="input"
operation=$_POST.operation
amount=$_POST.amount|intval
equipment=$equipment.key
date=$_POST.date|parse_date
comment=$_POST.comment|trim
user=$mvt_new.user
}}
{{* enregistrer la liaison entre le retour et la sortie temporaire *}}
{{:save
key=""|uuid
validate_schema="link.schema.json"
type="link"
direction="output"
temp_key=$_GET.key
return=$mvt_key
}}
{{if $_GET.user == null}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=1&msg=retour"|args:$mvt_new.equipment}}
{{else}}
{{:redirect force="/admin/users/details.php?id=%s"|args:$_GET.user}}
{{/if}}
{{/form}}
{{:admin_header title="Retour de matériel" custom_css="./../../style.css" current="module_equipment"}}
{{:form_errors}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="entrees"}}
{{/if}}
{{*
-------------------- Préparer la saisie --------------------
*}}
{{#foreach from=$config.input_nature key=key}}
{{if $type == "retour"}}
{{:assign var="return_label.%s"|args:$key value=$label}}
{{:break}}
{{/if}}
{{/foreach}}
{{* infos de la catégorie *}}
{{#load key=$equipment.category assign="category"}}{{/load}}
<form method="post" action="">
<fieldset>
<legend>Retour de « {{$equipment.name}} (Catégorie : {{$category.name}}) »</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$return_label}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" min=1 max=$exterieur required=true default=$exterieur}}
{{:input type="textarea" name="comment" label="Remarques" cols="40", rows="3" required=false}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}

View File

@ -0,0 +1,14 @@
{{* -*- brindille -*- *}}
{{* calculer les quantité de matériels dont l'asso n'est pas propriétaire *}}
{{#foreach from=$cumul_mvt key="cat_key" item="cat_elem"}}
{{#foreach from=$cat_elem.eqpmt key="eqpmt_key" item="eqpmt"}}
{{:assign quantite="%d-%d"|math:$eqpmt.nonproprio:$eqpmt.retour}}
{{if $quantite != 0}}
{{:assign
var="temporaire.%s.%s"|args:$cat_elem.name:$eqpmt_key
value="%s (quantité : %d)"|args:$eqpmt.name:$quantite
}}
{{/if}}
{{/foreach}}
{{/foreach}}

View File

@ -0,0 +1,149 @@
{{* -*- brindille -*- *}}
{{*
paramètres :
- key : clé du matériel à rendre
*}}
{{if ! $dialog}}
{{* barre de navigation *}}
{{:include file="../../_nav.html" current="sorties"}}
{{/if}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../../_get_config.html" keep="config"}}
{{* types de sorties *}}
{{#foreach from=$config.output_nature key=key}}
{{if $type == 'retour'}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{/if}}
{{/foreach}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* 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}}
{{* récupérer les infos du matériel *}}
{{#load type="equipment" key=$_GET.key assign="equipment"}}
{{/load}}
{{:assign stock=0}}
{{:assign exterieur=0}}
{{:assign nonproprio=0}}
{{:assign insere=false}}
{{* lister tous les mouvements du matériel *}}
{{#load type="movement" where="$$.equipment = '%s'"|args:$_GET.key assign="mvt" order="$$.date ASC"}}
{{* traiter le nouveau mouvement *}}
{{if ! $insere && $mvt.date > $_POST.date|parse_date}}
{{:assign insere=true}}
{{:assign dispo_old=$nonproprio}}
{{:assign nonproprio="%d-%d"|math:$nonproprio:$_POST.quantite}}
{{if $nonproprio < 0}}
{{:assign date_err=$_POST.date|date:"d/m/Y"}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle disponible (%d) à la date du %s"|args:$_POST.quantite:$dispo_old:$date_err}}
{{/if}}
{{/if}}
{{* traiter le mouvement courant *}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt.direction:$mvt.operation}}
{{if $mvt.direction === 'input'}}
{{if $type_mvt == 'définitif'}}
{{:assign stock="%d+%d"|math:$stock:$mvt.amount}}
{{elseif $type_mvt == 'retour'}}
{{:assign exterieur="%d-%d"|math:$exterieur:$mvt.amount}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign nonproprio="%d+%d"|math:$nonproprio:$mvt.amount}}
{{/if}}
{{elseif $mvt.direction === 'output'}}
{{if $type_mvt == 'définitif'}}
{{:assign stock="%d-%d"|math:$stock:$mvt.amount}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign exterieur="%d+%d"|math:$exterieur:$mvt.amount}}
{{elseif $type_mvt == 'retour'}}
{{:assign nonproprio="%d-%d"|math:$nonproprio:$mvt.amount}}
{{/if}}
{{/if}}
{{:assign dispo="%d-%d"|math:$stock:$exterieur}}
{{if $dispo < 0 || $stock < 0 || $exterieur < 0 || $nonproprio < 0}}
{{:assign date_err=$mvt.date|date:"d/m/Y"}}
{{:error message="Erreur : la quantité indiquée (%s) est incompatible avec la sortie de %s unités à la date du %s"|args:$_POST.quantite:$mvt.amount:$date_err}}
{{/if}}
{{/load}}
{{if ! $insere}}
{{:assign dispo_old=$nonproprio}}
{{:assign nonproprio="%d-%d"|math:$nonproprio:$_POST.quantite}}
{{if $nonproprio < 0}}
{{:assign date_err=$_POST.date|date:"d/m/Y"}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle disponible (%d) à la date du %s"|args:$_POST.quantite:$dispo_old:$date_err}}
{{/if}}
{{/if}}
{{* Enregistrer le mouvement *}}
{{:assign mvt_key=""|uuid}}
{{:save
key=$mvt_key
validate_schema="../movement.schema.json"
type="movement"
direction="output"
operation=$_POST.operation
amount=$_POST.quantite|intval
equipment=$equipment.key
date=$_POST.date|parse_date
comment=$_POST.remarques|trim
}}
{{:redirect force="../../historique.html?ok=1&key=%s&prop=0&msg=sortie"|args:$_GET.key}}
{{/form}}
{{:admin_header title="Sortie de matériel" custom_css="./../../style.css" current="module_equipment"}}
{{:form_errors}}
{{* Extraire et compiler les infos de la base *}}
{{:include file="../../_calcul_dispo.html" keep="categories,equipments"}}
{{:assign var=present from="equipments.%s.nonproprio"|args:$_GET.key}}
{{if $present > 0}}
{{* déterminer le matériel concerné par le mouvement *}}
{{#load key=$_GET.key assign="equipment"}}{{/load}}
{{:assign var=cat_name from=categories.%s|args:$equipment.category}}
{{* formulaire de sortie de matériel *}}
<form method="post" action="">
<fieldset class="informations">
<legend>Informations matériel</legend>
<dl class="describe">
<dt>Matériel</dt>
<dd>{{$equipment.name}}</dd>
<dt>Catégorie</dt>
<dd>{{$cat_name}}</dd>
<dt>Quantité présente</dt>
<dd>{{$present}}</dd>
</dl>
</fieldset>
<fieldset class="sortie">
<legend>Ajouter une sortie d'un matériel présent temporairement</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort}}
{{:input type="date" name="date" label="Date de sortie" required=true default=$now|date_short}}
{{:input type="number" name="quantite" label="Quantité" required=true default=$present min=1 max=$present}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{else}}
<p class="block error">Il n'y a aucun matériel en stock</p>
{{/if}}
{{:admin_footer}}

View File

@ -5,6 +5,11 @@
- key : clé du matériel à sortir
*}}
{{if ! $dialog}}
{{* barre de navigation *}}
{{:include file="../../_nav.html" current="sorties"}}
{{/if}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../../_get_config.html" keep="config"}}
@ -15,9 +20,6 @@
{{/if}}
{{/foreach}}
{{* récupérer les infos du matériel *}}
{{#load key=$_GET.key assign="equipment"}}{{/load}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* interdire date dans le futur *}}
@ -25,19 +27,9 @@
{{: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 $_POST.user|count > 1}}
{{:error message="Un membre au plus peut être associé à une sortie"}}
{{/if}}
{{#foreach from=$_POST.user key="id" item="name"}}
{{:assign var="user.id" value=$id}}
{{:assign var="user.name" value=$name}}
{{/foreach}}
{{* récupérer les infos du matériel *}}
{{#load type="equipment" key=$_GET.key assign="equipment"}}
{{/load}}
{{:assign stock=0}}
{{:assign exterieur=0}}
@ -50,17 +42,18 @@
{{if ! $insere && $mvt.date > $_POST.date|parse_date}}
{{:assign insere=true}}
{{:assign dispo_old="%d-%d"|math:$stock:$exterieur}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign stock="%d-%d"|math:$stock:$_POST.amount}}
{{:assign stock="%d-%d"|math:$stock:$_POST.quantite}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign exterieur="%d+%d"|math:$exterieur:$_POST.amount}}
{{:assign exterieur="%d+%d"|math:$exterieur:$_POST.quantite}}
{{/if}}
{{:assign dispo="%d-%d"|math:$stock:$exterieur}}
{{if $dispo < 0 || $stock < 0 || $exterieur < 0}}
{{:assign date_err=$_POST.date|date:"d/m/Y"}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle disponible (%d) à la date du %s"|args:$_POST.amount:$dispo_old:$date_err}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle disponible (%d) à la date du %s"|args:$_POST.quantite:$dispo_old:$date_err}}
{{/if}}
{{/if}}
@ -89,7 +82,7 @@
{{if $dispo < 0 || $stock < 0 || $exterieur < 0 || $nonproprio < 0}}
{{:assign date_err=$mvt.date|date:"d/m/Y"}}
{{:error message="Erreur : la quantité indiquée (%s) est incompatible avec la sortie de %s unités à la date du %s"|args:$_POST.amount:$mvt.amount:$date_err}}
{{:error message="Erreur : la quantité indiquée (%s) est incompatible avec la sortie de %s unités à la date du %s"|args:$_POST.quantite:$mvt.amount:$date_err}}
{{/if}}
{{/load}}
{{if ! $insere}}
@ -97,38 +90,18 @@
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign stock="%d-%d"|math:$stock:$_POST.amount}}
{{:assign stock="%d-%d"|math:$stock:$_POST.quantite}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign exterieur="%d+%d"|math:$exterieur:$_POST.amount}}
{{:assign exterieur="%d+%d"|math:$exterieur:$_POST.quantite}}
{{/if}}
{{:assign dispo="%d-%d"|math:$stock:$exterieur}}
{{if $dispo < 0 || $stock < 0 || $exterieur < 0}}
{{:assign date_err=$_POST.date|date:"d/m/Y"}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle disponible (%d) à la date du %s"|args:$_POST.amount:$dispo_old:$date_err}}
{{:error message="Erreur : la quantité indiquée (%s) est supérieure à celle disponible (%d) à la date du %s"|args:$_POST.quantite:$dispo_old:$date_err}}
{{/if}}
{{/if}}
{{* calculer la nouvelle quantité du matériel *}}
{{:assign var="type_mvt" from="config.output_nature.%s.type"|args:$_POST.operation}}
{{if $type_mvt == 'définitif'}}
{{:assign var="equipment.stock" value="%d-%d"|math:$equipment.stock:$_POST.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="equipment.out" value="%d+%d"|math:$equipment.out:$_POST.amount|intval}}
{{/if}}
{{:save
key=$equipment.key
validate_schema="../../equipment.schema.json"
type="equipment"
category=$equipment.category
name=$equipment.name
status="available"
stock=$equipment.stock
out=$equipment.out
notowned=$equipment.notowned
}}
{{* Enregistrer le mouvement *}}
{{:assign mvt_key=""|uuid}}
{{:save
@ -137,26 +110,29 @@
type="movement"
direction="output"
operation=$_POST.operation
amount=$_POST.amount|intval
amount=$_POST.quantite|intval
equipment=$equipment.key
date=$_POST.date|parse_date
comment=$_POST.remarques|trim
user=$user.id
}}
{{:redirect force="../../historique.html?ok=1&key=%s&prop=1&msg=sortie"|args:$_GET.key}}
{{/form}}
{{:admin_header title="Sortie de matériel" custom_css="./../../style.css" current="module_equipment"}}
{{if ! $dialog}}
{{* 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}}
{{* Extraire et compiler les infos de la base *}}
{{:include file="../../_calcul_dispo.html" keep="categories,equipments"}}
{{:assign var=stock from="equipments.%s.stock"|args:$_GET.key}}
{{:assign var=exterieur from="equipments.%s.exterieur"|args:$_GET.key}}
{{:assign dispo="%d-%d"|math:$stock:$exterieur}}
{{if $dispo > 0}}
{{* déterminer le matériel concerné par le mouvement *}}
{{#load key=$_GET.key assign="equipment"}}{{/load}}
{{:assign var=cat_name from=categories.%s|args:$equipment.category}}
{{* formulaire de sortie de matériel *}}
<form method="post" action="">
<fieldset class="informations">
@ -165,25 +141,17 @@
<dt>Matériel</dt>
<dd>{{$equipment.name}}</dd>
<dt>Catégorie</dt>
<dd>{{$category.name}}</dd>
<dd>{{$cat_name}}</dd>
<dt>Quantité disponible</dt>
<dd class="num">{{$dispo}}</dd>
</dl>
</fieldset>
<fieldset class="sortie">
<legend>Enregistrer une sortie</legend>
<legend>Ajouter une sortie</legend>
<dl>
{{:input type="select" name="operation" label="Type" required=true default_empty="— Aucun —" options=$output_labels|sort}}
{{:input type="select" name="operation" label="Type" required=true options=$output_labels|sort}}
{{: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=$dispo min=1 max=$dispo}}
{{:input
type="list"
name="user"
label="Membre destinataire"
target="!users/selector.php"
multiple=true
max=1
}}
{{:input type="number" name="quantite" label="Quantité" required=true default=$dispo min=1 max=$dispo}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}}
</dl>
</fieldset>
@ -192,8 +160,7 @@
</p>
</form>
{{else}}
<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 y a 0 unité de ce matériel disponible à la date du {{$now|date_short}}</p>
{{/if}}
{{:form_errors}}
{{:admin_footer}}

View File

@ -6,35 +6,73 @@
- prop : = 1 si matériel propriété de l'asso
*}}
{{:assign var="libelles.input" value="entrée"}}
{{:assign var="libelles.output" value="sortie"}}
{{#load key=$_GET.key assign="mvt_suppr"}}
{{else}}
{{:error message="Aucun mouvement avec la clé « %s »"|args:$_GET.key}}
{{/load}}
{{:assign var="libelle" from="libelles.%s"|args:$mvt_suppr.direction}}
{{:assign key_eqpmt_suppr=$mvt_suppr.equipment}}
{{:assign var="date_suppr" value="%s"|args:$mvt_suppr.date|date_short}}
{{* trouver le matériel concerné par ce mouvement *}}
{{#load type="equipment" where="key = :key" :key=$mvt_suppr.equipment assign="curr_eqpmt"}}
{{#load type="equipment" where="key = :key" :key=$mvt_suppr.equipment assign="equipment"}}
{{else}}
{{:error message="Aucun matériel avec la clé « %s »"|args:$mvt_suppr.equipment}}
{{/load}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
{{#form on="delete"}}
{{* 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}}
{{if $type_operation == 'temporaire'}}
{{#load type="link" where="$$.temp_key = :key" :key=$_GET.key}}
{{:assign link_key=$key}}
{{/load}}
{{if $link_key != null}}
{{:redirect force="../historique.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{else}}
{{:assign dispo=0}}
{{:assign nonprop=0}}
{{* récupérer la config des entrées/sorties *}}
{{:include file="../_get_config.html" keep="config"}}
{{* TODO vérifier s'il est possible de supprimer le mouvement *}}
{{if $mvt_suppr.direction == 'input'}}
{{:assign dispo=0}}
{{:assign nonprop=0}}
{{#load
type="movement"
where="$$.equipment = :key" :key=$mvt_suppr.equipment
assign="mvt"
order="$$.date"}}
{{* déterminer le type de mouvement *}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt.direction:$mvt.operation}}
{{if $key != $_GET.key}}
{{* ce n'est pas le mouvement à supprimer : cumuler les entrées/sorties *}}
{{if $mvt.direction == 'input'}}
{{if $type_mvt == 'temporaire'}}
{{:assign nonprop="%d+%d"|math:$nonprop:$mvt.amount}}
{{else}}
{{:assign dispo="%d+%d"|math:$dispo:$mvt.amount}}
{{/if}}
{{elseif $mvt.direction == 'output'}}
{{if $type_mvt == 'retour'}}
{{:assign nonprop="%d-%d"|math:$nonprop:$mvt.amount}}
{{else}}
{{:assign dispo="%d-%d"|math:$dispo:$mvt.amount}}
{{/if}}
{{/if}}
{{* problème ? *}}
{{if $dispo < 0 || $nonprop < 0}}
{{:redirect force="../historique.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{/if}}
{{/load}}
{{else}}
{{* sortie *}}
{{:assign temporaire=false}}
{{:assign var="type_operation" from="config.output_nature.%s.type"|args:$mvt_suppr.operation}}
{{if $type_operation == 'temporaire'}}
{{:assign exterieur=0}}
{{#load
type="movement"
where="$$.equipment = :key" :key=$mvt_suppr.equipment
@ -47,124 +85,47 @@
{{if $key != $_GET.key}}
{{* ce n'est pas le mouvement à supprimer : cumuler les entrées/sorties *}}
{{if $mvt.direction == 'input'}}
{{if $type_mvt == 'temporaire'}}
{{:assign nonprop="%d+%d"|math:$nonprop:$mvt.amount}}
{{else}}
{{:assign dispo="%d+%d"|math:$dispo:$mvt.amount}}
{{if $type_mvt == 'retour'}}
{{:assign exterieur="%d-%d"|math:$exterieur:$mvt.amount}}
{{/if}}
{{elseif $mvt.direction == 'output'}}
{{if $type_mvt == 'retour'}}
{{:assign nonprop="%d-%d"|math:$nonprop:$mvt.amount}}
{{else}}
{{:assign dispo="%d-%d"|math:$dispo:$mvt.amount}}
{{if $type_mvt == 'temporaire'}}
{{:assign exterieur="%d+%d"|math:$exterieur:$mvt.amount}}
{{/if}}
{{/if}}
{{* problème ? *}}
{{if $dispo < 0 || $nonprop < 0}}
{{if $exterieur < 0}}
{{:redirect force="../historique.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{/if}}
{{/load}}
{{* suppression possible *}}
{{if $type_operation == 'retour'}}
{{#load type="link" where="$$.return = :key" :key=$_GET.key}}
{{:assign link_key=$key}}
{{/load}}
{{/if}}
{{/if}}
{{else}}
{{* sortie *}}
{{:assign var="type_operation" from="config.output_nature.%s.type"|args:$mvt_suppr.operation}}
{{if $type_operation == 'temporaire'}}
{{#load type="link" where="$$.temp_key = :key OR $$.return = :key" :key=$_GET.key}}
{{:assign link_key=$key}}
{{/load}}
{{if $link_key != null}}
{{:redirect force="../historique.html?key=%s&prop=%s&err=1&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{/if}}
{{elseif $type_operation == 'retour'}}
{{#load type="link" where="$$.return = :key" :key=$_GET.key}}
{{:assign link_key=$key}}
{{/load}}
{{/if}}
{{/if}}
{{* vérification réussie : supprimer le mouvement *}}
{{:delete key=$_GET.key}}
{{if $link_key != null}}
{{:delete key=$link_key}}
{{/if}}
{{:assign libelle=$libelle|ucfirst}}
{{:assign var="msg" value="%s « %s (%d) en date du %s » supprimée"|args:$libelle:$equipment.name:$mvt_suppr.amount:$date_suppr}}
{{* voir s'il reste des mouvements pour le matériel concerné par le mouvement supprimé *}}
{{#foreach from=$config.input_nature key=key}}
{{if $type == 'définitif'}}
{{:assign var="input_types." value=$key}}
{{/if}}
{{/foreach}}
{{#load type="movement" where="$$.equipment = :eqpmt_key" :eqpmt_key=$curr_eqpmt.key}}
{{:assign mvt_ok=true}}
{{if $operation|in:$input_types}}
{{:assign entree_def=true}}
{{:break}}
{{/if}}
{{/load}}
{{if $mvt_ok}}
{{* calculer et mettre à jour la nouvelle quantité du matériel *}}
{{:assign var="type_mvt" from="config.%s_nature.%s.type"|args:$mvt_suppr.direction:$mvt_suppr.operation}}
{{if $mvt_suppr.direction == 'input'}}
{{if $type_mvt == 'définitif'}}
{{:assign var="curr_eqpmt.stock" value="%d-%d"|math:$curr_eqpmt.stock:$mvt_suppr.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="curr_eqpmt.notowned" value="%d-%d"|math:$curr_eqpmt.notowned:$mvt_suppr.amount|intval}}
{{elseif $type_mvt == 'retour'}}
{{:assign var="curr_eqpmt.out" value="%d+%d"|math:$curr_eqpmt.out:$mvt_suppr.amount|intval}}
{{/if}}
{{else}}
{{if $type_mvt == 'définitif'}}
{{:assign var="curr_eqpmt.stock" value="%d+%d"|math:$curr_eqpmt.stock:$mvt_suppr.amount|intval}}
{{elseif $type_mvt == 'temporaire'}}
{{:assign var="curr_eqpmt.out" value="%d-%d"|math:$curr_eqpmt.out:$mvt_suppr.amount|intval}}
{{elseif $type_mvt == 'retour'}}
{{:assign var="curr_eqpmt.notowned" value="%d+%d"|math:$curr_eqpmt.notowned:$mvt_suppr.amount|intval}}
{{/if}}
{{/if}}
{{if $curr_eqpmt.stock == 0 && ! $entree_def}}
{{:assign var="curr_eqpmt.stock" value=null}}
{{/if}}
{{:save
key=$curr_eqpmt.key
validate_schema="../equipment.schema.json"
type="equipment"
category=$curr_eqpmt.category
name=$curr_eqpmt.name
status="available"
stock=$curr_eqpmt.stock
out=$curr_eqpmt.out
notowned=$curr_eqpmt.notowned
}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=%s&msg=suppression"|args:$mvt_suppr.equipment:$_GET.prop}}
{{#load type="movement" where="$$.equipment = :eqpmt_key" :eqpmt_key=$equipment.key}}
{{else}}
{{* supprimer le matériel *}}
{{:delete key=$curr_eqpmt.key}}
{{:redirect force="../index.html?ok=1&msg=supprmvtmat"}}
{{/if}}
{{:delete key=$equipment.key}}
{{:assign var="msg" value="%s - Matériel « %s » supprimé"|args:$msg:$equipment.name}}
{{:redirect force="../index.html?ok=1&msg=%s"|args:$msg}}
{{/load}}
{{:redirect force="../historique.html?ok=1&key=%s&prop=%s&msg=%s"|args:$mvt_suppr.equipment:$_GET.prop:$msg}}
{{/form}}
{{:admin_header title="Supprimer un mouvement" current="module_equipment"}}
{{:form_errors}}
{{:assign var="date_suppr" value="%s"|args:$mvt_suppr.date|date_short}}
{{:assign var="mvt_label" from="config.%s_nature.%s.label"|args:$mvt_suppr.direction:$mvt_suppr.operation}}
{{:delete_form
legend="Supprimer ?"
warning="Supprimer le mouvement « %s de %s (quantité : %d) en date du %s » ?"|args:$mvt_label:$curr_eqpmt.name:$mvt_suppr.amount:$date_suppr
warning="Supprimer « %s (%d) en date du %s » ?"|args:$equipment.name:$mvt_suppr.amount:$date_suppr
}}

View File

@ -38,7 +38,6 @@
{{:assign dispo="%d-%d"|math:$stock:$exterieur}}
{{if $dispo < 0 || $stock < 0 || $exterieur < 0 || $nonprop < 0}}
{{:assign erreur=true}}
{{:assign var="pb.mvt" value=$mvt}}
{{:break}}
{{/if}}
{{/foreach}}

View File

@ -18,10 +18,6 @@ function disableColumSort(liste) {
anchor.removeAttribute("href");
anchor.removeAttribute("title");
anchor.removeChild(anchor.firstElementChild);
let headerClass = titles[i].getAttribute("class");
if (headerClass == null) { headerClass = ""; }
headerClass += "nosort";
titles[i].setAttribute("class", headerClass);
}
}
}

View File

@ -1,149 +0,0 @@
{{* -*- brindille -*- *}}
{{#restrict section="users" level="read"}}{{/restrict}}
{{* 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}}
{{#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 $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="%smouvements/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}}
{{#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 $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}}

View File

@ -1,43 +0,0 @@
{{* -*- brindille -*- *}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* vérification *}}
{{if $_POST.name == null}}
{{:error message="Le nom du lieu de stockage est obligatoire"}}
{{/if}}
{{#load type="storage" where="$$.name = :name" :name=$_POST.name|trim limit=1}}
{{:error message="Ce nom est déjà utilisé"}}
{{/load}}
{{:save
key=""|uuid
validate_schema="storage.schema.json"
type="storage"
name=$_POST.name|trim
location=$_POST.location|trim
}}
{{:redirect force="index.html?ok=1&msg=ajout"}}
{{/form}}
{{:admin_header title="Lieu de stockage" current="module_equipment"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="../_nav.html" current="storage"}}
{{/if}}
{{:form_errors}}
<form method="post" action="" data-focus="1">
<fieldset class="storage">
<legend>Ajouter un lieu de stockage</legend>
<dl>
{{:input type="text" name="name" label="Nom" required=true}}
{{:input type="textarea" name="location" label="Emplacement" cols="40", rows="3" required=false}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>

View File

@ -1,27 +0,0 @@
{{* -*- brindille -*- *}}
{{*
paramètres :
- key : clé du stockage à supprimer
*}}
{{#form on="delete"}}
{{* vérifier s'il est possible de supprimer le lieu de stockage *}}
{{#load type="movement" where="$$.storage = :storage_key" :storage_key=$_GET.key limit=1}}
{{:redirect force="index.html?err=1&msg=suppression"}}
{{/load}}
{{:delete where="key = :key" :key=$_GET.key}}
{{:redirect force="index.html?ok=1&msg=suppression"}}
{{/form}}
{{:admin_header title="Lieux de stockage" custom_css="./style.css" current="module_equipment"}}
{{:form_errors}}
{{#load key=$_GET.key limit="1" assign="store"}}{{/load}}
{{:delete_form
legend="Supprimer %s ?"|args:$store.name
warning="Confirmer la suppression de « %s »"|args:$store.name
}}

View File

@ -1,44 +0,0 @@
{{* -*- brindille -*- *}}
{{*
Afficher les lieux de stockage
*}}
{{:admin_header title="Configuration" current="module_equipment"}}
{{:include file="../_nav.html" current="config" subcurrent="storage"}}
{{if $_GET.ok}}
{{if $_GET.msg == "ajout"}}
<p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "suppression"}}
<p class="block confirm">Suppression effectuée</p>
{{/if}}
{{elseif $_GET.err}}
{{if $_GET.msg == "suppression"}}
<p class="block error">Impossible de supprimer ce lieu de stockage car il est utilisé !</p>
{{else}}
<p class="block error">Opération refusée</p>
{{/if}}
{{/if}}
{{#list
type="storage"
select="
$$.name AS 'Nom';
$$.location AS 'Emplacement'
"
}}
<tr>
<td>{{$name}}</td>
<td>{{$location}}</td>
<td class="actions">
{{:linkbutton label="Modifier" shape="edit" href="modify_storage.html?key=%s"|args:$key target="_dialog"}}
{{:linkbutton label="Supprimer" shape="delete" href="delete_storage.html?key=%s"|args:$key target="_dialog"}}
</td>
</tr>
{{else}}
<p class="block alert">Aucun lieu de stockage.</p>
{{/list}}
{{:admin_footer}}

View File

@ -1,53 +0,0 @@
{{* -*- brindille -*- *}}
{{* récupérer les infos du lieu de stockage *}}
{{#load key=$_GET.key assign="storage"}}
{{else}}
{{:error message="Lieu de stockage introuvable"}}
{{/load}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* voir si le nom a changé *}}
{{if $_POST.name|trim == $storage.name}}
{{* voir si l'emplacement a changé *}}
{{if $_POST.location|trim != $storage.location}}
{{:assign modif=true}}
{{/if}}
{{else}}
{{* voir s'il existe un lieu de stockage de même nom *}}
{{#load type="storage" where="$$.name = :name" :name=$_POST.name|trim limit=1}}
{{:error message="Modification impossible car ce nom (« %s ») est déjà utilisé !"|args:$name|trim}}
{{else}}
{{:assign modif=true}}
{{/load}}
{{/if}}
{{if $modif}}
{{:save
key=$storage.key
validate_schema="storage.schema.json"
type="storage"
name=$_POST.name|trim
location=$_POST.location|trim
}}
{{/if}}
{{:redirect force="./index.html?ok=1&msg=modification"}}
{{/form}}
{{:admin_header title="Modifier un lieu de stockage" current="module_equipment"}}
{{:form_errors}}
{{* formulaire de modification d'un lieu de stockage *}}
<form method="post" action="" data-focus="1">
<fieldset class="modif_storage">
<legend>Modifier le lieu de stockage « {{$storage.name}} »</legend>
<dl>
{{:input type="text" name="name" label="Nom" default=$storage.name required=true maxlength="100"}}
{{:input type="textarea" name="location" label="Emplacement" default=$storage.location cols="40", rows="3" required=false}}
</dl>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</fieldset>
</form>

View File

@ -1,19 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["storage"]
},
"name" : {
"description": "Nom du lieu de stockage",
"type": "string"
},
"location": {
"description": "Emplacement du lieu de stockage",
"type": "string"
}
},
"required": ["type", "name"]
}

View File

@ -26,8 +26,3 @@
margin-top : 0;
margin-left : 0;
}
/* désactiver rétroaction pour colonnes non triables */
table.list > thead td[class~=nosort] a:hover {
background-color : rgba(var(--gSecondColor), 0.);
}

View File

@ -14,14 +14,13 @@
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{if $_POST.unarchive != 1}}
{{if $_POST.unarchive == 1}}
{{:save
key=$equipment.key
status="available"
}}
{{:redirect force="archives.html?ok=1&msg=modification"}}
{{/if}}
{{:redirect force="archives.html"}}
{{:redirect force="archives.html?ok=1&msg=modification"}}
{{/form}}
{{:admin_header title="Modifier matériel" custom_css="./style.css" current="module_equipment"}}
@ -41,7 +40,7 @@
<dd>{{$cat_name}}</dd>
</dl>
<dl>
{{:input type="checkbox" value=1 name="unarchive" label="Archivé" checked="checked" help="décocher pour remettre le matériel en service"}}
{{:input type="checkbox" value=1 name="unarchive" label="Désarchiver" help="cocher pour remettre le matériel en service"}}
</dl>
</fieldset>