From 54273c6707d51b1304afed1f87b6ab0430db2058 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Engel Date: Tue, 6 Oct 2026 14:02:50 +0200 Subject: [PATCH] =?UTF-8?q?Incorporation=20=C3=A9critures=20comptes=2023xx?= =?UTF-8?q?=20cr=C3=A9=C3=A9es=20hors=20Paheko?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _immobilisations_autres.html | 2 +- _unfinished.html | 130 +++++++++++++++++++++++------------ add_infos.html | 72 +++++++++++++++---- asset.schema.json | 2 +- scripts.js | 7 +- transfer.html | 64 ++++++++++------- 6 files changed, 186 insertions(+), 91 deletions(-) diff --git a/_immobilisations_autres.html b/_immobilisations_autres.html index 6ea7f15..d80acee 100644 --- a/_immobilisations_autres.html +++ b/_immobilisations_autres.html @@ -79,7 +79,7 @@ !condition=$condition assign="immo_line" }} - {{if $immo_line.status == 'managed'}} + {{if $immo_line.status == 'managed' || $immo_line.status == 'amortized'}} {{if $immo_line.amount == null || $immo_line.amount == 0 || $immo_line.amount == $immo_line.debit}} {{:continue}} {{/if}} diff --git a/_unfinished.html b/_unfinished.html index 4c12d4d..c361db3 100644 --- a/_unfinished.html +++ b/_unfinished.html @@ -9,6 +9,15 @@ la construction d'un bâtiment destiné à être amorti)

