Compare commits

..

36 commits

Author SHA1 Message Date
Jean-Christophe Engel
6319275d67 Transfert : adaptation date mise en service au nouveau format doc 2026-05-19 12:26:03 +02:00
Jean-Christophe Engel
2e8492b025 Amélioration détection amortissements orphelins 2026-05-19 12:10:50 +02:00
Jean-Christophe Engel
a358858575 Suppression code inutile 2026-05-18 10:57:22 +02:00
Jean-Christophe Engel
9649d6af0e Suppression paramètre ligne immobilisation 2026-05-18 10:56:23 +02:00
Jean-Christophe Engel
3d1109018e Adaptation onglet Sorties aux nouveaux documents 2026-05-14 14:17:41 +02:00
Jean-Christophe Engel
bb8d27b616 Adaptation sortie bilan aux nouveaux documents 2026-05-14 12:00:01 +02:00
Jean-Christophe Engel
c427e8900f Amélioration cosmétique 2026-05-14 11:59:25 +02:00
Jean-Christophe Engel
40ad2a0e30 Ajout liaisons écritures sortie 2026-05-13 14:28:34 +02:00
Jean-Christophe Engel
85bc1316b5 Adaptation nouvelles liaisons + améliorations vérif dates 2026-05-13 14:25:48 +02:00
Jean-Christophe Engel
2c0181b298 Harmonisation présentation et libellés 2026-05-13 11:38:04 +02:00
Jean-Christophe Engel
91ec943e6d Ajout possibilité détachement écriture crédit 2026-05-12 13:40:23 +02:00
Jean-Christophe Engel
18ce7b0edd Modification présentation écritures avoir liées 2026-05-12 09:56:08 +02:00
Jean-Christophe Engel
b83942efd2 Ajout delete_infos.html 2026-05-11 12:01:30 +02:00
Jean-Christophe Engel
b15eab168c Correction détermination dates achat et mise en service 2026-05-11 12:01:02 +02:00
Jean-Christophe Engel
e4a637c652 Correction erreur affichage annuité estimée 2026-05-11 10:23:28 +02:00
Jean-Christophe Engel
49b207c0e1 Ajout possibilité supprimer liaison écriture crédit immo 2026-05-08 08:31:28 +02:00
Jean-Christophe Engel
e62b2a9f70 Ajout possibilité choisir compte 404 à création immobilisation 2026-05-08 08:09:03 +02:00
Jean-Christophe Engel
c07b77e942 Correction erreur solde immo 2026-05-06 13:09:11 +02:00
Jean-Christophe Engel
a1ce03a7b4 Marquer immo soldée après enregistrement dernier amortissement 2026-05-06 13:05:52 +02:00
Jean-Christophe Engel
4e131e1f5b Suppression libellé ligne écriture amortissement 2026-05-06 09:52:35 +02:00
Jean-Christophe Engel
3169fe9268 Corrections contrôles validité date et affichage état immo ignorées 2026-05-05 12:25:11 +02:00
Jean-Christophe Engel
78407592a1 Ajout page modification des infos d'une immobilisation 2026-05-04 18:45:13 +02:00
Jean-Christophe Engel
c620ac769e Changement nom : immo_link => credit_link 2026-05-04 13:48:48 +02:00
Jean-Christophe Engel
d06dd424b3 Amélioration recherche écritures au crédit du compte d'une immobilisation 2026-05-04 08:36:32 +02:00
Jean-Christophe Engel
62692ef550 Amélioration présentation 2026-04-30 11:55:12 +02:00
Jean-Christophe Engel
401aac686b Correction erreur saisie montant 2026-04-30 11:54:30 +02:00
Jean-Christophe Engel
b74ef8ae9c Correction erreur conversion montant saisi 2026-04-29 14:23:46 +02:00
Jean-Christophe Engel
d6fd5b4047 Petites améliorations et corrections 2026-04-29 13:37:22 +02:00
Jean-Christophe Engel
e31286f440 Adaptation nouveau schéma doc immo 2026-04-29 12:03:03 +02:00
Jean-Christophe Engel
faccd71ef8 liaison lignes + possibilité saisir montant 2026-04-29 12:02:07 +02:00
Jean-Christophe Engel
87a1f31bb3 liaisons écritures remplacées par liaisons lignes 2026-04-29 12:01:24 +02:00
Jean-Christophe Engel
d5c62b6ef3 Prise en compte écritures BOI avec montant immo subdivisé 2026-04-29 11:49:10 +02:00
Jean-Christophe Engel
f8f4da59b6 Prise en compte écritures gérées uniquement (immo, crédit, amort) 2026-04-29 11:49:10 +02:00
Jean-Christophe Engel
463d5d109e Affichage détails immo ; ajout montant au crédit du compte d'une l'immo 2026-04-29 11:49:00 +02:00
Jean-Christophe Engel
269ff406e4 Merge branch 'main' into classification_initiale 2026-04-02 09:22:34 +02:00
Jean-Christophe Engel
aae9580ee0 Vérification existence table module 2026-04-01 11:03:11 +02:00
28 changed files with 2249 additions and 1344 deletions

View file

