amortization/save_amort.html
2026-06-10 11:16:01 +02:00

315 lines
11 KiB
HTML

{{* -*- brindille -*- *}}
{{*
Créer une écriture d'amortissement
@param immo_doc_id : id du doc associé à l'immo
*}}
{{* données de l'immobilisation *}}
{{:include file="_get_immo_data.html" immo_doc_id=$_GET.immo_doc_id|intval keep="info_immo, ligne_immo, message"}}
{{if $message != null}}
{{:error message=$message}}
{{/if}}
{{if $info_immo.amount != null}}
{{:assign var="ligne_immo.amount" value=$info_immo.amount}}
{{/if}}
{{:assign date_debut=$info_immo.date_mes|or:$info_immo.date_achat|or:$ligne_immo.date_achat}}
{{:assign amort_label=$info_immo.label|or:$ligne_immo.trans_label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $amort_label}}
{{:assign amort_label=$amort_label|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{:assign var="amort_label" value="Amortissement %s"|args:$amort_label}}
{{if $info_immo.status == "amortized" || $info_immo.status == "archived"}}
{{:error message="Cette immobilisation est complètement amortie ; il est impossible d'ajouter une écriture d'amortissement"}}
{{/if}}
{{* déduire le montant des écritures liées à l'immo courante au crédit du même compte *}}
{{:include file="_get_credit_lines.html" immo_doc_id=$_GET.immo_doc_id keep="total_credits"}}
{{:assign var="ligne_immo.amount" value="%d-%d"|math:$ligne_immo.amount:$total_credits}}
{{* lister les amortissements liés à l'immobilisation *}}
{{:include file="./_get_amort_lines.html" immo_doc_id=$_GET.immo_doc_id keep="linked_amort, total_amort"}}
{{:assign valeur_residuelle="%d-%d"|math:$ligne_immo.amount:$total_amort}}
{{if $valeur_residuelle == 0}}
{{:error message="Cette immobilisation est complètement amortie ; il est impossible d'ajouter une écriture d'amortissement"}}
{{/if}}
{{#foreach from=$linked_amort|ksort item="line"}}
{{:assign date_debut=$line.date}}
{{:assign code_amort=$line.account_code}}
{{:assign amort_account_label=$line.account_label}}
{{:assign amort_label=$line_label|or:$trans_label}}
{{/foreach}}
{{if $total_amort == 0}}
{{* 1er amortissement *}}
{{* déterminer le compte d'amortissement en fonction du compte d'immobilisation *}}
{{#select code, label from acc_accounts where id = :id; :id=$ligne_immo.account_id assign=amort_account}}
{{/select}}
{{:include
file="./_get_amort_code.html"
code_immo=$amort_account.code
keep="code_amort"
}}
{{:assign var="amort_account_label" value="Amortissement %s"|args:$amort_account.label}}
{{:assign var=libelle value="Amortissement %s"|args:$ligne_immo.trans_label}}
{{else}}
{{* amortissements suivants *}}
{{:assign date_debut=$date_debut|strtotime}}
{{:assign date_debut="%d+(60*60*24)"|math:$date_debut|date:"Y-m-d"}}
{{/if}}
{{*
lister les exercices qui englobent la date de mise en service de l'immo
ou la date du dernier amortissement
*}}
{{:assign msg_years=""}}
{{#years closed=false order="start_date" where="start_date <= :debut AND :debut <= end_date"
:debut=$date_debut assign=years.}}
{{if $total_amort == 0}}
{{:assign ts_debut=$date_debut|strtotime}}
{{else}}
{{:assign ts_debut=$start_date|strtotime}}
{{/if}}
{{:assign ts_fin=$end_date|strtotime}}
{{:assign debut=$start_date|date_short}}
{{:assign fin=$end_date|date_short}}
{{:assign var="open_years.%d"|args:$id value=$label|cat:" (du "|cat:$debut|cat:" au "|cat:$fin|cat:")"}}
{{:assign var="years_data.%d"|args:$id value=$ts_debut|cat:" "|cat:$ts_fin}}
{{:assign msg_years=$msg_years|cat:"\n"|cat:" - "|cat:$label|cat:" : "|cat:$debut|cat:" à "|cat:$fin}}
{{else}}
{{:error message="Aucun exercice ouvert pour enregistrer un amortissement"}}
{{/years}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* vérifier que la date est située dans un exercice compatible *}}
{{:assign ts_date = $_POST.date_amort|parse_date|strtotime}}
{{:assign ok=false}}
{{#foreach from=$years}}
{{if $id == $_POST.id_year}}
{{:assign selected_chart=$id_chart}}
{{if $start_date|strtotime <= $ts_date && $ts_date <= $end_date|strtotime}}
{{:assign ok=true}}
{{:break}}
{{/if}}
{{/if}}
{{/foreach}}
{{if ! $ok}}
{{:error message="La date choisie n'est dans aucun exercice compatible !\nExercices compatibles : %s"|args:$msg_years}}
{{/if}}
{{* déterminer le numéro des comptes au cas où la clé serait un identifiant *}}
{{:include
file="_get_codes.html"
account=$_POST.debit_account
keep="account_code"
}}
{{:assign debit_account=$account_code}}
{{:include
file="_get_codes.html"
account=$_POST.credit_account
keep="account_code"
}}
{{:assign credit_account=$account_code}}
{{* vérifier :
- que le compte d'amortissement débute par un préfixe correct (280, 281, ...)
- est présent dans le PC de l'exercice correspondant à la date
*}}
{{:include file="_get_config.html" keep="module.config.prefixes"}}
{{#foreach from=$module.config.prefixes item="code"}}
{{* déterminer le numéro du compte d'amortissement associé au compte d'immobilisation *}}
{{:include
file="./_get_amort_code.html"
code_immo=$code
keep="code_amort"
}}
{{:assign var="amort_array." value=$code_amort|intval}}
{{/foreach}}
{{:include
file="_check_account.html"
account=$credit_account
chart_id=$selected_chart
prefix_array=$amort_array
keep="account_ok"
}}
{{if $account_ok == null}}
{{:assign compte=$credit_account|implode:""}}
{{:redirect url="add_account.html?account=%s&chart=%s"|args:$compte:$selected_chart}}
{{/if}}
{{* vérifier que le montant ne dépasse pas le solde restant *}}
{{:assign solde="%d-%d"|math:$ligne_immo.amount:$total_amort}}
{{if $_POST.montant|trim|money_int > $solde|intval}}
{{:assign montant=$_POST.montant|trim|money_int|money_raw}}
{{:assign solde=$solde|money_raw}}
{{:error message="Le montant indiqué « %s » dépasse le solde à amortir « %s »"|args:$montant:$solde}}
{{/if}}
{{* enregistrer l'écriture *}}
{{:assign
var="lines."
debit=$_POST.montant
account=$debit_account|keys|value:0
id_project=$ligne_immo.id_project
}}
{{:assign
var="lines."
credit=$_POST.montant
account=$credit_account|keys|value:0
id_project=$ligne_immo.id_project
}}
{{:api
method="POST"
path="accounting/transaction"
assign="result"
assign_code="result_code"
id_year=$_POST.id_year
type="advanced"
date=$_POST.date_amort
label=$_POST.designation
lines=$lines
linked_transactions=$ligne_immo.trans_id|intval
}}
{{* enregistrer la liaison des lignes *}}
{{#foreach from=$result.lines item="line"}}
{{if $line.account_code == $credit_account|keys|value:0}}
{{:save
key=""|uuid
type="amort_link"
immo_doc_id=$_GET.immo_doc_id|intval
amort_line_id=$line.id
created=true
}}
{{:break}}
{{/if}}
{{/foreach}}
{{* immo soldée ? *}}
{{if $_POST.montant|trim|money_int == $solde}}
{{:assign var="info_immo.status" value="amortized"}}
{{:save
key=$info_immo.key
status=$info_immo.status
}}
{{/if}}
{{:redirect force="amortization.html?immo_doc_id=%s&type_immo=%s&ok=1&msg=amortissement"|args:$_GET.immo_doc_id:$info_immo.status}}
{{/form}}
{{:admin_header title="Ajout amortissement" custom_css="./style.css" current="module_amortization"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subcurrent="managed" subsubcurrent="amortization"}}
{{/if}}
{{:form_errors}}
{{:assign var=selected_year value=$years.0.id}}
{{:assign var=date_amort value=$years.0.end_date}}
{{:include file="_calcul_dates.html" date_debut=$date_debut date_fin=$date_amort keep="nbjours"}}
{{* montant de l'amortissement *}}
{{:assign montant_amort="%f/%f/365*%d"|math:$ligne_immo.amount:$info_immo.duration:$nbjours|intval}}
{{:assign montant_amort="min(%f, %d-%d)"|math:$montant_amort:$ligne_immo.amount:$total_amort}}
{{:assign var="debit_account.6811" value="6811 — Dot. aux amortissements des immobilisations"}}
{{:assign var="credit_account.%s"|args:$code_amort value="%s — "|args:$code_amort|cat:$amort_account_label}}
{{* -------------------------------------------------------------------------------- *}}
<div id="f_erreur" class="hidden">
<p class="block error">La date saisie n'est pas dans l'exercice choisi !</p>
</div>
<form method="post" action="">
<fieldset class="ajout_amort">
<legend>Ajouter une écriture d'amortissement</legend>
<dl>
{{:input type="select" default=$selected_year name="id_year" label="Exercice" required=true default_empty="— Faire un choix —" options=$open_years}}
{{:input type="date" name="date_amort" label="Date" required=true default=$date_amort|date_short}}
{{:input type="text" name="designation" label="Libellé" required=true default=$amort_label size="50"}}
{{:input type="money" name="montant" label="Montant" required=true default=$montant_amort}}
{{:input
type="list"
name="debit_account"
label="Compte de débit"
required=true
readonly=true
target="!acc/charts/accounts/selector.php?codes=%s&id_year=%d"|args:"68*":$selected_year
default=$debit_account
}}
{{:input
type="list"
name="credit_account"
label="Compte d'amortissement (28xx)"
required=true
readonly=true
target="!acc/charts/accounts/selector.php?codes=%s&id_year=%d"|args:"28*":$selected_year
default=$credit_account
}}
<div id="donnees" class="hidden">
{{:input type="text" name="montant_immo" default=$ligne_immo.amount}}
{{:input type="text" name="duree_amort" default=$info_immo.duration}}
{{:input type="text" name="somme_amort" default=$total_amort}}
{{:input type="select" name="years_data" options=$years_data}}
</div>
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript">
/*
afficher la date de fin de l'exercice choisi
mettre à jour le numéro d'exercice dans les sélecteur de comptes
recalculer le montant de l'amortissement
*/
function redisplayData(evt,
f_immo = 'f_montant_immo',
f_duree = 'f_duree_amort',
f_amort = 'f_somme_amort',
f_years_data = 'f_years_data',
f_years_select = 'f_id_year',
f_date = 'f_date_amort',
f_montant = 'f_montant',
f_erreur = 'f_erreur'
)
{
setDateEnd(f_years_select, f_date, f_years_data);
setSelectorYear(['credit_account', 'debit_account'], f_years_select);
displayAmort(f_immo, f_duree, f_amort, f_years_data, f_years_select, f_montant, f_erreur);
}
function redisplayAmort(evt,
f_immo = 'f_montant_immo',
f_duree = 'f_duree_amort',
f_amort = 'f_somme_amort',
f_years_data = 'f_years_data',
f_years_select = 'f_id_year',
f_date = 'f_date_amort',
f_montant = 'f_montant',
f_erreur = 'f_erreur'
)
{
displayAmort(f_immo, f_duree, f_amort, f_years_data, f_years_select, f_montant, f_erreur, f_date);
}
(function () {
setDateEnd('f_id_year', 'f_date_amort', 'f_years_data');
document.getElementById('f_id_year').onchange = redisplayData;
document.getElementById('f_date_amort').onchange = redisplayAmort;
})();
</script>