Compare commits

..

No commits in common. "62692ef550f7c49cb5f41d166f1b38c0e7cfcc58" and "269ff406e4c398c942a33d8d10d84637036b28b0" have entirely different histories.

18 changed files with 813 additions and 1261 deletions

View file

@ -3,6 +3,7 @@
{{* Liste des immobilisations en cours d'amortissement ou amorties *}} {{* Liste des immobilisations en cours d'amortissement ou amorties *}}
{{:include file="_get_config.html" keep="module.config"}} {{:include file="_get_config.html" keep="module.config"}}
<section class="immobilisation">
<p class="help"> <p class="help">
{{if $type_immo == "managed"}} {{if $type_immo == "managed"}}
@ -12,7 +13,6 @@
{{/if}} {{/if}}
</p> </p>
{{if $module.table != null}}
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
@ -29,6 +29,14 @@
</thead> </thead>
<tbody> <tbody>
{{* vérifier l'existence de la table du module *}}
{{#load limit="1"}}
{{:assign table_presente=true}}
{{else}}
{{:assign table_presente=false}}
{{/load}}
{{if $table_presente}}
{{* lister les immobilisations *}} {{* lister les immobilisations *}}
{{:assign account_condition="("}} {{:assign account_condition="("}}
{{#foreach from=$module.config.prefixes item="code"}} {{#foreach from=$module.config.prefixes item="code"}}
@ -36,8 +44,17 @@
{{:assign account_condition=$account_condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}} {{:assign account_condition=$account_condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}} {{/foreach}}
{{:assign account_condition=$account_condition|cat:"0)"}} {{:assign account_condition=$account_condition|cat:"0)"}}
{{:assign status_condition="($$.status = 'managed' OR $$.status = 'amortized')"}} {{:assign doc_condition="($$.status <> 'ignored' AND $$.status <> 'archived')"}}
{{:assign condition=$account_condition|cat:" AND line.debit > 0 AND "|cat:$status_condition}}
{{: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="($$.status IS NULL 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_condition|cat:")"}}
{{:assign nb_immo=0}} {{:assign nb_immo=0}}
{{:assign total_immo = 0}} {{:assign total_immo = 0}}
@ -51,105 +68,152 @@
account.id as account_id, account.id as account_id,
account.code as account_code, account.code as account_code,
trans.id_year as trans_id_year, trans.id_year as trans_id_year,
info.id as immo_doc_id,
$$.duration as duration, $$.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 $$.status as status
FROM acc_transactions AS trans FROM acc_transactions AS trans
INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id 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_accounts AS account ON line.id_account = account.id
INNER JOIN acc_years AS years ON trans.id_year = years.id INNER JOIN acc_years AS years ON trans.id_year = years.id
INNER JOIN !table AS info ON $$.line = line.id LEFT JOIN !table AS info ON $$.line = line.id
WHERE !condition WHERE !condition
ORDER BY COALESCE(doc_date_achat, trans_date) DESC; ORDER BY trans.date DESC;
!table=$module.table !table=$module.table
!condition=$condition !condition=$condition
}} }}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$immo_trans_id}} {{: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 compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{:assign montant_immo=$doc_amount|or:$debit}} {{:assign duration=$duration}}
{{:assign immo_date = $doc_date_achat|or:$trans_date}} {{:assign montant_immo=$debit}}
{{:assign label_immo=$doc_label|or:$trans_label}} {{if $status == null}}
{{if $line_label != null && $line_label != $label_immo}} {{:assign status="unknown"}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$line_label}}
{{/if}} {{/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 et déduire leur montant de celui de l'immo
*}} *}}
{{#load {{#select
type="immo_link" CASE links.id_related = :immo_trans_id
where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $immo_doc_id WHEN true THEN links.id_transaction
}} WHEN false THEN links.id_related
{{if $amount == null}} END as other_id,
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id; line.credit
:credit_line_id=$credit_line_id 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}} {{:assign montant_immo="%d-%d"|math:$montant_immo:$credit}}
{{/select}} {{/select}}
{{else}}
{{:assign montant_immo="%d-%d"|math:$montant_immo:$amount}}
{{/if}}
{{/load}}
{{* Immobilisation soldée ? *}} {{* Immobilisation soldée ? *}}
{{* TODO ¿ marquer archivée ? *}} {{* TODO marquer archivée *}}
{{if $montant_immo == 0}} {{if $montant_immo == 0}}
{{:continue}} {{:continue}}
{{/if}} {{/if}}
{{* chercher des lignes des écritures d'amortissement liées à la ligne d'immobilisation *}} {{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}}
{{:assign amort_lines=null}} {{:assign amort_lines=null}}
{{:assign amort_amount=0}} {{#select
{{#load type="amort_link" l_amort.credit as amount,
where="$$.immo_doc_id = :immo_doc_id" CASE links.id_related = t_immo.id
:immo_doc_id = $immo_doc_id WHEN true THEN links.id_transaction
assign="amort_link" 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"
}} }}
{{if $amount == null}} {{:assign var="amort_lines.%d."|args:$amort_trans_id value=$line}}
{{#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}} {{/select}}
{{else}}
{{:assign amort_amount="%d+%d"|math:$amort_amount:$amount}} {{:assign amort_amount=0}}
{{/if}} {{#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}} {{/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}}
{{* classement par onglet *}} {{* classement par onglet *}}
{{if $type_immo == "managed" && $amort_amount >= $montant_immo}}{{:continue}}{{/if}} {{if $type_immo == "managed" && $amort_amount >= $montant_immo}}{{:continue}}{{/if}}
{{if $type_immo == "amortized" && $amort_amount < $montant_immo}}{{:continue}}{{/if}} {{if $status == "unknown" && ! $exist_amort}}{{:continue}}{{/if}}
{{if $type_immo == "amortized" && $amort_amount < $montant_immo}}{{:continue}}{{/if}} {{* ?? *}}
{{:assign nb_immo="%d+1"|math:$nb_immo}} {{:assign nb_immo="%d+1"|math:$nb_immo}}
{{:assign total_immo="%d+%d"|math:$total_immo:$montant_immo}} {{:assign total_immo="%d+%d"|math:$total_immo:$montant_immo}}
{{:assign var="montant" from="sommes_immo.%s"|args:$account_code}} {{:assign var="montant" from="sommes_immo.%s"|args:$account_code}}
{{:assign var="sommes_immo.%s"|args:$account_code value="%d+%d"|math:$montant:$montant_immo}} {{:assign var="sommes_immo.%s"|args:$account_code value="%d+%d"|math:$montant:$montant_immo}}
<tr> <tr>
<td class="num"><a href="{{$trans_url}}">#{{$immo_trans_id}}</a></td> <td class="num"><a href={{$trans_url}}>#{{$immo_trans_id}}</a></td>
<td>{{$immo_date|date_short}}</td> <td>{{$trans_date|date_short}}</td>
<td>{{$label_immo}}</td> <td>{{$trans_label}}{{if $line_label != null && $line_label != $trans_label}} — {{$line_label}}{{/if}}</td>
<td class="money">{{$montant_immo|money_html:false|raw}}</td> <td class="money">{{$montant_immo|money_html:false|raw}}</td>
<td class="money">{{if $duration != null}}{{$duration}}{{/if}}</td> <td class="money">{{if $duration != null}}{{$duration}}{{/if}}</td>
<td class="money">{{$amort_amount|money_html:false|raw}}</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 class="money">{{"%d-%d"|math:$montant_immo:$amort_amount|money_html:false|raw}}</td>
<td><a href="{{$compte_url}}">{{$account_code}}</a></td> <td><a href={{$compte_url}}>{{$account_code}}</a></td>
<td class="actions"> <td class="actions">
{{*if $amort_amount == 0*}} {{if ! $exist_amort || $status == "unknown"}}
{{:linkbutton {{:linkbutton
label="Détails" label="Paramètres"
href="details_immo.html?immo_doc_id=%s"|args:$immo_doc_id href="add_infos.html?immo_line_id=%s&type_immo=%s"|args:$immo_line_id:$type_immo
shape="search" shape="settings"
}} }}
{{* target="_dialog"*}} {{* target="_dialog"*}}
{{*/if*}} {{/if}}
{{:linkbutton {{:linkbutton
label="Amortissements" label="Amortissements"
href="amortization.html?immo_line_id=%s&type_immo=%s&immo_doc_id=%s"|args:$immo_line_id:$type_immo:$immo_doc_id shape="table" href="amortization.html?immo_line_id=%s&type_immo=%s"|args:$immo_line_id:$type_immo
shape="table"
}} }}
</td> </td>
</tr> </tr>
@ -186,8 +250,9 @@
</tr> </tr>
{{/if}} {{/if}}
</tfoot> </tfoot>
</table>
{{/if}} {{/if}}
{{if $nb_immo == 0 || $module.table == null}} </table>
{{if $nb_immo == 0 || ! $table_presente}}
<p class="block alert">Aucune immobilisation</p> <p class="block alert">Aucune immobilisation</p>
{{/if}} {{/if}}
</section>

View file

@ -1,12 +1,12 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{* Liste des immobilisations non gérées ou non entièrement affectées *}} {{* Liste des immobilisations non amortissables ou non (encore) gérées *}}
{{:include file="_get_config.html" keep="module.config"}} {{:include file="_get_config.html" keep="module.config"}}
<section class="immobilisation">
<p class="help"> <p class="help">
Cette page liste les immobilisations pas encore prises en charge Cette page liste les écritures pas (encore) prises en charge par le module et sans écriture d'amortissement associée.
par le module ou les écritures de la balance d'ouverture initiale
dont le montant n'est pas encore totalement affecté
</p> </p>
{{:assign saved_hides=$module.config.hides}} {{:assign saved_hides=$module.config.hides}}
@ -28,21 +28,40 @@
{{:assign checked="checked"}} {{:assign checked="checked"}}
{{/if}} {{/if}}
<form method="post" action="">
<fieldset>
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher toutes les écritures" }}
</fieldset>
</form>
<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>
{{* vérifier l'existence de la table du module *}} {{* vérifier l'existence de la table du module *}}
{{if $module.table != null}} {{#load limit="1"}}
{{:assign columns="$$.status as status, SUM($$.amount) as amount,"}} {{:assign columns="$$.duration as duration, $$.status as status,"}}
{{:assign table_join="LEFT JOIN !table AS info ON $$.line = line.id"}} {{:assign table_join="LEFT JOIN !table AS info ON $$.line = line.id"}}
{{:assign doc_condition="($$.status IS NULL OR $$.status == 'managed' OR $$.status == 'ignored')"}} {{:assign doc_condition1="($$.status == 'ignored')"}}
{{:assign doc_condition2="$$.status IS NULL"}}
{{else}} {{else}}
{{:assign columns=""}} {{:assign columns=""}}
{{:assign table_join=""}} {{:assign table_join=""}}
{{:assign doc_condition="1"}} {{:assign doc_condition1="0"}}
{{/if}} {{:assign doc_condition2="1"}}
{{/load}}
{{* {{* lister les immobilisations *}}
lister les immobilisations non prises en charge par le module
ou dont le montant n'a pas été totalement affecté
*}}
{{:assign account_condition="("}} {{:assign account_condition="("}}
{{#foreach from=$module.config.prefixes item="code"}} {{#foreach from=$module.config.prefixes item="code"}}
{{:assign code=$code|cat:"%"|quote_sql}} {{:assign code=$code|cat:"%"|quote_sql}}
@ -60,13 +79,11 @@
{{else}} {{else}}
{{:assign filter_condition="1"}} {{:assign filter_condition="1"}}
{{/if}} {{/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 NOT (trans.status & 16) AND "|cat:$filter_condition|cat:" AND "|cat:$doc_condition}} {{:assign condition=$account_condition|cat:" AND debit > 0 AND ("|cat:$filter_condition|cat:" OR "|cat:$doc_condition1|cat:")"}}
{{:assign nb_managed=0}} {{:assign nb_immo=0}}
{{:assign nb_ignored=0}}
{{:assign nb_null=0}}
{{:assign nb_other=0}}
{{#select {{#select
trans.id as immo_trans_id, trans.id as immo_trans_id,
trans.label as trans_label, trans.label as trans_label,
@ -85,67 +102,27 @@
INNER JOIN acc_years AS years ON trans.id_year = years.id INNER JOIN acc_years AS years ON trans.id_year = years.id
!table_join !table_join
WHERE !condition WHERE !condition
GROUP BY immo_line_id
ORDER BY trans.date DESC; ORDER BY trans.date DESC;
!columns=$columns !columns=$columns
!table_join=$table_join !table_join=$table_join
!table=$module.table !table=$module.table
!condition=$condition !condition=$condition
assign="immo_line"
}} }}
{{* {{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$immo_trans_id}}
parmi les immos gérées, ne conserver que celles dont le montant dans le doc est non nul {{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
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}}
{{/if}}
{{if $status == null}} {{if $status == null}}
{{:assign nb_null="%d+1"|math:$nb_null}} {{:assign status="unknown"}}
{{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}} {{/if}}
{{: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*}}
<form method="post" action="">
<fieldset>
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher les écritures ignorées" }}
</fieldset>
</form>
{{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"}}
{{if $unhide == null}} {{if $unhide == null}}
{{if $status == "ignored"}} {{if $status != "unknown"}}
{{:continue}} {{:continue}}
{{/if}} {{/if}}
{{else}} {{else}}
{{if $status != "ignored" && $status != "unknown"}}
{{:continue}}
{{/if}}
{{* vérifier si le libellé aurait pu être filtré *}} {{* vérifier si le libellé aurait pu être filtré *}}
{{#foreach from=$module.config.filters item="filter"}} {{#foreach from=$module.config.filters item="filter"}}
{{if $filter|strpos:$trans_label !== false}} {{if $filter|strpos:$trans_label !== false}}
@ -154,34 +131,69 @@
{{/foreach}} {{/foreach}}
{{/if}} {{/if}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.immo_trans_id}} {{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.trans_id_year}} {{:assign amort_lines=null}}
{{:assign reste="%d-%d"|math:$line.debit:$line.amount}} {{#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}}
{{:continue}}
{{/if}}
{{:assign nb_immo="%d+1"|math:$nb_immo}}
<tr {{if $status == "ignored"}}class="ignored"{{/if}}> <tr {{if $status == "ignored"}}class="ignored"{{/if}}>
<td class="num"><a href="{{$trans_url}}">#{{$line.immo_trans_id}}</a></td> <td class="num"><a href={{$trans_url}}>#{{$immo_trans_id}}</a></td>
<td class="nombre">{{$line.immo_line_id}}</td>
<td>{{$trans_date|date_short}}</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>{{$trans_label}}{{if $line_label != null && $line_label != $trans_label}} — {{$line_label}}{{/if}}</td>
<td class="money">{{"%f"|math:$line.debit|money_html:false|raw}}</td> <td class="money">{{"%f"|math:$debit|money_html:false|raw}}</td>
<td class="money">{{"%f"|math:$line.amount|money_html:false|raw}}</td> <td><a href={{$compte_url}}>{{$account_code}}</a></td>
<td class="money">{{"%f"|math:$reste|money_html:false|raw}}</td> <td>{{$account_label}}</td>
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td>
<td class="actions"> <td class="actions">
{{:linkbutton {{:linkbutton
label="Paramètres" label="Paramètres"
href="add_infos.html?immo_line_id=%s&type_immo=other"|args:$immo_line_id href="add_infos.html?immo_line_id=%s&type_immo=other"|args:$immo_line_id
shape="settings" shape="settings"
target="_dialog"
}} }}
{{* target="_dialog"*}}
</td> </td>
</tr> </tr>
{{/foreach}} {{/select}}
</tbody> </tbody>
</table> </table>
{{else}} {{if $nb_immo == 0}}
<p class="block alert">Aucune immobilisation</p> <p class="block alert">Aucune immobilisation</p>
{{/if}} {{/if}}
</section>
<script type="text/javascript"> <script type="text/javascript">
function changeVisibility(evt, idcheck = 'f_unhide_1') { function changeVisibility(evt, idcheck = 'f_unhide_1') {

View file

@ -154,11 +154,11 @@
<tr {{if $ignore}}class="checked"{{/if}}> <tr {{if $ignore}}class="checked"{{/if}}>
<td class="check">{{:input type="checkbox" name="selected[]" value=$trans_id}}</td> <td class="check">{{:input type="checkbox" name="selected[]" value=$trans_id}}</td>
<td class="num"><a href="{{$trans_url}}">#{{$trans_id}}</a></td> <td class="num"><a href={{$trans_url}}>#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td> <td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}</td> <td>{{$trans_label}}</td>
<td class="money">{{"%f"|math:$debit|money_html:false|raw}}</td> <td class="money">{{"%f"|math:$debit|money_html:false|raw}}</td>
<td class="account_code"><a href="{{$compte_url}}">{{$account_code}}</a></td> <td class="account_code"><a href={{$compte_url}}>{{$account_code}}</a></td>
<td>{{$account_label}}</td> <td>{{$account_label}}</td>
<td class="actions"> <td class="actions">
{{:linkbutton {{:linkbutton

View file

@ -141,7 +141,7 @@
type="immo" type="immo"
line=$immo_line_id line=$immo_line_id
duration=$duration duration=$duration
date_mes=$date_debut date=$date_debut
status=$status status=$status
}} }}
{{/if}} {{/if}}
@ -243,9 +243,8 @@ function changeYear(evt, f_accounts = ['credit_account', 'debit_account'], f_yea
setSelectorYear(f_accounts, f_years_select); setSelectorYear(f_accounts, f_years_select);
} }
function changeVisibility(evt, idcheck = 'f_amortir_1', iddiv = 'div_amort') function changeVisibility(evt, idcheck = 'f_amortir_1', fields = ['div_amort']) {
{ toggleVisibility(idcheck, fields);
toggleVisibility(idcheck, document.querySelectorAll('#' + iddiv));
} }
(function () { (function () {

View file

@ -3,136 +3,140 @@
{{* {{*
@param immo_line_id @param immo_line_id
@param type_immo : managed, amortized, archived, other @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
*}} *}}
{{* cas de la prise en charge *}} {{* données de l'immobilisaion *}}
{{* données de l'immobilisation *}} {{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{: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}} {{/load}}
{{#select {{#select
trans.id as immo_trans_id, trans.id as immo_trans_id,
trans.label as trans_label, trans.label,
trans.date as date_achat, trans.date as date_achat,
line.debit as montant, line.debit as montant,
line.label as line_label, line.label as line_label,
acc.code, acc.code
acc.label as account_label
FROM acc_transactions_lines AS line FROM acc_transactions_lines AS line
INNER join acc_transactions AS trans ON line.id_transaction = trans.id INNER join acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS acc ON line.id_account = acc.id INNER JOIN acc_accounts AS acc ON line.id_account = acc.id
WHERE line.id = :line_id; WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval :line_id = $_GET.immo_line_id
assign="ligne_immo" assign=ligne_immo
}} }}
{{else}} {{else}}
{{:error message="Immobilisation non trouvée"}} {{:error message="Aucune immobilisation trouvée"}}
{{/select}} {{/select}}
{{:assign reste="%d-%d"|math:$ligne_immo.montant:$montant_affecte}} {{* chercher les liaisons de l'écriture d'immobilisation *}}
{{* {{#select
{{if $info_immo != null}} CASE links.id_related = :immo_trans_id
{{:assign date_defaut=$info_immo.date}} WHEN true THEN links.id_transaction
{{:assign duree_defaut=$info_immo.duration}} WHEN false THEN links.id_related
{{:assign choix_defaut=$info_immo.status}} END as linked_id,
{{else}} acc.code
{{:assign duree_defaut=null}} FROM acc_transactions_links as links
{{/if}} 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 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"}} {{#form on="save"}}
{{if $_POST.classify == null}}
{{:error message="Vous devez choisir une action"}}
{{/if}}
{{if ! $_POST.amortir}} {{if $_POST.classify == "ignored"}}
{{* ne pas amortir *}} {{* ne pas amortir *}}
{{:assign duration=0}} {{:assign duration=0}}
{{:assign libelle=null}} {{:assign date_debut=$ligne_immo.date_achat|parse_date}}
{{:assign montant=null}}
{{:assign date_achat=null}}
{{:assign date_mes=null}}
{{:assign status="ignored"}} {{:assign status="ignored"}}
{{else}} {{else}}
{{* vérifier que la date d'acquisition est antérieure à la date de mise en service *}}
{{* vérifier que la date de mise en service est postérieure à la date d'acquisition *}} {{:assign date_debut=$_POST.date_mes|or:$ligne_immo.date_achat|parse_date}}
{{:assign d1=$_POST.date_achat|or:$ligne_immo.date_achat|parse_date}} {{if $date_debut|strtotime < $ligne_immo.date_achat|strtotime}}
{{:assign d2=$_POST.date_mes|or:$d1|parse_date}} {{:assign dd=$date_debut|date_short}}
{{if $d2 < $d1}} {{:assign da=$ligne_immo.date_achat|date_short}}
{{: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:$dd:$da}}
{{: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}}
{{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}} {{:assign duration=$_POST.duree|intval}}
{{if $duration <= 0}} {{if $duration <= 0}}
{{:error message="Erreur : la durée d'amortissement doit être strictement positive"}} {{:error message="Erreur : la durée d'amortissement doit être strictement positive"}}
{{/if}} {{/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}}
{{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 || $_POST.date_mes|parse_date == $ligne_immo.date_achat}}
{{:assign date_mes=null}}
{{else}}
{{:assign date_mes=$_POST.date_mes|parse_date}}
{{/if}}
{{:assign status="managed"}} {{:assign status="managed"}}
{{/if}} {{/if}}
{{/if}}
{{* enregistrer les infos de l'immobilisation *}} {{* enregistrer les infos de l'immobilisation *}}
{{if $info_immo == null || $montant_affecte > 0}} {{if $info_immo == null}}
{{:assign key=""|uuid}} {{:assign key=""|uuid}}
{{else}} {{else}}
{{:assign key=$info_immo.key}} {{:assign key=$info_immo.key}}
{{/if}} {{/if}}
{{:save {{:save
key=$key key=$key
validate_schema="schema.json" validate_schema="schema.json"
type="immo" type="immo"
line=$_GET.immo_line_id|intval line=$_GET.immo_line_id|intval
duration=$duration duration=$duration
label=$libelle date=$date_debut
amount=$montant
date_achat=$date_achat
date_mes=$date_mes
status=$status status=$status
assign_new_id="new_id"
}} }}
{{if $_POST.amortir}} {{* copier les autres liaisons *}}
{{:assign type_immo="managed"}} {{#foreach from=$linked_transactions key="code" item="liaisons"}}
{{else}} {{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"}} {{:assign type_immo="other"}}
{{else}}
{{:assign type_immo=$_GET.type_immo}}
{{/if}} {{/if}}
{{:redirect force="index.html?ok=1&msg=infos&type_immo=%s"|args:$type_immo}} {{:redirect force="index.html?ok=1&msg=infos&type_immo=%s"|args:$type_immo}}
{{/form}} {{/form}}
@ -147,46 +151,53 @@
{{:assign choix_defaut=$_GET.type_immo}} {{: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}}
{{/if}}
{{* {{*
- classer l'immobilisation - classer l'immobilisation
- renseigner ou modifier la date de mise en service, les écritures associées ou la durée d'amortissement - renseigner ou 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}} {{: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> <h3 class="ruler">
Paramètres de l'immobilisation
<span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span>
</h3>
<div class="informations"> <div class="informations">
<dl class="describe"> <dl class="describe">
<dt>Immobilisation</dt> <dt>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> <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</dt> <dt>Montant</dt>
<dd class="money strong">{{"%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>
<dt>Montant déjà affecté</dt> <dt>Date de l'écriture d'immobilisation</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> <dd>{{$ligne_immo.date_achat|date_short}}</dd>
<dt>Compte d'immobilisation</dt>
<dd>{{$ligne_immo.code}} — {{$ligne_immo.account_label}}
</dl> </dl>
</div> </div>
<form method="post" action=""> <form method="post" action="">
<fieldset> <fieldset>
<legend>Amortissement</legend> <legend>Classement</legend>
<dl> <dl id="classement_immo">
{{: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"}} <dt><label>Faites un choix</label> <b>(obligatoire)</b></dt>
<div class="masquable"> {{: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="number" name="duree" label="Durée d'amortissement" required=true min=1}} {{:input type="radio-btn" name="classify" value="amortized" label="Amortissement terminé" help="Cette immobilisation sera classée parmi les immobilisations amorties" default=$choix_defaut}}
</div> {{: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> </dl>
</fieldset> </fieldset>
<fieldset class="masquable">
<legend>Informations facultatives</legend> <fieldset id="infos_immo">
<legend>Informations</legend>
<dl> <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="number" name="duree" label="Durée d'amortissement" default=$duree_defaut required=true min=1}}
{{: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="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="text" name="libelle" label="Libellé" help="à renseigner uniquement si différent du libellé de l'écriture d'immobilisation"}} {{: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"}}
{{:input type="money" name="montant" label="Montant de l'immobilisation" required=true default=$reste}}
</dl> </dl>
</fieldset> </fieldset>
@ -198,16 +209,29 @@
{{:admin_footer}} {{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var info_immo = {{$info_immo|json_encode|raw}};
function changeVisibility(evt, idcheck = 'f_amortir_1', hiddenclass = 'masquable') // afficher/masquer les champs de saisie
{ function toggleInputs(event) {
toggleVisibility(idcheck, document.querySelectorAll('.' + hiddenclass)); 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);
} else {
g.toggle('#infos_immo', false);
} }
}
toggleInputs();
(function () { (function () {
document.getElementById('f_amortir_1').onclick = changeVisibility; const radios = document.querySelectorAll('input[name="classify"]');
radios.forEach(radio => {
radio.addEventListener("change", toggleInputs);
});
})(); })();
</script> </script>

View file

@ -3,16 +3,10 @@
{{* {{*
Lister les écritures d'amortissement associées à une immobilisation Lister les écritures d'amortissement associées à une immobilisation
@param immo_line_id : id de la ligne d'immo @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 @param type_immo : managed, amortized, archived, others
*}} *}}
{{* données de l'immobilisation *}} {{* récupérer les infos de l'immobilisation *}}
{{#load type="immo" id=$_GET.immo_doc_id|intval assign="info_immo"}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{#select {{#select
line.id as immo_line_id, line.id as immo_line_id,
line.debit as montant, line.debit as montant,
@ -20,113 +14,167 @@
trans.id as immo_trans_id, trans.id as immo_trans_id,
trans.label as label, trans.label as label,
trans.date, trans.date,
account.code as account_code, account.code as account_code
account.label as account_label
FROM acc_transactions_lines AS line FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON line.id_account = account.id INNER JOIN acc_accounts AS account ON line.id_account = account.id
WHERE line.id = :line_id; WHERE line.id = :line_id;
:line_id = $info_immo.line :line_id = $_GET.immo_line_id|intval
assign="ligne_immo" assign=ligne_immo
}} }}
{{else}} {{else}}
{{:error message="Immobilisation non trouvée"}} {{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{/select}} {{/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}} {{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.immo_trans_id}}
{{:assign date_debut=$info_immo.date_mes|or:$info_immo.date_achat|or:$ligne_immo.date}} {{#load type="immo" where="$$.line = :line_id" :line_id=$_GET.immo_line_id|intval}}
{{:assign label_immo=$info_immo.label|or:$ligne_immo.label}} {{:assign duree=$duration}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $label_immo}} {{:assign date_debut=$date}}
{{:assign label_immo=$label_immo|cat:" — "|cat:$ligne_immo.line_label}} {{:assign status=$status}}
{{/if}} {{/load}}
{{if $info_immo.amount != null}}
{{:assign var="ligne_immo.montant" value=$info_immo.amount}}
{{/if}}
{{if $info_immo.status == 'ignored'}} {{if $status == 'ignored'}}
{{:error message="Cette immobilisation ne doit pas être amortie"}} {{:error message="Cette immobilisation ne doit pas être amortie"}}
{{/if}} {{/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 et déduire leur montant de celui de l'immo
*}} *}}
{{:assign total_credits=0}} {{:assign total_credits=0}}
{{#load type="immo_link" where="$$.immo_doc_id=:immo_doc_id" :immo_doc_id=$_GET.immo_doc_id|intval}} {{#select
{{if $amount == null}} CASE links.id_related = :immo_trans_id
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id; WHEN true THEN links.id_transaction
:credit_line_id=$credit_line_id 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}} {{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}} {{/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 var="ligne_immo.montant" value="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{:assign solde=$ligne_immo.montant}} {{:assign solde=$ligne_immo.montant}}
{{*:debug info_immo=$info_immo ligne_immo=$ligne_immo total_credits=$total_credits solde=$solde*}}
{{if $info_immo.status == "amortized"}}
{{:assign amort_amount=$ligne_immo.montant}}
{{:assign valeur_residuelle=0}}
{{else}}
{{:assign valeur_residuelle=$ligne_immo.montant}}
{{/if}}
{{* lister les lignes des écritures d'amortissement liées à l'immobilisation *}} {{* 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
}}
{{#select {{#select
line.id as amort_line_id, l_amort.credit as amort_amount,
line.credit, l_amort.label as amort_line_label,
line.label as amort_line_label, l_amort.id as amort_line_id,
trans.id as amort_trans_id, CASE WHEN links.id_related = t_immo.id
trans.label as amort_trans_label, THEN links.id_transaction
ELSE links.id_related
END as amort_trans_id,
trans.date as amort_date, trans.date as amort_date,
trans.label as amort_trans_label,
trans.id_year as amort_year, trans.id_year as amort_year,
account.id as account_id, account.id as account_id,
account.code as account_code, account.code as account_code,
account.label as account_label account.label as account_label
FROM acc_transactions_lines AS line FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER join acc_accounts AS account on line.id_account = account.id INNER JOIN acc_transactions_links as links
WHERE line.id = :amort_line_id 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
:amort_line_id = $amort_line_id 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" assign="amort_line"
}} }}
{{:assign var="amort_line.amort_amount" value=$amount|or:$credit}} {{* lister les lignes d'amortissement liées à la ligne d'immobilisation *}}
{{:assign var="linked_amort.%s_%d"|args:$amort_date:$id value=$amort_line}} {{#load type="link"
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_line.amort_amount}} where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id AND $$.amort_line_id = :amort_line_id"
{{/select}} 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}} {{/load}}
{{if $date_debut == null}}
{{:assign date_debut=$amort_date}}
{{/if}}
{{/select}}
{{if $status == "amortized"}}
{{:assign amort_amount=$ligne_immo.montant}}
{{:assign valeur_residuelle=0}}
{{else}}
{{:assign valeur_residuelle=$ligne_immo.montant}}
{{#foreach from=$linked_amort}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_amount}}
{{/foreach}}
{{/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}} {{:assign autres_amortissements=false}}
{{if $valeur_residuelle > 0}}
{{* Chercher des amortissements non rattachés à une immo *}}
{{#select {{#select
line.id as amort_line_id,
line.id_transaction AS amort_trans_id line.id_transaction AS amort_trans_id
FROM acc_transactions_lines AS line FROM acc_transactions_lines AS line
INNER JOIN acc_accounts AS account ON account.id = line.id_account 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_transactions AS trans ON trans.id = line.id_transaction
INNER JOIN acc_years AS y ON y.id = trans.id_year 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) WHERE account.code LIKE "28%" AND credit > 0 AND (NOT trans.status & 16) AND !filter_condition
ORDER BY trans.date, trans.label; ORDER BY trans.date, trans.label;
!filter_condition=$filter_condition
assign="amort"
}} }}
{{* cette ligne d'amortissement a-t-elle un doc associé ? *}} {{* voir s'il existe des écritures liées avec un numéro de compte d'immobilisation *}}
{{#load type="amort_link" {{#select
where="$$.amort_line_id = :amort_line_id" links.id_transaction,
:amort_line_id = $amort_line_id 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 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}}
{{else}}
{{:assign keep=false}}
{{/load}}
{{if $keep}}
{{:assign autres_amortissements=true}}
{{/if}}
{{else}} {{else}}
{{:assign autres_amortissements=true}} {{:assign autres_amortissements=true}}
{{/load}}
{{/select}} {{/select}}
{{/if}} {{/select}}
{{:admin_header title="Liste des amortissements" custom_css="./style.css" current="module_amortization"}} {{:admin_header title="Liste des amortissements" custom_css="./style.css" current="module_amortization"}}
@ -152,16 +200,16 @@
{{if $_GET.ok}} {{if $_GET.ok}}
{{if $_GET.msg|match:"attach"}} {{if $_GET.msg|match:"attach"}}
{{:assign msg="Attachement amortissement %s effectué"|args:$_GET.trans_id}} {{:assign msg="Attachement écriture %s effectué"|args:$_GET.trans_id}}
{{elseif $_GET.msg|match:"detach"}} {{elseif $_GET.msg|match:"detach"}}
{{:assign msg="Détachement amortissement %s affectué"|args:$_GET.trans_id}} {{:assign msg="Détachement écriture %s affectué"|args:$_GET.trans_id}}
{{elseif $_GET.msg|match:"amortissement"}} {{elseif $_GET.msg|match:"amortissement"}}
{{:assign msg="Amortissement enregistré"}} {{:assign msg="Amortissement enregistré"}}
{{/if}} {{/if}}
<p class="block confirm">{{$msg}}</p> <p class="block confirm">{{$msg}}</p>
{{elseif $_GET.err}} {{elseif $_GET.err}}
{{if $_GET.msg|match:"attach"}} {{if $_GET.msg|match:"attach"}}
{{:assign msg="Échec attachement amortissement"}} {{:assign msg="Échec attachement"}}
{{elseif $_GET.msg|match:"amortissement"}} {{elseif $_GET.msg|match:"amortissement"}}
{{:assign msg="Échec enregistrement amortissement"}} {{:assign msg="Échec enregistrement amortissement"}}
{{/if}} {{/if}}
@ -174,7 +222,7 @@
<p class="submit"> <p class="submit">
{{:linkbutton {{:linkbutton
label="Sortir du bilan" label="Sortir du bilan"
href="balance_sheet_exit.html?immo_line_id=%s&immo_doc_id=%s&type_immo=%s"|args:$_GET.immo_line_id:$_GET.immo_doc_id:$_GET.type_immo href="balance_sheet_exit.html?immo_line_id=%s&type_immo=%s"|args:$_GET.immo_line_id:$_GET.type_immo
shape="export" shape="export"
class="main" class="main"
}} }}
@ -190,22 +238,14 @@
<div class="informations"> <div class="informations">
<dl class="describe"> <dl class="describe">
<dt>Immobilisation</dt> <dt>Immobilisation</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span> {{$label_immo}}</dd> <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>Compte d'immobilisation</dt> <dt>Montant</dt>
<dd>{{$ligne_immo.account_code}} — {{$ligne_immo.account_label}}</dd>
<dt>Montant de l'immobilisation</dt>
<dd class="money strong">{{"%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 strong">{{"%f"|math:$solde|money_currency_html:false|raw}}</dd>
{{/if}}
<dt>Début d'amortissement</dt> <dt>Début d'amortissement</dt>
<dd>{{$date_debut|date_short}}</dd> <dd>{{$date_debut|date_short}}</dd>
{{if $info_immo.duration != null}} {{if $duree != null}}
<dt>Durée</dt> <dt>Durée</dt>
<dd>{{$info_immo.duration}} ans</dd> <dd>{{$duree}} ans</dd>
{{/if}} {{/if}}
{{if $valeur_residuelle > 0}} {{if $valeur_residuelle > 0}}
<dt>Montant des amortissements</dt> <dt>Montant des amortissements</dt>
@ -213,9 +253,9 @@
<dt>Valeur nette comptable</dt> <dt>Valeur nette comptable</dt>
<dd>{{$valeur_residuelle|money_currency_html:false|raw}}</dd> <dd>{{$valeur_residuelle|money_currency_html:false|raw}}</dd>
{{/if}} {{/if}}
{{if $info_immo.duration != null && $valeur_residuelle > 0}} {{if $duree != null && $valeur_residuelle > 0}}
<dt>Annuité estimée</dt> <dt>Annuité estimée</dt>
<dd>{{"min(%d, %f/%d)"|math:$valeur_residuelle:$ligne_immo.montant:$info_immo.duration|money_currency_html:false|raw}}</dd> <dd>{{"min(%d, %f/%d)"|math:$valeur_residuelle:$ligne_immo.montant:$duree|money_currency_html:false|raw}}</dd>
{{/if}} {{/if}}
</dl> </dl>
</div> </div>
@ -237,13 +277,13 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{#foreach from=$linked_amort|ksort item="line"}} {{#foreach from=$linked_amort item="line"}}
{{* données de l'écriture *}} {{* données de l'écriture *}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.amort_trans_id}} {{: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}} {{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.amort_year}}
{{:assign solde="%f-%d"|math:$solde:$line.amort_amount}} {{:assign solde="%f-%d"|math:$solde:$line.amort_amount}}
<tr> <tr>
<td class="num"><a href="{{$trans_url}}">#{{$line.amort_trans_id}}</a></td> <td class="num"><a href={{$trans_url}}>#{{$line.amort_trans_id}}</a></td>
<td>{{$line.amort_date|date_short}}</td> <td>{{$line.amort_date|date_short}}</td>
<td class="money">{{"%f"|math:$line.amort_amount|money_html:false|raw}}</td> <td class="money">{{"%f"|math:$line.amort_amount|money_html:false|raw}}</td>
<td class="money">{{"%f"|math:$solde|money_html:false|raw}}</td> <td class="money">{{"%f"|math:$solde|money_html:false|raw}}</td>
@ -253,10 +293,10 @@
— {{$line.amort_line_label}} — {{$line.amort_line_label}}
{{/if}} {{/if}}
</td> </td>
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td> <td><a href={{$compte_url}}>{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td> <td>{{$line.account_label}}</td>
<td> <td>
{{:linkbutton label="Détacher" href="detach_amort.html?amort_line_id=%d&immo_line_id=%d&immo_doc_id=%s"|args:$line.amort_line_id:$ligne_immo.immo_line_id:$_GET.immo_doc_id shape="minus"}} {{: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"}}
</td> </td>
</tr> </tr>
{{/foreach}} {{/foreach}}
@ -267,11 +307,16 @@
<p class="block alert">Aucun amortissement enregistré pour cette immobilisation</p> <p class="block alert">Aucun amortissement enregistré pour cette immobilisation</p>
{{/if}} {{/if}}
{{if $_GET.type_immo == null || $_GET.type_immo != "amortized"}}
{{* Autres amortissements non rattachés *}}
{{if $autres_amortissements}} {{if $autres_amortissements}}
<p class="block alert"> <p class="block alert">
Il y a des écritures d'amortissement qui ne sont pas rattachées à une immobilisation ! <br /> Il existe 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. Utilisez le bouton « Rattacher une écriture » pour les afficher ; vous pourrez choisir d'en attacher certaines à cette immobilisation.
</p> </p>
{{/if}} {{/if}}
{{/if}}
{{:form_errors}} {{:form_errors}}
{{:admin_footer}} {{:admin_footer}}

View file

@ -1,92 +1,33 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{* {{*
Enregistrer la liaison entre une ligne d'écriture d'amortissement Enregistrer la liaison entre une écriture d'amortissement et
et une ligne d'écriture d'immobilisation l'écriture d'immobilisation correspondante
@param immo_line_id : numéro de ligne de l'écriture d'immobilisation
@param amort_line_id : numéro de ligne de l'écriture d'amortissement
@param immo_doc_id : numéro du doc d'immo
*}} *}}
{{* chercher l'écriture d'immobilisation *}} {{* chercher l'écriture d'immobilisation *}}
{{#select {{#select
line.id_transaction as immo_trans_id, id_transaction
trans.label as trans_label, FROM acc_transactions_lines
line.label as line_label WHERE id = :line_id;
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 :line_id = $_GET.immo_line_id|intval
assign="ligne_immo"
}} }}
{{:assign immo_trans_id=$id_transaction}}
{{else}} {{else}}
{{:error message="Immobilisation non trouvée"}} {{:error message="Impossible de trouver l'écriture d'immobilisation de la ligne « %s »"|args:$_GET.immo_line_id}}
{{/select}} {{/select}}
{{* chercher le doc associé à l'immo *}}
{{#load id=$_GET.immo_doc_id|intval}}
{{:assign label_immo=$label|or:$ligne_immo.trans_label}}
{{else}}
{{:error message="Immobilisation non trouvée"}}
{{/load}}
{{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 *}} {{* chercher l'écriture d'amortissement *}}
{{#select {{#select
line.credit as amount, id_transaction
line.label as line_label, FROM acc_transactions_lines
trans.date as amort_date, WHERE id = :line_id;
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 :line_id = $_GET.amort_line_id|intval
assign="amort_line"
}} }}
{{:assign amort_trans_id=$id_transaction}}
{{else}} {{else}}
{{:error message="Amortissement non trouvé"}} {{:error message="Impossible de trouver l'écriture d'amortissement de la ligne « %s »"|args:$_GET.amort_line_id}}
{{/select}} {{/select}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$amort_line.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
}}
{{:assign montant_affecte="%d+%d"|math:$montant_affecte:$amount}}
{{/load}}
{{: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}}
{{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}}
{{* chercher les liaisons de l'écriture d'immobilisation *}} {{* chercher les liaisons de l'écriture d'immobilisation *}}
{{#select {{#select
@ -96,73 +37,38 @@
END as linked_id END as linked_id
FROM acc_transactions_links as links FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id; WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $ligne_immo.immo_trans_id :immo_trans_id = $immo_trans_id
}} }}
{{:assign var="linked_transactions." value=$linked_id}} {{:assign var="linked_transactions." value=$linked_id}}
{{/select}} {{/select}}
{{* ajouter la nouvelle liaison *}} {{* ajouter la nouvelle liaison *}}
{{:assign var="linked_transactions." value=$amort_line.trans_id}} {{:assign var="linked_transactions." value=$amort_trans_id}}
{{:api {{:api
method="POST" method="POST"
path="accounting/transaction/%s/transactions"|args:$ligne_immo.immo_trans_id path="accounting/transaction/%s/transactions"|args:$immo_trans_id
assign="result" assign="result"
assign_code="result_code" assign_code="result_code"
transactions=$linked_transactions transactions=$linked_transactions
}} }}
{{* vérifier si cette liaison est déjà présente dans les documents pour éviter les doublons *}} {{* vérifier si cette liaison est déjà présente dans les documents pour éviter les doublons *}}
{{* TODO voir si nécessaire ? *}} {{#load type="link"
{{#load type="amort_link" where="$$.immo_line_id = :immo_line_id AND
where="$$.immo_doc_id = :immo_doc_id AND $$.amort_line_id = :amort_line_id" $$.amort_trans_id = :amort_trans_id AND
:immo_doc_id=$_GET.immo_doc_id|intval $$.amort_line_id = :amort_line_id"
:immo_line_id=$_GET.immo_line_id|intval
:amort_trans_id = $amort_trans_id
:amort_line_id = $_GET.amort_line_id|intval :amort_line_id = $_GET.amort_line_id|intval
limit=1 limit=1
}} }}
{{else}} {{else}}
{{:save {{:save
key=""|uuid key=""|uuid
type="amort_link" type="link"
immo_doc_id=$_GET.immo_doc_id|intval immo_line_id=$_GET.immo_line_id|intval
amort_line_id=$_GET.amort_line_id|intval amort_line_id=$_GET.amort_line_id|intval
amount=$saved_amount amort_trans_id=$amort_trans_id
}} }}
{{/load}} {{/load}}
{{:redirect force="amortization.html?immo_line_id=%s&ok=1&msg=attach&trans_id=%s"|args:$_GET.immo_line_id:$amort_trans_id}}
{{:redirect force="amortization.html?immo_line_id=%s&immo_doc_id=%s&ok=1&msg=attach_amort"|args:$_GET.immo_line_id:$_GET.immo_doc_id}}
{{/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>
<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 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>

View file

@ -1,162 +0,0 @@
{{* -*- 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="immo_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="immo_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

@ -3,9 +3,6 @@
{{* {{*
Supprimer l'association entre une écriture d'amortissement et Supprimer l'association entre une écriture d'amortissement et
une écriture d'immobilisation une écriture d'immobilisation
@param immo_line_id : id de la ligne d'immo
@param amort_line_id : id de la ligne d'amortissement
@param immo_doc_id : id du doc associé à l'immo
*}} *}}
{{* chercher l'écriture d'immobilisation *}} {{* chercher l'écriture d'immobilisation *}}
@ -17,7 +14,7 @@
}} }}
{{:assign immo_trans_id=$id_transaction}} {{:assign immo_trans_id=$id_transaction}}
{{else}} {{else}}
{{:error message="Immobilisation non trouvée"}} {{:error message="Impossible de trouver l'écriture d'immobilisation de la ligne « %s »"|args:$_GET.immo_line_id}}
{{/select}} {{/select}}
{{* chercher l'écriture d'amortissement *}} {{* chercher l'écriture d'amortissement *}}
@ -29,7 +26,7 @@
}} }}
{{:assign amort_id=$id_transaction}} {{:assign amort_id=$id_transaction}}
{{else}} {{else}}
{{:error message="Amortissement non trouvé"}} {{:error message="Impossible de trouver l'écriture d'amortissement de la ligne « %s »"|args:$_GET.amort_line_id}}
{{/select}} {{/select}}
{{* {{*
@ -60,13 +57,15 @@
}} }}
{{* supprimer le doc de liaison entre les lignes *}} {{* supprimer le doc de liaison entre les lignes *}}
{{#load type="amort_link" {{#load type="link"
where="$$.immo_doc_id = :immo_doc_id AND $$.amort_line_id = :amort_line_id" where="$$.immo_line_id = :immo_line_id AND
:immo_doc_id=$_GET.immo_doc_id|intval $$.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
:amort_line_id = $_GET.amort_line_id|intval :amort_line_id = $_GET.amort_line_id|intval
}} }}
{{:delete id=$id}} {{:delete id=$id}}
{{/load}} {{/load}}
{{:redirect {{:redirect to="amortization.html?immo_line_id=%s&ok=1&msg=detach&trans_id=%s"|args:$_GET.immo_line_id:$amort_id}}
to="amortization.html?immo_line_id=%s&ok=1&msg=detach&immo_doc_id=%s"|args:$_GET.immo_line_id:$_GET.immo_doc_id}}

View file

@ -1,159 +0,0 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Détails de l'immobilisation" custom_css="./style.css" current="module_amortization"}}
{{*
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 (OBSOLÈTE ?) immo_line_id : numéro de ligne de l'écriture d'immobilisation
@param immo_doc_id : numéro du doc d'immo
*}}
{{*
TODO : permettre la modification des param (en cas d'erreur de saisie)
TODO : permettre de corriger le montant de l'amort et/ou de supprimer l'attachement
FAIT : déduire montant au crédit de la ligne 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:$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="immo_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." value=$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:$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}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{if $total_credits == 0 && $total_amort == 0}}
{{:assign subsubcurrent="credit"}}
{{else}}
{{:assign subsubcurrent=null}}
{{/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}}
{{if $_GET.ok}}
{{if $_GET.msg|match:"attach_amort"}}
{{:assign msg="Attachement amortissement effectué"}}
{{elseif $_GET.msg|match:"attach_immo"}}
{{:assign msg="Attachement avoir effectué"}}
{{elseif $_GET.msg|match:"info"}}
{{:assign msg="Données de l'immobilisation enregistrées"}}
{{/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">
Paramètres de l'immobilisation
<span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.immo_trans_id}}</a></span>
</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> {{$info_immo.label}}</dd>
<dt>Compte d'immobilisation</dt>
<dd>{{$ligne_immo.account_code}} — {{$ligne_immo.account_label}}</dd>
<dt>Montant de l'immobilisation</dt>
<dd class="money strong">{{"%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="id"}}
{{:assign url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$id}}
<span class="num"><a href="{{$url}}">#{{$id}}</a></span>
{{/foreach}}
{{*:debug linked_immos=$linked_immos*}}
</dd>
<dt>Montant à amortir</dt>
<dd class="money strong">{{"%f"|math:$solde|money_currency_html:false|raw}}</dd>
{{/if}}
<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 des amortissements</dt>
<dd>{{$total_amort|money_currency_html:false|raw}}</dd>
</dl>
</div>

View file

@ -62,7 +62,7 @@
<div class="informations"> <div class="informations">
<dl class="describe"> <dl class="describe">
<dt>Écriture</dt> <dt>Écriture</dt>
<dd><span class="num"><a href="{{$trans_url}}">#{{$ligne_immo.trans_id}}</a></span> {{$ligne_immo.label}}</dd> <dd><span class="num"><a href={{$trans_url}}>#{{$ligne_immo.trans_id}}</a></span> {{$ligne_immo.label}}</dd>
<dt>Montant</dt> <dt>Montant</dt>
<dd class="money strong">{{"%f"|math:$ligne_immo.amount|money_currency_html:false|raw}}</dd> <dd class="money strong">{{"%f"|math:$ligne_immo.amount|money_currency_html:false|raw}}</dd>
</dl> </dl>

View file

@ -1,36 +0,0 @@
{
"$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", "immo_link"]
},
"immo_doc_id" : {
"description": "identifiant du document d'immobilisation associé",
"type" : "integer",
"exclusiveMinimum": 0
},
"amort_line_id" : {
"description": "numéro de ligne d'amortissement associée à l'immobilisation",
"type": "integer",
"exclusiveMinimum": 0
},
"credit_line_id": {
"description": "numéro de ligne au crédit du compte 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": "immo_link"}}, "required": ["type"]},
"then": {"required": ["credit_line_id"]},
}

View file

@ -1,142 +0,0 @@
{{* -*- 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
variante : utiliser une jointure ; pas forcément plus efficace
*}}
{{#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_trans_id NOT IN (
SELECT
CASE WHEN id_transaction = credit_trans_id THEN id_transaction
ELSE id_related
END AS other_id
FROM acc_transactions_links WHERE other_id = credit_trans_id)
ORDER BY trans.date, trans.label;
:account_code = $ligne_immo.account_code
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}}

View file

@ -4,7 +4,6 @@
Lister les écritures d'amortissement indépendantes Lister les écritures d'amortissement indépendantes
et proposer des les attacher à l'immo sélectionnée et proposer des les attacher à l'immo sélectionnée
@param immo_line_id = id de la ligne d'immo @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 *}} {{* récupérer les infos de l'immobilisation *}}
@ -18,19 +17,11 @@
assign=ligne_immo assign=ligne_immo
}} }}
{{else}} {{else}}
{{:error message="Immobilisation non trouvée"}} {{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{/select}} {{/select}}
{{#load id=$_GET.immo_doc_id|intval}}
{{:assign label_immo=$label|or:$ligne_immo.label}}
{{else}}
{{:error message="Informations de l'immobilisation %s (%s) non trouvées"|args:$_GET.immo_line_id:$ligne_immo.label}}
{{/load}}
{{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"}} {{:include file="_get_config.html" keep="module.config"}}
{{if $_POST.unhide == null}} {{if $_POST.unhide == null}}
{{:assign filter_condition=" NOT ("}} {{:assign filter_condition=" NOT ("}}
{{#foreach from=$module.config.filters item="filter"}} {{#foreach from=$module.config.filters item="filter"}}
@ -63,26 +54,46 @@
!filter_condition=$filter_condition !filter_condition=$filter_condition
assign="amort" assign="amort"
}} }}
{{* voir s'il existe des lignes d'immo liées à cette ligne d'amortissement *}}
{{:assign amort_amount=0}} {{* voir s'il existe des écritures liées avec un numéro de compte d'immobilisation *}}
{{:assign keep_amort=true}} {{#select
{{#load type="amort_link" links.id_transaction,
where="$$.amort_line_id = :amort_line_id" links.id_related,
:amort_line_id=$amort.amort_line_id|intval trans.id AS trans_id
assign="amort_link" 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
}} }}
{{if $amort_link.amount == null || $amort_link.amount == 0}} {{* voir s'il existe un doc associé à une ligne de l'amortissement *}}
{{:assign amort_amount=$amort.amort_amount}} {{:assign keep=true}}
{{:assign keep_amort=false}} {{#load type="link"
{{else}} where="$$.amort_trans_id = :amort_trans_id"
{{:assign amort_amount="%d+%d"|math:$amort_amount:$amort_link.amount}} :amort_trans_id = $amort.amort_trans_id
}}
{{if $amort_line_id == $amort.amort_line_id}}
{{:assign keep=false}}
{{:break}}
{{/if}} {{/if}}
{{else}} {{else}}
{{* pas de ligne d'immo liée à cette ligne d'amort => garder cette ligne d'amortissement *}} {{:assign keep=false}}
{{/load}} {{/load}}
{{if $keep_amort && $amort_amount < $amort.amort_amount}} {{if $keep}}
{{:assign var="free_amort_lines." value=$amort}} {{:assign var="autres_amortissements." value=$amort}}
{{/if}} {{/if}}
{{else}}
{{:assign var="autres_amortissements." value=$amort}}
{{/select}}
{{/select}} {{/select}}
{{:admin_header title="Amortissements non rattachés" custom_css="./style.css" current="module_amortization"}} {{:admin_header title="Amortissements non rattachés" custom_css="./style.css" current="module_amortization"}}
@ -95,7 +106,7 @@
subcurrent="other" subcurrent="other"
subsubcurrent="amortization" subsubcurrent="amortization"
type_immo="other" type_immo="other"
autres_amort=$free_amort_lines autres_amort=$autres_amortissements
}} }}
{{/if}} {{/if}}
@ -105,13 +116,13 @@
<form method="post" action=""> <form method="post" action="">
<fieldset> <fieldset>
{{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher les écritures ignorées"}} {{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher toutes les écritures" }}
</fieldset> </fieldset>
</form> </form>
{{if $free_amort_lines != null}} {{if $autres_amortissements != null}}
<section class="amortissement"> <section class="amortissement">
<h3 class="ruler">Immobilisation « {{$label_immo}} »</h3> <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>
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
@ -125,24 +136,20 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{#foreach from=$free_amort_lines item="line"}} {{#foreach from=$autres_amortissements item="line"}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.amort_trans_id}} {{: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}} {{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.amort_year}}
<tr> <tr>
<td class="num"><a href="{{$trans_url}}">#{{$line.amort_trans_id}}</a></td> <td class="num"><a href={{$trans_url}}>#{{$line.amort_trans_id}}</a></td>
<td>{{$line.trans_date|date_short}}</td> <td>{{$line.trans_date|date_short}}</td>
<td class="money">{{"%f"|math:$line.amort_amount|money_html:false|raw}}</td> <td class="money">{{"%f"|math:$line.amort_amount|money_html:false|raw}}</td>
<td>{{$line.trans_label}} <td>{{$line.trans_label}}
{{if $line.line_label != null && $line.line_label != $line.trans_label}} - {{$line.line_label}}{{/if}} {{if $line.line_label != null && $line.line_label != $line.trans_label}} - {{$line.line_label}}{{/if}}
</td> </td>
<td><a href="{{$compte_url}}">{{$line.account_code}}</a></td> <td><a href={{$compte_url}}>{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td> <td>{{$line.account_label}}</td>
<td> <td>
{{if $_GET.init == null}} {{: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?amort_line_id=%d&immo_line_id=%d&immo_doc_id=%s"|args:$line.amort_line_id:$_GET.immo_line_id:$_GET.immo_doc_id shape="plus"}}
{{elseif $_GET.init}}
{{:linkbutton label="Attacher" href="attach_amort_init.html?amort_line_id=%d&immo_line_id=%d&immo_doc_id=%s"|args:$line.amort_line_id:$_GET.immo_line_id:$_GET.immo_doc_id shape="plus"}}
{{/if}}
</td> </td>
</tr> </tr>
{{/foreach}} {{/foreach}}

View file

@ -3,7 +3,6 @@
{{* {{*
Créer une écriture d'amortissement Créer une écriture d'amortissement
@param immo_line_id : id de la ligne d'immobilisation @param immo_line_id : id de la ligne d'immobilisation
@param immo_doc_id : id du doc associé à l'immo
*}} *}}
{{* Infos de l'immobilisation *}} {{* Infos de l'immobilisation *}}
@ -12,7 +11,7 @@
line.debit as montant, line.debit as montant,
line.id_project as project_id, line.id_project as project_id,
line.label as line_label, line.label as line_label,
trans.id as immo_trans_id, trans.id as trans_id,
trans.label, trans.label,
trans.date, trans.date,
account.code as account_code account.code as account_code
@ -22,90 +21,106 @@
LEFT JOIN acc_projects AS project ON line.id_project = project.id LEFT JOIN acc_projects AS project ON line.id_project = project.id
WHERE line.id = :line_id; WHERE line.id = :line_id;
:line_id = $_GET.immo_line_id|intval :line_id = $_GET.immo_line_id|intval
assign="ligne_immo" assign=ligne_immo
}} }}
{{else}} {{else}}
{{:error message="Immobilisation non trouvée"}} {{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_line_id}}
{{/select}} {{/select}}
{{:assign date_debut=$ligne_immo.date}} {{:assign date_debut=$ligne_immo.date}}
{{:assign var="amort_label" value="Amortissement %s"|args:$ligne_immo.label}}
{{#load id=$_GET.immo_doc_id|intval}} {{if $ligne_immo.line_label != null && $ligne_immo.line_label != $ligne_immo.label}}
{{:assign duree=$duration}}
{{if $date_mes != null}}
{{:assign date_debut=$date_mes}}
{{/if}}
{{:assign status=$status}}
{{:assign amort_label=$label|or:$ligne_immo.label}}
{{if $amount != null}}
{{:assign var="ligne_immo.montant" value=$amount}}
{{/if}}
{{else}}
{{:error message="Informations de l'immobilisation « %s » non trouvées ; vous devez d'abord les renseigner"|args:$ligne_immo.label}}
{{/load}}
{{if $ligne_immo.line_label != null && $ligne_immo.line_label != $amort_label}}
{{:assign amort_label=$amort_label|cat:" — "|cat:$ligne_immo.line_label}} {{:assign amort_label=$amort_label|cat:" — "|cat:$ligne_immo.line_label}}
{{/if}} {{/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 $status == "amortized" || $status == "archived"}}
{{:error message="Cette immobilisation est complètement amortie ; il est impossible d'ajouter une écriture d'amortissement"}} {{:error message="Cette immobilisation est complètement amortie ; il est impossible d'ajouter une écriture d'amortissement"}}
{{/if}} {{/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 et déduire leur montant de celui de l'immo
*}} *}}
{{:assign total_credits=0}} {{:assign total_credits=0}}
{{#load {{#select
type="immo_link" CASE links.id_related = :immo_trans_id
where="$$.immo_doc_id = :immo_doc_id" :immo_doc_id = $_GET.immo_doc_id|intval WHEN true THEN links.id_transaction
}} WHEN false THEN links.id_related
{{if $amount == null}} END as other_id,
{{#select credit FROM acc_transactions_lines WHERE id = :credit_line_id; line.credit
:credit_line_id=$credit_line_id 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}} {{:assign total_credits="%d+%d"|math:$total_credits:$credit}}
{{/select}} {{/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 var="ligne_immo.montant" value="%d-%d"|math:$ligne_immo.montant:$total_credits}}
{{:assign solde=$ligne_immo.montant}} {{:assign solde=$ligne_immo.montant}}
{{* chercher des écritures d'amortissement liées à la ligne d'immobilisation *}} {{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{#load
type="amort_link"
where="$$.immo_doc_id = :immo_doc_id"
order="$$.date"
:immo_doc_id=$_GET.immo_doc_id|intval
}}
{{#select {{#select
line.credit, 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.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.code as account_code,
account.label as account_label account.label as account_label
FROM acc_transactions_lines AS line FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER join acc_accounts AS account on line.id_account = account.id INNER JOIN acc_transactions_links as links
WHERE line.id = :amort_line_id 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
:amort_line_id = $amort_line_id 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" assign="amort_line"
}} }}
{{:assign var="amort_line.amort_amount" value=$amount|or:$credit}} {{#load type="link"
{{:assign var="linked_amort.%s_%d"|args:$amort_date:$id value=$amort_line}} where="$$.immo_line_id = :immo_line_id AND $$.amort_trans_id = :amort_trans_id"
{{/select}} order="$$.date"
assign="line"
:immo_line_id=$_GET.immo_line_id|intval :amort_trans_id=$amort_line.amort_trans_id
}}
{{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}} {{/load}}
{{/select}}
{{:assign total_amort=0}} {{:assign total_amort=0}}
{{:assign valeur_residuelle=$ligne_immo.montant}} {{:assign valeur_residuelle=$ligne_immo.montant}}
{{#foreach from=$linked_amort|ksort item="line"}} {{#foreach from=$linked_amort}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$line.amort_amount}} {{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_amount}}
{{:assign total_amort="%d+%d"|math:$total_amort:$line.amort_amount}} {{:assign total_amort="%d+%d"|math:$total_amort:$amort_amount}}
{{:assign date_debut=$line.amort_date}} {{:assign date_debut=$amort_date}}
{{:assign code_amort=$line.account_code}} {{:assign code_amort=$account_code}}
{{:assign amort_account_label=$line.account_label}} {{:assign amort_account_label=$account_label}}
{{:assign amort_label=$amort_label}}
{{/foreach}} {{/foreach}}
{{if $valeur_residuelle == 0}} {{if $valeur_residuelle == 0}}
@ -206,7 +221,7 @@
}} }}
{{if $account_ok == null}} {{if $account_ok == null}}
{{:assign compte=$credit_account|implode:""}} {{:assign compte=$credit_account|implode:""}}
{{:redirect url="add_account.html?account=%s&chart=%s"|args:$compte:$selected_chart}} {{:redirect url="add_account.html?account=%s&chart=%s&immo_line_id=%s"|args:$compte:$selected_chart:$_GET.immo_line_id}}
{{/if}} {{/if}}
{{* vérifier que le montant ne dépasse pas le solde restant *}} {{* vérifier que le montant ne dépasse pas le solde restant *}}
@ -241,7 +256,7 @@
date=$_POST.date_amort date=$_POST.date_amort
label=$_POST.designation label=$_POST.designation
lines=$lines lines=$lines
linked_transactions=$ligne_immo.immo_trans_id|intval linked_transactions=$ligne_immo.trans_id|intval
}} }}
{{* enregistrer la liaison des lignes *}} {{* enregistrer la liaison des lignes *}}
@ -260,13 +275,14 @@
{{if $amort_trans_id != null}} {{if $amort_trans_id != null}}
{{:save {{:save
key=""|uuid key=""|uuid
type="amort_link" type="link"
immo_doc_id=$_GET.immo_doc_id|intval immo_line_id=$_GET.immo_line_id|intval
amort_line_id=$amort_line_id|intval amort_line_id=$amort_line_id|intval
amort_trans_id=$result.id
}} }}
{{/if}} {{/if}}
{{:redirect force="amortization.html?immo_line_id=%s&immo_doc_id=%s&ok=1&msg=amortissement"|args:$_GET.immo_line_id:$_GET.immo_doc_id}} {{:redirect force="amortization.html?immo_line_id=%s&ok=1&msg=amortissement"|args:$_GET.immo_line_id}}
{{/form}} {{/form}}
{{:admin_header title="Ajout amortissement" custom_css="./style.css" current="module_amortization"}} {{:admin_header title="Ajout amortissement" custom_css="./style.css" current="module_amortization"}}

View file

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

View file

@ -14,13 +14,14 @@ function toggleInputs(idcb, idfields) {
function toggleVisibility(idcheck, fields) { function toggleVisibility(idcheck, fields) {
const elem = document.getElementById(idcheck); const elem = document.getElementById(idcheck);
fields.forEach(function (field) { for (let id of fields) {
const field = document.getElementById(id);
if (elem.checked) { if (elem.checked) {
field.classList.remove('hidden'); field.setAttribute('class', '');
} else { } else {
field.classList.add('hidden'); field.setAttribute('class', 'hidden');
}
} }
});
} }
// fixer l'exercice des sélecteurs de compte // fixer l'exercice des sélecteurs de compte

View file

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