@ -5,7 +5,6 @@
Cette page liste les immobilisations sorties du bilan
</p>
{{* Immobilisation avec une écriture de sortie de bilan *}}
{{:include file="_get_config.html" keep="module.config"}}
{{* lister les immobilisations *}}
@ -66,47 +65,54 @@
ORDER BY trans.date DESC;
!condition=$condition
}}
{{:assign montant_immo=$debit}}
{{* voir si l'immo est prise en charge *}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$immo_line_id|intval}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$immo_line_id assign="info_immo"}}
{{:assign status=$status}}
{{else}}
{{:assign amortissable="nsp"}}
{{:assign status="unknown"}}
{{:assign status=null}}
{{/load}}
{{if $status == "ignored"}}
{{if $status != "archived"}}
{{:continue}}
{{/if}}
{{:assign date_mes=$info_immo.date_mes|or:$trans_date}}
{{:assign montant_immo=$debit}}
{{* chercher le doc de sortie du bilan *}}
{{:assign exit_date=null}}
{{#load type="exit_link" where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id=$info_immo.id}}
{{:assign exit_line_id=$exit_line_id}}
{{#select
trans.date
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :exit_line_id;
:exit_line_id=$exit_line_id
}}
{{:assign exit_date=$date}}
{{/select}}
{{/load}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign solde_immo=$montant_immo}}
{{:assign credit_immo=null}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit,
MAX(trans2.date) as exit_date
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
INNER JOIN acc_transactions AS trans2 ON trans2.id = other_id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account
ORDER BY trans2.date, trans2.id
;
:immo_trans_id=$trans_id
:account=$account_code
assign="credit_immo."
{{:assign total_credits=0}}
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $info_immo.id
}}
{{:assign solde_immo="%d-%d"|math:$solde_immo:$credit}}
{{:assign exit_date=$exit_date}}
{{/select}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{/load}}
{{:assign solde_immo="%d-%d"|math:$montant_immo:$total_credits}}
{{if $solde_immo == 0}}
{{:assign status="archived"}}
@ -116,11 +122,6 @@
{{:continue}}
{{/if}}
{{:assign nb=$credit_immo|count}}
{{:assign nb="%d-1"|math:$nb}}
{{:assign var="last_credit" from="credit_immo.%d"|args:$nb}}
{{:assign montant_immo=$last_credit.credit}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{:assign nb_immo="%d+1"|math:$nb_immo}}
@ -150,7 +151,7 @@
<tr>
<td class="num"><a href="{{$trans_url}}">#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$date_mes|date_short}}</td>
<td>{{$exit_date|date_short}}</td>
<td>{{$trans_label}}{{if $line_label != null && $line_label != $trans_label}} — {{$line_label}}{{/if}}</td>
<td class="money">{{"%f"|math:$montant_immo|money_html:false|raw}}</td>

View file

@ -3,16 +3,16 @@
{{* Liste des immobilisations en cours d'amortissement ou amorties *}}
{{:include file="_get_config.html" keep="module.config"}}
<section class="immobilisation">
<p class="help">
{{if $type_immo == "managed"}}
Cette page liste les immobilisations en cours d'amortissement
{{elseif $type_immo == "amortized"}}
Cette page liste les immobilisations dont l'amortissement est terminé
{{/if}}
</p>
<p class="help">
{{if $type_immo == "managed"}}
Cette page liste les immobilisations en cours d'amortissement
{{elseif $type_immo == "amortized"}}
Cette page liste les immobilisations dont l'amortissement est terminé
{{/if}}
</p>
{{if $module.table != null}}
<table class="list">
<thead>
<tr>
@ -29,19 +29,6 @@
</thead>
<tbody>
{{* vérifier l'existence de la table du module *}}
{{if $module.table != null}}
{{:assign columns="$$.duration as duration, $$.status as status,"}}
{{:assign table_join="LEFT JOIN !table AS info ON $$.line = line.id"}}
{{:assign doc_condition1="($$.status <> 'ignored' AND $$.status <> 'archived')"}}
{{:assign doc_condition2="$$.status IS NULL"}}
{{else}}
{{:assign columns=""}}
{{:assign table_join=""}}
{{:assign doc_condition1="0"}}
{{:assign doc_condition2="1"}}
{{/if}}
{{* lister les immobilisations *}}
{{:assign account_condition="("}}
{{#foreach from=$module.config.prefixes item="code"}}
@ -49,17 +36,8 @@
{{:assign account_condition=$account_condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}}
{{:assign account_condition=$account_condition|cat:"0)"}}
{{*:assign doc_condition="($$.status <> 'ignored' AND $$.status <> 'archived')"*}}
{{:assign filter_condition="NOT ("}}
{{#foreach from=$module.config.filters item="filter"}}
{{:assign filter="%"|cat:$filter|cat:"%"|quote_sql}}
{{:assign filter_condition=$filter_condition|cat:" trans_label LIKE "|cat:$filter|cat:" OR "}}
{{/foreach}}
{{:assign filter_condition=$filter_condition|cat:"0)"}}
{{:assign filter_condition="("|cat:$doc_condition2|cat:" AND NOT (trans.status & 16) AND "|cat:$filter_condition|cat:")"}}
{{:assign condition=$account_condition|cat:" AND debit > 0 AND ("|cat:$filter_condition|cat:" OR "|cat:$doc_condition1|cat:")"}}
{{:assign status_condition="($$.status = 'managed' OR $$.status = 'amortized')"}}
{{:assign condition=$account_condition|cat:" AND line.debit > 0 AND "|cat:$status_condition}}
{{:assign nb_immo=0}}
{{:assign total_immo = 0}}
@ -72,127 +50,80 @@
line.label AS line_label,
account.id as account_id,
account.code as account_code,
!columns
trans.id_year as trans_id_year
trans.id_year as trans_id_year,
info.id as immo_doc_id,
$$.duration as duration,
$$.label as doc_label,
$$.amount as doc_amount,
$$.date_achat as doc_date_achat,
$$.date as doc_date_mes,
$$.status as status
FROM acc_transactions AS trans
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
INNER JOIN acc_years AS years ON trans.id_year = years.id
!table_join
INNER JOIN !table AS info ON $$.line = line.id
WHERE !condition
ORDER BY trans.date DESC;
!columns=$columns
!table_join=$table_join
ORDER BY COALESCE(doc_date_achat, trans_date) DESC;
!table=$module.table
!condition=$condition
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$immo_trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{:assign duration=$duration}}
{{:assign montant_immo=$debit}}
{{if $status == null}}
{{:assign status="unknown"}}
{{:assign montant_immo=$doc_amount|or:$debit}}
{{:assign immo_date = $doc_date_achat|or:$trans_date}}
{{:assign label_immo=$doc_label|or:$trans_label}}
{{if $line_label != null && $line_label != $label_immo}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$line_label}}
{{/if}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
{{*
chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$immo_trans_id
:account=$account_code
}}
{{:assign montant_immo="%d-%d"|math:$montant_immo:$credit}}
{{/select}}
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $immo_doc_id
}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign montant_immo="%d-%d"|math:$montant_immo:$credit}}
{{/select}}
{{else}}
{{:assign montant_immo="%d-%d"|math:$montant_immo:$amount}}
{{/if}}
{{/load}}
{{* Immobilisation soldée ? *}}
{{* TODO marquer archivée *}}
{{* TODO ¿ marquer archivée ? *}}
{{if $montant_immo == 0}}
{{:continue}}
{{/if}}
{{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}}
{{* chercher des lignes des écritures d'amortissement liées à la ligne d'immobilisation *}}
{{:assign amort_lines=null}}
{{#select
l_amort.credit as amount,
CASE links.id_related = t_immo.id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as amort_trans_id,
l_amort.id AS amort_line_id
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction OR t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER JOIN acc_accounts AS account ON l_amort.id_account = account.id
WHERE l_immo.id = :line_id AND l_amort.credit <> 0 AND account.code LIKE '28%';
:line_id = $immo_line_id|intval
assign="line"
}}
{{:assign var="amort_lines.%d."|args:$amort_trans_id value=$line}}
{{/select}}
{{:assign amort_amount=0}}
{{#foreach from=$amort_lines key="amort_trans_id" item="lines"}}
{{:assign nb=$lines|count}}
{{* lister les docs de liaison de l'écriture d'amortissement *}}
{{:assign links=null}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id"
:immo_line_id = $immo_line_id
:amort_trans_id = $amort_trans_id
assign="links."
{{#load type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id = $immo_doc_id
assign="amort_link"
}}
{{/load}}
{{#foreach from=$lines item="line"}}
{{* voir s'il existe une ligne associée à l'écriture d'amortissement *}}
{{:assign line_link_exist=false}}
{{#foreach from=$links item="link"}}
{{if $link.amort_line_id == $line.amort_line_id}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$line.amount}}
{{:assign line_link_exist=true}}
{{/if}}
{{/foreach}}
{{if ! $line_link_exist}}
{{if $nb == 1}}
{{* créer la liaison ligne immo <-> ligne amort *}}
{{*:debug lier_immo_line_id=$immo_line_id lier_amort_trans_id=$amort_trans_id avec_amort_line_id=$amort_line_id*}}
{{:save
key=""|uuid
type="link"
immo_line_id=$immo_line_id
amort_line_id=$amort_line_id
amort_trans_id=$amort_trans_id
}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$line.amount}}
{{/if}}
{{/if}}
{{/foreach}}
{{/foreach}}
{{if $amort_amount == 0}}
{{:assign exist_amort=false}}
{{else}}
{{:assign exist_amort=true}}
{{:assign amort_amount=$amort_amount}}
{{/if}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :amort_line_id;
:amort_line_id = $amort_line_id
}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$credit}}
{{/select}}
{{else}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$amount}}
{{/if}}
{{/load}}
{{* classement par onglet *}}
{{if $type_immo == "managed" && $amort_amount >= $montant_immo}}{{:continue}}{{/if}}
{{if $status == "unknown" && ! $exist_amort}}{{:continue}}{{/if}}
{{if $type_immo == "amortized" && $amort_amount < $montant_immo}}{{:continue}}{{/if}} {{* ?? *}}
{{if $type_immo == "amortized" && $amort_amount < $montant_immo}}{{:continue}}{{/if}}
{{:assign nb_immo="%d+1"|math:$nb_immo}}
{{:assign total_immo="%d+%d"|math:$total_immo:$montant_immo}}
@ -200,26 +131,25 @@
{{:assign var="sommes_immo.%s"|args:$account_code value="%d+%d"|math:$montant:$montant_immo}}
<tr>
<td class="num"><a href="{{$trans_url}}">#{{$immo_trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}{{if $line_label != null && $line_label != $trans_label}} — {{$line_label}}{{/if}}</td>
<td>{{$immo_date|date_short}}</td>
<td>{{$label_immo}}</td>
<td class="money">{{$montant_immo|money_html:false|raw}}</td>
<td class="money">{{if $duration != null}}{{$duration}}{{/if}}</td>
<td class="money">{{$amort_amount|money_html:false|raw}}</td>
<td class="money">{{"%d-%d"|math:$montant_immo:$amort_amount|money_html:false|raw}}</td>
<td><a href="{{$compte_url}}">{{$account_code}}</a></td>
<td class="actions">
{{if ! $exist_amort || $status == "unknown"}}
{{*if $amort_amount == 0*}}
{{:linkbutton
label="Paramètres"
href="add_infos.html?immo_line_id=%s&type_immo=%s"|args:$immo_line_id:$type_immo
shape="settings"
label="Détails"
href="details_immo.html?immo_doc_id=%s"|args:$immo_doc_id
shape="eye"
}}
{{* target="_dialog"*}}
{{/if}}
{{* target="_dialog"*}}
{{*/if*}}
{{:linkbutton
label="Amortissements"
href="amortization.html?immo_line_id=%s&type_immo=%s"|args:$immo_line_id:$type_immo
shape="table"
href="amortization.html?immo_doc_id=%s&type_immo=%s"|args:$immo_doc_id:$type_immo shape="table"
}}
</td>
</tr>
@ -256,9 +186,8 @@
</tr>
{{/if}}
</tfoot>
{{*/if*}}
</table>
{{if $nb_immo == 0}}
<p class="block alert">Aucune immobilisation</p>
{{/if}}
</section>
{{/if}}
{{if $nb_immo == 0 || $module.table == null}}
<p class="block alert">Aucune immobilisation</p>
{{/if}}

View file

@ -1,199 +1,187 @@
{{* -*- brindille -*- *}}
{{* Liste des immobilisations non amortissables ou non (encore) gérées *}}
{{* Liste des immobilisations non gérées ou non entièrement affectées *}}
{{:include file="_get_config.html" keep="module.config"}}
<section class="immobilisation">
<p class="help">
Cette page liste les immobilisations pas encore prises en charge
par le module ou les écritures de la balance d'ouverture initiale
dont le montant n'est pas encore totalement affecté
</p>
<p class="help">
Cette page liste les écritures pas (encore) prises en charge par le module et sans écriture d'amortissement associée.
</p>
{{:assign saved_hides=$module.config.hides}}
{{:assign var="user_hides" from="saved_hides.%s"|args:$logged_user.id}}
{{:assign saved_hides=$module.config.hides}}
{{:assign var="user_hides" from="saved_hides.%s"|args:$logged_user.id}}
{{if $_POST|count == 0}}
{{:assign unhide=$user_hides.unhide_other}}
{{if $_POST|count == 0}}
{{:assign unhide=$user_hides.unhide_other}}
{{else}}
{{if $_POST.unhide == null}}
{{:assign unhide=0}}
{{else}}
{{if $_POST.unhide == null}}
{{:assign unhide=0}}
{{else}}
{{:assign unhide=1}}
{{:assign unhide=1}}
{{/if}}
{{:assign var="user_hides.unhide_other" value=$unhide"}}
{{:assign var="saved_hides.%s"|args:$logged_user.id value=$user_hides}}
{{:save key="config" hides=$saved_hides}}
{{/if}}
{{if $unhide}}
{{:assign checked="checked"}}
{{/if}}
{{* vérifier l'existence de la table du module *}}
{{if $module.table != null}}
{{:assign columns="$$.status as status, SUM($$.amount) as amount,"}}
{{:assign table_join="LEFT JOIN !table AS info ON $$.line = line.id"}}
{{:assign doc_condition="($$.status IS NULL OR $$.status == 'managed' OR $$.status == 'ignored')"}}
{{else}}
{{:assign columns=""}}
{{:assign table_join=""}}
{{:assign doc_condition="1"}}
{{/if}}
{{*
lister les immobilisations non prises en charge par le module
ou dont le montant n'a pas été totalement affecté
*}}
{{:assign account_condition="("}}
{{#foreach from=$module.config.prefixes item="code"}}
{{:assign code=$code|cat:"%"|quote_sql}}
{{:assign account_condition=$account_condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}}
{{:assign account_condition=$account_condition|cat:"0)"}}
{{if $unhide == null}}
{{:assign filter_condition="NOT ("}}
{{#foreach from=$module.config.filters item="filter"}}
{{:assign filter="%"|cat:$filter|cat:"%"|quote_sql}}
{{:assign filter_condition=$filter_condition|cat:" trans_label LIKE "|cat:$filter|cat:" OR "}}
{{/foreach}}
{{:assign filter_condition=$filter_condition|cat:"0)"}}
{{else}}
{{:assign filter_condition="1"}}
{{/if}}
{{:assign condition=$account_condition|cat:" AND debit > 0 AND NOT (trans.status & 16) AND "|cat:$filter_condition|cat:" AND "|cat:$doc_condition}}
{{:assign nb_managed=0}}
{{:assign nb_ignored=0}}
{{:assign nb_null=0}}
{{:assign nb_other=0}}
{{#select
trans.id as immo_trans_id,
trans.label as trans_label,
trans.date as trans_date,
line.id as immo_line_id,
line.debit AS debit,
line.label AS line_label,
account.id as account_id,
account.code as account_code,
account.label as account_label,
!columns
trans.id_year as trans_id_year
FROM acc_transactions AS trans
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
INNER JOIN acc_years AS years ON trans.id_year = years.id
!table_join
WHERE !condition
GROUP BY immo_line_id
ORDER BY trans.date DESC;
!columns=$columns
!table_join=$table_join
!table=$module.table
!condition=$condition
assign="immo_line"
}}
{{*
parmi les immos gérées, ne conserver que celles dont le montant dans le doc est non nul
et inférieur au montant de l'écriture d'immo
*}}
{{if $immo_line.status == 'managed'}}
{{if $immo_line.amount == null || $immo_line.amount == 0 || $immo_line.amount == $immo_line.debit}}
{{:continue}}
{{/if}}
{{:assign var="user_hides.unhide_other" value=$unhide"}}
{{:assign var="saved_hides.%s"|args:$logged_user.id value=$user_hides}}
{{:save key="config" hides=$saved_hides}}
{{/if}}
{{if $unhide}}
{{:assign checked="checked"}}
{{if $status == null}}
{{:assign nb_null="%d+1"|math:$nb_null}}
{{elseif $status == 'managed'}}
{{:assign nb_managed="%d+1"|math:$nb_managed}}
{{elseif $status == 'ignored'}}
{{:assign nb_ignored="%d+1"|math:$nb_ignored}}
{{else}}
{{:assign nb_other="%d+1"|math:$nb_other}}
{{/if}}
<form method="post" action="">
<fieldset>
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher toutes les écritures" }}
</fieldset>
</form>
{{:assign var="immo_lines." value=$immo_line}}
{{/select}}
{{*:debug lines=$immo_lines nb_lines=$immo_lines|count nb_null=$nb_null nb_managed=$nb_managed nb_ignored=$nb_ignored nb_other=$nb_other unhide=$unhide*}}
<table class="list">
<thead>
<tr>
<th class="num"></th>
<th>Date</th>
<th>Libellé</th>
<th class="nombre">Montant</th>
<th>N° compte</th>
<th>Compte</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
<form method="post" action="">
<fieldset>
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher les écritures ignorées" }}
</fieldset>
</form>
{{* vérifier l'existence de la table du module *}}
{{#load limit="1"}}
{{:assign columns="$$.duration as duration, $$.status as status,"}}
{{:assign table_join="LEFT JOIN !table AS info ON $$.line = line.id"}}
{{:assign doc_condition1="($$.status == 'ignored')"}}
{{:assign doc_condition2="$$.status IS NULL"}}
{{else}}
{{:assign columns=""}}
{{:assign table_join=""}}
{{:assign doc_condition1="0"}}
{{:assign doc_condition2="1"}}
{{/load}}
{{if $immo_lines|count > 0}}
<table class="list">
<thead>
<tr>
<th class="num"></th>
<th class="nombre">Ligne</th>
<th>Date</th>
<th>Libellé</th>
<th class="nombre">Montant</th>
<th class="nombre">Affecté</th>
<th class="nombre">Reste</th>
<th>N° compte</th>
<th>Compte</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
{{#foreach from=$immo_lines item="line"}}
{{* lister les immobilisations *}}
{{:assign account_condition="("}}
{{#foreach from=$module.config.prefixes item="code"}}
{{:assign code=$code|cat:"%"|quote_sql}}
{{:assign account_condition=$account_condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}}
{{:assign account_condition=$account_condition|cat:"0)"}}
{{if $unhide == null}}
{{:assign filter_condition="NOT ("}}
{{#foreach from=$module.config.filters item="filter"}}
{{:assign filter="%"|cat:$filter|cat:"%"|quote_sql}}
{{:assign filter_condition=$filter_condition|cat:" trans_label LIKE "|cat:$filter|cat:" OR "}}
{{/foreach}}
{{:assign filter_condition=$filter_condition|cat:"0)"}}
{{else}}
{{:assign filter_condition="1"}}
{{/if}}
{{:assign filter_condition="("|cat:$doc_condition2|cat:" AND NOT (trans.status & 16) AND "|cat:$filter_condition|cat:")"}}
{{:assign condition=$account_condition|cat:" AND debit > 0 AND ("|cat:$filter_condition|cat:" OR "|cat:$doc_condition1|cat:")"}}
{{:assign nb_immo=0}}
{{#select
trans.id as immo_trans_id,
trans.label as trans_label,
trans.date as trans_date,
line.id as immo_line_id,
line.debit AS debit,
line.label AS line_label,
account.id as account_id,
account.code as account_code,
account.label as account_label,
!columns
trans.id_year as trans_id_year
FROM acc_transactions AS trans
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
INNER JOIN acc_years AS years ON trans.id_year = years.id
!table_join
WHERE !condition
ORDER BY trans.date DESC;
!columns=$columns
!table_join=$table_join
!table=$module.table
!condition=$condition
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$immo_trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{if $status == null}}
{{:assign status="unknown"}}
{{/if}}
{{if $unhide == null}}
{{if $status != "unknown"}}
{{:continue}}
{{/if}}
{{else}}
{{if $status != "ignored" && $status != "unknown"}}
{{:continue}}
{{/if}}
{{* vérifier si le libellé aurait pu être filtré *}}
{{#foreach from=$module.config.filters item="filter"}}
{{if $filter|strpos:$trans_label !== false}}
{{:assign status="ignored"}}
{{/if}}
{{/foreach}}
{{/if}}
{{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}}
{{:assign amort_lines=null}}
{{#select
l_amort.credit as amort_amount,
CASE links.id_related = t_immo.id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as amort_trans_id,
l_amort.id AS amort_line_id
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction OR t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER JOIN acc_accounts AS account ON l_amort.id_account = account.id
WHERE l_immo.id = :line_id AND l_amort.credit <> 0 AND account.code LIKE '28%';
:line_id = $immo_line_id|intval
assign="amort_lines."
}}
{{/select}}
{{:assign amort_amount=0}}
{{#foreach from=$amort_lines item="line"}}
{{* voir s'il existe un doc associé à l'écriture d'amortissement *}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id AND $$.amort_line_id = :amort_line_id"
:immo_line_id = $immo_line_id
:amort_trans_id = $line.amort_trans_id
:amort_line_id = $line.amort_line_id
}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$line.amount}}
{{else}}
{{* TODO À VÉRIFIER (cas multi-lignes) *}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$line.amount}}
{{/load}}
{{/foreach}}
{{if $amort_amount != 0}}
{{if $unhide == null}}
{{if $status == "ignored"}}
{{:continue}}
{{/if}}
{{else}}
{{* vérifier si le libellé aurait pu être filtré *}}
{{#foreach from=$module.config.filters item="filter"}}
{{if $filter|strpos:$trans_label !== false}}
{{:assign status="ignored"}}
{{/if}}
{{/foreach}}
{{/if}}
{{:assign nb_immo="%d+1"|math:$nb_immo}}
<tr {{if $status == "ignored"}}class="ignored"{{/if}}>
<td class="num"><a href="{{$trans_url}}">#{{$immo_trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}{{if $line_label != null && $line_label != $trans_label}} — {{$line_label}}{{/if}}</td>
<td class="money">{{"%f"|math:$debit|money_html:false|raw}}</td>
<td><a href="{{$compte_url}}">{{$account_code}}</a></td>
<td>{{$account_label}}</td>
<td class="actions">
{{:linkbutton
label="Paramètres"
href="add_infos.html?immo_line_id=%s&type_immo=other"|args:$immo_line_id
shape="settings"
target="_dialog"
}}
</td>
</tr>
{{/select}}
</tbody>
</table>
{{if $nb_immo == 0}}
<p class="block alert">Aucune immobilisation</p>
{{/if}}
</section>
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.immo_trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.trans_id_year}}
{{:assign reste="%d-%d"|math:$line.debit:$line.amount}}
<tr {{if $status == "ignored"}}class="ignored"{{/if}}>
<td class="num"><a href="{{$trans_url}}">#{{$line.immo_trans_id}}</a></td>
<td class="nombre">{{$line.immo_line_id}}</td>
<td>{{$trans_date|date_short}}</td>
<td>{{$line.trans_label}}{{if $line.line_label != null && $line.line_label != $line.trans_label}} — {{$line.line_label}}{{/if}}</td>
<td class="money">{{"%f"|math:$line.debit|money_html:false|raw}}</td>
<td class="money">{{"%f"|math:$line.amount|money_html:false|raw}}</td>
<td class="money">{{"%f"|math:$reste|money_html:false|raw}}</td>
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td>
<td class="actions">
{{:linkbutton
label="Paramètres"
href="add_infos.html?immo_line_id=%s"|args:$immo_line_id
shape="settings"
}}
{{* target="_dialog"*}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
{{else}}
<p class="block alert">Aucune immobilisation</p>
{{/if}}
<script type="text/javascript">
function changeVisibility(evt, idcheck = 'f_unhide_1') {

View file

@ -1,17 +1,35 @@
{{* -*- brindille -*- *}}
<nav class="tabs">
{{if $current == "index" && $subsubcurrent == null}}
{{if $current == "index" && $subcurrent != "unfinished" && $subsubcurrent == null}}
<aside>
{{:linkbutton label="Ajouter une immobilisation" shape="plus" href="add_asset.html"}}
</aside>
{{elseif $current == "index" && $subcurrent == "details"}}
<aside>
{{if $subsubcurrent|match:"credit"}}
{{:linkbutton label="Rattacher une écriture d'immobilisation" href="link_immo.html?immo_doc_id=%s"|args:$_GET.immo_doc_id shape="link" target="_dialog"}}
{{/if}}
{{if $subsubcurrent|match:"modif"}}
{{:linkbutton label="Modifier" href="modify_infos.html?immo_doc_id=%s"|args:$_GET.immo_doc_id shape="edit" target="_dialog"}}
{{/if}}
</aside>
{{elseif $subsubcurrent == "amortization" && $type_immo == null || $type_immo == "managed" || $type_immo == "other"}}
<aside>
{{if $autres_amort}}
{{:linkbutton label="Rattacher une écriture" href="other_amortizations.html?immo_line_id=%s"|args:$_GET.immo_line_id shape="link" target="_dialog"}}
{{:linkbutton
label="Rattacher un amortissement"
title="Rattacher un amortissement existant"
href="other_amortizations.html?immo_doc_id=%s"|args:$_GET.immo_doc_id
shape="link"
target="_dialog"}}
{{/if}}
{{:linkbutton label="Enregistrer un amortissement" shape="plus"
href="save_amort.html?immo_line_id=%s"|args:$_GET.immo_line_id}}
{{:linkbutton
label="Enregistrer un amortissement"
title="Enregistrer un nouvel amortissement"
href="save_amort.html?immo_doc_id=%s"|args:$_GET.immo_doc_id target="_dialog"
shape="plus"
}}
</aside>
{{/if}}
@ -20,7 +38,7 @@
<li {{if $subcurrent == "amortized"}}class="current"{{/if}}><a href="index.html?type_immo=amortized">Amorties</a></li>
<li {{if $subcurrent == "archived"}}class="current"{{/if}}><a href="index.html?type_immo=archived">Sorties du bilan</a></li>
<li {{if $subcurrent == "unfinished"}}class="current"{{/if}}><a href="index.html?type_immo=unfinished">En cours</a></li>
<li {{if $subcurrent == "other"}}class="current"{{/if}}><a href="index.html?type_immo=other">Autres</a></li>
<li {{if $subcurrent == "other"}}class="current"{{/if}}><a href="index.html?type_immo=other">À classer</a></li>
<li {{if $current == "config"}} class="current"{{/if}}><a href="config.html">Configuration</a></li>
</ul>

View file

@ -126,7 +126,13 @@
{{:continue}}
{{/if}}
{{* voir s'il existe une écriture qui solde l'immobilisation *}}
{{*
TODO cas où :
- il y a (au moins) une écriture d'avoir
- il y a une écriture dui solde l'immo (montant = montant immo - avoir
*}}
{{* voir s'il existe une écriture qui solde l'immobilisation (voir ci-dessus) *}}
{{#select
count(*) AS count
FROM acc_transactions AS trans

View file

@ -75,7 +75,7 @@
{{if $account_ok == null}}
{{:assign compte=$debit_account|implode:""}}
{{:redirect url="add_account.html?account=%s&chart=%s&immo_line_id=%s"|args:$compte:$selected_chart:$_GET.immo_line_id}}
{{:redirect url="add_account.html?account=%s&chart=%s"|args:$compte:$selected_chart}}
{{/if}}
{{:assign debit_account=$debit_account|keys|value:0}}
@ -108,6 +108,11 @@
{{/if}}
{{:assign duration=$_POST.duree|intval}}
{{:assign status="managed"}}
{{if $_POST.date_mes == null || $_POST.date_mes == $_POST.date_achat}}
{{:assign date_mes=null}}
{{else}}
{{:assign date_mes=$_POST.date_mes|date_short}}
{{/if}}
{{/if}}
{{* enregistrer l'écriture *}}
@ -141,7 +146,7 @@
type="immo"
line=$immo_line_id
duration=$duration
date=$date_debut
date_mes=$date_mes
status=$status
}}
{{/if}}
@ -201,7 +206,7 @@
name="credit_account"
label="Compte de décaissement"
required=true
target="!acc/charts/accounts/selector.php?types=%s&id_year=%d"|args:"1|2|3":$selected_year
target="!acc/charts/accounts/selector.php?types=%s&id_year=%d"|args:"1|2|3|4":$selected_year
}}
{{:input
type="list"
@ -243,8 +248,9 @@ function changeYear(evt, f_accounts = ['credit_account', 'debit_account'], f_yea
setSelectorYear(f_accounts, f_years_select);
}
function changeVisibility(evt, idcheck = 'f_amortir_1', fields = ['div_amort']) {
toggleVisibility(idcheck, fields);
function changeVisibility(evt, idcheck = 'f_amortir_1', iddiv = 'div_amort')
{
toggleVisibility(idcheck, document.querySelectorAll('#' + iddiv));
}
(function () {

View file

@ -2,165 +2,142 @@
{{*
@param immo_line_id
@param type_immo : managed, amortized, archived, other
TODO ? :
- séparer les cas des immo simples et complexes (BOI)
par exemple pour la durée d'amort par défaut {{:input ...}}
- prise en charge immo => param = immo_line_id
- modif param immo => param = immo_doc_id
*}}
{{* données de l'immobilisaion *}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{* cas de la prise en charge *}}
{{* données de l'immobilisation *}}
{{:assign montant_affecte=0}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval assign="info_immo"}}
{{:assign montant_affecte="%d+%d"|math:$montant_affecte:$amount}}
{{/load}}
{{#select
trans.id as immo_trans_id,
trans.label,
trans.label as trans_label,
trans.date as date_achat,
line.debit as montant,
line.label as line_label,
acc.code
acc.code,
acc.label as account_label
FROM acc_transactions_lines AS line
INNER join acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id
assign=ligne_immo
:line_id = $_GET.immo_line_id|intval
assign="ligne_immo"
}}
{{else}}
{{:error message="Aucune immobilisation trouvée"}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign reste="%d-%d"|math:$ligne_immo.montant:$montant_affecte}}
{{* chercher les liaisons de l'écriture d'immobilisation *}}
{{:assign total_credits=0}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id,
line.credit,
acc.code
FROM acc_transactions_links as links
INNER JOIN acc_transactions_lines AS line on line.id_transaction = linked_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE (links.id_transaction = :immo_trans_id or links.id_related = :immo_trans_id)
AND line.credit > 0
;
:immo_trans_id = $ligne_immo.immo_trans_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{:assign var="linked_transactions.%d."|args:$code value=$linked_id}}
{{/select}}
{{:assign var="immo_transactions" from="linked_transactions.%d"|args:$ligne_immo.code}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{if $_POST.classify == null}}
{{:error message="Vous devez choisir une action"}}
{{/if}}
{{if $_POST.classify == "ignored"}}
{{if ! $_POST.amortir}}
{{* ne pas amortir *}}
{{:assign duration=0}}
{{:assign date_debut=$ligne_immo.date_achat|parse_date}}
{{:assign libelle=null}}
{{:assign montant=null}}
{{:assign date_achat=null}}
{{:assign date_mes=null}}
{{:assign status="ignored"}}
{{else}}
{{* vérifier que la date d'acquisition est antérieure à la date de mise en service *}}
{{:assign date_debut=$_POST.date_mes|or:$ligne_immo.date_achat|parse_date}}
{{if $date_debut|strtotime < $ligne_immo.date_achat|strtotime}}
{{:assign dd=$date_debut|date_short}}
{{if $_POST.date_achat|parse_date > $ligne_immo.date_achat}}
{{:assign da=$ligne_immo.date_achat|date_short}}
{{:error message="Erreur : la date de mise en service (%s) ne peut être antérieure à la date d'acquisition (%s)"|args:$dd:$da}}
{{:error message="Erreur : la date d'achat (%s) ne peut être postérieure à la date de l'écriture d'immobilisation (%s)"|args:$_POST.date_achat:$da}}
{{/if}}
{{if $_POST.classify == "amortized"}}
{{if $info_immo.duration == null}}
{{:assign duration=0}}
{{else}}
{{:assign duration=$info_immo.duration}}
{{/if}}
{{:assign status="amortized"}}
{{elseif $_POST.classify == "archived"}}
{{if $info_immo.duration == null}}
{{:assign duration=0}}
{{else}}
{{:assign duration=$info_immo.duration}}
{{/if}}
{{:assign status="archived"}}
{{else}}
{{:assign duration=$_POST.duree|intval}}
{{if $duration <= 0}}
{{:error message="Erreur : la durée d'amortissement doit être strictement positive"}}
{{/if}}
{{:assign status="managed"}}
{{* vérifier que la date de mise en service est postérieure à la date d'acquisition *}}
{{:assign d1=$_POST.date_achat|or:$ligne_immo.date_achat|parse_date}}
{{:assign d2=$_POST.date_mes|or:$d1|parse_date}}
{{if $d2 < $d1}}
{{:assign da=$d1|date_short}}
{{:error message="Erreur : la date de mise en service (%s) ne peut être antérieure à la date d'acquisition (%s)"|args:$_POST.date_mes:$da}}
{{/if}}
{{if $_POST.date_achat == null || $_POST.date_achat|parse_date == $ligne_immo.date_achat}}
{{:assign date_achat=null}}
{{else}}
{{:assign date_achat=$_POST.date_achat|parse_date}}
{{/if}}
{{if $_POST.date_mes == null || $_POST.date_mes == $_POST.date_achat}}
{{:assign date_mes=null}}
{{else}}
{{:assign date_mes=$_POST.date_mes|parse_date}}
{{/if}}
{{:assign duration=$_POST.duree|intval}}
{{if $duration <= 0}}
{{:error message="Erreur : la durée d'amortissement doit être strictement positive"}}
{{/if}}
{{if $_POST.libelle != $ligne_immo.line_label && $_POST.libelle != $ligne_immo.trans_label}}
{{:assign libelle=$_POST.libelle}}
{{/if}}
{{if $_POST.montant == null || $_POST.montant|money_int == 0 }}
{{if $montant_affecte > 0}}
{{:assign montant=$reste}}
{{else}}
{{:assign montant=null}}
{{/if}}
{{else}}
{{:assign montant=$_POST.montant|money_int}}
{{if $montant == $ligne_immo.montant}}
{{:assign montant=null}}
{{/if}}
{{/if}}
{{if $montant > $reste}}
{{:assign reste_nb="%f"|math:$reste|money_currency:false}}
{{:assign montant_nb="%f"|math:$montant|money_currency:false}}
{{:error message="Le montant (%s) ne peut être supérieur au reste (%s)"|args:$montant_nb:$reste_nb}}
{{/if}}
{{:assign status="managed"}}
{{/if}}
{{* enregistrer les infos de l'immobilisation *}}
{{if $info_immo == null}}
{{if $info_immo == null || $montant_affecte > 0}}
{{:assign key=""|uuid}}
{{else}}
{{:assign key=$info_immo.key}}
{{/if}}
{{:save
key=$key
validate_schema="schema.json"
type="immo"
line=$_GET.immo_line_id|intval
duration=$duration
date=$date_debut
label=$libelle
amount=$montant
date_achat=$date_achat
date_mes=$date_mes
status=$status
}}
{{* copier les autres liaisons *}}
{{#foreach from=$linked_transactions key="code" item="liaisons"}}
{{if $code != $ligne_immo.code}}
{{:debug code=$code liaisons=$liaisons}}
{{#foreach from=$liaisons item="elem"}}
{{:assign var="new_transactions." value=$elem}}
{{/foreach}}
{{/if}}
{{/foreach}}
{{* nouvelles liaisons *}}
{{#foreach from=$_POST.transactions key="key" item="elem"}}
{{:assign var="new_transactions." value=$elem|intval}}
{{/foreach}}
{{* Enregistrer les liaisons *}}
{{if $new_transactions != null}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$ligne_immo.immo_trans_id
assign="result"
assign_code="result_code"
transactions=$new_transactions
}}
{{/if}}
{{if $_POST.classify == "managed" || $_POST.classify == "amortized"}}
{{:assign type_immo=$_POST.classify}}
{{elseif $_POST.classify == "ignored"}}
{{:assign type_immo="other"}}
{{if $_POST.amortir}}
{{:assign type_immo="managed"}}
{{else}}
{{:assign type_immo=$_GET.type_immo}}
{{:assign type_immo="other"}}
{{/if}}
{{:redirect force="index.html?ok=1&msg=infos&type_immo=%s"|args:$type_immo}}
{{/form}}
{{:form_errors}}
{{:admin_header title="Classer l'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subcurrent="%s"|args:$_GET.type_immo subsubcurrent="parameter"}}
{{/if}}
{{:assign choix_defaut=$_GET.type_immo}}
{{if $info_immo != null}}
{{:assign date_defaut=$info_immo.date}}
{{:assign duree_defaut=$info_immo.duration}}
{{:assign choix_defaut=$info_immo.status}}
{{else}}
{{:assign duree_defaut=null}}
{{:include file="_nav.html" current="index" subcurrent="other" subsubcurrent="parameter"}}
{{/if}}
{{:form_errors}}
{{*
- classer l'immobilisation
@ -168,45 +145,45 @@
*}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
<h3 class="ruler">
Paramètres de l'immobilisation
<span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span>
</h3>
<h3 class="ruler">Paramètres de l'immobilisation</h3>
<div class="informations">
<dl class="describe">
<dt>Immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$ligne_immo.label}}{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $ligne_immo.label}} — {{$ligne_immo.line_label}}{{/if}}</dd>
<dt>Montant de l'immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$ligne_immo.trans_label}}{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $ligne_immo.trans_label}} — {{$ligne_immo.line_label}}{{/if}}</dd>
<dt>Montant</dt>
<dd class="money strong">{{"%f"|math:$ligne_immo.montant|money_currency_html:false|raw}}</dd>
{{if $total_credits > 0}}
<dt>Montant des avoirs</dt>
<dd class="money">{{"%f"|math:$total_credits|money_currency_html:false|raw}}</dd>
<dt>Montant à amortir</dt>
<dd class="money">{{"%d-%d"|math:$ligne_immo.montant:$total_credits|money_currency_html:false|raw}}</dd>
{{/if}}
<dt>Date de l'écriture d'immobilisation</dt>
<dt>Montant déjà affecté</dt>
<dd class="money strong">{{"%f"|math:$montant_affecte|money_currency_html:false|raw}}</dd>
<dt>Montant restant à affecter</dt>
<dd class="money strong">{{"%f"|math:$reste|money_currency_html:false|raw}}</dd> <dt>Date de l'écriture d'immobilisation</dt>
<dd>{{$ligne_immo.date_achat|date_short}}</dd>
<dt>Compte d'immobilisation</dt>
<dd>{{$ligne_immo.code}} — {{$ligne_immo.account_label}}
</dl>
</div>
<form method="post" action="">
<fieldset>
<legend>Classement</legend>
<dl id="classement_immo">
<dt><label>Faites un choix</label> <b>(obligatoire)</b></dt>
{{:input type="radio-btn" name="classify" value="managed" label="Immobilisation à amortir" help="Cette immobilisation sera classée parmi les immobilisations amortissables" default=$choix_defaut}}
{{:input type="radio-btn" name="classify" value="amortized" label="Amortissement terminé" help="Cette immobilisation sera classée parmi les immobilisations amorties" default=$choix_defaut}}
{{:input type="radio-btn" name="classify" value="archived" label="Immobilisation sortie du bilan" help="Cette immobilisation sera classée parmi les immobilisations sorties du bilan" default=$choix_defaut}}
{{:input type="radio-btn" name="classify" value="ignored" label="Immobilisation à ignorer" help="Cette écriture n'apparaitra plus dans la liste des immobilisations" default=$choix_defaut}}
</dl>
</fieldset>
<fieldset id="infos_immo">
<legend>Informations</legend>
<legend>Amortissement</legend>
<dl>
{{:input type="number" name="duree" label="Durée d'amortissement" default=$duree_defaut required=true min=1}}
{{:input type="list" name="transactions" default=$immo_transactions label="Écritures liées au crédit du compte d'immobilisation" target="!acc/transactions/selector.php" multiple=true help="par exemple écriture d'avoir ou autre réduction du montant de l'acquisition"}}
{{:input type="date" name="date_mes" label="Date de mise en service" default=$date_defaut help="à renseigner uniquement si différente de la date d'acquisition"}}
{{if $info_immo.status == 'ignored'}}
{{:assign checked=null}}
{{else}}
{{:assign checked="checked"}}
{{/if}}
{{:input id="amortir" type="checkbox" value=1 name="amortir" label="Amortir cette immobilisation sur une ou plusieurs années" checked="%s"|args:$checked help="Dé-cocher pour ne pas amortir"}}
<div class="masquable">
{{:input type="number" name="duree" label="Durée d'amortissement" required=true min=1 suffix="année(s)"}}
</div>
</dl>
</fieldset>
<fieldset class="masquable">
<legend>Informations facultatives</legend>
<dl>
{{:input type="date" name="date_achat" label="Date d'acquisition" help="à renseigner uniquement si différente de la date de l'écriture d'immobilisation"}}
{{:input type="date" name="date_mes" label="Date de mise en service" help="à renseigner uniquement si différente de la date d'acquisition"}}
{{:input type="text" name="libelle" label="Libellé" help="à renseigner uniquement si différent du libellé de l'écriture d'immobilisation"}}
{{:input type="money" name="montant" label="Montant de l'immobilisation" required=true default=$reste}}
</dl>
</fieldset>
@ -218,29 +195,23 @@
{{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript">
var info_immo = {{$info_immo|json_encode|raw}};
// afficher/masquer les champs de saisie
function toggleInputs(event) {
const classement_immo = document.getElementById('classement_immo');
const managed = classement_immo.querySelector('input[type=radio][value=managed]');
const amortized = classement_immo.querySelector('input[type=radio][value=amortized]');
if (managed.checked) {
g.toggle('#infos_immo', true);
} else if (amortized.checked && info_immo != null && info_immo.duration != 0) {
g.toggle('#infos_immo', true);
function changeVisibility(evt, idcheck = 'f_amortir_1', hiddenclass = 'masquable', id_help = 'help_f_amortir_1')
{
toggleVisibility(idcheck, document.querySelectorAll('.' + hiddenclass));
const help_elem = document.getElementById(id_help);
if (document.getElementById(idcheck).checked) {
help_elem.innerText = "Dé-cocher pour ne pas amortir";
} else {
g.toggle('#infos_immo', false);
help_elem.innerText = "Cocher pour amortir";
}
}
toggleInputs();
(function () {
const radios = document.querySelectorAll('input[name="classify"]');
radios.forEach(radio => {
radio.addEventListener("change", toggleInputs);
});
document.getElementById('f_amortir_1').onclick = changeVisibility;
changeVisibility(null);
})();
</script>

183
aide.md
View file

@ -1,183 +0,0 @@
# Module de gestion d'immobilisations et amortissements pour Paheko
## Préambule
* Ce module recense les écritures d'immobilisation et d'amortissement
présentes dans la comptabilité et offre la possibilité de saisir de
nouvelles écritures d'immobilisation, de calculer et d'enregistrer
les écritures d'amortissement.
* Les écritures d'amortissement **liées à une écriture
d'immobilisation** lui sont automatiquement associées par le module
; par contre, les écritures d'amortissement qui ne sont **pas liées
à une écriture d'immobilisation** sont détectées mais doivent être
associées manuellement à leur immobilisation.
### Fonctionnalités
* créer une immobilisation
* créer des écritures d'amortissement pour une immobilisation
* associer une écriture d'amortissement *orpheline* à une écriture
d'immobilisation
* sortir une immobilisation du bilan en fin de de vie ou par cession
* réunir des écritures d'immobilisation en cours de constitution
pour créer une immobilisation amortissable
* filtrer les écritures d'immobilisation et d'amortissement par
libellé
* classer manuellement une écriture d'immobilisation (utile pour les
immobilisations créées avant la mise en service du module)
## Comment faire pour ...
### Incorporer une écriture d'immobilisation existante dans le module
Si on a créé des immobilisations et éventuellement des amortissements
avec Paheko *avant* la mise en service du module *Amortissements*,
il est possible de les prendre en charge avec le module. Les
immobilisations concernées sont regroupées dans l'onglet Autres.
- cliquer le bouton *Paramètres* en face de l'immobilisation à prendre
en charge
- cocher *Immobilisation à amortir* pour spécifier qu'on veut amortir
l'immobilisation ; plusieurs champs d'informations s'affichennt :
- Durée d'amortissement : renseigner la durée (obligatoire)
- Écritures liées au crédit du compte d'immobilisation : lorsqu'on
acquiert une immobilisation, il se peut que par la suite on
obtienne une ristourne ou un avoir ; cet avoir est enregistré
dans Paheko par une écriture dont le montant est au crédit du
compte d'immobilisation ; le module offre la possibilité
d'associer cette écriture d'avoir à l'écriture
d'immobilisation. En effet, le montant amortissable est égal au
montant d'acquisition de l'immobilisation moins la somme des
avoirs. Pour cela, cliquer le bouton *Ajouter* puis sélectionner
une écriture : cette écriture sera associée à l'écriture
d'immobilisation et son montant déduit du montant de
l'immobilisation pour donner le montant à amortir
- Date de mise en service : c'est la date à laquelle
l'immobilisation est en état de fonctionner, qui peut être
postérieure à la date d'acquisition ; c'est cette date qui est
prise en compte dans le calcul des amortissements ; si elle
coïncide avec la date d'acquisition, inutile de la renseigner.
- L'immobilisation apparait ensuite dans l'onglet *Amortissables* ; on
peut vérifier et éventuellement modifier ses paramètres grâce au
bouton Paramètres
### Attacher une écriture d'amortissement à une immobilisation
Si des écritures d'amortissement ont été saisies avec Paheko *avant*
la mise en service du module *Amortissements*, on peut les associer à
leur immobilisation :
- cliquer le bouton *Amortissements* en face de l'immobilisation concernée ; si la mention
> « Il existe des écritures d'amortissement qui ne sont pas rattachées à une immobilisation !
> Utilisez le bouton « Rattacher une écriture » pour les afficher ; vous pourrez choisir d'en attacher certaines à cette immobilisation. »
est présente, c'est qu'il existe des écritures d'amortissement saisies avec Paheko *avant*
la mise en service du module.
- cliquer le bouton *Rattacher une écriture* pour en afficher la liste
- le cas échéant, cliquer *Attacher* en face de l'écriture à rattacher
De retour sur la page des amortissements, on constate la présence de l'écriture d'amortissement qu'on vient d'attacher ; on peut répéter le processus plusieurs fois si nécessaire. On peut aussi détacher une écriture si on s'est trompé.
### Enregistrer une écriture d'immobilisation
Il s'agit de créer une nouvelle écriture d'immobilisation ; pour cela,
cliquer le bouton *Ajouter une immobilisation* qui est présent sur
la plupart des onglets ; dans la fenêtre de saisie qui s'affiche il
suffit de saisir les données de l'immobilisation puis de cliquer
*Ajouter* :
* Exercice : sélectionner l'exercice dans lequel enregistrer l'écriture
* Date d'acquisition : doit être située dans l'exercice sélectionné
* Libellé
* Montant
* Compte de décaissement
* Compte d'immobilisation
* Projet
* case Amortir : laisser cochée pour amortir l'immobilisation,
dé-cocher pour ne pas l'amortir
* Durée d'amortissement en années : à saisir uniquement si
l'immobilisation doit être amortie
* Date de mise en service : c'est la date de première utilisation ;
à renseigner uniquement si différente de la date d'acquisition ;
doit être postérieure ou égale à la date d'acquisition
### Enregistrer une écriture d'amortissement
* Il n'est possible d'enregistrer une nouvelle écriture
d'amortissement pour une immobilisation que si la date
d'acquisition et la durée d'immobilisation ont été préalablement
définies.
* À partir de l'onglet *Amortissables*, cliquer le bouton
*Amortissements* en face de l'immobilisation choisie ; dans la
page suivante, cliquer le bouton *Enregistrer un amortissement*
; dans la fenêtre de saisie qui s'affiche, il faut renseigner les
informations suivantes :
* Exercice : sélectionner l'exercice dans lequel enregistrer l'écriture
* Date de l'écriture : doit être située dans l'exercice
sélectionné et postérieure à la date de mise en service
* Libellé
* Montant : caclculé par le module ; il peut être modifié si
nécessaire, par exemple pour l'arrondir à un nombre entier
* Compte de débit : par défaut c'est le compte *6811 : Dotation
aux amortissements des immobilisations*
* Compte d'amortissement : par défaut c'est le compte qui
correspond au compte de l'immobilisation
### Sortir une immobilisation du bilan
### Transformer des immobilisations en cours en immobilisation amortissable
### Marquer *à ignorer* des écritures
### Ignorer des écritures selon leur libellé
## Description de l'interface
Les écritures d'immobilisation sont réparties en plusieurs onglets.
### Amortissables
Cet onglet liste les immobilisations en cours d'amortissement.
##### bouton Paramètres
Ce bouton affiche une page qui permet de modifier les caractéristiques
d'une immobilisation ;
On peut décider de son classement :
* Amortir ; c'est le choix par défaut pour les immobilisations de
cet onglet
* Amortissement terminé : cette immobilisation sera alors classée
parmi les immobilisations amorties ; c'est le choix par défaut
pour les immobilisations de l'onglet Amorties
* Ignorer l'écriture : cette écriture n'apparaîtra plus dans la
liste des immobilisations
Pour les immobilisations à amortir, on peut préciser :
* obligatoirement la durée d'amortissement en années
* optionnellement la date de mise en service si elle est différente
de la date d'acquisition
###### bouton Amortissements
Ce bouton affiche la liste des amortissements déjà réalisés pour une
immobilisation ; à partir de cette page, il est possible d'enregistrer
un nouvel amortissement ou bien d'attacher une écriture
d'amortissement à l'immobilisation
### Amorties
Cet onglet liste les immobilisations dont l'amortissement est terminé
mais toujours en service dans l'association.
### Sorties du bilan
Cette page liste les immobilisations sorties du bilan, donc qui ne sont
plus en service dans l'association, soit parce qu'elles sont hors
d'usage, soit parce qu'elles ont été cédées.
### En cours
Cette page liste les immobilisations en cours de constitution, donc
non amortissables ; à terme, elles sont destinées à être regroupées
pour être transformées en immobilisation amortissable.
### Autres
Cette page liste les écritures d'immobilisation pas (encore) prises en
charge par le module et sans écriture d'amortissement associée.

View file

@ -2,179 +2,141 @@
{{*
Lister les écritures d'amortissement associées à une immobilisation
@param immo_line_id : id de la ligne d'immo
@param immo_doc_id : id du doc associé à l'immo
@param type_immo : managed, amortized, archived, others
*}}
{{* récupérer les infos de l'immobilisation *}}
{{* données de l'immobilisation *}}
{{#load type="immo" id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
line.id as immo_line_id,
line.debit as montant,
line.label as line_label,
trans.id as immo_trans_id,
trans.label as label,
trans.date,
account.code as account_code
trans.date as date_achat,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval
assign=ligne_immo
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign date_debut=$ligne_immo.date}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{:assign duree=$duration}}
{{:assign date_debut=$date}}
{{:assign status=$status}}
{{/load}}
{{:assign date_debut=$info_immo.date_mes|or:$info_immo.date_achat|or:$ligne_immo.date_achat}}
{{:assign label_immo=$info_immo.label|or:$ligne_immo.label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $label_immo}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{if $info_immo.amount != null}}
{{:assign var="ligne_immo.montant" value=$info_immo.amount}}
{{/if}}
{{if $status == 'ignored'}}
{{if $info_immo.status == 'ignored'}}
{{:error message="Cette immobilisation ne doit pas être amortie"}}
{{/if}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
{{*
chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign total_credits=0}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.immo_trans_id
:account=$ligne_immo.account_code
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{:assign montant_amortissable="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{:assign solde=$montant_amortissable}}
{{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}}
{{#select
l_amort.credit as amort_amount,
l_amort.label as amort_line_label,
l_amort.id as amort_line_id,
CASE WHEN links.id_related = t_immo.id
THEN links.id_transaction
ELSE links.id_related
END as amort_trans_id,
trans.date as amort_date,
trans.label as amort_trans_label,
trans.id_year as amort_year,
account.id as account_id,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction OR t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER join acc_transactions as trans on l_amort.id_transaction = trans.id
INNER join acc_accounts as account on l_amort.id_account = account.id
WHERE l_immo.id = :line_id AND account.code LIKE '28%'
ORDER BY trans.date;
:line_id = $_GET.immo_line_id|intval
assign="amort_line"
}}
{{* lister les lignes d'amortissement liées à la ligne d'immobilisation *}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id AND $$.amort_line_id = :amort_line_id"
assign="line"
:immo_line_id=$_GET.immo_line_id|intval
:amort_trans_id=$amort_line.amort_trans_id
:amort_line_id = $amort_line.amort_line_id
}}
{{:assign var="linked_amort." value=$amort_line}}
{{/load}}
{{if $date_debut == null}}
{{:assign date_debut=$amort_date}}
{{#load type="credit_link" where="$$.immo_doc_id=:immo_doc_id" :immo_doc_id=$_GET.immo_doc_id|intval}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{/select}}
{{/load}}
{{:assign solde="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{if $status == "amortized"}}
{{:assign amort_amount=$montant_amortissable}}
{{if $info_immo.status == "amortized"}}
{{:assign amort_amount=$solde}}
{{:assign valeur_residuelle=0}}
{{else}}
{{:assign valeur_residuelle=$montant_amortissable}}
{{#foreach from=$linked_amort}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_amount}}
{{/foreach}}
{{:assign valeur_residuelle=$solde}}
{{/if}}
{{* Autres amortissements non rattachés *}}
{{:include file="_get_config.html" keep="module.config"}}
{{:assign filter_condition=" NOT ("}}
{{#foreach from=$module.config.filters item="filter"}}
{{:assign filter="%"|cat:$filter|cat:"%"|quote_sql}}
{{:assign filter_condition=$filter_condition|cat:" trans.label LIKE "|cat:$filter|cat:" OR "}}
{{/foreach}}
{{:assign filter_condition=$filter_condition|cat:"0)"}}
{{:assign autres_amortissements=false}}
{{#select
line.id_transaction AS amort_trans_id
FROM acc_transactions_lines AS line
INNER JOIN acc_accounts AS account ON account.id = line.id_account
INNER JOIN acc_transactions AS trans ON trans.id = line.id_transaction
INNER JOIN acc_years AS y ON y.id = trans.id_year
WHERE account.code LIKE "28%" AND credit > 0 AND (NOT trans.status & 16) AND !filter_condition
ORDER BY trans.date, trans.label;
!filter_condition=$filter_condition
assign="amort"
{{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}}
{{#load type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id = $_GET.immo_doc_id|intval
}}
{{* voir s'il existe des écritures liées avec un numéro de compte d'immobilisation *}}
{{#select
links.id_transaction,
links.id_related,
trans.id AS trans_id
FROM acc_transactions_links AS links
INNER JOIN acc_transactions AS trans ON (
CASE
WHEN links.id_transaction = :id_amort THEN links.id_related
WHEN links.id_related = :id_amort THEN links.id_transaction
END) = trans.id
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE
links.id_transaction = :id_amort OR links.id_related = :id_amort
AND acc.code LIKE '21%'
LIMIT 1
line.id as amort_line_id,
line.credit,
line.label as amort_line_label,
trans.id as amort_trans_id,
trans.label as amort_trans_label,
trans.date as amort_date,
trans.id_year as amort_year,
account.id as account_id,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER join acc_accounts AS account on line.id_account = account.id
WHERE line.id = :amort_line_id
;
:id_amort=$amort.amort_trans_id
:amort_line_id = $amort_line_id
assign="amort_line"
}}
{{* voir s'il existe un doc associé à une ligne de l'amortissement *}}
{{:assign keep=true}}
{{#load type="link"
where="$$.amort_trans_id = :amort_trans_id"
:amort_trans_id = $amort.amort_trans_id
}}
{{if $amort_line_id == $amort.amort_line_id}}
{{:assign keep=false}}
{{:break}}
{{:assign var="amort_line.amort_amount" value=$amount|or:$credit}}
{{:assign var="linked_amort.%s_%d"|args:$amort_date:$id value=$amort_line}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_line.amort_amount}}
{{/select}}
{{/load}}
{{if $valeur_residuelle > 0}}
{{* Chercher des amortissements non rattachés à une immo *}}
{{#select
line.id as amort_line_id,
line.id_transaction AS amort_trans_id,
line.credit as amort_amount
FROM acc_transactions_lines AS line
INNER JOIN acc_accounts AS account ON account.id = line.id_account
INNER JOIN acc_transactions AS trans ON trans.id = line.id_transaction
INNER JOIN acc_years AS y ON y.id = trans.id_year
WHERE account.code LIKE "28%" AND credit > 0 AND (NOT trans.status & 16)
ORDER BY trans.date, trans.label;
assign="amort"
}}
{{* voir s'il existe des lignes d'immo liées à cette ligne d'amortissement *}}
{{:assign amort_amount=0}}
{{:assign keep_amort=true}}
{{#load type="amort_link"
where="$$.amort_line_id = :amort_line_id"
:amort_line_id = $amort_line_id
assign="amort_link"
}}
{{if $amort_link.amount == null || $amort_link.amount == 0}}
{{:assign amort_amount=$amort.amort_amount}}
{{:assign keep_amort=false}}
{{else}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$amort_link.amount}}
{{/if}}
{{else}}
{{:assign keep=false}}
{{* pas de ligne d'immo liée à cette ligne d'amort => garder cette ligne d'amortissement *}}
{{/load}}
{{if $keep}}
{{:assign autres_amortissements=true}}
{{if $keep_amort && $amort_amount < $amort.amort_amount}}
{{:assign var="free_amort_lines." value=$amort}}
{{/if}}
{{else}}
{{:assign autres_amortissements=true}}
{{/select}}
{{/select}}
{{/if}}
{{:admin_header title="Liste des amortissements" custom_css="./style.css" current="module_amortization"}}
@ -195,21 +157,21 @@
subcurrent="%s"|args:$subcurrent
subsubcurrent="amortization"
type_immo=$_GET.type_immo
autres_amort=$autres_amortissements
autres_amort=$free_amort_lines
}}
{{if $_GET.ok}}
{{if $_GET.msg|match:"attach"}}
{{:assign msg="Attachement écriture %s effectué"|args:$_GET.trans_id}}
{{:assign msg="Attachement amortissement %s effectué"|args:$_GET.trans_id}}
{{elseif $_GET.msg|match:"detach"}}
{{:assign msg="Détachement écriture %s affectué"|args:$_GET.trans_id}}
{{:assign msg="Détachement amortissement %s affectué"|args:$_GET.trans_id}}
{{elseif $_GET.msg|match:"amortissement"}}
{{:assign msg="Amortissement enregistré"}}
{{/if}}
<p class="block confirm">{{$msg}}</p>
{{elseif $_GET.err}}
{{if $_GET.msg|match:"attach"}}
{{:assign msg="Échec attachement"}}
{{:assign msg="Échec attachement amortissement"}}
{{elseif $_GET.msg|match:"amortissement"}}
{{:assign msg="Échec enregistrement amortissement"}}
{{/if}}
@ -222,15 +184,14 @@
<p class="submit">
{{:linkbutton
label="Sortir du bilan"
href="balance_sheet_exit.html?immo_line_id=%s&type_immo=%s"|args:$_GET.immo_line_id:$_GET.type_immo
href="balance_sheet_exit.html?immo_doc_id=%s&type_immo=%s"|args:$_GET.immo_doc_id:$_GET.type_immo
shape="export"
class="main"
}}
</p>
<p class="help">
Il sera possible de choisir la date de sortie, d'indiquer
le montant de la cession le cas échéant et de modifier les
comptes associés.
Il sera possible de choisir la date de sortie et d'indiquer
le montant de la cession le cas échéant.
</p>
</fieldset>
</form>
@ -238,30 +199,32 @@
<div class="informations">
<dl class="describe">
<dt>Immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$ligne_immo.label}}{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $ligne_immo.label}} — {{$ligne_immo.line_label}}{{/if}}</dd>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$label_immo}}</dd>
<dt>Compte d'immobilisation</dt>
<dd>{{$ligne_immo.account_code}} — {{$ligne_immo.account_label}}</dd>
<dt>Début d'amortissement</dt>
<dd>{{$date_debut|date_short}}</dd>
{{if $duree != null}}
{{if $info_immo.duration != null}}
<dt>Durée</dt>
<dd>{{$duree}} ans</dd>
<dd>{{$info_immo.duration}} ans</dd>
{{/if}}
<dt>Montant de l'immobilisation</dt>
<dd class="money">{{"%f"|math:$ligne_immo.montant|money_currency_html:false|raw}}</dd>
<dd class="money strong">{{"%f"|math:$ligne_immo.montant|money_currency_html:false|raw}}</dd>
{{if $total_credits > 0}}
<dt>Montant des avoirs</dt>
<dd class="money">{{"%f"|math:$total_credits|money_currency_html:false|raw}}</dd>
<dt>Montant à amortir</dt>
<dd class="money">{{"%f"|math:$montant_amortissable|money_currency_html:false|raw}}</dd>
<dd class="money strong">{{"%f"|math:$solde|money_currency_html:false|raw}}</dd>
{{/if}}
{{if $valeur_residuelle > 0}}
<dt>Montant des amortissements</dt>
<dd>{{"%d-%d"|math:$montant_amortissable:$valeur_residuelle|money_currency_html:false|raw}}</dd>
<dt>Valeur nette comptable</dt>
<dd>{{"%d-%d"|math:$solde:$valeur_residuelle|money_currency_html:false|raw}}</dd>
<dt>Valeur nette résiduelle</dt>
<dd>{{$valeur_residuelle|money_currency_html:false|raw}}</dd>
{{/if}}
{{if $duree != null && $valeur_residuelle > 0}}
{{if $info_immo.duration != null && $valeur_residuelle > 0}}
<dt>Annuité estimée</dt>
<dd>{{"min(%d, %f/%d)"|math:$valeur_residuelle:$montant_amortissable:$duree|money_currency_html:false|raw}}</dd>
<dd>{{"min(%d, %f/%d)"|math:$valeur_residuelle:$solde:$info_immo.duration|money_currency_html:false|raw}}</dd>
{{/if}}
</dl>
</div>
@ -283,7 +246,7 @@
</tr>
</thead>
<tbody>
{{#foreach from=$linked_amort item="line"}}
{{#foreach from=$linked_amort|ksort item="line"}}
{{* données de l'écriture *}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.amort_trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.amort_year}}
@ -302,7 +265,7 @@
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td>
<td>
{{:linkbutton label="Détacher" href="detach_amort.html?amort_line_id=%d&immo_line_id=%d"|args:$line.amort_line_id:$ligne_immo.immo_line_id shape="minus"}}
{{:linkbutton label="Détacher" href="detach_amort.html?immo_doc_id=%s&amort_line_id=%s"|args:$_GET.immo_doc_id:$line.amort_line_id shape="minus"}}
</td>
</tr>
{{/foreach}}
@ -313,16 +276,11 @@
<p class="block alert">Aucun amortissement enregistré pour cette immobilisation</p>
{{/if}}
{{if $_GET.type_immo == null || $_GET.type_immo != "amortized"}}
{{* Autres amortissements non rattachés *}}
{{if $autres_amortissements}}
<p class="block alert">
Il existe des écritures d'amortissement qui ne sont pas rattachées à une immobilisation ! <br />
Utilisez le bouton « Rattacher une écriture » pour les afficher ; vous pourrez choisir d'en attacher certaines à cette immobilisation.
</p>
{{/if}}
{{if $free_amort_lines}}
<p class="block alert">
Il y a des écritures d'amortissement qui ne sont pas rattachées à une immobilisation ! <br />
Utilisez le bouton « Rattacher un amortissement » pour les afficher ; vous pourrez choisir d'en attacher certaines à cette immobilisation.
</p>
{{/if}}
{{:form_errors}}
{{:admin_footer}}

View file

@ -1,74 +1,231 @@
{{* -*- brindille -*- *}}
{{*
Enregistrer la liaison entre une écriture d'amortissement et
l'écriture d'immobilisation correspondante
Enregistrer la liaison entre une ligne d'écriture d'amortissement
et une ligne d'écriture d'immobilisation
@param immo_doc_id : numéro du doc d'immo
@param amort_line_id : numéro de ligne de l'écriture d'amortissement
*}}
{{* chercher l'écriture d'immobilisation *}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
:line_id = $_GET.immo_line_id|intval
}}
{{:assign immo_trans_id=$id_transaction}}
{{* données de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{:assign label_immo=$label|or:$ligne_immo.trans_label}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'immobilisation de la ligne « %s »"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
line.id_transaction as immo_trans_id,
line.debit as montant,
trans.label as trans_label,
line.label as line_label
FROM acc_transactions_lines as line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :line_id;
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign montant_immo=$info_immo.amount|or:$ligne_immo.montant}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $label_immo}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{* chercher l'écriture d'amortissement *}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
line.credit as amount,
line.label as line_label,
trans.date as amort_date,
trans.label as trans_label,
trans.id as trans_id,
acc.code as account_code,
acc.label as account_label
FROM acc_transactions_lines as line
INNER JOIN acc_transactions as trans on line.id_transaction = trans.id
INNER JOIN acc_accounts as acc on line.id_account = acc.id
WHERE line.id = :line_id;
:line_id = $_GET.amort_line_id|intval
assign="amort_line"
}}
{{:assign amort_trans_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'amortissement de la ligne « %s »"|args:$_GET.amort_line_id}}
{{:error message="Amortissement non trouvé"}}
{{/select}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$amort_line.trans_id}}
{{* chercher les liaisons de l'écriture d'immobilisation *}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $immo_trans_id
}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/select}}
{{* ajouter la nouvelle liaison *}}
{{:assign var="linked_transactions." value=$amort_trans_id}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{* vérifier si cette liaison est déjà présente dans les documents pour éviter les doublons *}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND
$$.amort_trans_id = :amort_trans_id AND
$$.amort_line_id = :amort_line_id"
:immo_line_id=$_GET.immo_line_id|intval
:amort_trans_id = $amort_trans_id
{{* montant de l'écriture d'amortissement déjà affecté *}}
{{:assign montant_affecte=0}}
{{#load type="amort_link" assign="linked_amort."
where="$$.amort_line_id = :amort_line_id"
:amort_line_id = $_GET.amort_line_id|intval
limit=1
}}
{{else}}
{{:save
key=""|uuid
type="link"
immo_line_id=$_GET.immo_line_id|intval
amort_line_id=$_GET.amort_line_id|intval
amort_trans_id=$amort_trans_id
}}
{{:assign montant_affecte="%d+%d"|math:$montant_affecte:$amount}}
{{/load}}
{{:redirect force="amortization.html?immo_line_id=%s&ok=1&msg=attach&trans_id=%s"|args:$_GET.immo_line_id:$amort_trans_id}}
{{:assign reste="%d-%d"|math:$amort_line.amount:$montant_affecte}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* vérifier que le montant saisi est inférieur au reste *}}
{{if $_POST.montant == null || $_POST.montant == 0}}
{{:assign montant_amort=$reste}}
{{if $montant_affecte == 0}}
{{:assign saved_amount=null}}
{{else}}
{{:assign saved_amount=$reste}}
{{/if}}
{{else}}
{{:assign montant_amort=$_POST.montant|money_int}}
{{if $montant_amort > $reste}}
{{:assign reste_nb="%f"|math:$reste|money_currency:false}}
{{:error message="Le montant de l'amortissement ne peut être supérieur au reste (%s)"|args:$reste_nb}}
{{/if}}
{{if $montant_amort == $amort_line.amount}}
{{:assign saved_amount=null}}
{{else}}
{{:assign saved_amount=$montant_amort}}
{{/if}}
{{/if}}
{{* vérifier que le montant total des amortissements ne dépasse pas la valeur de l'immo *}}
{{* montant de l'immo *}}
{{:assign total_credits=0}}
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $_GET.immo_doc_id|intval
}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{/load}}
{{:assign montant_immo="%d-%d"|math:$montant_immo:$total_credits}}
{{* montant des amortissements *}}
{{:assign total_amort=0}}
{{#load
type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id=$_GET.immo_doc_id|intval
}}
{{if $amount == null || $amount == 0}}
{{#select
line.credit
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER join acc_accounts AS account on line.id_account = account.id
WHERE line.id = :amort_line_id
;
:amort_line_id = $amort_line_id
}}
{{:assign total_amort="%d+%d"|math:$total_amort:$credit}}
{{/select}}
{{else}}
{{:assign total_amort="%d+%d"|math:$total_amort:$amount}}
{{/if}}
{{/load}}
{{:assign vnc="%d-%d"|math:$montant_immo:$total_amort}}
{{:assign total_amort="%d+%d"|math:$total_amort:$montant_amort}}
{{if $total_amort > $montant_immo}}
{{:assign ma="%f"|math:$montant_amort|money_currency:false}}
{{:assign vnc="%f"|math:$vnc|money_currency:false}}
{{:error message="Le montant de l'amortissement (%s) dépasse la valeur résiduelle de l'immobilisation (%s)"|args:$ma:$vnc}}
{{/if}}
{{* chercher les liaisons de l'écriture d'immobilisation *}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $ligne_immo.immo_trans_id
}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/select}}
{{* ajouter la nouvelle liaison *}}
{{:assign var="linked_transactions." value=$amort_line.trans_id}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$ligne_immo.immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{* vérifier si cette liaison est déjà présente dans les documents pour éviter les doublons *}}
{{* TODO voir si nécessaire ? *}}
{{#load type="amort_link"
where="$$.immo_doc_id = :immo_doc_id AND $$.amort_line_id = :amort_line_id"
:immo_doc_id=$_GET.immo_doc_id|intval
:amort_line_id = $_GET.amort_line_id|intval
limit=1
}}
{{else}}
{{:save
key=""|uuid
type="amort_link"
immo_doc_id=$_GET.immo_doc_id|intval
amort_line_id=$_GET.amort_line_id|intval
amount=$saved_amount
}}
{{/load}}
{{* immo soldée ? *}}
{{if $total_amort == $montant_immo}}
{{:assign status="amortized"}}
{{:save
key=$info_immo.key
status=$status
}}
{{/if}}
{{:redirect force="amortization.html?immo_doc_id=%s&type_immo=%s&ok=1&msg=attach_amort"|args:$_GET.immo_doc_id:$status}}
{{/form}}
{{:admin_header title="Amortir l'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="config" subcurrent="init" subsubcurrent="parameter"}}
{{/if}}
{{:form_errors}}
<div class="informations">
<dl class="describe">
<dt>Immobilisation</dt>
<dd>{{$label_immo}}</dd>
<dt>Amortissement</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$amort_line.trans_id}}</a></span> {{$label_immo}}</dd>
<dt>Montant de l'écriture d'amortissement</dt>
<dd>{{$amort_line.amount|money_currency_html:false|raw}}</dd>
{{if $montant_affecte > 0}}
<dt>Montant déjà affecté</dt>
<dd class="money strong">{{"%f"|math:$montant_affecte|money_currency_html:false|raw}}</dd>
<dt>Montant restant à affecter</dt>
<dd class="money strong">{{"%f"|math:$reste|money_currency_html:false|raw}}</dd>
{{/if}}
</dl>
</div>
<form method="post" action="" data-focus="1">
<fieldset>
<dl>
{{:input type="money" name="montant" label="Montant" default=$reste required=true help="Montant de l'amortissement"}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>

162
attach_immo.html Normal file
View file

@ -0,0 +1,162 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Écritures au crédit du compte d'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{*
Enregistrer la liaison entre une ligne d'immobilisation et
une ligne d'écriture au crédit du compte de l'immobilisation
@param credit_line_id : ligne d'écriture au crédit du compte de l'immobilisation
@param immo_doc_id : numéro du doc d'immo
*}}
{{* chercher l'écriture d'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="doc_immo"}}
{{else}}
{{:error message="Immobilisation non gérée ; vous devez d'abord renseigner ses informations"}}
{{/load}}
{{#select
line.id as immo_line_id,
line.id_transaction as immo_trans_id,
line.label as line_label,
trans.label as trans_label
FROM acc_transactions_lines as line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :line_id;
:line_id = $doc_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign label_immo=$doc_immo.label|or:$ligne_immo.trans_label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $label_immo}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{* chercher l'écriture au crédit du compte d'immobilisation *}}
{{#select
line.id_transaction as credit_trans_id,
line.credit as amount,
trans.label as trans_label,
line.label as line_label
FROM acc_transactions_lines as line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :line_id;
:line_id = $_GET.credit_line_id|intval
assign="credit_line"
}}
{{else}}
{{:error message="Impossible de trouver l'écriture au crédit du compte de l'immobilisation de la ligne « %s »"|args:$ligne_immo.trans_label}}
{{/select}}
{{:assign credit_trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$credit_line.credit_trans_id}}
{{* montant de l'écriture de crédit déjà affecté *}}
{{:assign montant_affecte=0}}
{{#load type="credit_link" assign="linked_immo."
where="$$.credit_line_id = :credit_line_id"
:credit_line_id = $_GET.credit_line_id|intval
}}
{{:assign montant_affecte="%d+%d"|math:$montant_affecte:$amount}}
{{/load}}
{{:assign reste="%d-%d"|math:$credit_line.amount:$montant_affecte}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{* vérifier que le montant saisi est inférieur au reste *}}
{{if $_POST.montant == null}}
{{if $montant_affecte == 0}}
{{:assign saved_credit=null}}
{{else}}
{{:assign saved_credit=$reste}}
{{/if}}
{{else}}
{{:assign montant_credit=$_POST.montant|money_int}}
{{if $montant_credit > $reste}}
{{:assign reste_nb="%f"|math:$reste|money_currency:false}}
{{:error message="Le montant de l'avoir ne peut être supérieur au reste (%s)"|args:$reste_nb}}
{{/if}}
{{if $montant_credit == $credit_line.amount}}
{{:assign saved_credit=null}}
{{else}}
{{:assign saved_credit=$montant_credit}}
{{/if}}
{{/if}}
{{* chercher les liaisons de l'écriture d'immobilisation *}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $ligne_immo.immo_trans_id
}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/select}}
{{* ajouter la nouvelle liaison *}}
{{:assign var="linked_transactions." value=$credit_line.credit_trans_id}}
{{* Enregistrer les liaisons *}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$ligne_immo.immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{*
TODO ? vérifier le succès avant d'enregistrer le doc ?
*}}
{{* enregistrer la liaison des lignes d'immo *}}
{{:save
key=""|uuid
type="credit_link"
immo_doc_id=$_GET.immo_doc_id|intval
credit_line_id=$_GET.credit_line_id|intval
amount=$saved_credit
}}
{{:redirect force="details_immo.html?immo_doc_id=%s&ok=1&msg=attach_immo"|args:$_GET.immo_doc_id}}
{{/form}}
{{if ! $dialog}}
{{:include
file="_nav.html"
current="config"
subcurrent="other"
subsubcurrent="immo"
type_immo="other"
}}
{{/if}}
{{:form_errors}}
<div class="informations">
<dl class="describe">
<dt>Immobilisation</dt>
<dd>{{$label_immo}}</dd>
<dt>Écriture au crédit du compte d'immobilisation</dt>
<dd><span class="num"><a href="{{$credit_trans_url}}">#{{$credit_line.credit_trans_id}}</a></span> {{$credit_line.trans_label}}{{if $credit_line.line_label != null && $credit_line.line_label != $credit_line.trans_label}} — {{$credit_line.line_label}}{{/if}}</dd>
<dt>Montant de l'écriture</dt>
<dd>{{$credit_line.amount|money_currency_html:false|raw}}</dd>
<dt>Montant déjà affecté</dt>
<dd class="money strong">{{"%f"|math:$montant_affecte|money_currency_html:false|raw}}</dd>
<dt>Montant restant à affecter</dt>
<dd class="money strong">{{"%f"|math:$reste|money_currency_html:false|raw}}</dd>
</dl>
</div>
<form method="post" action="" data-focus="1">
<fieldset>
<dl>
{{:input type="money" name="montant" label="Montant" default=$reste help="Montant de l'avoir"}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>

View file

@ -2,10 +2,15 @@
{{*
Sortir une immobilisation du bilan
@param immo_line_id : id de la ligne d'immobilisation
@param immo_doc_id : id du doc associé à l'immo
*}}
{{* Infos de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
line.debit as montant,
trans.id AS trans_id,
@ -16,105 +21,93 @@
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign date_debut=$ligne_immo.date_achat}}
{{:assign ts_mes=$ligne_immo.date_achat|strtotime}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{:assign ts_mes=$date|strtotime}}
{{:assign date_debut=$date}}
{{:assign duree_amort=$duration}}
{{/load}}
{{:assign date_debut=$info_immo.date_mes|or:$info_immo.date_achat|or:$ligne_immo.date_achat}}
{{if $info_immo.amount != null}}
{{:assign var="ligne_immo.montant" value=$info_immo.amount}}
{{/if}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign total_credits=0}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id = $info_immo.id
assign="credit_link"
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{else}}
{{*
TODO : à garder ?
pas de doc => voir liaison écritures
*}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{/load}}
{{:assign var="ligne_immo.montant" value="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{:assign total_amort=0}}
{{:assign amort_number=0}}
{{#select
l_amort.credit as amort_amount,
l_amort.id as amort_line_id,
CASE
WHEN links.id_related = t_immo.id
THEN links.id_transaction
ELSE links.id_related
END as amort_trans_id,
trans.date
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction OR t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER join acc_transactions as trans on l_amort.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON l_amort.id_account = account.id
WHERE l_immo.id = :line_id AND account.code LIKE '28%'
;
:line_id = $_GET.immo_line_id|intval
assign="amort_lines."
{{#load type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id = $_GET.immo_doc_id|intval
}}
{{/select}}
{{#foreach from=$amort_lines item="amort_line"}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id"
assign="line"
:immo_line_id=$_GET.immo_line_id|intval :amort_trans_id=$amort_line.amort_trans_id
{{#select
line.credit,
trans.date as amort_date
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :amort_line_id
;
:amort_line_id = $amort_line_id
assign="amort_line"
}}
{{if $line.amort_line_id == $amort_line.amort_line_id}}
{{:assign amort_number="%d+1"|math:$amort_number}}
{{:assign total_amort="%d+%d"|math:$total_amort:$amort_line.amort_amount}}
{{if $first_amort_date == null}}
{{:assign first_amort_date=$amort_line.date}}
{{elseif $amort_line.date < $first_amort_date}}
{{:assign first_amort_date=$amort_line.date}}
{{/if}}
{{if $last_amort_date == null}}
{{:assign last_amort_date=$amort_line.date}}
{{elseif $amort_line.date > $last_amort_date}}
{{:assign last_amort_date=$amort_line.date}}
{{/if}}
{{/if}}
{{else}}
{{:assign amort_number="%d+1"|math:$amort_number}}
{{:assign total_amort="%d+%d"|math:$total_amort:$amort_line.amort_amount}}
{{if $first_amort_date == null}}
{{:assign first_amort_date=$amort_line.date}}
{{elseif $amort_line.date < $first_amort_date}}
{{:assign first_amort_date=$amort_line.date}}
{{/if}}
{{if $last_amort_date == null}}
{{:assign last_amort_date=$amort_line.date}}
{{elseif $amort_line.date > $last_amort_date}}
{{:assign last_amort_date=$amort_line.date}}
{{/if}}
{{/load}}
{{:assign amort_amount=$amount|or:$credit}}
{{:assign total_amort="%d+%d"|math:$total_amort:$amort_amount}}
{{:assign var="linked_amort.%s_%d"|args:$amort_date:$id value=$amort_line}}
{{/select}}
{{/load}}
{{:assign amort_number=$linked_amort|count}}
{{#foreach from=$linked_amort|ksort item="line"}}
{{if $first_amort_date == null}}
{{:assign first_amort_date=$line.amort_date}}
{{/if}}
{{if $last_amort_date == null}}
{{:assign last_amort_date=$line.amort_date}}
{{elseif $line.amort_date > $last_amort_date}}
{{:assign last_amort_date=$line.amort_date}}
{{/if}}
{{/foreach}}
{{if $total_amort == 0}}
@ -122,10 +115,11 @@
{{:assign total_amort=$ligne_immo.montant}}
{{/if}}
{{else}}
{{:assign date_debut=$last_amort_date|strtotime}}
{{:assign date_debut="%d+(60*60*24)"|math:$date_debut|date:"Y-m-d"}}
{{:assign date_debut=$last_amort_date}}
{{/if}}
{{:assign ts_debut=$date_debut|strtotime}}
{{:assign ts_debut="%d+(60*60*24)"|math:$ts_debut}}
{{:assign date_debut=$ts_debut|date:"Y-m-d"}}
{{:assign valeur_nette="%f-%f"|math:$ligne_immo.montant:$total_amort}}
{{*
@ -141,7 +135,8 @@
{{:assign fin=$end_date|date_short}}
{{:assign var="open_years.%d"|args:$id value=$label|cat:" (du "|cat:$debut|cat:" au "|cat:$fin|cat:")"}}
{{else}}
{{:error message="Aucun exercice ouvert pour enregistrer un amortissement"}}
{{:assign debut=$date_debut|date_short}}
{{:error message="Aucun exercice ouvert pour enregistrer un amortissement à partir du %s"|args:$debut}}
{{/years}}
{{if $years|count == 1}}
{{:assign default_year=$years.0.id}}
@ -156,39 +151,12 @@
{{:error message="Vous devez renseigner la date de sortie"}}
{{/if}}
{{* vérifier la validité de la date de mise en service *}}
{{if $_POST.date_mes != null}}
{{:assign ts_mes=$_POST.date_mes|parse_date|strtotime}}
{{if $ts_mes < $ligne_immo.date_achat|strtotime || $ts_mes > $first_amort_date|strtotime}}
{{:assign immo_date=$ligne_immo.date_achat|date_short}}
{{:assign amort_date=$first_amort_date|date_short}}
{{:error message="La date de mise en service doit être postérieure à la date d'acquisition de l'immobilisation (%s) et antérieure à la date du premier amortissement (%s)"|args:$immo_date:$amort_date}}
{{/if}}
{{/if}}
{{* vérifier la validité de la durée d'immobilisation *}}
{{if $valeur_nette > 0}}
{{if $info_immo.duration == null}}
{{if $_POST.duree == null}}
{{:error message="Vous devez renseigner la durée de l'immobilisation"}}
{{elseif $_POST.duree < $amort_number}}
{{:error message="La durée de l'amortissement ne peut être inférieure au nombre d'écritures d'amortissement (%d)"|args:$amort_number}}
{{else}}
{{:assign duree_amort=$_POST.duree}}
{{/if}}
{{/if}}
{{/if}}
{{* vérifier la validité de la date de sortie *}}
{{if $info_immo.date != null}}
{{if $_POST.date_sortie|parse_date < $info_immo.date}}
{{:assign immo_date=$info_immo.date|date_short}}
{{if $info_immo.date_mes != null}}
{{if $_POST.date_sortie|parse_date < $info_immo.date_mes}}
{{:assign immo_date=$info_immo.date_mes|date_short}}
{{:error message="La date de sortie doit être postérieure à la date de mise en service de l'immobilisation (%s)"|args:$immo_date}}
{{/if}}
{{elseif $_POST.date_mes != null}}
{{if $_POST.date_sortie|parse_date < $_POST.date_mes|parse_date}}
{{:error message="La date de sortie doit être postérieure à la date de mise en service de l'immobilisation (%s)"|args:$_POST.date_mes}}
{{/if}}
{{elseif $_POST.date_sortie|parse_date < $ligne_immo.date_achat}}
{{:assign immo_date=$ligne_immo.date_achat|date_short}}
{{:error message="La date de sortie doit être postérieure à la date d'acquisition de l'immobilisation (%s)"|args:$immo_date}}
@ -198,38 +166,39 @@
{{:error message="La date de sortie doit être postérieure à la date du dernier amortissement (%s)"|args:$last_amort_date}}
{{/if}}
{{* vérifier que la date de sortie est située dans un exercice ouvert *}}
{{:assign ts_exit = $_POST.date_sortie|parse_date|strtotime}}
{{:assign ok=false}}
{{:assign msg_amort=""}}
{{#foreach from=$years}}
{{if $id == $_POST.id_year}}
{{:assign selected_year=$id}}
{{:assign exercice_ok=false}}
{{* vérifier que la date de sortie est dans l'exercice choisi *}}
{{#foreach from=$years item="current_year"}}
{{if $current_year.id == $_POST.id_year}}
{{:assign selected_year=$current_year.id}}
{{if $start_date|strtotime <= $ts_exit && $ts_exit <= $end_date|strtotime}}
{{:assign ok=true}}
{{:assign current_year=$current_year}}
{{:assign exercice_ok=true}}
{{:break}}
{{/if}}
{{/if}}
{{* voir si des amortissements ont été oubliés *}}
{{if $valeur_nette > 0 && $info_immo.status != "amortized" && $start_date|strtotime > $last_amort_date|strtotime && $end_date|strtotime < $now}}
{{:assign debut=$start_date|date_short}}
{{:assign fin=$end_date|date_short}}
{{:assign msg_amort=$msg_amort|cat:"\n"|cat:" - "|cat:$label|cat:" : du "|cat:$debut|cat:" au "|cat:$fin}}
{{/if}}
{{/foreach}}
{{if ! $ok}}
{{if ! $exercice_ok}}
{{:error message="La date choisie n'est pas dans l'exercice sélectionné !"}}
{{/if}}
{{if $msg_amort != ""}}
{{:error message="Vous devez d'abord enregistrer les amortissements des exercices suivants : %s"|args:$msg_amort}}
{{* voir si des amortissements ont été oubliés *}}
{{if $valeur_nette > 0 && $info_immo.status != "amortized"}}
{{if $current_year.start_date <= $date_debut && $date_debut <= $current_year.end_date}}
{{:assign amort_ok=true}}
{{else}}
{{:assign amort_ok=false}}
{{/if}}
{{if ! $amort_ok}}
{{:error message="Vous devez d'abord enregistrer les amortissements des exercices précédents"}}
{{/if}}
{{/if}}
{{:redirect to="compute_exit_data.html?immo_line_id=%s&amort_amount=%s&year=%s&date_mes=%s&date_debut=%s&exit_date=%s&duree_amort=%s"|args:$_GET.immo_line_id:$total_amort:$selected_year:$ts_mes:$ts_debut:$ts_exit:$duree_amort}}
{{:redirect to="compute_exit_data.html?immo_doc_id=%s&amort_amount=%s&year=%s&date_debut=%s&exit_date=%s"|args:$_GET.immo_doc_id:$total_amort:$selected_year:$ts_debut:$ts_exit}}
{{/form}}
{{:admin_header title="Sortie de bilan" custom_css="./style.css" current="module_amortization"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subcurrent="%s"|args:$_GET.type_immo subsubcurrent="balance_exit"}}
{{/if}}
@ -245,10 +214,10 @@
<dt>Montant</dt>
<dd id="montant_immo" class="money">{{$ligne_immo.montant|money_currency_html:false|raw}}</dd>
<dt>Date d'acquisition</dt>
<dd >{{$ligne_immo.date_achat|date_short}}</dd>
{{if $info_immo.date != null && $info_immo.date != $ligne_immo.date_achat}}
<dd>{{$info_immo.date_achat|or:$ligne_immo.date_achat|date_short}}</dd>
{{if $info_immo.date_mes != null && $info_immo.date_mes != $ligne_immo.date_achat}}
<dt>Date de mise en service</dt>
<dd>{{$info_immo.date|date_short}}</dd>
<dd>{{$info_immo.date_mes|date_short}}</dd>
{{/if}}
{{if $info_immo.duration != null}}
<dt>Durée de l'amortissement</dt>
@ -258,23 +227,13 @@
<dd id="montant_amort" class="money">{{$total_amort|money_currency_html:false|raw}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Valeur nette résiduelle</dt>
<dd class="money">{{$valeur_nette|money_currency_html:false|raw}} <span class="help">(à la date de début de l'exercice)</span></dd>
{{if $last_amort_date != null}}
<dt>Date du dernier amortissement</dt>
<dd>{{$last_amort_date|date_short}}</dd>
{{/if}}
</dl>
</div>
{{if $valeur_nette > 0}}
{{if $info_immo.date == null || $info_immo.duration == null}}
<fieldset>
<legend>Informations sur l'immobilisation</legend>
<dl>
{{if $info_immo.date == null}}
{{:input type="date" name="date_mes" label="Date de mise en service" help="C'est la date de première utilisation ; à renseigner uniquement si différente de la date d'acquisition"}}
{{/if}}
{{if $info_immo.duration == null}}
{{:input type="number" name="duree" label="Durée d'amortissement" required=true min=1 help="La durée est nécessaire pour calculer l'amortissement complémentaire"}}
{{/if}}
</dl>
</fieldset>
{{/if}}
{{/if}}
<fieldset>
<legend>Informations de sortie</legend>
<dl>

View file

@ -3,14 +3,18 @@
{{*
Calculer les valeurs de la sortie et saisir le montant de la cession (optionnel)
paramètres :
- immo_line_id : numéro de ligne de l'écriture d'immobilisation
- amort_amount : montant des amortissements
- year : exercice de la date de sortie de l'immobilisation
- date_mes : datede mise en service de l'immobilisation
- date_debut : date de début de la période d'amortissement complémentaire
- exit_date : date de sortie de l'immobilisation
- duree_amort : durée de l'amortiseement (optionnel)
@param immo_doc_id : id du doc associé à l'immo
@param amort_amount : montant des amortissements
@param year : exercice de la date de sortie de l'immobilisation
@param date_debut : date de début de la période d'amortissement complémentaire
@param exit_date : date de sortie de l'immobilisation
*}}
{{* TODO *}}
{{* Infos de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
line.debit as montant,
@ -22,41 +26,62 @@
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign total_credits=0}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id = $info_immo.id
assign="credit_link"
}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{else}}
{{*
TODO : à garder ?
pas de doc => voir liaison écritures
*}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{/load}}
{{:assign var="ligne_immo.montant" value="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{:assign valeur_nette="%f-%f"|math:$ligne_immo.montant:$_GET.amort_amount}}
{{:assign amort_comp=0}} {{* amortissement complémentaire jqà date sortie *}}
{{if $valeur_nette > 0}}
{{:assign nbjours="1+(%d-%d)/(60*60*24)"|math:$_GET.exit_date:$_GET.date_debut}}
{{:assign annuite="%f/%f"|math:$ligne_immo.montant:$_GET.duree_amort}}
{{:assign annuite="%f/%f"|math:$ligne_immo.montant:$info_immo.duration}}
{{:assign amort_comp="round(%f/365*%f, 0)"|math:$annuite:$nbjours}}
{{:assign amort_comp="min(%f, %f)"|math:$valeur_nette:$amort_comp}}
{{/if}}
@ -69,7 +94,7 @@
{{/if}}
{{/if}}
{{:redirect to="write_exit.html?immo_line_id=%s&amort_amount=%s&year=%s&date_mes=%s&date_debut=%s&exit_date=%s&duree_amort=%s&cession=%s"|args:$_GET.immo_line_id:$_GET.amort_amount:$_GET.year:$_GET.date_mes:$_GET.date_debut:$_GET.exit_date:$_GET.duree_amort:$_POST.montant_cession}}
{{:redirect to="write_exit.html?immo_doc_id=%s&amort_amount=%s&year=%s&date_debut=%s&exit_date=%s&cession=%s"|args:$_GET.immo_doc_id:$_GET.amort_amount:$_GET.year:$_GET.date_debut:$_GET.exit_date:$_POST.montant_cession}}
{{/form}}
{{:admin_header title="Sortie du bilan" custom_css="./style.css" current="module_amortization"}}
@ -91,14 +116,12 @@
<dd id="montant_immo" class="money">{{$ligne_immo.montant|money_currency_html:false|raw}}</dd>
<dt>Date d'acquisition</dt>
<dd >{{$ligne_immo.date_achat|date_short}}</dd>
{{if $_GET.date_mes != $ligne_immo.date_achat|strtotime}}
{{if $info_immo.date_mes != null && $info_immo.date_mes != $ligne_immo.date_achat}}
<dt>Date de mise en service</dt>
<dd>{{$_GET.date_mes|date:"d/m/Y"}}</dd>
{{/if}}
{{if $_GET.duree_amort != null && $_GET.duree_amort != 0}}
<dt>Durée de l'amortissement</dt>
<dd id="duree_amort" class="num">{{$_GET.duree_amort}} ans</dd>
<dd>{{$info_immo.date_mes|date_short}}</dd>
{{/if}}
<dt>Durée de l'amortissement</dt>
<dd id="duree_amort" class="num">{{$info_immo.duration}} ans</dd>
<dt>Montant des amortissements</dt>
<dd id="montant_amort" class="money">{{$_GET.amort_amount|money_currency_html:false|raw}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Valeur nette résiduelle</dt>

100
delete_infos.html Normal file
View file

@ -0,0 +1,100 @@
{{* -*- brindille -*- *}}
{{*
Supprimer les infos d'une immo et les liaisons d'immo associées
@param immo_doc_id
*}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
trans.id as immo_trans_id,
trans.label as trans_label,
trans.date as date_achat,
line.debit as montant,
line.label as line_label,
acc.code,
acc.label as account_label
FROM acc_transactions_lines AS line
INNER join acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE line.id = :line_id;
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
{{:assign immo_label=$info_immo.label|or:$ligne_immo.trans_label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $immo_label}}
{{:assign immo_label=$immo_label|cat::" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{#form on="delete"}}
{{#select
trans.id
FROM acc_transactions_lines AS line
INNER JOIN !table ON $$.credit_line_id = line.id
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE $$.type =
"credit_link" AND $$.immo_doc_id = :immo_doc_id
;
!table = $module.table
:immo_doc_id = $_GET.immo_doc_id|intval
}}
{{:assign var="linked_trans." value=$id}}
{{/select}}
{{:debug linked_trans=$linked_trans}}
{{if $linked_trans != null}}
{{* chercher et supprimer les écritures liées *}}
{{#select
CASE links.id_related = trans.id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (links.id_transaction = trans.id OR links.id_related = trans.id)
WHERE trans.id = :immo_trans_id
;
:immo_trans_id=$ligne_immo.immo_trans_id
}}
{{if ! $linked_trans|has:$linked_id}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/if}}
{{/select}}
{{* enregistrer les liaisons restantes *}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$ligne_immo.immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{* supprimer les docs de liaison *}}
{{:delete type="immo_link" where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $_GET.immo_doc_id|intval}}
{{/if}}
{{* supprimer les infos de l'immobilisation *}}
{{:delete id=$_GET.immo_doc_id|intval}}
{{:redirect force="index.html?ok=1&msg=suppr_infos&type_immo=other"}}
{{/form}}
{{:admin_header title="Supprimer" current="module_amortization"}}
{{:form_errors}}
{{:delete_form
legend="Immobilisation « #%s %s »"|args:$ligne_immo.immo_trans_id:$immo_label
warning="Supprimer les paramètres de l'immobilisation « #%s %s » ?"|args:$ligne_immo.immo_trans_id:$immo_label
info="L'écriture d'immobilisation ne sera pas supprimée ; les nouveaux paramètres pourront être saisis depuis l'onglet « À classer »"
}}
{{:admin_footer}}

View file

@ -3,21 +3,29 @@
{{*
Supprimer l'association entre une écriture d'amortissement et
une écriture d'immobilisation
@param immo_doc_id : id du doc associé à l'immo
@param amort_line_id : id de la ligne d'amortissement
*}}
{{* chercher l'écriture d'immobilisation *}}
{{* données de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{* écriture d'immobilisation *}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
:line_id = $_GET.immo_line_id|intval
:line_id = $info_immo.line
}}
{{:assign immo_trans_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'immobilisation de la ligne « %s »"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{* chercher l'écriture d'amortissement *}}
{{* écriture d'amortissement *}}
{{#select
id_transaction
FROM acc_transactions_lines
@ -26,7 +34,7 @@
}}
{{:assign amort_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'amortissement de la ligne « %s »"|args:$_GET.amort_line_id}}
{{:error message="Amortissement non trouvé"}}
{{/select}}
{{*
@ -57,15 +65,18 @@
}}
{{* supprimer le doc de liaison entre les lignes *}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND
$$.amort_trans_id = :amort_trans_id AND
$$.amort_line_id = :amort_line_id"
:immo_line_id=$_GET.immo_line_id|intval
:amort_trans_id = $amort_id|intval
{{#load type="amort_link"
where="$$.immo_doc_id = :immo_doc_id AND $$.amort_line_id = :amort_line_id"
:immo_doc_id=$_GET.immo_doc_id|intval
:amort_line_id = $_GET.amort_line_id|intval
}}
{{:delete id=$id}}
{{/load}}
{{:redirect to="amortization.html?immo_line_id=%s&ok=1&msg=detach&trans_id=%s"|args:$_GET.immo_line_id:$amort_id}}
{{* marquer immo non soldée *}}
{{:save
key=$info_immo.key
status="managed"
}}
{{:redirect to="amortization.html?immo_doc_id=%s&ok=1&msg=detach"|args:$_GET.immo_doc_id:}}

75
detach_immo.html Normal file
View file

@ -0,0 +1,75 @@
{{* -*- brindille -*- *}}
{{*
Supprimer l'association entre une écriture d'immobilisation et
une écriture au crédit du compte d'immobilisation
@param immo_doc_id : id du doc associé à l'immo
@param credit_line_id : id de la ligne de crédit
*}}
{{* données de l'immobilisation *}}
{{#load type="immo" id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
:line_id = $info_immo.line
}}
{{:assign immo_trans_id=$id_transaction}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{* chercher l'écriture au crédit *}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
:line_id = $_GET.credit_line_id|intval
}}
{{:assign credit_id=$id_transaction}}
{{else}}
{{:error message="Écriture au crédit non trouvée"}}
{{/select}}
{{*
chercher les liaisons de l'écriture d'immobilisation
et supprimer la liaison avec l'écriture au crédit
*}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $immo_trans_id
}}
{{if $linked_id != $credit_id}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/if}}
{{/select}}
{{* Enregistrer les liaisons *}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{* supprimer le doc de liaison entre les lignes *}}
{{#load type="credit_link"
where="$$.immo_doc_id = :immo_doc_id AND $$.credit_line_id = :credit_line_id"
:immo_doc_id=$_GET.immo_doc_id|intval
:credit_line_id = $_GET.credit_line_id|intval
}}
{{:delete id=$id}}
{{/load}}
{{:redirect to="details_immo.html?immo_doc_id=%s&ok=1&msg=detach&"|args:$_GET.immo_doc_id}}

206
details_immo.html Normal file
View file

@ -0,0 +1,206 @@
{{* -*- brindille -*- *}}
{{*
Afficher les détails d'une immmo
- permettre l'association d'une immo au crédit du compte de l'immo
- permettre de modifier les paramètres de l'immo
@param immo_doc_id : numéro du doc d'immo
*}}
{{* données de l'immobilisation *}}
{{#load type="immo" id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
trans.id as immo_trans_id,
trans.label as label,
trans.date as date_achat,
line.id as immo_line_id,
line.debit as montant,
line.label as line_label,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
WHERE line.id = :line_id;
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign var="info_immo.amount" value=$info_immo.amount|or:$ligne_immo.montant}}
{{:assign var="info_immo.date_achat" value=$info_immo.date_achat|or:$ligne_immo.date_achat}}
{{:assign var="info_immo.date_mes" value=$info_immo.date_mes|or:$info_immo.date_achat|or:$ligne_immo.date_achat}}
{{:assign var="info_immo.label" value=$info_immo.label|or:$ligne_immo.label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $info_immo.label}}
{{:assign var="info_immo.label" value=$info_immo.label|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{*
chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign linked_immos=null}}
{{:assign total_credits=0}}
{{#load type="credit_link" where="$$.immo_doc_id=:immo_doc_id" :immo_doc_id=$_GET.immo_doc_id|intval}}
{{#select
line.credit,
line.id as line_id,
trans.id as trans_id,
trans.label,
trans.date
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign credit=$credit}}
{{:assign var="linked_immos." trans_id=$trans_id credit_line_id=$line_id label=$label amount=$credit date=$date}}
{{/select}}
{{if $amount == null}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{/load}}
{{:assign solde="%d-%d"|math:$info_immo.amount:$total_credits}}
{{:assign total_amort=0}}
{{* lister les docs d'amortissement liées à la ligne d'immobilisation *}}
{{#load type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id=$_GET.immo_doc_id|intval
}}
{{if $amount != null}}
{{:assign total_amort="%d+%d"|math:$total_amort:$amount}}
{{else}}
{{#select credit FROM acc_transactions_lines WHERE id = :amort_line_id;
:amort_line_id=$amort_line_id
}}
{{:assign total_amort="%d+%d"|math:$total_amort:$credit}}
{{/select}}
{{/if}}
{{/load}}
{{:admin_header title="Détails de l'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{*
{{if ! $dialog}}
{{:assign subsubcurrent=null}}
{{if $total_credits == 0 && $total_amort == 0}}
{{:assign subsubcurrent="credit"}}
{{/if}}
{{if $total_amort == 0}}
{{:assign subsubcurrent=$subsubcurrent|cat:"-modif"}}
{{/if}}
{{:include file="_nav.html" current="index" subcurrent="details" subsubcurrent=$subsubcurrent}}
{{/if}}
*}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
<nav class="tabs">
<aside>
{{*if $total_credits == 0*}}
{{:linkbutton label="Rattacher une écriture d'immobilisation" href="link_immo.html?immo_doc_id=%s"|args:$_GET.immo_doc_id shape="link" target="_dialog"}}
{{*/if*}}
</aside>
<nav style="margin-bottom: 1em;">
{{:linkbutton shape="left" label="Retour à la liste des immobilisations" href="index.html}}
{{if $total_amort == 0}}
{{:linkbutton label="Modifier les paramètres" href="modify_infos.html?immo_doc_id=%s"|args:$_GET.immo_doc_id shape="edit" target="_dialog"}}
{{:linkbutton label="Supprimer les paramètres" href="delete_infos.html?immo_doc_id=%s"|args:$_GET.immo_doc_id shape="delete" target="_dialog"}}
{{/if}}
</nav>
</nav>
{{if $_GET.ok}}
{{if $_GET.msg|match:"attach_amort"}}
{{:assign msg="Écriture d'amortissement attachée"}}
{{elseif $_GET.msg|match:"attach_immo"}}
{{:assign msg="Écriture au crédit attachée"}}
{{elseif $_GET.msg|match:"info"}}
{{:assign msg="Données de l'immobilisation enregistrées"}}
{{elseif $_GET.msg|match:"detach"}}
{{:assign msg="Écriture au crédit détachée"}}
{{else}}
{{:assign msg="Opération effectuée avec succès"}}
{{/if}}
<p class="block confirm">{{$msg}}</p>
{{elseif $_GET.err}}
{{:assign msg="L'opération a échoué"}}
<p class="block error">{{$msg}}</p>
{{/if}}
<h3 class="ruler">
Immobilisation
<span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span>
{{$info_immo.label}}
</h3>
{{if $linked_immos != null}}
<aside class="right">
<table class="list">
<caption>Écritures d'avoir liées</caption>
<tbody>
{{#foreach from=$linked_immos item="line"}}
{{:assign url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.trans_id}}
<tr>
<td class="num"><a href="{{$url}}">#{{$line.trans_id}}</a></td>
<td>{{$line.label}}</td>
<td>{{$line.date|date_short}}</td>
<td class="money">{{"%f"|math:$line.amount|money_currency_html:false|raw}}</td>
<td>
{{:linkbutton label="Détacher" href="detach_immo.html?immo_doc_id=%s&credit_line_id=%s"|args:$_GET.immo_doc_id:$line.credit_line_id shape="minus"}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
</aside>
{{/if}}
<div class="informations">
<dl class="describe">
{{*
<dt>Immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span><span class="label"> {{$info_immo.label}}</span></dd>
*}}
<dt>Compte d'immobilisation</dt>
<dd>{{$ligne_immo.account_code}} — {{$ligne_immo.account_label}}</dd>
<dt>Date d'acquisition</dt>
<dd>{{$info_immo.date_achat|date_short}}</dd>
{{if $info_immo.date_mes != null && $info_immo.date_mes != $info_immo.date_achat}}
<dt>Date de mise en service</dt>
<dd>{{$info_immo.date_mes|date_short}}</dd>
{{/if}}
<dt>Durée d'amortissement</dt>
<dd>{{$info_immo.duration}} ans</dd>
<dt>Montant de l'immobilisation</dt>
<dd class="money">{{"%f"|math:$info_immo.amount|money_currency_html:false|raw}}</dd>
{{if $total_credits > 0}}
<dt>Montant des avoirs</dt>
<dd class="money">{{"%f"|math:$total_credits|money_currency_html:false|raw}}</dd>
{{*
<dt>Écritures d'avoir</dt>
<dd>
{{#foreach from=$linked_immos item="line"}}
{{:assign url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.id}}
<span class="num"><a href="{{$url}}">#{{$line.id}}</a></span>
{{/foreach}}
</dd>
*}}
<dt>Montant à amortir</dt>
<dd class="money">{{"%f"|math:$solde|money_currency_html:false|raw}}</dd>
{{/if}}
{{if $total_amort > 0}}
<dt>Montant des amortissements</dt>
<dd>{{$total_amort|money_currency_html:false|raw}}</dd>
<dt>Valeur nette résiduelle</dt>
<dd>{{"%d-%d-%d"|math:$info_immo.amount:$total_credits:$total_amort|money_currency_html:false|raw}}</dd>
{{/if}}
</dl>
</div>

View file

@ -16,7 +16,7 @@
{{elseif $type_immo == "other"}}
{{:admin_header title="Autres immobilisations" custom_css="./style.css" current="module_amortization"}}
{{elseif $type_immo == "unfinished"}}
{{:admin_header title="Immobilisations en cours de constitution" custom_css="./style.css" current="module_amortization"}}
{{:admin_header title="Immobilisations en cours de constitution" custom_css="./style.css" current="module_amortization" subcurrent="unfinished"}}
{{/if}}
{{:include file="_nav.html" current="index" subcurrent="%s"|args:$type_immo}}
@ -24,6 +24,8 @@
{{if $_GET.ok}}
{{if $_GET.msg|match:"immobilisation"}}
{{:assign msg="Immobilisation enregistrée"}}
{{elseif $_GET.msg|match:"suppr_infos"}}
{{:assign msg="Informations supprimées"}}
{{elseif $_GET.msg|match:"infos"}}
{{:assign msg="Informations enregistrées"}}
{{/if}}
@ -45,6 +47,9 @@
{{/select}}
{{/load}}
{{* chercher des immos antérieures à la date de début du 1er exercice *}}
{{*:include file="_old_assets.html"*}}
{{if $type_immo == "other"}}
{{:include file="_immobilisations_autres.html"}}
{{elseif $type_immo == "archived"}}

44
link.schema.json Normal file
View file

@ -0,0 +1,44 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "Schéma des liens entre documents",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["amort_link", "credit_link", "exit_link"]
},
"immo_doc_id" : {
"description": "identifiant du document d'immobilisation associé",
"type" : "integer",
"exclusiveMinimum": 0
},
"amort_line_id" : {
"description": "ligne d'amortissement associée à l'immobilisation",
"type": "integer",
"exclusiveMinimum": 0
},
"credit_line_id": {
"description": "ligne au crédit du compte de l'immobilisation",
"type": "integer",
"exclusiveMinimum": 0
},
"exit_line_id": {
"description": "ligne d'amortissement de sortie du bilan de l'immobilisation",
"type": "integer",
"exclusiveMinimum": 0
},
"amount": {
"description": "montant de la ligne d'amortissement ou de crédit",
"type": ["number", "null"]
}
},
"required": ["type", "immo_doc_id"],
"if": {"properties": {"type": {"const": "amort_link"}}, "required": ["type"]},
"then": {"required": ["amort_line_id"]},
"else":
"if": {"properties": {"type": {"const": "credit_link"}}, "required": ["type"]},
"then": {"required": ["credit_line_id"]},
"else":
"if": {"properties": {"type": {"const": "exit_link"}}, "required": ["type"]},
"then": {"required": ["exit_line_id"]},
}

139
link_immo.html Normal file
View file

@ -0,0 +1,139 @@
{{* -*- brindille -*- *}}
{{*
Lister les écritures au crédit du compte de l'immobilisation
paramètre et proposer de les attacher à l'immo paramètre
@param immo_doc_id : document associé à l'immo
*}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Informations de l'immobilisation non trouvées"}}
{{/load}}
{{* récupérer les infos de l'immobilisation *}}
{{#select
trans.id as immo_trans_id,
trans.label as label,
trans.date as date_achat,
line.id as immo_line_id,
line.label as line_label,
line.debit as montant,
account.code as account_code
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id
WHERE line.id = :line_id;
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation « %s » non trouvée"|args:$info_immo.line}}
{{/select}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
{{:assign label_immo=$ligne_immo.label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $label_immo}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{*
lister les écritures au crédit du compte de l'immobilisation
*}}
{{#select
line.id as credit_line_id,
line.id_transaction as credit_trans_id,
line.credit as credit_amount,
line.label as line_label,
trans.id as immo_trans_id,
trans.date as trans_date,
trans.label as trans_label,
trans.id_year as credit_year,
account.id as account_id,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON trans.id = line.id_transaction
INNER JOIN acc_accounts AS account ON account.id = line.id_account
INNER JOIN acc_years AS y ON y.id = trans.id_year
WHERE account.code = :account_code AND credit > 0
AND credit_line_id NOT IN (
SELECT json_extract(link.document, '$.credit_line_id') AS credit_line_id FROM !table as link
WHERE json_extract(link.document, '$.type') == "credit_link")
ORDER BY trans.date, trans.label;
:account_code = $ligne_immo.account_code
!table =$module.table
assign="other_immos."
}}
{{/select}}
{{:admin_header title="Écritures au crédit du compte d'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include
file="_nav.html"
current="config"
subcurrent="other"
subsubcurrent="immo"
type_immo="other"
}}
{{/if}}
<section class="immobilisation">
<fieldset>
<legend>
Écritures au crédit du compte d'immobilisation « {{$ligne_immo.account_code}} »
</legend>
<div class="informations">
<dl class="describe">
<dt>Immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$label_immo}}</dd>
<dt>Montant</dt>
<dd class="money strong">{{"%f"|math:$ligne_immo.montant|money_currency_html:false|raw}}</dd>
<dt>Date de l'écriture d'immobilisation</dt>
<dd>{{$ligne_immo.date_achat|date_short}}</dd>
</dl>
</div>
</fieldset>
{{if $other_immos != null}}
<table class="list">
<thead>
<tr>
<th></th>
<th>Date</th>
<th class="nombre">Montant</th>
<th>Libellé</th>
<th>N° compte</th>
<th>Compte</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
{{#foreach from=$other_immos item="line"}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.credit_trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.credit_year}}
<tr>
<td class="num"><a href="{{$trans_url}}">#{{$line.credit_trans_id}}</a></td>
<td>{{$line.trans_date|date_short}}</td>
<td class="money">{{"%f"|math:$line.credit_amount|money_html:false|raw}}</td>
<td>{{$line.trans_label}}
{{if $line.line_label != null && $line.line_label != $line.trans_label}} - {{$line.line_label}}{{/if}}
</td>
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td>
<td>
{{:linkbutton label="Attacher" href="attach_immo.html?credit_line_id=%d&immo_doc_id=%s"|args:$line.credit_line_id:$_GET.immo_doc_id shape="plus"}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
<p class="help">Sélectionner une écriture d'avoir ou autre réduction du montant de l'acquisition pour l'associer à l'immobilisation</p>
{{else}}
<p class="block alert">Aucune écriture au crédit du compte « {{$ligne_immo.account_code}} »</p>
{{/if}}
</section>
{{:form_errors}}
{{:admin_footer}}

299
modify_infos.html Normal file
View file

@ -0,0 +1,299 @@
{{* -*- brindille -*- *}}
{{*
@param immo_doc_id
TODO ? :
- séparer les cas des immo simples et complexes (BOI)
par exemple pour la durée d'amort par défaut {{:input ...}}
- prise en charge immo => param = immo_line_id
- modif param immo => param = immo_doc_id
- DONE possibilité supprimer liaison écriture avoir
*}}
{{* données de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
trans.id as immo_trans_id,
trans.label as trans_label,
trans.date as date_achat,
line.debit as montant,
line.label as line_label,
acc.code,
acc.label as account_label
FROM acc_transactions_lines AS line
INNER join acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE line.id = :line_id;
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign montant_immo=$info_immo.amount|or:$ligne_immo.montant}}
{{:assign immo_label=$info_immo.label|or:$ligne_immo.trans_label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $immo_label}}
{{:assign immo_label=$immo_label|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{*
chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign linked_immos=null}}
{{:assign total_credits=0}}
{{#load type="credit_link" where="$$.immo_doc_id=:immo_doc_id" :immo_doc_id=$_GET.immo_doc_id|intval}}
{{#select
line.credit,
trans.id
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign credit=$credit}}
{{:assign credit_trans_id=$id}}
{{/select}}
{{:assign var="linked_immos." doc=$id trans=$credit_trans_id}}
{{if $amount == null}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{/load}}
{{:assign solde="%d-%d"|math:$montant_immo:$total_credits}}
{{:assign autres_amount=0}}
{{#load
type="immo"
where="$$.line = :line_id AND id != :doc_id"
:line_id = $info_immo.line
:doc_id = $info_immo.id
}}
{{:assign autres_amount="%d+%d"|math:$autres_amount:$amount}}
{{/load}}
{{:assign max_disponible="%d-%d"|math:$ligne_immo.montant:$autres_amount}}
{{* traiter la saisie *}}
{{#form on="save"}}
{{if ! $_POST.amortir}}
{{* ne pas amortir *}}
{{:assign duration=0}}
{{:assign libelle=null}}
{{:assign montant=null}}
{{:assign date_achat=null}}
{{:assign date_mes=null}}
{{:assign status="ignored"}}
{{else}}
{{if $_POST.date_achat|parse_date > $ligne_immo.date_achat}}
{{:assign da=$ligne_immo.date_achat|date_short}}
{{:error message="Erreur : la date d'achat (%s) ne peut être postérieure à la date de l'écriture d'immobilisation (%s)"|args:$_POST.date_achat:$da}}
{{/if}}
{{if $_POST.date_achat == null || $_POST.date_achat|parse_date == $info_immo.date_achat}}
{{:assign date_achat=$info_immo.date_achat}}
{{elseif $_POST.date_achat|parse_date == $ligne_immo.date_achat}}
{{:assign date_achat=null}}
{{else}}
{{:assign date_achat=$_POST.date_achat|parse_date}}
{{/if}}
{{* TODO : simplifier ? *}}
{{if $_POST.date_mes == null || $_POST.date_mes|parse_date == $info_immo.date_mes}}
{{:assign date_mes=$info_immo.date_mes}}
{{elseif $_POST.date_mes|parse_date == $info_immo.date_achat}}
{{:assign date_mes=null}}
{{elseif $_POST.date_mes|parse_date == $ligne_immo.date_achat}}
{{if $info_immo.date_achat == null}}
{{:assign date_mes=null}}
{{else}}
{{:assign date_mes=$ligne_immo.date_achat}}
{{/if}}
{{else}}
{{:assign date_mes=$_POST.date_mes|parse_date}}
{{:assign date_achat_comp=$ligne_immo.date_achat}}
{{if $date_achat != null}}
{{:assign date_achat_comp=$date_achat}}
{{/if}}
{{if $date_mes < $date_achat_comp}}
{{:assign da=$date_achat_comp|date_short}}
{{:error message="Erreur : la date de mise en service (%s) ne peut être antérieure à la date d'acquisition (%s)"|args:$_POST.date_mes:$da}}
{{/if}}
{{/if}}
{{:assign duration=$_POST.duree|intval}}
{{if $duration <= 0}}
{{:error message="Erreur : la durée d'amortissement doit être strictement positive"}}
{{/if}}
{{if $_POST.libelle != $ligne_immo.line_label && $_POST.libelle != $ligne_immo.trans_label}}
{{:assign libelle=$_POST.libelle}}
{{else}}
{{:assign libelle=null}}
{{/if}}
{{:assign montant=null}}
{{if $_POST.montant == null || $_POST.montant|money_int == 0 || $_POST.montant|money_int == $info_immo.amount}}
{{:assign montant=$info_immo.amount}}
{{else}}
{{:assign montant=$_POST.montant|money_int}}
{{if $montant < 0 || $montant > $max_disponible}}
{{:assign montant_aff="%f"|math:$montant|money_currency:false}}
{{:assign max_aff="%f"|math:$max_disponible|money_currency:false}}
{{:error message="Le montant (%s) doit être positif et ne peut être supérieur à %s"|args:$montant_aff:$max_aff}}
{{/if}}
{{/if}}
{{:assign status="managed"}}
{{/if}}
{{* écritures de crédit *}}
{{#foreach from=$linked_immos item="elem"}}
{{if ! $_POST.credit_id|has:$elem.trans}}
{{:assign var="docs_to_remove." value=$elem.doc}}
{{:assign var="links_to_remove." value=$elem.trans}}
{{/if}}
{{/foreach}}
{{if $docs_to_remove != null}}
{{:assign remove_set=$docs_to_remove|implode:","}}
{{:assign remove_set="("|cat:$remove_set|cat:")"}}
{{:delete where="id IN %s"|args:$remove_set}}
{{* idem avec acc_transactions_links *}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $ligne_immo.immo_trans_id
}}
{{if ! $linked_id|in:$links_to_remove}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/if}}
{{/select}}
{{* Enregistrer les liaisons *}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$ligne_immo.immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{/if}}
{{* enregistrer les infos de l'immobilisation *}}
{{:save
key=$info_immo.key
validate_schema="schema.json"
type="immo"
line=$info_immo.line
duration=$duration
label=$libelle
amount=$montant
date_achat=$date_achat
date_mes=$date_mes
status=$status
assign_new_id="new_id"
}}
{{if $_POST.amortir}}
{{:assign type_immo="managed"}}
{{else}}
{{:assign type_immo="other"}}
{{/if}}
{{:redirect force="index.html?ok=1&msg=infos&type_immo=%s"|args:$type_immo}}
{{/form}}
{{:admin_header title="Modifier l'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subcurrent="%s"|args:$_GET.type_immo subsubcurrent="parameter"}}
{{/if}}
{{:form_errors}}
{{:assign choix_defaut=$_GET.type_immo}}
{{*
modifier la date de mise en service, les écritures associées ou la durée d'amortissement
*}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
<h3 class="ruler">Paramètres de l'immobilisation</h3>
<div class="informations">
<dl class="describe">
<dt>Immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$immo_label}}</dd>
<dt>Compte d'immobilisation</dt>
<dd>{{$ligne_immo.code}} — {{$ligne_immo.account_label}}
<dt>Montant</dt>
<dd class="money strong">{{"%f"|math:$montant_immo|money_currency_html:false|raw}}</dd>
{{if $total_credits > 0}}
<dt>Montant des avoirs</dt>
<dd class="money">{{"%f"|math:$total_credits|money_currency_html:false|raw}}</dd>
<dt>Montant à amortir</dt>
<dd class="money strong">{{"%f"|math:$solde|money_currency_html:false|raw}}</dd>
{{/if}}
<dt>Date de l'écriture d'immobilisation</dt>
<dd>{{$ligne_immo.date_achat|date_short}}</dd>
</dl>
</div>
<form method="post" action="">
<fieldset>
<legend>Paramètres de l'amortissement</legend>
<dl>
{{:input id="amortir" type="checkbox" value=1 name="amortir" label="Amortir cette immobilisation sur une ou plusieurs années" checked="checked" help="Dé-cocher pour ne pas amortir"}}
<div class="masquable">
{{:input type="number" name="duree" label="Durée d'amortissement" min=1 default=$info_immo.duration}}
{{:input type="text" name="libelle" label="Libellé" default=$info_immo.label}}
{{if $info_immo.amount != null}}
{{:assign max_aff="%f"|math:$max_disponible|money_currency:false}}
{{:input type="money" name="montant" label="Montant de l'immobilisation" default=$montant_immo help="Montant maximum : %s"|args:$max_aff}}
{{/if}}
{{:input type="date" name="date_achat" label="Date d'acquisition" default=$info_immo.date_achat}}
{{:input type="date" name="date_mes" label="Date de mise en service" default=$info_immo.date_mes}}
{{if $linked_immos != null}}
<dt><label>Écritures d'avoir liées à l'immobilisation</label></dt>
<dd>
<span class="input-list avoirs">
<label for="credit_id">Écritures&nbsp;:</label>
{{#foreach from=$linked_immos item="elem"}}
<span class="label">
<input type="hidden" name="credit_id[]" value="{{$elem.trans}}">{{$elem.trans}}
<button data-icon="✘" type="button" class=" icn-btn" title="Cliquer pour supprimer la liaison"></button>
</span>
{{/foreach}}
</span>
</dd>
{{/if}}
</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">
function changeVisibility(evt, idcheck = 'f_amortir_1', hiddenclass = 'masquable')
{
toggleVisibility(idcheck, document.querySelectorAll('.' + hiddenclass));
}
(function () {
document.getElementById('f_amortir_1').onclick = changeVisibility;
})();
</script>

View file

@ -3,25 +3,34 @@
{{*
Lister les écritures d'amortissement indépendantes
et proposer des les attacher à l'immo sélectionnée
@param immo_line_id = id de la ligne d'immo
@param immo_doc_id id du doc d'immo associé
*}}
{{* récupérer les infos de l'immobilisation *}}
{{* données de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{:assign label_immo=$label|or:$ligne_immo.label}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
trans.label as label,
line.label as line_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval
assign=ligne_immo
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:include file="_get_config.html" keep="module.config"}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $label_immo}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}}
{{:include file="_get_config.html" keep="module.config"}}
{{if $_POST.unhide == null}}
{{:assign filter_condition=" NOT ("}}
{{#foreach from=$module.config.filters item="filter"}}
@ -54,46 +63,26 @@
!filter_condition=$filter_condition
assign="amort"
}}
{{* voir s'il existe des écritures liées avec un numéro de compte d'immobilisation *}}
{{#select
links.id_transaction,
links.id_related,
trans.id AS trans_id
FROM acc_transactions_links AS links
INNER JOIN acc_transactions AS trans ON (
CASE
WHEN links.id_transaction = :id_amort THEN links.id_related
WHEN links.id_related = :id_amort THEN links.id_transaction
END) = trans.id
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE
links.id_transaction = :id_amort OR links.id_related = :id_amort
AND acc.code LIKE '21%'
LIMIT 1
;
:id_amort=$amort.amort_trans_id
{{* voir s'il existe des lignes d'immo liées à cette ligne d'amortissement *}}
{{:assign amort_amount=0}}
{{:assign keep_amort=true}}
{{#load type="amort_link"
where="$$.amort_line_id = :amort_line_id"
:amort_line_id=$amort.amort_line_id|intval
assign="amort_link"
}}
{{* voir s'il existe un doc associé à une ligne de l'amortissement *}}
{{:assign keep=true}}
{{#load type="link"
where="$$.amort_trans_id = :amort_trans_id"
:amort_trans_id = $amort.amort_trans_id
}}
{{if $amort_line_id == $amort.amort_line_id}}
{{:assign keep=false}}
{{:break}}
{{/if}}
{{if $amort_link.amount == null || $amort_link.amount == 0}}
{{:assign amort_amount=$amort.amort_amount}}
{{:assign keep_amort=false}}
{{else}}
{{:assign keep=false}}
{{/load}}
{{if $keep}}
{{:assign var="autres_amortissements." value=$amort}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$amort_link.amount}}
{{/if}}
{{else}}
{{:assign var="autres_amortissements." value=$amort}}
{{/select}}
{{* pas de ligne d'immo liée à cette ligne d'amort => garder cette ligne d'amortissement *}}
{{/load}}
{{if $keep_amort && $amort_amount < $amort.amort_amount}}
{{:assign var="free_amort_lines." value=$amort}}
{{/if}}
{{/select}}
{{:admin_header title="Amortissements non rattachés" custom_css="./style.css" current="module_amortization"}}
@ -106,7 +95,7 @@
subcurrent="other"
subsubcurrent="amortization"
type_immo="other"
autres_amort=$autres_amortissements
autres_amort=$free_amort_lines
}}
{{/if}}
@ -116,13 +105,13 @@
<form method="post" action="">
<fieldset>
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher toutes les écritures" }}
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher les écritures ignorées"}}
</fieldset>
</form>
{{if $autres_amortissements != null}}
{{if $free_amort_lines != null}}
<section class="amortissement">
<h3 class="ruler">Immobilisation « {{$ligne_immo.label}}{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $ligne_immo.label}} — {{$ligne_immo.line_label}}{{/if}} »</h3>
<h3 class="ruler">Immobilisation « {{$label_immo}} »</h3>
<table class="list">
<thead>
<tr>
@ -136,7 +125,7 @@
</tr>
</thead>
<tbody>
{{#foreach from=$autres_amortissements item="line"}}
{{#foreach from=$free_amort_lines item="line"}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.amort_trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.amort_year}}
<tr>
@ -149,13 +138,15 @@
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td>
<td>
{{:linkbutton label="Attacher" href="attach_amort.html?amort_line_id=%d&immo_line_id=%d"|args:$line.amort_line_id:$_GET.immo_line_id shape="plus"}}
{{:linkbutton label="Attacher" href="attach_amort.html?immo_doc_id=%s&amort_line_id=%s"|args:$_GET.immo_doc_id:$line.amort_line_id shape="plus"}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
</section>
{{else}}
<p class="block alert">Aucun amortissement à rattacher</p>
{{/if}}
{{:form_errors}}
{{:admin_footer}}

View file

@ -2,16 +2,21 @@
{{*
Créer une écriture d'amortissement
@param immo_line_id : id de la ligne d'immobilisation
@param immo_doc_id : id du doc associé à l'immo
*}}
{{* Infos de l'immobilisation *}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
line.id_account as account_id,
line.debit as montant,
line.id_project as project_id,
line.label as line_label,
trans.id as trans_id,
trans.id as immo_trans_id,
trans.label,
trans.date,
account.code as account_code
@ -20,106 +25,84 @@
INNER JOIN acc_accounts AS account ON line.id_account = account.id
LEFT JOIN acc_projects AS project ON line.id_project = project.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval
assign=ligne_immo
:line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{:assign date_debut=$ligne_immo.date}}
{{:assign var="amort_label" value="Amortissement %s"|args:$ligne_immo.label}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $ligne_immo.label}}
{{if $info_immo.amount != null}}
{{:assign var="ligne_immo.montant" value=$info_immo.amount}}
{{/if}}
{{:assign date_debut=$info_immo.date_mes|or:$info_immo.date_achat|or:$ligne_immo.date}}
{{:assign amort_label=$info_immo.label|or:$ligne_immo.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}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{:assign duree=$duration}}
{{:assign date_debut=$date}}
{{:assign status=$status}}
{{else}}
{{:error message="Vous devez renseigner la date de mise en service et la durée d'immobilisation"}}
{{/load}}
{{if $status == "amortized" || $status == "archived"}}
{{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}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
{{*
chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign total_credits=0}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $_GET.immo_doc_id|intval
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{/load}}
{{:assign var="ligne_immo.montant" value="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{:assign solde=$ligne_immo.montant}}
{{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{#select
l_amort.credit as amort_amount,
l_amort.label as amort_label,
l_amort.id as amort_line_id,
CASE WHEN links.id_related = t_immo.id
THEN links.id_transaction
ELSE links.id_related
END as amort_trans_id,
trans.date as amort_date,
trans.label as trans_label,
trans.id_year as amort_year,
account.id as account_id,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction OR t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER join acc_transactions as trans on l_amort.id_transaction = trans.id
INNER join acc_accounts as account on l_amort.id_account = account.id
WHERE
l_immo.id = :line_id
AND account.code LIKE '28%'
ORDER BY trans.date;
:line_id = $_GET.immo_line_id|intval
assign="amort_line"
}}
{{#load type="link"
where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id"
order="$$.date"
assign="line"
:immo_line_id=$_GET.immo_line_id|intval :amort_trans_id=$amort_line.amort_trans_id
{{* chercher des écritures d'amortissement liées à la ligne d'immobilisation *}}
{{#load
type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
order="$$.date"
:immo_doc_id=$_GET.immo_doc_id|intval
}}
{{if $line.amort_line_id == $amort_line.amort_line_id}}
{{:assign var="linked_amort." value=$amort_line}}
{{/if}}
{{else}}
{{:assign var="linked_amort." value=$amort_line}}
{{/load}}
{{/select}}
{{#select
line.credit,
trans.date as amort_date,
COALESCE(trans.label, line.label) as amort_label,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER join acc_accounts AS account on line.id_account = account.id
WHERE line.id = :amort_line_id
;
:amort_line_id = $amort_line_id
assign="amort_line"
}}
{{:assign var="amort_line.amort_amount" value=$amount|or:$credit}}
{{:assign var="linked_amort.%s_%d"|args:$amort_date:$id value=$amort_line}}
{{/select}}
{{/load}}
{{:assign total_amort=0}}
{{:assign valeur_residuelle=$ligne_immo.montant}}
{{#foreach from=$linked_amort}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_amount}}
{{:assign total_amort="%d+%d"|math:$total_amort:$amort_amount}}
{{:assign date_debut=$amort_date}}
{{:assign code_amort=$account_code}}
{{:assign amort_account_label=$account_label}}
{{:assign amort_label=$trans_label}}
{{#foreach from=$linked_amort|ksort item="line"}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$line.amort_amount}}
{{:assign total_amort="%d+%d"|math:$total_amort:$line.amort_amount}}
{{:assign date_debut=$line.amort_date}}
{{:assign code_amort=$line.account_code}}
{{:assign amort_account_label=$line.account_label}}
{{:assign amort_label=$amort_label}}
{{/foreach}}
{{if $valeur_residuelle == 0}}
@ -220,7 +203,7 @@
}}
{{if $account_ok == null}}
{{:assign compte=$credit_account|implode:""}}
{{:redirect url="add_account.html?account=%s&chart=%s&immo_line_id=%s"|args:$compte:$selected_chart:$_GET.immo_line_id}}
{{: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 *}}
@ -236,15 +219,14 @@
debit=$_POST.montant
account=$debit_account|keys|value:0
id_project=$ligne_immo.project_id
label=$_POST.designation
}}
{{:assign
var="lines."
credit=$_POST.montant
account=$credit_account|keys|value:0
id_project=$ligne_immo.project_id
label=$_POST.designation
}}
{{:api
method="POST"
path="accounting/transaction"
@ -255,33 +237,32 @@
date=$_POST.date_amort
label=$_POST.designation
lines=$lines
linked_transactions=$ligne_immo.trans_id|intval
linked_transactions=$ligne_immo.immo_trans_id|intval
}}
{{* enregistrer la liaison des lignes *}}
{{#select
trans.id AS trans_id,
line.id AS line_id
FROM acc_transactions AS trans
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id
WHERE trans.id = :trans_id
;
:trans_id = $result.id
}}
{{:assign amort_trans_id=$trans_id}}
{{:assign amort_line_id=$line_id}}
{{/select}}
{{if $amort_trans_id != null}}
{{#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
}}
{{:break}}
{{/if}}
{{/foreach}}
{{* immo soldée ? *}}
{{if $_POST.montant|trim|money_int == $solde}}
{{:assign var="info_immo.status" value="amortized"}}
{{:save
key=""|uuid
type="link"
immo_line_id=$_GET.immo_line_id|intval
amort_line_id=$amort_line_id|intval
amort_trans_id=$result.id
key=$info_immo.key
status=$info_immo.status
}}
{{/if}}
{{:redirect force="amortization.html?immo_line_id=%s&ok=1&msg=amortissement"|args:$_GET.immo_line_id}}
{{: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"}}
@ -298,7 +279,7 @@
{{: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.montant:$duree:$nbjours|intval}}
{{:assign montant_amort="%f/%f/365*%d"|math:$ligne_immo.montant:$info_immo.duration:$nbjours|intval}}
{{:assign montant_amort="min(%f, %d-%d)"|math:$montant_amort:$ligne_immo.montant:$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}}
@ -335,7 +316,7 @@
}}
<div id="donnees" class="hidden">
{{:input type="text" name="montant_immo" default=$ligne_immo.montant}}
{{:input type="text" name="duree_amort" default=$duree}}
{{: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>

View file

@ -14,11 +14,20 @@
"description": "durée de l'amortissement en années",
"type": "integer"
},
"label" : {
"description" : "libellé de l'immobilisation si besoin",
"type" : ["string", "null"]
},
"amount" : {
"description": "montant de l'immobilisation si besoin",
"type": ["integer", "null"]
},
"date" : {
"date_achat" : {
"description" : "date d'achat de l'immobilisation si besoin",
"type" : ["string", "null"],
"format" : "date"
},
"date_mes" : {
"description" : "date de mise en service de l'immobilisation",
"type" : ["string", "null"],
"format" : "date"
@ -28,5 +37,5 @@
"enum" : ["managed", "amortized", "archived", "ignored"]
}
},
"required": ["type", "line", "duration", "date"]
"required": ["type", "line", "duration", "status"]
}

View file

@ -14,14 +14,13 @@ function toggleInputs(idcb, idfields) {
function toggleVisibility(idcheck, fields) {
const elem = document.getElementById(idcheck);
for (let id of fields) {
const field = document.getElementById(id);
fields.forEach(function (field) {
if (elem.checked) {
field.setAttribute('class', '');
field.classList.remove('hidden');
} else {
field.setAttribute('class', 'hidden');
field.classList.add('hidden');
}
}
});
}
// fixer l'exercice des sélecteurs de compte
@ -80,7 +79,7 @@ function setDateEnd(id_exercices, id_date, id_years) {
// renvoyer la valeur numérique d'un montant formaté en €
function getNumber(text) {
return Number(text.replace(/[^0-9,]/g, '').replace(/,/, '.'));
return Number(text.replace(/[^0-9,]/g, '').replace(/,/, '.'));
}
// calculer le montant d'un amortissement

View file

@ -35,17 +35,15 @@ h2[class="aide"], h3[class="aide"] {
}
.informations dl.describe {
grid-template-columns : 20rem 1fr;
grid-template-columns : 25rem 1fr;
}
.informations dl.describe > dt {
flex: 0 0 15rem;
margin-right: 0;
white-space: nowrap;
}
.informations dl.describe > dd {
flex: 0 0 calc(100% - 20rem);
margin-right: 0;
}
@ -76,7 +74,31 @@ table.list tbody tr.ignored:nth-child(even) {
font-style: italic;
background: rgba(255, 255, 200, 0.5);
}
html.dark table.list tbody tr.ignored:nth-child(odd) {
font-style: italic;
background: rgba(100, 100, 0, 0.4);
}
html.dark table.list tbody tr.ignored:nth-child(even) {
font-style: italic;
background: rgba(100, 100, 0, 0.4);
}
html.dialog.dark {
filter: none !important;
}
html.dialog.dark main {
background-color : #ddd;
}
html.dark .block.alert {
background-color : rgba(87, 206, 235, 0.5);
}
span.input-list.avoirs label {
padding : 0.4rem 0.6rem;
}
aside.right {
float: right;
}

View file

@ -75,12 +75,12 @@
{{/if}}
{{* vérifier que la date de mise en service est située dans l'exercice sélectionné *}}
{{:assign ts_date = $_POST.date_mes|parse_date|strtotime}}
{{:assign ts_date = $_POST.date_mes|parse_date}}
{{: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}}
{{if $start_date <= $ts_date && $ts_date <= $end_date}}
{{:assign ok=true}}
{{:break}}
{{/if}}
@ -93,11 +93,8 @@
{{if ! $_POST.amortir}}
{{* ne pas amortir *}}
{{:assign duration=0}}
{{:assign date_debut=$_POST.date_achat|parse_date}}
{{:assign status="ignored"}}
{{else}}
{{* vérifier que la date d'acquisition est antérieure à la date de mise en service *}}
{{:assign date_debut=$_POST.date_mes|parse_date}}
{{:assign duration=$_POST.duree|intval}}
{{:assign status="managed"}}
{{/if}}
@ -182,7 +179,7 @@
type="immo"
line=$immo_line_id
duration=$duration
date=$date_debut
date_mes=null
status=$status
}}
{{if $_POST.amortir}}

View file

@ -3,16 +3,19 @@
{{*
Enregistrer les écritures de sortie du bilan
paramètres :
- immo_line_id : numéro de ligne de l'écriture d'immobilisation
- immo_doc_id : id du doc associé à l'immobilisation
- amort_amount : montant des amortissements
- year : exercice de la date de sortie de l'immobilisation
- date_mes : date de mise en service de l'immobilisation
- date_debut : date de début de la période d'amortissement complémentaire
- exit_date : date de sortie de l'immobilisation
- duree_amort : durée de l'amortiseement (optionnel)
- cession : montant de la cession (optionnel)
*}}
{{#load id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select
line.debit as montant,
line.id_transaction,
@ -25,43 +28,63 @@
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE line.id = :immo_line_id;
:immo_line_id = $_GET.immo_line_id|intval
:immo_line_id = $info_immo.line
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/select}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{/load}}
{{* chercher des écritures liées à l'immo courante au crédit du même compte
et déduire leur montant de celui de l'immo
*}}
{{:assign total_credits=0}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{#load
type="credit_link"
where="$$.immo_doc_id = :immo_doc_id"
:immo_doc_id = $info_immo.id
assign="credit_link"
}}
{{if $amount == null}}
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id;
:credit_line_id=$credit_line_id
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{else}}
{{:assign total_credits="%d+%d"|math:$total_credits:$amount}}
{{/if}}
{{else}}
{{*
TODO : à garder ?
pas de doc => voir liaison écritures
*}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as other_id,
line.credit
FROM acc_transactions AS trans
INNER JOIN acc_transactions_links as links
ON (trans.id = links.id_transaction OR trans.id = links.id_related)
INNER JOIN acc_transactions_lines AS line on line.id_transaction = other_id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE trans.id = :immo_trans_id AND line.credit > 0 AND acc.code = :account;
:immo_trans_id=$ligne_immo.trans_id
:account=$ligne_immo.account_code
}}
{{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}}
{{/load}}
{{:assign var="ligne_immo.montant" value="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{:assign valeur_nette="%f-%f"|math:$ligne_immo.montant:$_GET.amort_amount}}
{{:assign amort_comp=0}} {{* amortissement complémentaire jqà date sortie *}}
{{:assign amort_except=0}} {{* amortissement exceptionnel jqà date fin amortissement *}}
{{if $valeur_nette > 0}}
{{:assign nbjours="1+(%d-%d)/(60*60*24)"|math:$_GET.exit_date:$_GET.date_debut}}
{{:assign annuite="%f/%f"|math:$ligne_immo.montant:$_GET.duree_amort}}
{{:assign annuite="%f/%f"|math:$ligne_immo.montant:$info_immo.duration}}
{{:assign amort_comp="round(%f/365*%f, 0)"|math:$annuite:$nbjours}}
{{:assign amort_comp="min(%f, %f)"|math:$valeur_nette:$amort_comp}}
@ -164,6 +187,18 @@
lines=$lines
linked_transactions=$ligne_immo.id_transaction
}}
{{* liaisons lignes d'amortissement *}}
{{#foreach from=$result.lines item="line"}}
{{if $line.account_code == $amort_account_code}}
{{:save
key=""|uuid
type="amort_link"
immo_doc_id=$info_immo.id
amort_line_id=$line.id
}}
{{/if}}
{{/foreach}}
{{/if}}
{{* écriture de sortie du bilan *}}
@ -218,6 +253,19 @@
linked_transactions=$ligne_immo.id_transaction
}}
{{* liaison écriture de sortie *}}
{{#foreach from=$result.lines item="line"}}
{{if $line.account_code == $immo_account_code}}
{{:save
key=""|uuid
type="exit_link"
immo_doc_id=$info_immo.id
exit_line_id=$line.id
}}
{{:break}}
{{/if}}
{{/foreach}}
{{if $montant_cession > 0}}
{{* Cession de l'immobilisation *}}
{{:assign libelle="Produit cession "|cat:$ligne_immo.label}}
@ -250,30 +298,16 @@
}}
{{/if}}
{{if $info_immo != null}}
{{* mettre à jour l'état de l'immobilisation *}}
{{:save
key=$info_immo.key
status="archived"
}}
{{else}}
{{:save
key=""|uuid
validate_schema="schema.json"
type="immo"
line=$_GET.immo_line_id|intval
duration=$_GET.duree_amort|intval
date=$_GET.date_mes|date:"Y-m-d"
status="archived"
}}
{{/if}}
{{* mettre à jour l'état de l'immobilisation *}}
{{:save
key=$info_immo.key
status="archived"
}}
{{:redirect to="index.html?type_immo=archived"}}
{{/form}}
{{:admin_header title="Sortie du bilan" custom_css="./style.css" current="module_amortization"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subcurrent="balance_exit"}}
{{/if}}
@ -347,14 +381,12 @@
<dd class="money">{{$ligne_immo.montant|money_currency_html:false|raw}}</dd>
<dt>Date d'acquisition</dt>
<dd >{{$ligne_immo.date_achat|date_short}}</dd>
{{if $_GET.date_mes != $ligne_immo.date_achat|strtotime}}
{{if $info_immo.date_mes != null && $info_immo.date_mes != $ligne_immo.date_achat}}
<dt>Date de mise en service</dt>
<dd>{{$_GET.date_mes|date:"d/m/Y"}}</dd>
{{/if}}
{{if $_GET.duree_amort != null}}
<dt>Durée de l'amortissement</dt>
<dd class="num">{{$_GET.duree_amort}} ans</dd>
<dd>{{$info_immo.date_mes|date_short}}</dd>
{{/if}}
<dt>Durée de l'amortissement</dt>
<dd class="num">{{$info_immo.duration}} ans</dd>
<dt>Montant des amortissements</dt>
<dd class="money">{{$_GET.amort_amount|money_currency_html:false|raw}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Valeur nette résiduelle</dt>