+{{#form on="transfer"}} + {{if $_POST.selected == null}} +

Vous n'avez sélectionné aucune écriture !

+ {{else}} + {{:assign doc_list=$_POST.selected|implode:","}} + {{:redirect to="transfer.html?doc=%s"|args:$doc_list}} + {{/if}} +{{/form}} + {{:include file="_get_config.html" keep="module.config"}} {{:assign saved_hides=$module.config.hides}} {{:assign var="user_hides" from="saved_hides.%s"|args:$logged_user.id}} @@ -21,7 +30,7 @@ {{else}} {{:assign unhide=1}} {{/if}} - {{:assign var="user_hides.unhide_unfinished" value=$unhide"}} + {{:assign var="user_hides.unhide_unfinished" value=$unhide}} {{:assign var="saved_hides.%s"|args:$logged_user.id value=$user_hides}} {{:save key="config" hides=$saved_hides}} {{/if}} @@ -64,57 +73,83 @@ account.id as account_id, account.code as account_code, account.label as account_label, - sum(line.debit) AS debit, + line.debit AS debit, trans.id_year as trans_id_year FROM acc_transactions AS trans INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id INNER JOIN acc_accounts AS account ON line.id_account = account.id INNER JOIN acc_years AS years ON trans.id_year = years.id WHERE !condition - GROUP BY trans.id ORDER BY trans.date DESC; !condition=$condition assign="immo_line" }} - {{* voir si l'écriture a été marquée ignorée *}} - {{:assign var="immo_line.ignore" value=false}} - {{#load type="immo" assign="info_immo" where="$$.line = :line_id AND $$.status = 'ignored'" :line_id=$immo_line_id|intval}} - {{:assign var="immo_line.ignore" value=true}} + {{* document associé *}} + {{#load type="immo" where="$$.line = :line_id" :line_id=$immo_line_id assign="info_immo"}} + {{:assign var="immo_line.doc_id" value=$info_immo.id}} + {{* *}} + {{if $status == "unfinished"}} + {{* voir si l'immo a été ventilée *}} + {{:assign var="immo_line.allocated_amount" value=0}} + {{#load type="immo" where="$$.line = :immo_line_id AND ($$.status = 'inprogress' OR $$.status = "transferred")" :immo_line_id=$immo_line_id}} + {{:assign var="immo_line.allocated_amount" value="%d+%d"|math:$immo_line.allocated_amount:$amount}} + {{/load}} + {{elseif $status == 'ignored'}} + {{:assign nb_ignored="%d + 1"|math:$nb_ignored}} + {{if $unhide == null}} + {{:continue}} + {{/if}} + {{/if}} + {{else}} + {{* cas d'une immo sans doc associé => créer le doc *}} + {{:save + key=""|uuid + validate_schema="asset.schema.json" + type="immo" + line=$immo_line_id|intval + duration=0 + status="unfinished" + assign_new_id="immo_doc_id" + }} + {{:assign var="immo_line.doc_id" value=$immo_doc_id|intval}} {{/load}} - {{if $immo_line.ignore}} - {{:assign nb_ignored="%d + 1"|math:$nb_ignored}} - {{/if}} - {{if $immo_line.ignore && $unhide == null}} + + {{if $info_immo.status == 'transferred'}} {{:continue}} {{/if}} - - {{* - TODO cas où : - - il y a (au moins) une écriture d'avoir - *}} - - {{* voir s'il existe une écriture qui solde l'immobilisation (voir ci-dessus) *}} - {{#select - count(*) AS count - FROM acc_transactions AS trans - INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id - INNER JOIN acc_accounts AS account ON line.id_account = account.id - WHERE line.credit = :amount AND code = :account_code - ; - :amount = $debit - :account_code = $account_code - }} - {{:assign count=$count}} - {{/select}} - - {{* S'il y a plus d'une écriture de même montant on ne peut pas décider *}} - {{if $count == 1}} + {{if $immo_line.allocated_amount == $debit}} {{:continue}} {{/if}} {{:assign var="immo_lines." value=$immo_line}} {{/select}} +{{* lister les immos incorporées de la balance d'ouverture *}} +{{#load type="immo" where="$$.status='inprogress'" assign="unfinished_immo"}} + {{* chercher l'écriture dont est tirée l'immo *}} + {{#select + trans.id as trans_id, + line.id as immo_line_id, + account.id as account_id, + account.code as account_code, + account.label as account_label, + trans.id_year as trans_id_year + FROM acc_transactions AS trans + INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id + INNER JOIN acc_accounts AS account ON line.id_account = account.id + INNER JOIN acc_years AS years ON trans.id_year = years.id + WHERE line.id = :unfinished_immo_line; + :unfinished_immo_line = $unfinished_immo.line + assign="immo_line" + }} + {{:assign var="immo_line.trans_label" value=$unfinished_immo.label}} + {{:assign var="immo_line.trans_date" value=$unfinished_immo.date_achat}} + {{:assign var="immo_line.debit" value=$unfinished_immo.amount}} + {{:assign var="immo_line.doc_id" value=$id}} + {{:assign var="immo_lines." value=$immo_line}} + {{/select}} +{{/load}} +
{{if $immo_lines|count > 0}}
@@ -133,9 +168,10 @@

- {{:linkbutton + {{:button + type="submit" + name="transfer" label="Transférer" - href="transfer.html?trans=" shape="right" id="transfer" }} @@ -148,7 +184,6 @@ {{:input type="checkbox" value=1 name="unhide" checked="%s"|args:$checked label="Afficher les écritures ignorées" }}

{{/if}} -
{{if $immo_lines|count > 0}}
@@ -160,6 +195,8 @@ Date Libellé Montant + Affecté + Reste N° compte Compte @@ -174,21 +211,24 @@ {{:assign total_immo="%d+%d"|math:$total_immo:$debit}} {{:assign var="montant" from="sommes_immo.%s"|args:$account_code}} {{:assign var="sommes_immo.%s"|args:$account_code value="%d+%d"|math:$montant:$debit}} + {{:assign var="row_value" value=$trans_id|cat:"_"|cat:$doc_id}} - - {{:input type="checkbox" name="selected[]" value=$trans_id}} + 0}}class="strong"{{/if}}> + {{:input type="checkbox" name="selected[]" value=$doc_id}} #{{$trans_id}} {{$trans_date|date_short}} {{$trans_label}} {{"%f"|math:$debit|money_html:false|raw}} + {{"%f"|math:$allocated_amount|money_html:false|raw}} + {{"%f-%f"|math:$debit:$allocated_amount|money_html:false|raw}} {{$account_code}} {{$account_label}} {{:linkbutton - label="Modifier" - href="ignore.html?immo_line_id=%s"|args:$immo_line_id - shape="edit" - target="_dialog" + label="Paramètres" + href="add_infos.html?immo_line_id=%s"|args:$immo_line_id + shape="settings" + target="_dialog" }} @@ -226,6 +266,7 @@ {{else}}

Aucune écriture d'immobilisation trouvée dans la comptabilité (compte {{$first_code}} et sous-comptes)

{{/if}} + diff --git a/add_infos.html b/add_infos.html index 9a45878..a740198 100644 --- a/add_infos.html +++ b/add_infos.html @@ -1,5 +1,6 @@ {{* -*- brindille -*- *}} +{{:admin_header title="Classer l'immobilisation" custom_css="./style.css" current="module_amortization"}} {{* Classer une immobilisation non prise en charge @param immo_line_id @@ -53,12 +54,12 @@ {{:assign status="ignored"}} {{elseif $_POST.classify == "archived"}} {{* voir s'il y a déjà un doc associé à cette immo *}} - {{#load type="immo" where="$$.line = :immo_line_id" :immo_line_id=$_GET.immo_line_id|intval}} - {{:assign uuid=$key}} - {{:assign immo_doc_id=$id}} + {{if $info_immo != null}} + {{:assign uuid=$info_immo.key}} + {{:assign immo_doc_id=$info_immo.id}} {{else}} {{:assign uuid=""|uuid}} - {{/load}} + {{/if}} {{* immobilisation sortie du bilan *}} {{:save @@ -71,7 +72,7 @@ assign_new_id="immo_doc_id" }} {{:redirect force="exit_step1.html?immo_doc_id=%s&from=exit"|args:$immo_doc_id}} - {{else}} + {{elseif $_POST.classify == "managed"}} {{* immobilisation amortissable *}} {{if $_POST.date_achat|parse_date > $ligne_immo.date_achat}} {{:assign da=$ligne_immo.date_achat|date_short}} @@ -124,12 +125,46 @@ {{:assign montant_nb="%f"|math:$montant|money_currency:false}} {{:error message="Le montant (%s) ne peut être supérieur au reste (%s)"|args:$montant_nb:$reste_nb}} {{/if}} - {{:assign status="managed"}} + {{elseif $_POST.classify == "unfinished"}} + {{* immobilisation en cours de constitution *}} + {{if $_POST.date_achat|parse_date > $ligne_immo.date_achat}} + {{:assign da=$ligne_immo.date_achat|date_short}} + {{:error message="Erreur : la date d'achat (%s) ne peut être postérieure à la date de l'écriture d'immobilisation (%s)"|args:$_POST.date_achat:$da}} + {{/if}} + + {{if $_POST.date_achat == null || $_POST.date_achat|parse_date == $ligne_immo.date_achat}} + {{:assign date_achat=null}} + {{else}} + {{:assign date_achat=$_POST.date_achat|parse_date}} + {{/if}} + + {{if $_POST.libelle != $ligne_immo.line_label && $_POST.libelle != $ligne_immo.trans_label}} + {{:assign libelle=$_POST.libelle}} + {{/if}} + + {{if $_POST.montant == null || $_POST.montant|money_int == 0 }} + {{if $montant_affecte > 0}} + {{:assign montant=$reste}} + {{else}} + {{:assign montant=null}} + {{/if}} + {{else}} + {{:assign montant=$_POST.montant|money_int}} + {{if $montant == $ligne_immo.montant}} + {{:assign montant=null}} + {{/if}} + {{/if}} + {{if $montant > $reste}} + {{:assign reste_nb="%f"|math:$reste|money_currency:false}} + {{:assign montant_nb="%f"|math:$montant|money_currency:false}} + {{:error message="Le montant (%s) ne peut être supérieur au reste (%s)"|args:$montant_nb:$reste_nb}} + {{/if}} + {{:assign status="inprogress"}} {{/if}} {{* enregistrer les infos de l'immobilisation *}} - {{if $info_immo == null || $montant_affecte > 0}} + {{if $info_immo == null || $_POST.classify == "unfinished" || $montant_affecte > 0}} {{:assign key=""|uuid}} {{else}} {{:assign key=$info_immo.key}} @@ -139,7 +174,7 @@ validate_schema="asset.schema.json" type="immo" line=$_GET.immo_line_id|intval - duration=$duration + duration=0 label=$libelle amount=$montant date_achat=$date_achat @@ -149,13 +184,14 @@ {{if $_POST.classify == "managed"}} {{:assign type_immo="managed"}} + {{elseif $_POST.classify == "unfinished"}} + {{:assign type_immo="unfinished"}} {{else}} {{:assign type_immo="other"}} {{/if}} {{:redirect force="index.html?ok=1&msg=infos&type_immo=%s"|args:$type_immo}} {{/form}} -{{:admin_header title="Classer l'immobilisation" custom_css="./style.css" current="module_amortization"}} {{* barre de navigation *}} {{if ! $dialog}} {{:include file="_nav.html" current="other" subcurrent="parameter"}} @@ -194,14 +230,19 @@
{{$ligne_immo.code}} — {{$ligne_immo.account_label}} +{{:assign unfinished_prefix=$ligne_immo.code|strpos:"23"}}
Classement
(obligatoire)
- {{:input type="radio-btn" name="classify" value="managed" label="Immobilisation à amortir" default=$choix_defaut}} - {{if $ligne_immo.date_achat > $first_date}} + {{if $unfinished_prefix === 0}} + {{:input type="radio-btn" name="classify" value="unfinished" label="Immobilisation en cours de constitution" default=$choix_defaut}} + {{else}} + {{:input type="radio-btn" name="classify" value="managed" label="Immobilisation à amortir" default=$choix_defaut}} + {{/if}} + {{if $ligne_immo.date_achat > $first_date && $unfinished_prefix !== 0}} {{:input type="radio-btn" name="classify" value="archived" label="Immobilisation sortie du bilan" default=$choix_defaut}} {{/if}} {{:input type="radio-btn" name="classify" value="ignored" label="Immobilisation à ignorer" help="L'écriture n'apparaitra plus dans la liste des immobilisations" default=$choix_defaut}} @@ -214,8 +255,10 @@ {{:input type="date" name="date_achat" label="Date d'acquisition" default=$date_achat_defaut help="à modifier si nécessaire"}} {{:input type="text" name="libelle" label="Libellé" default=$immo_label help="à modifier si nécessaire"}} {{:input type="money" name="montant" label="Montant de l'immobilisation" required=true default=$reste help="à modifier si différent du montant de l'écriture d'immobilisation"}} - {{:input type="number" name="duree" label="Durée d'amortissement" required=true min=1 suffix="année(s)"}} - {{:input type="date" name="date_mes" label="Date de mise en service" default=$date_mes_defaut help="à modifier si différente de la date d'acquisition"}} + {{if $unfinished_prefix !== 0}} + {{:input type="number" name="duree" label="Durée d'amortissement" required=true min=1 suffix="année(s)"}} + {{:input type="date" name="date_mes" label="Date de mise en service" default=$date_mes_defaut help="à modifier si différente de la date d'acquisition"}} + {{/if}}
@@ -234,7 +277,8 @@ function toggleInputs(event) { const classement_immo = document.getElementById('classement_immo'); const managed = classement_immo.querySelector('input[type=radio][value=managed]'); - if (managed.checked) { + const unfinished = classement_immo.querySelector('input[type=radio][value=unfinished]'); + if ((managed != null && managed.checked) || (unfinished != null && unfinished.checked)) { g.toggle('.masquable', true); } else { g.toggle('.masquable', false); diff --git a/asset.schema.json b/asset.schema.json index 4391dd5..2ee4b13 100644 --- a/asset.schema.json +++ b/asset.schema.json @@ -35,7 +35,7 @@ }, "status" : { "type" : ["string", "null"], - "enum" : ["managed", "amortized", "archived", "ignored"] + "enum" : ["managed", "amortized", "archived", "unfinished", "ignored", "inprogress", "transferred"] }, "created" : { "description" : "vrai si immobilisation créée dans le module", diff --git a/scripts.js b/scripts.js index 3def0ba..ab42804 100644 --- a/scripts.js +++ b/scripts.js @@ -241,7 +241,7 @@ function computeTotal(id_total, id_url) { for (const line of lines) { let button = line.querySelector('input[type=checkbox]'); if (button.checked) { - let money = line.querySelector('.money'); + let money = line.querySelector('.remainder'); let code = line.querySelector('.account_code a').innerText; if (code in total) { total[code] += getNumber(money.innerText) * 100; @@ -274,11 +274,6 @@ function computeTotal(id_total, id_url) { foot.removeChild(e); } } - - // mettre à jour les paramètres de l'url - let url = document.getElementById(id_url); - let new_href = url.href.replace(/trans=.*/, 'trans=' + Object.values(transactions)); - url.href = new_href; } // dupliquer la dernière ligne d'une table diff --git a/transfer.html b/transfer.html index 3017036..9997707 100644 --- a/transfer.html +++ b/transfer.html @@ -30,33 +30,38 @@ {{/foreach}} {{:assign condition=$condition|cat:"0)"}} -{{* détails des écritures paramètres *}} -{{:assign trans=$_GET.trans|explode:","}} -{{:assign var="trans_list" value=$trans|map:quote_sql}} -{{:assign trans_list=$trans_list|implode:","}} -{{:assign trans_list="("|cat:$trans_list|cat:")"}} -{{:assign condition=$condition|cat:" AND trans.id IN "|cat:$trans_list}} +{{:assign docs=$_GET.doc|explode:","}} +{{:assign var="doc_list" value=$docs|map:quote_sql}} +{{:assign doc_list=$doc_list|implode:","}} +{{:assign doc_list="("|cat:$doc_list|cat:")"}} +{{:assign doc_condition="doc.id IN "|cat:$doc_list}} {{#select - trans.id as trans_id, - trans.label AS trans_label, - trans.date AS trans_date, - SUM(line.debit) AS line_debit, + doc.id as doc_id, + IFNULL(json_extract(doc.document, '$.label'), + CASE WHEN line.label IS NOT NULL AND line.label != trans.label + THEN trans.label || " - " || line.label + ELSE trans.label + END) AS label, + IFNULL(json_extract(doc.document, '$.date_achat'), trans.date) AS date, + IFNULL(json_extract(doc.document, '$.amount'), line.debit) AS amount, account.code AS account_code, account.label AS account_label, line.id_project as project_id - FROM acc_transactions AS trans - INNER JOIN acc_transactions_lines AS line ON line.id_transaction = trans.id + FROM module_data_amortization AS doc + INNER JOIN acc_transactions_lines AS line ON json_extract(doc.document, '$.line') = line.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 - WHERE !condition - GROUP BY trans.id + WHERE json_extract(document, '$.type') = "immo" + AND !doc_condition ; - !condition=$condition -}} - {{:assign var="transactions.%s"|args:$trans_id - amount=$line_debit - line_label=$trans_label - date=$trans_date + !doc_condition=$doc_condition + assign="doc_line" + }} + {{:assign var="transactions.%s"|args:$doc_id + amount=$amount + line_label=$label + date=$date code=$account_code label=$account_label project=$project_id @@ -139,7 +144,6 @@ - que le compte d'immo débute par un préfixe correct (20, 21, ...) - est présent dans le PC de l'exercice correspondant à la date *}} - {{:include file="_check_account.html" account=$account_code @@ -153,9 +157,6 @@ {{:error message="Le compte « %s » n'est pas un compte d'immobilisation ou n'est pas dans le plan comptable de l'exercice choisi"|args:$compte}} {{/if}} - {{* écritures liées *}} - {{:assign var="linked_transactions" value=$transactions|keys}} - {{* enregistrer l'écriture *}} {{:api method="POST" @@ -166,7 +167,6 @@ date=$_POST.date_mes label=$_POST.designation|trim lines=$lines - linked_transactions=$linked_transactions }} {{:assign lines_count=$lines|count}} @@ -183,6 +183,18 @@ status=$status created=true }} + + {{* changer le statut des immos transférées *}} + {{#select + id + FROM module_data_amortization AS doc + WHERE id IN !id_list; + !id_list=$doc_list + assign="doc" + }} + {{:save id=$id status="transferred"}} + {{/select}} + {{if $_POST.amortir}} {{:assign type_immo="managed"}} {{else}} @@ -199,7 +211,7 @@ {{:form_errors}} {{* formulaire d'ajout d'immobilisation *}} -{{if $_GET.trans == null}} +{{if $_GET.doc == null}} {{:error message="Vous n'avez sélectionné aucune écriture !"}} {{/if}}