Ajout saisie tarif des sorties temporaires

This commit is contained in:
Jean-Christophe Engel 2026-02-09 14:50:04 +01:00
parent 03d278ab2c
commit bc2aefe26a
3 changed files with 146 additions and 38 deletions

View file

@ -12,18 +12,28 @@
{{* lecture config *}} {{* lecture config *}}
{{:include file="../_get_config.html" keep="config, directions, config_defaut"}} {{:include file="../_get_config.html" keep="config, directions, config_defaut"}}
{{if ! $directions|has_key:$_GET.dir}}
{{:error message="Direction « %s » inconnue !"|args:$_GET.dir}}
{{/if}}
{{#form on="save"}} {{#form on="save"}}
{{if $_POST.output_fields.type == "temporaire"}}
{{* vérifier si le tarif a été choisi *}}
{{if $_POST.tarif == null}}
{{:error message="Vous n'avez pas choisi le tarif"}}
{{/if}}
{{/if}}
{{* vérifier s'il existe un libellé de même nom dans la même direction *}} {{* vérifier s'il existe un libellé de même nom dans la même direction *}}
{{#foreach from=$directions key="direction"}} {{#foreach from=$directions key="direction"}}
{{:assign var="nature" from="config.%s_nature"|args:$direction}} {{:assign var="nature" from="config.%s_nature"|args:$direction}}
{{#foreach from=$nature key="key"}} {{#foreach from=$nature key="key" item="elem"}}
{{:assign var="fields" from="_POST.%s_fields"|args:$_GET.dir}} {{:assign var="fields" from="_POST.%s_fields"|args:$_GET.dir}}
{{if $_GET.dir == $direction && $label|trim|tolower == $fields.label|trim|tolower}} {{if $_GET.dir == $direction && $fields.label|trim|tolower == $elem.label|trim|tolower}}
{{:error message="Ce libellé est déjà présent"}} {{:error message="Le libellé « %s » est déjà présent"|args:$fields.label}}
{{/if}} {{/if}}
{{:assign var="%s_nature"|args:$direction value=$elem}}
{{:assign var="%s_nature.key"|args:$direction value=$key}} {{:assign var="%s_nature.key"|args:$direction value=$key}}
{{:assign var="%s_nature.label"|args:$direction value=$label}}
{{:assign var="%s_nature.type"|args:$direction value=$type}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/foreach}} {{/foreach}}
@ -34,6 +44,13 @@
{{:assign var="%s_nature.key"|args:$direction value=""|uuid}} {{:assign var="%s_nature.key"|args:$direction value=""|uuid}}
{{:assign var="%s_nature.label"|args:$direction value=$newlabel}} {{:assign var="%s_nature.label"|args:$direction value=$newlabel}}
{{:assign var="%s_nature.type"|args:$direction from="_POST.%s_fields.type"|args:$direction}} {{:assign var="%s_nature.type"|args:$direction from="_POST.%s_fields.type"|args:$direction}}
{{if $_POST.output_fields != null}}
{{if $_POST.output_fields.type == "temporaire"}}
{{:assign var="output_nature.fee" value=$_POST.tarif}}
{{else}}
{{:assign var="output_nature.fee" value=null}}
{{/if}}
{{/if}}
{{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}} {{:assign var="%s_natures."|args:$direction from="%s_nature"|args:$direction}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
@ -104,28 +121,28 @@
<fieldset> <fieldset>
<legend>Type de sortie</legend> <legend>Type de sortie</legend>
<dl> <dl>
<td> {{:input type="select"
{{:input type="select" label="Type de sortie"
label="Type de sortie" name="output_fields[type]"
name="output_fields[type]" options=$output_types
options=$output_types default=$type
default=$type required=true
required=true default_empty="— Choisir un type —"}}
default_empty="— Choisir un type —"}} {{:input
</td> type="text"
<td> label="Libellé de la sortie"
{{:input name="output_fields[label]"
type="text"
label="Libellé de la sortie"
name="output_fields[label]"
required=true}} required=true}}
</td> <div id="tarif">
{{:input type="radio-btn" name="tarif" value="gratuit" label="Gratuit" required=true prefix_title="Tarification"}}
{{:input type="radio-btn" name="tarif" value="payant" label="Payant" required=true}}
</div>
</dl> </dl>
<div class="help block"> <div class="help block">
<h3>Signification du type de sortie</h3> <h3>Signification du type de sortie</h3>
<ul> <ul>
<li><b>définitif</b> : le matériel n'appartient plus à l'asso (ex : vente, casse, perte, vol, ...)</li> <li><b>définitif</b> : le matériel n'appartient plus à l'asso (ex : vente, casse, perte, vol, ...)</li>
<li><b>temporaire</b> : le matériel sort temporairement de l'asso qui en reste propriétaire (ex : location, prêt)</li> <li><b>temporaire</b> : le matériel sort temporairement de l'asso qui en reste propriétaire (ex : location, prêt) ; dans ce cas, il faut indiquer si ce type de sortie est gratuit ou payant</li>
<li><b>retour</b> : le matériel <strong>non propriété de l'asso</strong> est rendu à son propriétaire (ex : retour de location ou d'emprunt)</li> <li><b>retour</b> : le matériel <strong>non propriété de l'asso</strong> est rendu à son propriétaire (ex : retour de location ou d'emprunt)</li>
</ul> </ul>
</div> </div>
@ -135,3 +152,23 @@
</p> </p>
</form> </form>
{{/if}} {{/if}}
<script type="text/javascript">
// afficher/masquer le choix du tarif
function toggleTarif(event) {
const output_fieldstype = document.getElementById('f_output_fieldstype');
const value = output_fieldstype.value;
if (value == 'temporaire') {
g.toggle('#tarif', true);
} else {
g.toggle('#tarif', false);
}
}
toggleTarif();
(function () {
const output_fieldstype = document.getElementById('f_output_fieldstype');
output_fieldstype.addEventListener("change", toggleTarif);
})();
</script>

View file

@ -2,27 +2,53 @@
{{#restrict block=true section="accounting" level="write"}}{{/restrict}} {{#restrict block=true section="accounting" level="write"}}{{/restrict}}
{{:admin_header title="Configuration" current="module_equipment"}} {{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="loan_duration"}}
{{#form on="save"}} {{#form on="save"}}
{{* vérifier si les boutons ont été cochés *}}
{{#foreach from=$module.config.output_nature item="elem"}}
{{if $elem.type == 'temporaire'}}
{{if $_POST|has_key:$elem.key}}
{{:assign var="fee" from="_POST.%s"|args:$elem.key}}
{{:assign var="elem" key=$elem.key label=$elem.label type=$elem.type fee=$fee}}
{{else}}
{{:error message="Vous n'avez pas fait de choix pour la sortie « %s »"|args:$elem.label}}
{{/if}}
{{/if}}
{{:assign var="output_nature." value=$elem}}
{{/foreach}}
{{:save {{:save
key="config" key="config"
loan_duration=$_POST.loan_duration output_nature=$output_nature
loan_duration=$_POST.loan_duration
}} }}
{{/form}} {{/form}}
{{* barre de navigation *}}
{{:include file="../_nav.html" current="config" subcurrent="divers"}} {{:include file="../_nav.html" current="config" subcurrent="divers"}}
{{:admin_header title="Configuration" current="module_equipment"}}
{{:form_errors}}
{{if $_GET.ok}} {{if $_GET.ok}}
<p class="block confirm">Configuration enregistrée.</p> <p class="block confirm">Configuration enregistrée.</p>
{{/if}} {{/if}}
{{* lecture config (défaut ou enregistrée) *}}
{{:include file="../_get_config.html" keep="loan_duration"}}
<form method="post" action="" data-focus="1"> <form method="post" action="" data-focus="1">
<fieldset class="storage"> <fieldset>
<legend>Sorties temporaires</legend>
<p class="help">Pour chaque sortie temporaire, indiquer si elle est gratuite ou payante</p>
<dl>
{{#foreach from=$module.config.output_nature}}
{{if $type == 'temporaire'}}
{{:input type="radio-btn" name=$key value="gratuit" label="Gratuit" required=true prefix_title=$label default=$fee}}
{{:input type="radio-btn" name=$key value="payant" label="Payant" required=true default=$fee}}
{{/if}}
{{/foreach}}
</dl>
</fieldset>
<fieldset>
<legend>Autres paramètres</legend> <legend>Autres paramètres</legend>
<dl> <dl>
{{:input type="number" name="loan_duration" label="Durée de prêt par défaut" min=1 required=true default=$loan_duration help="Durée en nombre de jours"}} {{:input type="number" name="loan_duration" label="Durée de prêt par défaut" min=1 required=true default=$loan_duration help="Durée en nombre de jours"}}

View file

@ -5,6 +5,7 @@
{{* {{*
paramètres : paramètres :
- key : clé du matériel à sortir - key : clé du matériel à sortir
- output_type : loan (prêt), rent (location), rien (cas général)
*}} *}}
{{* récupérer la config des entrées/sorties *}} {{* récupérer la config des entrées/sorties *}}
@ -12,7 +13,17 @@
{{* types de sorties *}} {{* types de sorties *}}
{{#foreach from=$config.output_nature key=key}} {{#foreach from=$config.output_nature key=key}}
{{if $type != 'retour'}} {{if $type == 'retour'}}
{{:continue}}
{{/if}}
{{if $type == 'temporaire' && $fee == 'payant'}}
{{:assign var="paid_keys." value=$key}}
{{/if}}
{{if $_GET.output_type == null}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{elseif $type == 'temporaire' && $_GET.output_type == "loan" && $fee != 'payant'}}
{{:assign var="output_labels.%s"|args:$key value=$label}}
{{elseif $type == 'temporaire' && $_GET.output_type == "rent" && $fee == 'payant'}}
{{:assign var="output_labels.%s"|args:$key value=$label}} {{:assign var="output_labels.%s"|args:$key value=$label}}
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
@ -200,19 +211,36 @@
{{/if}} {{/if}}
{{:input type="date" name="date" label="Date de sortie" required=true default=$now|date_short}} {{:input type="date" name="date" label="Date de sortie" required=true default=$now|date_short}}
{{:input type="number" name="amount" label="Quantité" required=true default=1 min=1 max=$dispo}} {{:input type="number" name="amount" label="Quantité" required=true default=1 min=1 max=$dispo}}
<div id="rent_user">
{{if $_GET.output_type == null || $_GET.output_type == "rent"}}
{{:input
type="list"
name="user"
label="Membre destinataire"
target="!users/selector.php"
multiple=true
max=1
required=true
}}
{{/if}}
</div>
</dl> </dl>
</fieldset> </fieldset>
<fieldset class="entree"> <fieldset class="entree">
<legend>Informations facultatives</legend> <legend>Informations facultatives</legend>
<dl> <dl>
{{:input <div id="loan_user">
type="list" {{if $_GET.output_type != "rent"}}
name="user" {{:input
label="Membre destinataire" type="list"
target="!users/selector.php" name="user"
multiple=true label="Membre destinataire"
max=1 target="!users/selector.php"
}} multiple=true
max=1
}}
{{/if}}
</div>
{{:input type="list" name="transactions" label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}} {{:input type="list" name="transactions" label="Écritures liées" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture avec facture"}}
{{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}} {{:input type="textarea" name="remarques" label="Remarques" cols="40" rows="3" required=false}}
{{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour"}} {{:input id="set_return_date" type="checkbox" value=1 name="set_return_date" label="Fixer une date de retour" help="Cocher pour fixer une date de retour"}}
@ -234,7 +262,10 @@
{{:admin_footer}} {{:admin_footer}}
<script type="text/javascript" src="../scripts.js"></script> <script type="text/javascript" src="../scripts.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var paid_keys = {{$paid_keys|json_encode|raw}};
function changeVisibility(evt, idcheck = 'f_set_return_date_1', fields = ['div_return_date']) { function changeVisibility(evt, idcheck = 'f_set_return_date_1', fields = ['div_return_date']) {
toggleVisibility(idcheck, fields); toggleVisibility(idcheck, fields);
} }
@ -244,9 +275,23 @@ function changeReturnDate(evt, id_date = 'f_date', id_return_date = 'f_return_da
setReturnDate(id_date, id_return_date, id_loan_duration); setReturnDate(id_date, id_return_date, id_loan_duration);
} }
function toggleUserDiv(event) {
const operation = document.getElementById('f_operation').value;
console.log('paid_keys=' + paid_keys + ', operation=' + operation);
if (paid_keys.includes(operation)) {
g.toggle('#rent_user', true);
g.toggle('#loan_user', false);
} else {
g.toggle('#rent_user', false);
g.toggle('#loan_user', true);
}
}
toggleUserDiv();
(function () { (function () {
document.getElementById('f_set_return_date_1').checked = false; document.getElementById('f_set_return_date_1').checked = false;
document.getElementById('f_set_return_date_1').onclick = changeVisibility; document.getElementById('f_set_return_date_1').onclick = changeVisibility;
document.getElementById('f_date').onchange = changeReturnDate; document.getElementById('f_date').onchange = changeReturnDate;
document.getElementById('f_operation').onchange = toggleUserDiv;
})(); })();
</script> </script>