Compare commits

...

87 Commits
v0.4 ... main

Author SHA1 Message Date
95bfdf27b4 Merge pull request 'Fin de vie dépôt' (#13) from lesanges-patch-1 into main
Reviewed-on: #13
2025-05-18 11:40:23 +02:00
609563f0ba Update README.md 2025-05-18 11:35:44 +02:00
830b0e7885 Update README.md 2025-05-17 21:40:59 +02:00
2e51d768d3 fusion branche variante_ajout_immo 2025-05-17 13:32:03 +02:00
0c4f39b21a Améliorations cosmétiques 2025-05-16 15:22:02 +02:00
3fc96927a5 Finalisation sortie du bilan 2025-05-16 15:19:48 +02:00
dec6c8d676 Simplification calcul nombre jours 2025-05-13 10:24:47 +02:00
1aa1e65b61 Réorganisation formulaire ajout immobilisation 2025-05-12 16:21:15 +02:00
9f8660a51f ajout immo : Choisir exercice avant date d'achat 2025-05-09 14:52:55 +02:00
673003ea77 Correction erreur exercice dans sélecteur compte 2025-05-09 11:41:16 +02:00
b587121d3f Petite amélioration cosmétique 2025-05-09 09:43:38 +02:00
f533118360 calcul amortissement sur 365 jours 2025-05-09 09:38:09 +02:00
99aa29a4a1 Recalculer le montant de l'amortissement en fonction de l'exercice et de la date 2025-05-07 12:26:08 +02:00
515eb443fa Petite amélioration cosmétique 2025-05-06 19:14:20 +02:00
90af8a0790 Petite correction 2025-05-06 17:08:47 +02:00
839739b992 Choisir exercice avant date amortissement 2025-05-06 17:07:46 +02:00
5b8c869ba4 Prise en compte exercice de durée supérieure à un an 2025-05-06 17:07:07 +02:00
ea8d805dba Sortie immobilisation du bilan 2025-04-30 11:36:23 +02:00
d669b5c95b petite amélioration script 2025-04-30 11:32:23 +02:00
1637f6eafd amortization : simplifications et amélioration présentation 2025-04-30 10:55:42 +02:00
0f1f3ed56d Ajout immo : forcer choix exercice 2025-04-25 12:34:44 +02:00
91b75e77d4 Diverses améliorations 2025-04-24 11:57:15 +02:00
f509cd42c9 Amortization : correction détermination date début 2025-04-24 11:52:03 +02:00
8b87ce74cf Utilisation quote_sql 2025-04-24 11:39:10 +02:00
b6ced673dc Correction calcul dates 2025-04-24 11:34:06 +02:00
31a0371ae2 Introduction status dans schéma immobilisation 2025-04-23 11:11:28 +02:00
9ac427415a ajout arrondi calcul date 2025-02-04 18:35:39 +01:00
fb0d34a4f4 début réorganisation classement immobilisations 2025-02-04 18:27:26 +01:00
2c11d3e4f3 ajout arrondi calcul date 2025-02-04 14:52:50 +01:00
17d132ffa2 améliorations cosmétiques 2025-02-04 14:50:54 +01:00
f17ccd1bc8 correction erreur sélection écritures d'amortissement 2025-01-31 12:23:30 +01:00
4b63ad4560 correction typo 2025-01-30 16:58:11 +01:00
2aa64cc525 changement numéro version module.ini 2025-01-28 17:50:01 +01:00
022e324bea suppression _amort_exclus.html 2025-01-28 16:53:57 +01:00
5ab7d628a8 Supprimer documents de balance d'ouverture 2025-01-25 10:23:15 +01:00
ad4b76695d Merge branch 'main' into selector 2025-01-20 17:27:16 +01:00
f1bea6bda2 adaptation selector aux modifs bohwaz 2025-01-20 17:25:13 +01:00
1e2ba133f5 Ignorer écritures de la balance d'ouverture 2025-01-20 17:11:59 +01:00
993ded84d3 Utiliser selector avec patterns 2025-01-17 14:49:40 +01:00
a604a86a3f Ordonner exercices ouverts par date 2025-01-17 14:16:57 +01:00
9e79eb7f42 mise-à-jour numéro version 2025-01-10 13:55:04 +01:00
03488b0ab9 mise-à-jour aide 2025-01-10 13:54:05 +01:00
5fcf510b25 restructuration et complément classification immobilisations 2025-01-10 13:53:47 +01:00
3ef33e15e3 amélioration classification immobilisations 2025-01-09 18:51:49 +01:00
c943c9d3e6 Amélioration affichage nombres 2025-01-07 16:06:45 +01:00
0160fef1c2 Séparation immobilisations achevées 2025-01-06 15:14:29 +01:00
6e06d4f24f Correction affichage solde nul 2025-01-06 14:04:36 +01:00
3738ea0721 amélioration + correction calcul dates 2024-12-27 20:46:53 +01:00
a1bf1c485c ajout modification informations immobilisation 2024-12-27 11:23:58 +01:00
b1a78a3047 ajout contrôle durée 2024-12-27 11:23:31 +01:00
f76c243b8c petites corrections 2024-12-26 11:33:04 +01:00
11be1386c2 Immo non amorties : modifier infos 2024-12-26 11:32:06 +01:00
4f1be445ff Ajout immo : possibilité de ne pas amortir 2024-12-26 11:29:16 +01:00
9d2c30f0eb add_duration.html renommé en add_infos.html 2024-12-26 10:37:58 +01:00
516021031d Exclure les immo et amortissements de la balance d'ouverture 2024-12-25 10:19:53 +01:00
d599d49e1a Séparation immobilisations amortissables ou pas 2024-12-24 11:47:32 +01:00
66859c550e ajout defaut.json manquant 2024-12-18 20:05:35 +01:00
eb533ba381 Rediriger vers page création compte amortissement si besoin 2024-12-18 15:13:01 +01:00
ddbea77660 Préciser numéro d'écriture attachée/détachée 2024-12-18 15:11:28 +01:00
33ad15dbfc Généralisation comptes immobilisation 2024-12-18 11:06:41 +01:00
92622fb9a0 Mise à jour page aide 2024-12-17 15:47:34 +01:00
0e2625e9a2 Suppression documents sans écriture associée 2024-12-17 15:45:51 +01:00
b17a14526e différentiation date d'acquisition et date mise en service 2024-12-17 15:34:46 +01:00
10f2128b1b refonte attachement/détachement écritures amortissement 2024-12-17 10:20:00 +01:00
59e6abe581 Amélioration navigation + masquage boutons inactifs 2024-12-14 08:54:20 +01:00
d2f924a81e Changement url téléchargement module 2024-12-13 15:14:12 +01:00
ec1922e5dd le champ closed de acc_years est devenu status 2024-12-12 18:48:37 +01:00
0e3a9669ec ajout lien vers comptes sur pages immobilisation et amortissement 2024-10-11 09:40:00 +02:00
00071437ef Correction aide 2024-04-02 18:29:49 +02:00
318bbce353 Simplification détermination numéro compte 2024-03-26 09:17:20 +01:00
46f203a89c Simplification et prise en compte identifiant ou numéro de compte
dans sélecteur
2024-03-25 19:15:04 +01:00
e00b9b0a7e Ajout vérification existence ligne immo dans documents 2024-03-22 14:23:41 +01:00
2fc7e5e902 Correction code banque et calcul premier amortissement 2024-03-21 15:39:44 +01:00
01ea1ad3dd Correction paramètre :api 2024-03-21 09:30:01 +01:00
105080c111 Correction erreurs montant max amortissement 2024-03-20 18:08:47 +01:00
d189f6d4c4 Ajout et mutualisation contrôles saisie 2024-03-19 18:20:53 +01:00
061a27d40d Correction erreur calcul montant + réorganisation affichage 2024-03-19 16:05:39 +01:00
b91c1087ae Correction erreur ajout immobilisation 2024-03-19 15:25:50 +01:00
48504bcb1d Modifications cosmétiques 2024-03-19 15:24:58 +01:00
7d829bbf9c Gestion des attachements avec écritures liées 2024-03-19 15:24:01 +01:00
77aac6fd4a Simplification saisie immobilisation et vérification cohérence 2024-03-15 20:54:24 +01:00
db26c7b2d6 Correction erreur exercice sur 2 années civiles 2024-03-15 20:53:59 +01:00
cc7ea1b54c Ajout page d'aide 2024-03-14 22:39:41 +01:00
885f737233 Prise en compte exercices sur 2 années civiles 2024-03-14 18:34:45 +01:00
b45e53f5ea changement identificateur 2024-03-14 11:03:54 +01:00
f3c2d2c884 Merge remote-tracking branch 'refs/remotes/origin/main' 2024-03-13 10:12:59 +01:00
5d1666b1f1 Correction erreur numéro exercice 2024-03-13 10:08:03 +01:00
31 changed files with 2803 additions and 592 deletions

View File

@ -1,9 +1,20 @@
# Module de gestion d'amortissements pour Paheko # Module de gestion d'amortissements pour Paheko
## Ce dépôt n'est plus mis à jour ; nouvel emplacement https://gitea.zaclys.com/lesanges/amortization
Ce module permet de gérer les écritures d'amortissements pour les immobilisations : Ce module permet de gérer les écritures d'amortissements pour les immobilisations :
- lister les immobilisations - lister les immobilisations
- ajouter une nouvelle immobilisation - ajouter une nouvelle immobilisation
- lister les amortissements d'une immobilisation : - lister les amortissements d'une immobilisation :
- amortissements déjà enregistrés - amortissements déjà enregistrés
- amortissements à venir - amortissements à venir
- associer une écriture d'amortissement à une immobilisation
- enregistrer un nouvel amortissement - enregistrer un nouvel amortissement
## Installation
- télécharger [l'archive zip](https://link.infini.fr/amortissement)
- cliquer « Configuration » puis « Extensions »
- en bas de la page, cliquer « Importer un module »
- sélectionner l'archive téléchargée ci-dessus
- activer le module qui est maintenant présent dans la liste des extensions inactives

View File

@ -6,23 +6,7 @@
- date_fin - date_fin
résultat : nbjours résultat : nbjours
*}} *}}
{{* pour simplifier : 30 jours par mois et 360 jours par an *}}
{{:assign jour_debut=$date_debut|date:"d"}} {{:assign ts_debut=$date_debut|strtotime}}
{{:assign jour_debut="min(%d, 30)"|math:$jour_debut}} {{:assign ts_fin=$date_fin|strtotime}}
{{:assign mois_debut=$date_debut|date:"m"}} {{:assign nbjours="1+abs(%d-%d)/(60*60*24)"|math:$ts_fin:$ts_debut}}
{{:assign annee_debut=$date_debut|date:"Y"}}
{{:assign jour_fin=$date_fin|date:"d"}}
{{:assign jour_fin="min(%d, 30)"|math:$jour_fin}}
{{:assign mois_fin=$date_fin|date:"m"}}
{{:assign annee_fin=$date_fin|date:"Y"}}
{{:assign nbjours="%d-%d"|math:$jour_fin:$jour_debut}}
{{:assign nbjours="%d+(%d-%d)*30"|math:$nbjours:$mois_fin:$mois_debut}}
{{:assign nbjours="%d+(%d-%d)*360"|math:$nbjours:$annee_fin:$annee_debut}}
{{* au cas où les deux dates seraient inversées ... *}}
{{if $nbjours < 0}}
{{:assign nbjours="-1*%d"|math:$nbjours}}
{{/if}}

33
_check_account.html Normal file
View File

@ -0,0 +1,33 @@
{{* -*- brindille -*- *}}
{{*
vérifier :
- que le compte débute par le préfixe correct
- est présent dans le PC indiqué
paramètres :
- account : tableau avec un identifiant de compte
- chart_id : identifiant de plan comptable
- prefix_array : tableau des préfixes
résultat :
- account_ok
*}}
{{:assign condition=" AND ("}}
{{#foreach from=$prefix_array item="code"}}
{{:assign code=$code|cat:"%"|quote_sql}}
{{:assign condition=$condition|cat:" code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}}
{{:assign condition=$condition|cat:"0)"}}
{{:assign account_code=$account|keys|key:0}}
{{#sql
select="code"
tables="acc_accounts"
where="id_chart = :id_chart %s"|args:$condition
:id_chart = $chart_id|intval
}}
{{if $account_code == $code}}
{{:assign account_ok=1}}
{{:break}}
{{/if}}
{{/sql}}

19
_check_date.html Normal file
View File

@ -0,0 +1,19 @@
{{* -*- brindille -*- *}}
{{*
vérifier que la date est située dans un exercice ouvert
paramètres :
- date
résultat : open_years, selected_year, selected_chart
*}}
{{:assign open_years=""}}
{{#years closed=false order="start_date" assign="open_years."}}
{{if
$start_date|strtotime <= $date|parse_date|strtotime &&
$end_date|strtotime >= $date|parse_date|strtotime
}}
{{:assign selected_year=$id}}
{{:assign selected_chart=$id_chart}}
{{/if}}
{{/years}}

14
_get_amort_code.html Normal file
View File

@ -0,0 +1,14 @@
{{* -*- brindille -*- *}}
{{*
déterminer le numéro du compte d'amortissement associé à un compte d'immobilisation
- param :
- code_immo : numéro du compte d'immobilisation
- résultat :
- code_amort : numéro du compte d'amortissement
*}}
{{:assign code_s=$code_immo|strval}}
{{:assign ch1=$code_s|substr:0:1}}
{{:assign reste=$code_s|substr:1}}
{{:assign code_amort=$ch1|cat:"8"|cat:$reste}}

10
_get_codes.html Normal file
View File

@ -0,0 +1,10 @@
{{* -*- brindille -*- *}}
{{*
déterminer le numéro du compte passé en paramètre dans un tableau
*}}
{{:assign label=$account|values|key:0}}
{{:assign pos=$label|strpos:" "}}
{{:assign account_code=$label|substr:0:$pos}}
{{:assign var="account_code.%s"|args:$account_code value=$label}}

View File

@ -1,6 +1,33 @@
{{* -*- brindille -*- *}}
<nav class="tabs"> <nav class="tabs">
{{if $current == 'index'}}
<aside>
{{:linkbutton label="Ajouter une immobilisation" shape="plus" href="add_asset.html" target="_dialog"}}
</aside>
{{/if}}
<ul> <ul>
<li {{if $current == 'index'}} class="current"{{/if}}><a href="{{$module.url}}index.html">Immobilisations</a></li> <li {{if $current == 'index'}} class="current"{{/if}}><a href="{{$module.url}}index.html">Immobilisations</a></li>
<li {{if $current == 'amortization'}} class="current"{{/if}}><a>Amortissements</a></li> <li {{if $current == 'aide'}} class="current"{{/if}}><a href="{{$module.url}}aide.html">Aide</a></li>
</ul> </ul>
{{if $current == 'index' && $subsubcurrent != 'balance_exit'}}
<ul class="sub">
<li {{if $subcurrent == 'encours'}}class="current"{{/if}}><a href="index.html?amort=encours">En cours</a></li>
<li {{if $subcurrent == 'fini'}}class="current"{{/if}}><a href="index.html?amort=fini">Terminées</a></li>
<li {{if $subcurrent == 'archive'}}class="current"{{/if}}><a href="index.html?amort=archive">Archivées</a></li>
<li {{if $subcurrent == 'autres'}}class="current"{{/if}}><a href="index.html?amort=autres">Autres</a></li>
</ul>
{{/if}}
{{if $subsubcurrent == 'amortization'}}
<ul class="sub">
<li class="title"><strong>Amortissements</strong></li>
</ul>
{{elseif $subsubcurrent == 'balance_exit'}}
<ul class="sub">
<li class="title"><strong>Sortie du bilan</strong></li>
</ul>
{{/if}}
</nav> </nav>

13
_next_year.html Normal file
View File

@ -0,0 +1,13 @@
{{* -*- brindille -*- *}}
{{*
Rend une date située un an après la date paramètre
paramètres :
- date
résultat : date_amort
*}}
{{:assign jour=$date|date:"d"}}
{{:assign mois=$date|date:"m"}}
{{:assign annee=$date|date:"Y"}}
{{:assign annee="%d+1"|math:$annee}}
{{:assign date_amort="%s/%s/%s"|args:$jour:$mois:$annee}}

21
add_account.html Normal file
View File

@ -0,0 +1,21 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Ajout immobilisation" current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index"}}
{{/if}}
<div class="block error">
Le compte « {{$_GET.account}} » n'est pas un compte
d'amortissement ou n'est pas dans le plan comptable de l'exercice
choisi
</div>
<div>
{{:linkbutton
label="Créer le compte"
shape="plus"
href="!acc/charts/accounts/new.php?id=%s"|args:$_GET.chart
}}
</div>

View File

@ -1,96 +1,193 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{:admin_header title="Ajout immobilisation" current="module_amortissement"}}
{{* barre de navigation *}} {{:read file="./defaut.json" assign="config_json"}}
{{if ! $dialog}} {{:assign config_defaut=$config_json|json_decode}}
{{:include file="_nav.html" current="index"}} {{:assign var="prefix_array" value=$config_defaut.prefixes|keys}}
{{/if}}
{{#years closed=false order="start_date" assign=years.}}
{{:assign ts_debut=$start_date|strtotime}}
{{:assign ts_fin=$end_date|strtotime}}
{{:assign debut=$start_date|date_short}}
{{:assign fin=$end_date|date_short}}
{{:assign var="years_data.%d"|args:$id value=$ts_debut|cat:" "|cat:$ts_fin}}
{{:assign var="open_years.%d"|args:$id value=$label|cat:" (du "|cat:$debut|cat:" au "|cat:$fin|cat:")"}}
{{if $ts_debut <= $now && $now <= $ts_fin}}
{{:assign selected_year=$id}}
{{/if}}
{{/years}}
{{* Traiter l'envoi du formulaire *}} {{* Traiter l'envoi du formulaire *}}
{{#form on="add"}} {{#form on="add"}}
{{* vérifier que la date d'achat est située dans un l'exercice sélectionné *}}
{{:assign ts_date = $_POST.date_achat|parse_date|strtotime}}
{{:assign ok=false}}
{{#foreach from=$years}}
{{if $id == $_POST.id_year}}
{{:assign selected_chart=$id_chart}}
{{if $start_date|strtotime <= $ts_date && $ts_date <= $end_date|strtotime}}
{{:assign ok=true}}
{{:break}}
{{/if}}
{{/if}}
{{/foreach}}
{{if ! $ok}}
{{:error message="La date saisie n'est pas dans l'exercice choisi !"}}
{{/if}}
{{if ! $_POST.amortir}}
{{* ne pas amortir *}}
{{:assign duration=0}}
{{:assign date_debut=$_POST.date_achat|parse_date}}
{{:assign status="ignored"}}
{{else}}
{{* vérifier que la date d'acquisition est antérieure à la date de mise en service *}}
{{:assign date_debut=$_POST.date_mes|or:$_POST.date_achat|parse_date}}
{{if $date_debut|strtotime < $_POST.date_achat|parse_date|strtotime}}
{{:assign dd=$date_debut|date_short}}
{{:assign da=$_POST.date_achat|date_short}}
{{:error message="Erreur : la date de mise en service (%s) ne peut être antérieure à la date d'acquisition (%s)"|args:$dd:$da}}
{{/if}}
{{:assign duration=$_POST.duree|intval}}
{{:assign status="managed"}}
{{/if}}
{{* déterminer le numéro des comptes au cas où la clé serait un identifiant *}}
{{:include
file="_get_codes.html"
account=$_POST.debit_account
keep="account_code"
}}
{{:assign debit_account=$account_code}}
{{:include
file="_get_codes.html"
account=$_POST.credit_account
keep="account_code"
}}
{{:assign credit_account=$account_code}}
{{* vérifier :
- que le compte d'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=$debit_account
chart_id=$selected_chart
prefix_array=$prefix_array
keep="account_ok"
}}
{{if $account_ok == null}}
{{:assign compte=$debit_account|implode:""}}
{{: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}}
{{* enregistrer l'écriture *}} {{* enregistrer l'écriture *}}
{{:assign var="credit_accounts" value=$_POST.credit_account|keys}}
{{:assign var="credit_account" value=$credit_accounts.0}}
{{:assign var="debit_accounts" value=$_POST.debit_account|keys}}
{{:assign var="debit_account" value=$debit_accounts.0}}
{{:api {{:api
method="POST" method="POST"
path="accounting/transaction" path="accounting/transaction"
assign="result" assign="result"
id_year=$_POST.id_year id_year=$_POST.id_year
type="revenue" type="revenue"
date=$_POST.date date=$_POST.date_achat
label=$_POST.designation label=$_POST.designation
amount=$_POST.montant amount=$_POST.montant
debit=$debit_account debit=$debit_account|keys|key:0
credit=$credit_account credit=$credit_account|keys|key:0
id_project=$_POST.id_project id_project=$_POST.id_project
}} }}
{{* vérifier s'il y a déjà un document avec le même numéro de ligne *}}
{{:assign var="immo_id" value=$result.lines.1.id}}
{{#load where="$$.line = :line_id" :line_id=$immo_id}}
{{:assign key=$key}}
{{else}}
{{:assign key=""|uuid}}
{{/load}}
{{* enregistrer les infos de l'immobilisation *}} {{* enregistrer les infos de l'immobilisation *}}
{{:assign var="line_id" value=$result.lines.1.id}}
{{:assign key=""|uuid}}
{{:save {{:save
key=$key key=$key
validate_schema="schema.json" validate_schema="schema.json"
type="immo" type="immo"
line=$line_id line=$immo_id
duration=$_POST.duree|intval duration=$duration
date=$date_debut
status=$status
}} }}
{{if $_POST.amortir}}
{{:redirect force="index.html?ok=1&msg=immobilisation"}} {{:assign amort="encours"}}
{{else}}
{{:assign amort="autres"}}
{{/if}}
{{:redirect force="index.html?ok=1&msg=immobilisation&amort=%s"|args:$amort}}
{{/form}} {{/form}}
{{* Préparer les infos pour le formulaire *}} {{:admin_header title="Ajout immobilisation" current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index"}}
{{/if}}
{{:assign var="bank_account.512A" value="512A — Compte courant"}} {{:form_errors}}
{{#years closed=false}}
{{:assign var="open_years.%d"|args:$id value=$label}}
{{if $start_date|strtotime <= $now && $end_date|strtotime >= $now}}
{{:assign best_year=$id}}
{{/if}}
{{/years}}
{{* formulaire d'ajout d'immobilisation *}} {{* formulaire d'ajout d'immobilisation *}}
{{* {{:assign var="immo_account.2" value="2 — Classe 2 — Comptes d'immobilisations"}}
TODO
- ajouter autres rubriques selon besoin
*}}
{{#select id,label FROM acc_projects WHERE archived = 0;}} {{#select id,label FROM acc_projects WHERE archived = 0;}}
{{:assign var="projects.%d"|args:$id value=$label}} {{:assign var="projects.%d"|args:$id value=$label}}
{{/select}} {{/select}}
{{#foreach from=$prefix_array item="code"}}
{{:assign var="pattern_array." value="%s*"|args:$code}}
{{/foreach}}
{{:assign patterns=$pattern_array|implode:"|"}}
<div id="erreur" class="hidden">
<p class="block error">La date choisie n'est dans aucun exercice ouvert !</p>
</div>
<form method="post" action=""> <form method="post" action="">
<fieldset class="ajout_immo"> <fieldset>
<legend>Ajouter une immobilisation</legend> <legend>Données de l'immobilisation</legend>
<dl> <dl>
{{:input type="select" default=$best_year name="id_year" label="Exercice" required=true options=$open_years}} {{:input type="select" name="id_year" label="Exercice" required=true default_empty="— Faire un choix —" options=$open_years}}
{{:input type="date" name="date" label="Date" required=true default=$now|date_short}} {{:input type="date" name="date_achat" label="Date d'acquisition" required=true default=$now|date_short}}
{{:input type="text" name="designation" label="Désignation" required=true}} {{:input type="text" name="designation" label="Désignation" required=true}}
{{:input type="money" name="montant" label="Montant" required=true}} {{:input type="money" name="montant" label="Montant" required=true}}
{{:input type="number" name="duree" label="Durée d'amortissement" required=true default=1}}
{{:input {{:input
type="list" type="list"
name="credit_account" name="credit_account"
label="Compte de décaissement" label="Compte de décaissement"
required=true required=true
target="!acc/charts/accounts/selector.php?targets=1:2:3&key=code&year=%d"|args:$best_year target="!acc/charts/accounts/selector.php?types=%s&id_year=%d"|args:"1|2|3":$selected_year
default=$bank_account
}} }}
{{:input {{:input
type="list" type="list"
name="debit_account" name="debit_account"
label="Compte d'immobilisation (20xx ou 21xx)" label="Compte d'immobilisation (20xx, 21xx, ...)"
required=true required=true
target="!acc/charts/accounts/selector.php?key=code&year=%d"|args:$best_year target="!acc/charts/accounts/selector.php?codes=%s&id_year=%d"|args:$patterns:$selected_year
default=$immo_account
}} }}
{{if $projects != null}} {{if $projects != null}}
{{:input type="select" name="id_project" label="Projet (analytique)" options=$projects default_empty="— Aucun —"}} {{:input type="select" name="id_project" label="Projet (analytique)" options=$projects default_empty="— Aucun —"}}
{{/if}} {{/if}}
<div id="donnees" class="hidden">
{{:input type="select" name="years_data" options=$years_data}}
</div>
</dl>
</fieldset>
<fieldset>
<legend>Amortissement</legend>
<dl>
{{:input id="amortir" type="checkbox" value=1 name="amortir" label="Amortir cette immobilisation sur plusieurs années" checked="cheched" help="Dé-cocher pour ne pas amortir"}}
<div id="div_amort">
{{:input type="date" name="date_mes" label="Date de mise en service" help="C'est la date de première utilisation ; à renseigner uniquement si différente de la date d'acquisition"}}
{{:input type="number" name="duree" label="Durée d'amortissement" required=true min=0 default=1 suffix="année(s)"}}
</div>
</dl> </dl>
</fieldset> </fieldset>
@ -99,5 +196,21 @@
</p> </p>
</form> </form>
{{:admin_footer}} {{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript">
function changeYear(evt, f_accounts = ['credit_account', 'debit_account'], f_years_select = 'f_id_year') {
setSelectorYear(f_accounts, f_years_select);
}
function changeVisibility(evt, idcheck = 'f_amortir_1', fields = ['div_amort']) {
toggleVisibility(idcheck, fields);
}
(function () {
document.getElementById('f_id_year').onchange = changeYear;
document.getElementById('f_amortir_1').onclick = changeVisibility;
})();
</script>

View File

@ -1,44 +0,0 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Renseigner durée amortissement" custom_css=$custom_css current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index"}}
{{/if}}
{{* renseigner la durée d'amortissement *}}
<h2 class="ruler">Durée d'amortissement</h2>
{{* Traiter l'envoi du formulaire *}}
{{#form on="add"}}
{{* enregistrer les infos de l'immobilisation *}}
{{:assign var="line_id" value=$_GET.line_id|intval}}
{{:assign key=""|uuid}}
{{:save
key=$key
validate_schema="schema.json"
type="immo"
line=$line_id
duration=$_POST.duree|intval
}}
{{:redirect force="index.html?ok=1&msg=durée"}}
{{/form}}
<form method="post" action="">
<fieldset class="ajout_duree">
<legend>Renseigner durée amortissement</legend>
<dl>
{{:input type="number" name="duree" label="Durée d'amortissement" required=true default=1}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="add" label="Ajouter" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}

108
add_infos.html Normal file
View File

@ -0,0 +1,108 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Renseigner informations amortissement" custom_css=$custom_css current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index"}}
{{/if}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="add"}}
{{* chercher la date d'acquisition de l'immobilisation *}}
{{:assign var="immo_id" value=$_GET.immo_id|intval}}
{{#select
trans.date as date_achat
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 = $immo_id
assign=ligne_immo
}}
{{/select}}
{{if $_POST.no_amort}}
{{* ne pas amortir *}}
{{:assign duration=0}}
{{:assign date_debut=$ligne_immo.date_achat|parse_date}}
{{:assign status="ignored"}}
{{else}}
{{* vérifier que la date d'acquisition est antérieure à la date de mise en service *}}
{{:assign date_debut=$_POST.date_mes|or:$ligne_immo.date_achat|parse_date}}
{{if $date_debut|strtotime < $ligne_immo.date_achat|strtotime}}
{{:assign dd=$date_debut|date_short}}
{{:assign da=$ligne_immo.date_achat|date_short}}
{{:error message="Erreur : la date de mise en service (%s) ne peut être antérieure à la date d'acquisition (%s)"|args:$dd:$da}}
{{/if}}
{{:assign duration=$_POST.duree|intval}}
{{if $duration <= 0}}
{{:error message="Erreur : la durée d'amortissement doit être strictement positive"}}
{{/if}}
{{:assign status="managed"}}
{{/if}}
{{* enregistrer les infos de l'immobilisation *}}
{{:assign key=""|uuid}}
{{:save
key=$key
validate_schema="schema.json"
type="immo"
line=$immo_id
duration=$duration
date=$date_debut
status=$status
}}
{{if $_POST.no_amort}}
{{:assign amort="autres"}}
{{else}}
{{:assign amort="encours"}}
{{/if}}
{{:redirect force="index.html?ok=1&msg=infos&amort=%s"|args:$amort}}
{{else}}
{{:form_errors}}
{{/form}}
{{* renseigner la date de mise en service et durée d'amortissement *}}
{{if $_GET.amort == 0}}
{{:assign checked=1}}
{{:assign disabled=1}}
{{else}}
{{:assign checked=0}}
{{:assign disabled=0}}
{{/if}}
<form method="post" action="">
<fieldset id="infos_immo">
<legend></legend>
<dl>
{{:input id="no_amort" type="checkbox" value=1 name="no_amort" label="Ne pas amortir" default=$checked help="Cocher pour ne pas amortir" onclick="toggleInputs('infos_immo','f_no_amort_1')"}}
{{:input type="date" name="date_mes" label="Date de mise en service" disabled=$disabled help="à renseigner uniquement si différente de la date d'acquisition"}}
{{:input type="number" name="duree" label="Durée d'amortissement" required=true min=1 default=1 disabled=$disabled}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="add" label="Ajouter" shape="right" class="main"}}
</p>
</form>
{{* activer/désactiver les champs de saisie *}}
<script type="text/javascript">
function toggleInputs(idfs, idcb) {
const noamort = document.getElementById(idcb);
const fs = document.getElementById(idfs);
for (let field of fs.querySelectorAll("input")) {
if (field == noamort) { continue }
if (noamort.checked) {
field.setAttribute("disabled","disabled");
}
else {
field.removeAttribute("disabled");
}
}
}
</script>
{{:admin_footer}}

155
aide.html Normal file
View File

@ -0,0 +1,155 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Aide" custom_css="./style.css" current="module_amortissement"}}
{{* barre de navigation *}}
{{:include file="_nav.html" current="aide"}}
<p class="aide">
Ce module gère l'amortissement linéaire des immobilisations.
</p>
<h2 class="aide">Immobilisations</h2>
Elles sont classées dans 3 onglets :
<h3 class="aide">Amortissables</h3>
On y trouve les immobilisations en cours et celles pour lesquelles le
module n'a pas d'information.
<p class="aide">
Dans le deuxième cas, il faut cliquer sur le bouton « Ajouter
infos » puis :
<ul class="aide">
<li>soit indiquer que l'immobilisation ne doit pas être amortie</li>
<li>soit fournir la date de mise en service du bien (si différente de la date d'acquisition) ainsi
que la durée en années de l'amortissement</li>
</ul>
</p>
<p class="aide">
Tant qu'une immobilisation ne possède pas d'amortissement, il est
possible de modifier ses informations à l'aide du bouton «
Modifier infos ».
</p>
<h3 class="aide">Terminées</h3>
On y trouve les immobilisations dont l'amortissement est terminé
<h3 class="aide">Non amortissables</h3>
<h3 class="aide">Ajouter une immobilisation</h3>
<div class="aide">
<p class="aide">
On peut indiquer qu'il s'agit d'une immobilisation qui ne doit pas être amortie ; dans le cas contraire, il faut renseigner les différents paramètres de l'immobilisation :
</p>
<ul class="aide">
<li>Date d'acquisition du bien</li>
<li>Date de mise en service du bien : uniquement si différente de la précédente</li>
<li>Désignation : c'est le libellé de l'immobilisation</li>
<li>Montant</li>
<li>Durée d'amortissement en années</li>
<li>Compte de décaissement : à choisir dans la liste</li>
<li>Compte d'immobilisation : doit débuter par <b>20</b>, <b>21</b> ou <b>27</b></li>
<li>Projet analytique (optionnel)</li>
</ul>
<p>
Après ajout, on se retrouve sur la page d'accueil des immobilisations.
</p>
</div>
<h2 class="aide">Amortissements</h2>
<div class="infos">
<p class="aide">
Le calcul de l'amortissement se fait par la <em>méthode linéaire</em>.
</p>
<p class="aide">
La date de début du calcul est par défaut la <em>date d'achat</em> ; si la
date de mise en service est <em>postérieure</em> à la date d'achat, c'est
celle-ci qui est prise en compte.
</p>
</div>
<h3 class="aide">Liste des amortissements</h3>
<div class="aide">
On trouve ici de une à trois listes, selon la situation :
<ul class="aide">
<li>
<b>Écritures d'amortissement liées à l'immobilisation courante</b>
<p>
Ce sont des écritures d'amortissement déjà
enregistrées et liées à l'écriture de
l'immobilisation courante.
</p>
</li>
<li>
<b>Écritures d'amortissements à enregistrer</b>
<p>
Ce sont les écritures amortissement de
l'immobilisation courante qui n'ont pas encore été
enregistrées ; seules les amortissements d'un
exercice ouvert peuvent être enregistrés ; les
autres sont présents pour information et pourront
être enregistrés quand l'exercice correspondant
aura été ouvert.
</p>
</li>
<li>
<b>Écritures d'amortissement qui ne sont associées à aucune immobilisation</b>
<p>
Ce sont des écritures passées sur un compte
d'amortissement (<b>28xx</b>) ; en cliquant le
bouton « Attacher », on peut rattacher l'écriture
d'amortissement sélectionnée à l'immobilisation
courante.
</p>
<p>
Si on a rattaché par erreur une écriture
d'amortissement à une immobilisation, le bouton «
Détacher » en face de l'écriture permettra de
défaire l'opération.
</p>
</li>
</ul>
</div>
<h3 class="aide">Créer une écriture d'amortissement</h3>
<div class="aide">
<p class=aide">
Il faut renseigner les différents paramètres de l'amortissement :
<ul class="aide">
<li>Date ; par défaut, il s'agit de la date de fin d'exercice</li>
<li>Désignation : déterminée à partir du libellé de l'immobilisation< ; elle peut être modifiée/li>
<li>Montant : sa valeur est calculée par le module ; elle peut être modifiée</li>
<li>
Compte de débit : à choisir dans la liste ; par défaut c'est le compte <em>6811 : Dotation aux amortissements des immobilisations</em>
</li>
<li>
Compte d'amortissement : à choisir dans la liste ; par défaut c'est le compte formé en intercalant un 8 après le 2 initial du compte d'immobilisation (exemple : 2183 => 28183)
</li>
</ul>
<p class="aide">
Après enregistrement, on se retrouve sur la page des amortissements
</p>
</p>
</div>
<h2 class="aide">Remarques</h2>
<ul class="aide">
<li>
Les écritures d'immobilisation et d'amortissement créées en
dehors du module ne peuvent être associées automatiquement que
si leurs écritures ont été liées ; dans le cas contraire, il
faudra renseigner manuellement les infos de l'immobilisation.
</li>
<li>
Les écritures d'immobilisation de la balance d'ouverture ne
peuvent être détectées automatiquement : il faudra indiquer
manuellement qu'elles ne doivent pas être amorties.
</li>
</ul>

View File

@ -1,15 +1,89 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{* récupérer les infos de l'immobilisation *}}
{{#select
line.id as immo_id,
line.debit as montant,
trans.id as trans_id,
trans.label as label,
trans.date
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_id|intval
assign=ligne_immo
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_id}}
{{/select}}
{{:assign date_debut=$ligne_immo.date}}
{{:assign solde=$ligne_immo.montant}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$_GET.immo_id|intval}}
{{:assign duree=$duration}}
{{:assign date_debut=$date}}
{{/load}}
{{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{#select
l_amort.credit as amort_amount,
l_amort.label as amort_label,
l_amort.id as amort_line,
CASE WHEN links.id_related = t_immo.id
THEN links.id_transaction
ELSE links.id_related
END as amort_trans_id,
trans.date as amort_date,
trans.label as trans_label,
trans.id_year as amort_year,
account.id as account_id,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction
OR
t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER join acc_transactions as trans on l_amort.id_transaction = trans.id
INNER join acc_accounts as account on l_amort.id_account = account.id
WHERE
l_immo.id = :line_id
AND account.code LIKE '28%'
ORDER BY trans.date;
:line_id = $_GET.immo_id|intval
assign=linked_lines.
}}
{{if $date_debut == null}}
{{:assign date_debut=$amort_date}}
{{/if}}
{{/select}}
{{:assign valeur_residuelle=$ligne_immo.montant}}
{{#foreach from=$linked_lines}}
{{:assign valeur_residuelle="%d-%d"|math:$valeur_residuelle:$amort_amount}}
{{/foreach}}
{{:admin_header title="Liste des amortissements" custom_css="./style.css" current="module_amortissement"}} {{:admin_header title="Liste des amortissements" custom_css="./style.css" current="module_amortissement"}}
{{* barre de navigation *}} {{* barre de navigation *}}
{{:include file="_nav.html" current="amortization"}} {{if $_GET.amort == "fini" || $valeur_residuelle== 0 }}
{{:assign subcurrent="fini"}}
{{elseif $_GET.amort == "archive"}}
{{:assign subcurrent="archive"}}
{{elseif $_GET.amort == null || $_GET.amort == "encours"}}
{{:assign subcurrent="encours"}}
{{else}}
{{:assign subcurrent="autres"}}
{{/if}}
{{:include file="_nav.html" current="index" subcurrent="%s"|args:$subcurrent subsubcurrent="amortization"}}
{{if $_GET.ok}} {{if $_GET.ok}}
{{if $_GET.msg|match:"attach"}} {{if $_GET.msg|match:"attach"}}
{{:assign msg="Attachement effectué"}} {{:assign msg="Attachement écriture %s effectué"|args:$_GET.trans_id}}
{{elseif $_GET.msg|match:"detach"}} {{elseif $_GET.msg|match:"detach"}}
{{:assign msg="Attachement supprimé"}} {{: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}}
@ -23,157 +97,35 @@
<p class="block error">{{$msg}}</p> <p class="block error">{{$msg}}</p>
{{/if}} {{/if}}
{{* récupérer les infos de l'immobilisation *}} {{if $valeur_residuelle > 0}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.line_id|intval}} <nav class="tabs amort">
{{else}} <aside>
{{:assign message="Pas d'info concernant l'immobilisation %s"|args:$_GET.line_id}} {{:linkbutton label="Enregistrer un amortissement" shape="plus" href="save_amort.html?immo_id=%s"|args:$_GET.immo_id target="_dialog"}}
{{:error message=$message}} </aside>
{{/load}} </nav>
{{/if}}
{{* liste de toutes les immobilisations gérées *}} <h3>Amortissement de «
{{#load type="immo"}} <a class="num"
{{:assign href={{"%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.trans_id}}>#{{$ligne_immo.trans_id}}</a>
var="info_immos.%s"|args:$line {{$ligne_immo.label}} » d'un montant de
duration=$duration {{"%f"|math:$ligne_immo.montant|money_currency}}
amort=$amort en date du {{$date_debut|date_short}}{{if $duree != null}} sur {{$duree}} ans{{/if}}
}} </h3>
{{#foreach from=$amort item="elem"}}
{{:assign var="amort_associes." value=$elem"}}
{{/foreach}}
{{/load}}
{{:assign var="duree" from="info_immos.%s.duration"|args:$_GET.line_id}}
{{#select
line.id as line_id,
line.id_account as account_id,
line.id_project as project_id,
line.debit as montant,
trans.id as trans_id,
trans.label as label,
trans.date as date_achat,
y.id as year_id,
y.end_date as date_fin,
project.label as project_label
from acc_transactions_lines as line
inner join acc_transactions as trans on line.id_transaction = trans.id
inner join acc_years as y on trans.id_year = y.id
left join acc_projects AS project ON line.id_project = project.id
where line.id = :line_id;
:line_id = $_GET.line_id|intval
assign=ligne_immo
}}
<h2>Amortissement de « {{$label}} » d'un montant de {{"%f"|math:$montant|money_currency}} en date du {{$date_achat|date_short}} sur {{$duree}} ans</h2>
{{else}}
{{:assign message="Immobilisation %s non trouvée"|args:$_GET.line_id}}
{{:error message=$message}}
{{/select}}
{{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{#select
l_immo.id,
l_immo.id_account,
l_amort.credit as amort_amount,
l_amort.label as amort_label,
l_amort.id as amort_line,
l_amort.id_transaction as amort_trans_id,
l_amort.id_project as projet,
l_amort.id_account as account_id,
l_amort.id_project as project_id,
project.label as project_label,
trans.date as amort_date,
trans.label as trans_label,
trans.id_year as amort_year,
acc.code as account_code,
acc.label as account_name,
acc.id_chart as PC,
"vrai" as linked
from acc_transactions_lines as l_immo
inner JOIN acc_transactions_links as links on l_immo.id_transaction = links.id_related
inner JOIN acc_transactions_lines as l_amort on links.id_transaction = l_amort.id_transaction
inner join acc_accounts as acc on l_amort.id_account = acc.id
inner join acc_transactions as trans on l_amort.id_transaction = trans.id
inner join acc_projects AS project ON l_immo.id_project = project.id
where l_immo.id = :line_id and l_amort.credit <> 0
order by trans.date;
:line_id = $_GET.line_id|intval
assign=linked_lines.
}}
{{:assign var="amort_associes." value=$amort_line}}
{{:assign var="amort_years." value=$amort_year}}
{{/select}}
{{* chercher parmi les associations *}}
{{:assign var="liste_amort" from="info_immos.%s.amort"|args:$_GET.line_id}}
{{#foreach from=$liste_amort item="id_amort"}}
{{#select
l_amort.id_transaction as amort_trans_id,
l_amort.credit as amort_amount,
l_amort.label as amort_label,
trans.date as amort_date,
trans.label as trans_label,
trans.id_year as amort_year,
acc.code as account_code,
acc.label as account_name,
project.label as project_label
from acc_transactions_lines as l_amort
inner join acc_transactions as trans on l_amort.id_transaction = trans.id
inner join acc_accounts as acc on l_amort.id_account = acc.id
inner join acc_projects AS project ON l_amort.id_project = project.id
where l_amort.id = :l_amort_id;
:l_amort_id = $id_amort
}}
{{:assign
var="linked_lines."
amort_line=$id_amort
amort_trans_id=$amort_trans_id
amort_amount=$amort_amount
amort_label=$amort_label
amort_date=$amort_date
amort_year=$amort_year
trans_label=$trans_label
account_code=$account_code
account_name=$account_name
project_label=$project_label
}}
{{:assign var="amort_years." value=$amort_year}}
{{/select}}
{{/foreach}}
{{* montant de l'annuité théorique *}}
{{:assign montant="%f"|math:$ligne_immo.montant}}
{{:assign annuite="%f/%f"|math:$montant:$duree}}
{{* première annuité *}}
{{:assign date_achat=$ligne_immo.date_achat|date_short}}
{{:assign date_fin=$ligne_immo.date_fin|date_short}}
{{:include file="_calcul_dates.html" date_debut=$date_achat date_fin=$date_fin keep="nbjours"}}
{{:assign annuite_1="%f/360*%d"|math:$annuite:$nbjours|intval}}
{{:assign date_amort=$date_fin}}
{{:assign annuite_courante=$annuite_1}}
{{:assign current_year=$ligne_immo.year_id}}
{{:assign solde=$ligne_immo.montant}}
{{:assign nbamort=0}}
{{if $linked_lines != null}} {{if $linked_lines != null}}
<section class="amortissement"> <section class="amortissement">
<h3 class="ruler"> <h3 class="center-block ruler">Amortissements rattachés</h3>
Amortissements attachés à « <a class="num"
href={{"%s/acc/transactions/details.php?id=%s"|args:$admin_url:$ligne_immo.trans_id}}>{{$ligne_immo.trans_id}}</a>
{{$ligne_immo.label}} »
({{"%f"|math:$ligne_immo.montant|money_currency}}, {{$ligne_immo.date_achat|date_short}})
</h3>
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th>Date</th> <th>Date</th>
<th style="text-align: right;">Montant</th> <th class="nombre">Montant</th>
<th style="text-align: right;">Solde</th> <th class="nombre">Solde</th>
<th>Libellé</th> <th>Libellé</th>
<th>N° compte</th> <th>N° compte</th>
<th>Compte</th> <th>Compte</th>
<th>Projet</th>
<th class="actions"></th> <th class="actions"></th>
</tr> </tr>
</thead> </thead>
@ -181,14 +133,13 @@
{{#foreach from=$linked_lines item="line"}} {{#foreach from=$linked_lines 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 solde="%f-%d"|math:$solde:$line.amort_amount}} {{:assign solde="%f-%d"|math:$solde:$line.amort_amount}}
{{:assign date_amort=$line.amort_date}}
{{:assign current_year=$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.amort_date|date_short}}</td> <td>{{$line.amort_date|date_short}}</td>
<td class="money">{{"%f"|math:$line.amort_amount|money}}</td> <td class="money">{{"%f"|math:$line.amort_amount|money}}</td>
<td class="money">{{"%f"|math:$solde|money}}</td> <td class="money">{{"%f"|math:$solde|money:false}}</td>
<td> <td>
{{if $line.amort_label == null}} {{if $line.amort_label == null}}
{{$line.trans_label}} {{$line.trans_label}}
@ -196,173 +147,92 @@
{{$line.amort_label}} {{$line.amort_label}}
{{/if}} {{/if}}
</td> </td>
<td>{{$line.account_code}}</td> <td><a href={{$compte_url}}>{{$line.account_code}}</a></td>
<td>{{$line.account_name}}</td> <td>{{$line.account_label}}</td>
<td>{{$line.project_label}}</td>
<td> <td>
{{if $line.linked == null}} {{:linkbutton label="Détacher" href="detach_amort.html?amort_id=%d&immo_id=%d"|args:$line.amort_line:$ligne_immo.immo_id shape="minus"}}
{{:linkbutton label="Détacher" href="detach_amort.html?amort_id=%d&immo_id=%d"|args:$line.amort_line:$ligne_immo.line_id shape="plus"}}
{{else}}
{{:linkbutton label="Détacher" href="" shape="lock" class="disabled"}}
{{/if}}
</td> </td>
</tr> </tr>
{{:assign annuite_courante=$annuite}}
{{:assign jour=$date_amort|date:"d"}}
{{:assign mois=$date_amort|date:"m"}}
{{:assign annee=$date_amort|date:"Y"}}
{{:assign annee="%d+1"|math:$annee}}
{{:assign date_amort="%s/%s/%s"|args:$jour:$mois:$annee|parse_date|date_short}}
{{:assign nbamort="%d+1"|math:$nbamort}}
{{/foreach}} {{/foreach}}
</tbody> </tbody>
</table> </table>
</section> </section>
{{/if}} {{/if}}
{{:assign project_id=$ligne_immo.project_id}} {{if $_GET.amort == null || $_GET.amort != "fini"}}
{{:assign project_label=$ligne_immo.project_label}}
{{:assign nbamort="%d-%d"|math:$duree:$nbamort}}
<section class="amortissement"> {{* Autres amortissements non rattachés *}}
<h3 class="ruler">Amortissements à enregistrer</h3> {{#select
<table class="list"> line.id as l_id,
<thead> line.id_transaction as t_id,
<tr> line.credit as amort_amount,
<th></th> line.label as l_label,
<th>Date</th> trans.date as t_date,
<th>Montant</th> trans.label as t_label,
<th>Solde</th> trans.id_year as amort_year,
<th>Libellé</th> account.id as account_id,
<th>N° compte</th> account.code as account_code,
<th>Compte</th> account.label as account_label
<th>Projet</th> FROM acc_transactions_lines AS line
<th class="actions"></th> INNER JOIN acc_accounts AS account ON account.id = line.id_account
</tr> INNER JOIN acc_transactions AS trans ON trans.id = line.id_transaction
</thead> INNER JOIN acc_years AS y ON y.id = trans.id_year
<tbody> WHERE account.code LIKE "28%" AND credit > 0 AND (NOT trans.status & 16)
{{#foreach count="%d+1"|math:$nbamort key="num"}} ORDER BY trans.date, trans.label;
{{:assign solde="%f-%d"|math:$solde:$annuite_courante}} assign=autre_amort
{{#select id from acc_years where end_date = :end_date and closed = 0; :end_date=$date_amort|parse_date}} }}
{{:assign enregistrer=1}} {{#select
{{:assign current_year=$id}} id_transaction,
{{else}} id_related
{{:assign enregistrer=0}} FROM acc_transactions_links
{{/select}} WHERE id_transaction = :id_amort OR id_related = :id_amort;
<tr> :id_amort=$t_id
<td class="num">{{"%d+1"|math:$num}}</td> }}
<td>{{$date_amort}}</td> {{else}}
<td class="money">{{"%f"|math:$annuite_courante|money}}</td> {{:assign var="autres_amortissements." value=$autre_amort}}
<td class="money">{{if $solde == 0}}0,00{{else}}{{"%f"|math:$solde|money}}{{/if}}</td> {{/select}}
<td> {{/select}}
{{if $libelle == null}}
{{:assign libelle="Amortissement "|cat:$ligne_immo.label}}
{{/if}}
{{$libelle}}
</td>
<td></td>
<td></td>
<td></td>
<td class="actions">
{{if $enregistrer == 1}}
{{:linkbutton
label="Enregistrer"
href="save_amort.html?amount=%d&account=%s&year=%s&trans_id=%d&line_id=%s&project_id=%d&label=%s"|args:$annuite_courante:$ligne_immo.account_id:$current_year:$ligne_immo.trans_id:$_GET.line_id:$project_id:$libelle
shape="right"
target="_dialog"
}}
{{else}}
{{:linkbutton label="Enregistrer" href="" shape="lock" class="disabled"}}
{{/if}}
</td>
</tr>
{{:assign jour=$date_amort|date:"d"}}
{{:assign mois=$date_amort|date:"m"}}
{{:assign annee=$date_amort|date:"Y"}}
{{:assign annee="%d+1"|math:$annee}}
{{:assign date_amort="%s/%s/%s"|args:$jour:$mois:$annee|parse_date|date_short}}
{{:assign annuite_courante="min(%f,%f)"|math:$annuite:$solde}}
{{if $solde == 0}}{{:break}}{{/if}}
{{/foreach}}
</tbody>
</table>
</section>
<section class="amortissement"> {{if $autres_amortissements != null}}
<h3 class="ruler">Autres amortissements non rattachés</h3> <section class="amortissement">
<table class="list"> <h3 class="center-block ruler">Autres amortissements non rattachés</h3>
<thead> <table class="list">
<tr> <thead>
<th></th>
<th>Date</th>
<th style="text-align: right;">Montant</th>
<th>Libellé</th>
<th>N° compte</th>
<th>Compte</th>
<th>Projet</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
{{#select
li.id as l_id,
li.id_transaction as t_id,
li.credit as montant,
li.reference,
li.label as l_label,
pro.label as p_label,
trans.date as t_date,
trans.label as t_label,
acc.code as a_code,
acc.label as a_label,
y.label as y_label
from acc_transactions_lines as li
inner join acc_accounts as acc on acc.id = li.id_account
inner join acc_transactions as trans on trans.id = li.id_transaction
inner join acc_years as y on y.id = trans.id_year
inner join acc_projects as pro on li.id_project = pro.id
where acc.code like "28%"
order by trans.date, trans.label
}}
{{:assign linked="false"}}
{{#select
id_transaction,
id_related
from acc_transactions_links
where id_transaction = :id_amort;
:id_amort=$t_id}}
{{:assign linked="true"}}
{{/select}}
{{if ! $l_id|in:$amort_associes && $linked != "true"}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$t_id}}
<tr> <tr>
<td class="num"><a href={{$trans_url}}>#{{$t_id}}</a></td> <th></th>
<td>{{$t_date|date_short}}</td> <th>Date</th>
<td class="money">{{"%f"|math:$montant|money}}</td> <th class="nombre">Montant</th>
<td>{{if $l_label == null}} <th>Libellé</th>
{{$t_label}} <th>N° compte</th>
{{else}} <th>Compte</th>
{{$l_label}} <th class="actions"></th>
{{/if}}
</td>
<td>{{$a_code}}</td>
<td>{{$a_label}}</td>
<td>{{$p_label}}</td>
<td>
{{if $linked != "true"}}
{{:linkbutton label="Attacher" href="attach_amort.html?amort_id=%d&immo_id=%d"|args:$l_id:$ligne_immo.line_id shape="plus"}}
{{else}}
{{:linkbutton label="Attacher" href="" shape="lock" class="disabled"}}
{{/if}}
</td>
</tr> </tr>
{{/if}} </thead>
{{/select}} <tbody>
</tbody> {{#foreach from=$autres_amortissements item="line"}}
</table> {{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$line.t_id}}
</section> {{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$line.account_id:$line.amort_year}}
<tr>
<td class="num"><a href={{$trans_url}}>#{{$line.t_id}}</a></td>
<td>{{$line.t_date|date_short}}</td>
<td class="money">{{"%f"|math:$line.amort_amount|money}}</td>
<td>{{if $line.l_label == null}}
{{$line.t_label}}
{{else}}
{{$line.l_label}}
{{/if}}
</td>
<td><a href={{$compte_url}}>{{$line.account_code}}</a></td>
<td>{{$line.account_label}}</td>
<td>
{{:linkbutton label="Attacher" href="attach_amort.html?amort_id=%d&immo_id=%d"|args:$line.l_id:$ligne_immo.immo_id shape="plus"}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
</section>
{{/if}}
{{/if}}
{{:form_errors}} {{:form_errors}}
{{:admin_footer}} {{:admin_footer}}

71
archives.html Normal file
View File

@ -0,0 +1,71 @@
{{* -*- brindille -*- *}}
{{* Liste des immobilisations archivées *}}
<section class="immobilisation">
<h2 class="ruler">Immobilisations archivées</h2>
{{:assign nb_immo=0}}
<table class="list">
<thead>
<tr>
<th></th>
<th>Date</th>
<th>Libellé</th>
<th class="nombre">Montant</th>
<th>N° compte</th>
<th>Compte</th>
<th>Projet</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
{{#load type="immo" where="$$.status = 'archived'"}}
{{:assign var="lines." value="'%s'"|args:$line}}
{{/load}}
{{:assign lines=$lines|implode:","}}
{{:assign lines="("|cat:$lines|cat:")"}}
{{:assign condition="line.id IN %s"|args:$lines}}
{{#select
trans.id as trans_id,
trans.label as trans_label,
trans.date as trans_date,
line.id as immo_id,
account.id as account_id,
account.code as account_code,
account.label as account_label,
line.debit AS debit,
project.label as project_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
LEFT JOIN acc_projects AS project ON line.id_project = project.id
WHERE !condition
ORDER BY trans.date DESC;
!condition=$condition
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{:assign nb_immo="%d+1"|math:$nb_immo}}
<tr>
<td class="num"><a href={{$trans_url}}>#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}</td>
<td class="money">{{"%f"|math:$debit|money:false}}</td>
<td><a href={{$compte_url}}>{{$account_code}}</a></td>
<td>{{$account_label}}</td>
<td>{{$project_label}}</td>
<td class="actions">
</td>
</tr>
{{/select}}
</tbody>
</table>
{{if $nb_immo == 0}}
<p class="block alert">Aucune immobilisation</p>
{{/if}}
</section>

View File

@ -1,33 +1,56 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{* {{*
Enregistrer l'association entre une écriture d'amortissement et Enregistrer la liaison entre une écriture d'amortissement et
l'écriture d'immobilisation correspondante l'écriture d'immobilisation correspondante
Comme je ne sais pas créer une ligne dans acc_transactions_links
j'enregistre les associations dans un document json
*}} *}}
{{* trouver l'entrée correspondant à l'immobilisation *}} {{* chercher l'écriture d'immobilisation *}}
{{#select
{{* TODO : améliorer le message d'erreur *}} id_transaction
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_id|intval}} FROM acc_transactions_lines
{{else}} WHERE id = :line_id;
{{:assign message="Pas d'info concernant l'immobilisation %s ; avez-vous renseigné la durée d'immobilisation ?"|args:$_GET.immo_id}} :line_id = $_GET.immo_id|intval
{{:error message=$message}}
{{/load}}
{{* Ajouter la nouvelle ligne d'amortissement aux lignes existantes *}}
{{:assign var="assoc." value=$_GET.amort_id|intval}}
{{* Enregistrer les infos *}}
{{:save
key=$info_immo.key
validate_schema="schema.json"
type="immo"
line=$info_immo.line
duration=$info_immo.duration
amort=$assoc
}} }}
{{:redirect to="amortization.html?line_id=%s&ok=1&msg=attach"|args:$_GET.immo_id}} {{:assign immo_trans_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'immobilisation de la ligne « %s »"|args:$_GET.immo_id}}
{{/select}}
{{* chercher l'écriture d'amortissement *}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
:line_id = $_GET.amort_id|intval
}}
{{:assign amort_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'amortissement de la ligne « %s »"|args:$_GET.amort_id}}
{{/select}}
{{* chercher les liaisons de l'écriture d'immobilisation *}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $immo_trans_id
}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/select}}
{{* ajouter la nouvelle liaison *}}
{{:assign var="linked_transactions." value=$amort_id}}
{{* Enregistrer les liaisons *}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{:redirect to="amortization.html?immo_id=%s&ok=1&msg=attach&trans_id=%s"|args:$_GET.immo_id:$amort_id}}

220
balance_sheet_exit.html Normal file
View File

@ -0,0 +1,220 @@
{{* -*- brindille -*- *}}
{{*
Sortir une immobilisation du bilan
@param immo_id : id de la ligne d'immobilisation
*}}
{{* Infos de l'immobilisation *}}
{{#select
line.debit as montant,
trans.date as date_achat,
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 = $_GET.immo_id|intval
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_id}}
{{/select}}
{{:assign date_debut=$ligne_immo.date_achat}}
{{:assign ts_mes=$ligne_immo.date_achat|strtotime}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_id|intval}}
{{:assign ts_mes=$date|strtotime}}
{{:assign date_debut=$date}}
{{:assign duree_amort=$duration}}
{{/load}}
{{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{#select
SUM(l_amort.credit) as amort_amount,
CASE
WHEN links.id_related = t_immo.id
THEN links.id_transaction
ELSE links.id_related
END as amort_trans_id,
MAX(trans.date) as last_amort_date,
MIN(trans.date) as first_amort_date,
COUNT(trans.id) as amort_number
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction
OR
t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER join acc_transactions as trans on l_amort.id_transaction = trans.id
INNER JOIN acc_accounts AS account ON l_amort.id_account = account.id
WHERE l_immo.id = :line_id AND account.code LIKE '28%'
LIMIT 1;
:line_id = $_GET.immo_id|intval
assign=amort_line
}}
{{/select}}
{{if $amort_line.amort_number == 0}}
{{:assign amort_amount=0}}
{{else}}
{{:assign amort_amount=$amort_line.amort_amount}}
{{:assign date_debut=$amort_line.last_amort_date|strtotime}}
{{:assign date_debut="%d+(60*60*24)"|math:$date_debut|date:"Y-m-d"}}
{{/if}}
{{:assign ts_debut=$date_debut|strtotime}}
{{:assign valeur_nette="%f-%f"|math:$ligne_immo.montant:$amort_amount}}
{{*
lister les exercices qui englobent la date de début du prochain amortissement
*}}
{{:assign default_exit_date=""}}
{{#years closed=false order="start_date" where="start_date <= :debut AND :debut <= end_date"
:debut=$date_debut assign=years.}}
{{if $start_date|strtotime <= $now && $now <= $end_date|strtotime}}
{{:assign default_exit_date=$now|date_short}}
{{/if}}
{{:assign ts_fin=$end_date|strtotime}}
{{:assign debut=$start_date|date_short}}
{{:assign fin=$end_date|date_short}}
{{:assign var="open_years.%d"|args:$id value=$label|cat:" (du "|cat:$debut|cat:" au "|cat:$fin|cat:")"}}
{{:assign var="years_data.%d"|args:$id value=$ts_debut|cat:" "|cat:$ts_fin}}
{{else}}
{{:error message="Aucun exercice ouvert pour enregistrer un amortissement"}}
{{/years}}
{{if $years|count == 1}}
{{:assign default_year=$years.0.id}}
{{else}}
{{:assign default_year=""}}
{{/if}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="proceed"}}
{{if $_POST.date_sortie == null}}
{{:error message="Vous devez renseigner la date de sortie"}}
{{/if}}
{{* vérifier la validité de la date de mise en service *}}
{{if $_POST.date_mes != null}}
{{:assign ts_mes=$_POST.date_mes|parse_date|strtotime}}
{{if $ts_mes < $ligne_immo.date_achat|strtotime || $ts_mes > $amort_line.first_amort_date|strtotime}}
{{:assign immo_date=$ligne_immo.date_achat|date_short}}
{{:assign amort_date=$amort_line.first_amort_date|date_short}}
{{:error message="La date de mise en service doit être postérieure à la date d'acquisition de l'immobilisation (%s) et antérieure à la date du premier amortissement (%s)"|args:$immo_date:$amort_date}}
{{/if}}
{{/if}}
{{* vérifier la validité de la durée d'immobilisation *}}
{{if $valeur_nette > 0}}
{{if $info_immo.duration == null}}
{{if $_POST.duree == null}}
{{:error message="Vous devez renseigner la durée de l'immobilisation"}}
{{elseif $_POST.duree < $amort_line.amort_number}}
{{:error message="La durée de l'amortissement ne peut être inférieure au nombre d'écritures d'amortissement (%d)"|args:$amort_line.amort_number}}
{{else}}
{{:assign duree_amort=$_POST.duree}}
{{/if}}
{{/if}}
{{/if}}
{{* vérifier la validité de la date de sortie *}}
{{if $info_immo.date != null}}
{{if $_POST.date_sortie|parse_date < $info_immo.date}}
{{:assign immo_date=$info_immo.date|date_short}}
{{:error message="La date de sortie doit être postérieure à la date de mise en service de l'immobilisation (%s)"|args:$immo_date}}
{{/if}}
{{elseif $_POST.date_mes != null}}
{{if $_POST.date_sortie|parse_date < $_POST.date_mes|parse_date}}
{{:error message="La date de sortie doit être postérieure à la date de mise en service de l'immobilisation (%s)"|args:$_POST.date_mes}}
{{/if}}
{{elseif $_POST.date_sortie|parse_date < $ligne_immo.date_achat}}
{{:assign immo_date=$ligne_immo.date_achat|date_short}}
{{:error message="La date de sortie doit être postérieure à la date d'acquisition de l'immobilisation (%s)"|args:$immo_date}}
{{/if}}
{{if $amort_line.amort_number != 0 && $_POST.date_sortie|parse_date <= $amort_line.last_amort_date}}
{{:assign last_amort_date=$amort_line.last_amort_date|date_short}}
{{:error message="La date de sortie doit être postérieure à la date de la dernière immobilisation (%s)"|args:$last_amort_date}}
{{/if}}
{{* vérifier que la date de sortie est située dans un exercice ouvert *}}
{{:assign ts_exit = $_POST.date_sortie|parse_date|strtotime}}
{{:assign ok=false}}
{{#foreach from=$years}}
{{if $id == $_POST.id_year}}
{{:assign selected_year=$id}}
{{if $start_date|strtotime <= $ts_exit && $ts_exit <= $end_date|strtotime}}
{{:assign ok=true}}
{{:break}}
{{/if}}
{{/if}}
{{/foreach}}
{{if ! $ok}}
{{:error message="La date choisie n'est pas dans l'exercice sélectionné !"}}
{{/if}}
{{:redirect to="compute_exit_data.html?immo_id=%s&amort_amount=%s&year=%s&date_mes=%s&date_debut=%s&exit_date=%s&duree_amort=%s"|args:$_GET.immo_id:$amort_amount:$selected_year:$ts_mes:$ts_debut:$ts_exit:$duree_amort}}
{{/form}}
{{:admin_header title="Sortie de bilan" custom_css="./style.css" current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subsubcurrent="balance_exit"}}
{{/if}}
{{:form_errors}}
{{* formulaire de sortie du bilan *}}
<h3>Sortir l'immobilisation « {{$ligne_immo.label}} » du bilan</h3>
<form method="post" action="">
<div class="informations">
<legend>Données de l'imobilisation</legend>
<dl class="describe">
<dt>Montant</dt>
<dd id="montant_immo" class="money">{{$ligne_immo.montant|money_currency:false}}</dd>
<dt>Date d'acquisition</dt>
<dd >{{$ligne_immo.date_achat|date_short}}</dd>
{{if $info_immo.date != null && $info_immo.date != $ligne_immo.date_achat}}
<dt>Date de mise en service</dt>
<dd>{{$info_immo.date|date_short}}</dd>
{{/if}}
{{if $info_immo.duration != null}}
<dt>Durée de l'amortissement</dt>
<dd id="duree_amort" class="num">{{$info_immo.duration}} ans</dd>
{{/if}}
<dt>Montant des amortissements</dt>
<dd id="montant_amort" class="money">{{$amort_amount|money_currency:false}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Valeur nette résiduelle</dt>
<dd class="money">{{$valeur_nette|money_currency:false}} <span class="help">(à la date de début de l'exercice)</span></dd>
</dl>
</div>
{{if $valeur_nette > 0}}
{{if $info_immo.date == null || $info_immo.duration == null}}
<fieldset>
<legend>Informations sur l'immobilisation</legend>
<dl>
{{if $info_immo.date == null}}
{{:input type="date" name="date_mes" label="Date de mise en service" help="C'est la date de première utilisation ; à renseigner uniquement si différente de la date d'acquisition"}}
{{/if}}
{{if $info_immo.duration == null}}
{{:input type="number" name="duree" label="Durée d'amortissement" required=true min=1 help="La durée est nécessaire pour calculer l'amortissement complémentaire"}}
{{/if}}
</dl>
</fieldset>
{{/if}}
{{/if}}
<fieldset>
<legend>Informations de sortie</legend>
<dl>
{{:input type="select" default=$default_year name="id_year" label="Exercice" required=true default_empty="— Faire un choix —" options=$open_years}}
{{:input type="date" name="date_sortie" label="Date de sortie du bilan" required=true default=$default_exit_date}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="proceed" label="Poursuivre" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}

133
compute_exit_data.html Normal file
View File

@ -0,0 +1,133 @@
{{* -*- brindille -*- *}}
{{*
Calculer les valeurs de la sortie et saisir le montant de la cession (optionnel)
paramètres :
- immo_id : numéro de ligne de l'écriture d'immobilisation
- amort_amount : montant des amortissements
- year : exercice de la date de sortie de l'immobilisation
- date_mes : datede mise en service de l'immobilisation
- date_debut : date de début de la période d'amortissement complémentaire
- exit_date : date de sortie de l'immobilisation
- duree_amort : durée de l'amortiseement (optionnel)
*}}
{{#select
line.debit as montant,
trans.date as date_achat,
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 = $_GET.immo_id|intval
assign="ligne_immo"
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_id}}
{{/select}}
{{:assign valeur_nette="%f-%f"|math:$ligne_immo.montant:$_GET.amort_amount}}
{{:assign amort_comp=0}} {{* amortissement complémentaire jqà date sortie *}}
{{if $valeur_nette > 0}}
{{:assign nbjours="1+(%d-%d)/(60*60*24)"|math:$_GET.exit_date:$_GET.date_debut}}
{{:assign annuite="%f/%f"|math:$ligne_immo.montant:$_GET.duree_amort}}
{{:assign amort_comp="round(%f/365*%f, 0)"|math:$annuite:$nbjours}}
{{:assign amort_comp="min(%f, %f)"|math:$valeur_nette:$amort_comp}}
{{/if}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="proceed"}}
{{:debug post=$_POST}}
{{if $_POST.cession != null}}
{{if $_POST.montant_cession == null}}
{{:error message="Vous devez saisir le montant de la cession"}}
{{/if}}
{{/if}}
{{:redirect to="write_exit.html?immo_id=%s&amort_amount=%s&year=%s&date_mes=%s&date_debut=%s&exit_date=%s&duree_amort=%s&cession=%s"|args:$_GET.immo_id:$_GET.amort_amount:$_GET.year:$_GET.date_mes:$_GET.date_debut:$_GET.exit_date:$_GET.duree_amort:$_POST.montant_cession}}
{{/form}}
{{:admin_header title="Sortie du bilan" custom_css="./style.css" current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subsubcurrent="balance_exit"}}
{{/if}}
{{:form_errors}}
<h3>Sortir l'immobilisation « {{$ligne_immo.label}} » du bilan</h3>
<form method="post" action="">
<div class="informations">
<legend>Données de l'imobilisation</legend>
<dl class="describe">
<dt>Montant</dt>
<dd id="montant_immo" class="money">{{$ligne_immo.montant|money_currency:false}}</dd>
<dt>Date d'acquisition</dt>
<dd >{{$ligne_immo.date_achat|date_short}}</dd>
{{if $_GET.date_mes != $ligne_immo.date_achat|strtotime}}
<dt>Date de mise en service</dt>
<dd>{{$_GET.date_mes|date:"d/m/Y"}}</dd>
{{/if}}
{{if $_GET.duree_amort != null}}
<dt>Durée de l'amortissement</dt>
<dd id="duree_amort" class="num">{{$_GET.duree_amort}} ans</dd>
{{/if}}
<dt>Montant des amortissements</dt>
<dd id="montant_amort" class="money">{{$_GET.amort_amount|money_currency:false}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Valeur nette résiduelle</dt>
<dd class="money">{{$valeur_nette|money_currency:false}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Date de sortie</dt>
<dd>{{$_GET.exit_date|date:"d/m/Y"}}</dd>
{{if $amort_comp > 0}}
<dt>Amortissement complémentaire</dt>
<dd class="money">{{$amort_comp|money_currency:false}} <span class="help">(jusqu'à la date de sortie)</span></dd>
<dt>Total des amortissements</dt>
<dd class="money">{{"%f+%f"|math:$_GET.amort_amount:$amort_comp|money_currency:false}} <span class="help">(à la date de sortie)</span></dd>
<dt>Valeur nette résiduelle</dt>
<dd class="money">{{"%f-%f"|math:$valeur_nette:$amort_comp|money_currency:false}} <span class="help">(à la date de sortie)</span></dd>
{{/if}}
</dl>
</div>
<fieldset>
<legend>Informations de sortie</legend>
<dl>
{{:input type="checkbox" value=1 name="cession" label="Cession" help="Cocher si la sortie est due à une cession" onclick="toggleHiddenAndFocus('f_cession_1', ['infos_cession'], 'f_montant_cession')"}}
<div id="infos_cession" class="hidden">
{{:input type="money" name="montant_cession" label="Montant de la cession" required=true}}
</div>
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="proceed" label="Poursuivre" shape="right" class="main"}}
</p>
</form>
<script type="text/javascript">
/*
- activer/désactiver les champs passés en paramètres
- donner le focus au champ de saisie du montant
*/
function toggleHiddenAndFocus(idcb, idfields, idinput) {
const cession = document.getElementById(idcb);
for (let id of idfields) {
const field = document.getElementById(id);
if (cession.checked) {
field.setAttribute("class", "");
document.getElementById(idinput).focus();
}
else {
field.setAttribute("class","hidden")
}
}
}
(function () {
toggleHiddenAndFocus('f_cession_1', ['infos_cession'], 'f_montant_cession');
})();
</script>
{{:admin_footer}}

8
defaut.json Normal file
View File

@ -0,0 +1,8 @@
{
"tva": false,
"prefixes": {
"20": "Immobilisations incorporelles",
"21": "Immobilisations corporelles",
"27": "Immobilisations financières"
}
}

View File

@ -5,27 +5,54 @@
une écriture d'immobilisation une écriture d'immobilisation
*}} *}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_id|intval}} {{* chercher l'écriture d'immobilisation *}}
{{else}} {{#select
{{:assign message="Pas d'info concernant l'immobilisation %s"|args:$_GET.immo_id}} id_transaction
{{:error message=$message}} FROM acc_transactions_lines
{{/load}} WHERE id = :line_id;
:line_id = $_GET.immo_id|intval
{{:assign var="liste_amort" val=$info_immo.amort}}
{{#foreach from=$info_immo.amort item="amort_id"}}
{{if $amort_id != $_GET.amort_id}}
{{:assign var="t_amort." value=$amort_id}}
{{/if}}
{{/foreach}}
{{* Enregistrer les infos *}}
{{:save
key=$info_immo.key
validate_schema="schema.json"
type="immo"
line=$info_immo.line
duration=$info_immo.duration
amort=$t_amort
}} }}
{{:redirect to="amortization.html?line_id=%s&ok=1&msg=detach"|args:$_GET.immo_id}} {{:assign immo_trans_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'immobilisation de la ligne « %s »"|args:$_GET.immo_id}}
{{/select}}
{{* chercher l'écriture d'amortissement *}}
{{#select
id_transaction
FROM acc_transactions_lines
WHERE id = :line_id;
:line_id = $_GET.amort_id|intval
}}
{{:assign amort_id=$id_transaction}}
{{else}}
{{:error message="Impossible de trouver l'écriture d'amortissement de la ligne « %s »"|args:$_GET.amort_id}}
{{/select}}
{{*
chercher les liaisons de l'écriture d'immobilisation
et supprimer la liaison avec l'écriture d'amortissement
*}}
{{#select
CASE links.id_related = :immo_trans_id
WHEN true THEN links.id_transaction
WHEN false THEN links.id_related
END as linked_id
FROM acc_transactions_links as links
WHERE id_transaction = :immo_trans_id or id_related = :immo_trans_id;
:immo_trans_id = $immo_trans_id
}}
{{if $linked_id != $amort_id}}
{{:assign var="linked_transactions." value=$linked_id}}
{{/if}}
{{/select}}
{{* Enregistrer les liaisons *}}
{{:api
method="POST"
path="accounting/transaction/%s/transactions"|args:$immo_trans_id
assign="result"
assign_code="result_code"
transactions=$linked_transactions
}}
{{:redirect to="amortization.html?immo_id=%s&ok=1&msg=detach&trans_id=%s"|args:$_GET.immo_id:$amort_id}}

187
immobilisations.html Normal file
View File

@ -0,0 +1,187 @@
{{* -*- brindille -*- *}}
{{* Liste des immobilisations amortissable ou à définir *}}
<section class="immobilisation">
{{if $amort == "encours"}}
<h2 class="ruler">Immobilisations en cours</h2>
{{elseif $amort == "fini"}}
<h2 class="ruler">Immobilisations amorties</h2>
{{/if}}
{{:assign nb_immo=0}}
<table class="list">
<thead>
<tr>
<th></th>
<th>Date</th>
<th>Libellé</th>
<th class="nombre">Montant</th>
<th class="nombre">Durée</th>
<th>N° compte</th>
<th>Compte</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
{{* lister les immobilisations *}}
{{:read file="./defaut.json" assign="config_json"}}
{{:assign config_defaut=$config_json|json_decode}}
{{:assign var="prefix_array" value=$config_defaut.prefixes|keys}}
{{:assign condition="("}}
{{#foreach from=$prefix_array item="code"}}
{{:assign code=$code|cat:"%"|quote_sql}}
{{:assign condition=$condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}}
{{:assign condition=$condition|cat:"0)"}}
{{:assign condition=$condition|cat:" AND debit > 0 AND NOT (trans.status & 16)"}}
{{#select
trans.id as trans_id,
trans.label as trans_label,
trans.date as trans_date,
line.id as immo_id,
account.id as account_id,
account.code as account_code,
account.label as account_label,
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
ORDER BY trans.date DESC;
!condition=$condition
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{:assign duration=null}}
{{* voir si l'immo est prise en charge *}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$immo_id|intval}}
{{:assign duration=$duration}}
{{if $status == "ignored"}}
{{:assign amortissable="non"}}
{{else}}
{{:assign amortissable="oui"}}
{{/if}}
{{else}}
{{:assign amortissable="nsp"}}
{{/load}}
{{if $amortissable == "non"}}
{{:continue}}
{{/if}}
{{* voir s'il existe une écriture qui solde l'immobilisation *}}
{{:assign ignore=false}}
{{#select
line.id AS line,
line.id_transaction AS trans,
line.debit,
line.label,
line2.id AS line2,
line2.id_transaction AS trans2,
line2.credit,
line2.label
FROM acc_transactions_lines AS line
INNER JOIN acc_accounts AS acc ON acc.id = line.id_account
INNER JOIN acc_transactions_lines AS line2 ON line2.id_account = acc.id
WHERE
line.id = :line_id
AND line2.credit = line.debit;
:line_id = $immo_id|intval
}}
{{:assign ignore=true}}
{{/select}}
{{if $ignore}}
{{:continue}}
{{/if}}
{{* voir s'il existe des écritures d'amortissement associées *}}
{{#select
sum(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
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_id|intval
}}
{{if $amort_amount == null}}
{{:assign exist_amort=false}}
{{:assign amort_amount=0}}
{{else}}
{{:assign amort_amount=$amort_amount}}
{{:assign exist_amort=true}}
{{/if}}
{{/select}}
{{* classement par onglet *}}
{{if $amort == "encours" && $amort_amount >= $debit ||
$amort == "fini" && $amort_amount < $debit ||
$amortissable == "nsp" && ! $exist_amort
}}
{{:continue}}
{{/if}}
{{:assign nb_immo="%d+1"|math:$nb_immo}}
<tr>
<td class="num"><a href={{$trans_url}}>#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}</td>
<td class="money">{{"%f"|math:$debit|money}}</td>
<td class="money">{{if $duration != null}}{{$duration}}{{/if}}</td>
<td><a href={{$compte_url}}>{{$account_code}}</a></td>
<td>{{$account_label}}</td>
<td class="actions">
{{if ! $exist_amort}}
{{:linkbutton
label="Modifier infos"
href="modif_infos.html?immo_id=%s&amort=1"|args:$immo_id
shape="settings"
target="_dialog"
}}
{{elseif $amortissable == "nsp"}}
{{:linkbutton
label="Ajouter infos"
href="add_infos.html?immo_id=%s&amort=1"|args:$immo_id
shape="settings"
target="_dialog"
}}
{{/if}}
{{if $amort == "encours" || $amort == "fini"}}
{{:linkbutton
label="Sortir du bilan"
href="balance_sheet_exit.html?immo_id=%s"|args:$immo_id
shape="export"
}}
{{/if}}
{{:linkbutton
label="Amortissements"
href="amortization.html?immo_id=%s&amort=%s"|args:$immo_id:$amort
shape="table"
}}
</td>
</tr>
{{/select}}
</tbody>
</table>
{{if $nb_immo == 0}}
<p class="block alert">Aucune immobilisation</p>
{{/if}}
</section>

129
immobilisations_autres.html Normal file
View File

@ -0,0 +1,129 @@
{{* -*- brindille -*- *}}
{{* Liste des immobilisations non amortissables ou non (encore) gérées *}}
<section class="immobilisation">
<h2 class="ruler">Autres immobilisations</h2>
<table class="list">
<thead>
<tr>
<th></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>
{{* lister les immobilisations *}}
{{:read file="./defaut.json" assign="config_json"}}
{{:assign config_defaut=$config_json|json_decode}}
{{:assign var="prefix_array" value=$config_defaut.prefixes|keys}}
{{:assign condition="("}}
{{#foreach from=$prefix_array item="code"}}
{{:assign code=$code|cat:"%"|quote_sql}}
{{:assign condition=$condition|cat:" account.code LIKE "|cat:$code|cat:" OR "}}
{{/foreach}}
{{:assign condition=$condition|cat:"0)"}}
{{:assign condition=$condition|cat:" AND debit > 0 AND NOT (trans.status & 16)"}}
{{#select
trans.id as trans_id,
trans.label as trans_label,
trans.date as trans_date,
line.id as immo_id,
account.id as account_id,
account.code as account_code,
account.label as account_label,
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
ORDER BY trans.date DESC;
!condition=$condition
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
{{* voir si l'immo est prise en charge *}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$immo_id|intval}}
{{:assign status=$status}}
{{else}}
{{:assign status="nsp"}}
{{/load}}
{{if $status != "ignored" && $status != "nsp"}}
{{:continue}}
{{/if}}
{{*:debug immo_id=$immo_id status=$status*}}
{{* voir s'il existe des écritures d'amortissement associées *}}
{{#select
sum(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
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_id|intval
}}
{{if $amort_amount != null}}
{{:assign ignore=true}}
{{else}}
{{:assign ignore=false}}
{{/if}}
{{/select}}
{{if $ignore}}
{{:continue}}
{{/if}}
<tr>
<td class="num"><a href={{$trans_url}}>#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}</td>
<td class="money">{{"%f"|math:$debit|money:false}}</td>
<td><a href={{$compte_url}}>{{$account_code}}</a></td>
<td>{{$account_label}}</td>
<td class="actions">
{{if $status == "nsp"}}
{{:linkbutton
label="Ajouter infos"
href="add_infos.html?immo_id=%s&amort=1"|args:$immo_id
shape="settings"
target="_dialog"
}}
{{else}}
{{:linkbutton
label="Modifier infos"
href="modif_infos.html?immo_id=%s&amort=0"|args:$immo_id
shape="help"
target="_dialog"
}}
{{/if}}
</td>
</tr>
{{/select}}
</tbody>
</table>
</section>

72
immobilisations_non.html Normal file
View File

@ -0,0 +1,72 @@
{{* -*- brindille -*- *}}
{{* Liste des immobilisations non amortissables *}}
<section class="immobilisation">
<h2 class="ruler">Immobilisations non amortissables</h2>
<table class="list">
<thead>
<tr>
<th></th>
<th>Date</th>
<th>Libellé</th>
<th class="nombre">Montant</th>
<th>N° compte</th>
<th>Compte</th>
<th>Projet</th>
<th class="actions"></th>
</tr>
</thead>
<tbody>
{{#load type="immo" where="$$.status = 'ignored'"}}
{{:assign var="lines." value="'%s'"|args:$line}}
{{/load}}
{{:assign lines=$lines|implode:","}}
{{:assign lines="("|cat:$lines|cat:")"}}
{{:assign condition="line.id IN %s"|args:$lines}}
{{:debug condition=$condition}}
{{#select
trans.id as trans_id,
trans.label as trans_label,
trans.date as trans_date,
line.id as immo_id,
account.id as account_id,
account.code as account_code,
account.label as account_label,
line.debit AS debit,
project.label as project_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
LEFT JOIN acc_projects AS project ON line.id_project = project.id
WHERE !condition
ORDER BY trans.date DESC;
!condition=$condition
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$trans_id}}
{{:assign compte_url="%s/acc/accounts/journal.php?id=%s&year=%s"|args:$admin_url:$account_id:$trans_id_year}}
<tr>
<td class="num"><a href={{$trans_url}}>#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}</td>
<td class="money">{{"%f"|math:$debit|money:false}}</td>
<td><a href={{$compte_url}}>{{$account_code}}</a></td>
<td>{{$account_label}}</td>
<td>{{$project_label}}</td>
<td class="actions">
{{:linkbutton
label="Modifier infos"
href="modif_infos.html?immo_id=%s&amort=0"|args:$immo_id
shape="help"
target="_dialog"
}}
</td>
</tr>
{{/select}}
</tbody>
</table>
</section>

View File

@ -1,112 +1,59 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{:admin_header title="Gestion des amortissements" custom_css=$custom_css current="module_amortissement"}} {{:admin_header title="Gestion des amortissements" custom_css="./style.css" current="module_amortissement"}}
{{* barre de navigation *}} {{* barre de navigation *}}
{{:include file="_nav.html" current="index"}} {{if $_GET.amort == null}}
{{:assign amort="encours"}}
{{else}}
{{:assign amort=$_GET.amort}}
{{/if}}
{{:include file="_nav.html" current="index" subcurrent="%s"|args:$amort}}
{{if $_GET.ok}} {{if $_GET.ok}}
{{if $_GET.msg|match:"immobilisation"}} {{if $_GET.msg|match:"immobilisation"}}
{{:assign msg="Immobilisation enregistrée"}} {{:assign msg="Immobilisation enregistrée"}}
{{elseif $_GET.msg|match:"durée"}} {{elseif $_GET.msg|match:"infos"}}
{{:assign msg="Durée enregistrée"}} {{:assign msg="Informations enregistrées"}}
{{/if}} {{/if}}
<p class="block confirm">{{$msg}}</p> <p class="block confirm">{{$msg}}</p>
{{elseif $_GET.err}} {{elseif $_GET.err}}
<p class="block error">Échec enregistrement immobilisation</p> <p class="block error">Échec enregistrement immobilisation</p>
{{/if}} {{/if}}
{{* lister les immobilisations *}} {{#load type="immo"}}
<section class="immobilisation"> {{* supprimer les documents sans écriture associée *}}
<h2 class="ruler">Liste des immobilisations</h2> {{#select
line.id as 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 = $line
}}
{{else}}
{{:delete key=$key}}
{{/select}}
<table class="list"> {{* supprimer les documents correspondant à une écriture de la balance d'ouverture
<thead> {{#select
<tr> line.id as line_id,
<th></th> trans.status
<th>Date</th> FROM acc_transactions_lines as line
<th>Libellé</th> INNER JOIN acc_transactions AS trans on line.id_transaction = trans.id
<th>Montant</th> WHERE line.id = :line_id AND (trans.status & 16);
<th>Durée</th> :line_id = $line
<th>N° compte</th> }}
<th>Compte</th> {{:delete key=$key}}
<th>Projet</th> {{/select}}
<th class="actions"></th> *}}
</tr> {{/load}}
</thead>
<tbody>
{{*
TODO améliorer cette requête : voir si assez général
*}}
{{#select {{if $amort == "autres"}}
trans.id as trans_id, {{:include file="./immobilisations_autres.html"}}
trans.label as trans_label, {{elseif $amort == "archive"}}
trans.date as trans_date, {{:include file="archives.html"}}
line.id as line_id, {{elseif $amort == "encours" || $amort == "fini"}}
account.code as account_code, {{:include file="./immobilisations.html"}}
account.label as account_label, {{/if}}
line.debit AS debit,
project.label as project_label
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
LEFT JOIN acc_projects AS project ON line.id_project = project.id
WHERE
(account.code LIKE '21%' OR account.code LIKE '22%')
ORDER BY trans.date DESC
}}
{{:assign trans_url="%s/acc/transactions/details.php?id=%s"|args:$admin_url:$trans_id}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$line_id|intval}}
{{*:debug info_immo=$info_immo*}}
{{:assign duration=$duration}}
{{else}}
{{:assign duration=null}}
{{/load}}
{{*:debug duration=$duration*}}
<tr>
<td class="num"><a href={{$trans_url}}>#{{$trans_id}}</a></td>
<td>{{$trans_date|date_short}}</td>
<td>{{$trans_label}}</td>
<td class="money">{{"%f"|math:$debit|money}}</td>
<td class="num">{{if $duration != null}}{{$duration}}{{/if}}</td>
<td>{{$account_code}}</td>
<td>{{$account_label}}</td>
<td>{{$project_label}}</td>
<td class="actions">
{{if $duration == null}}
{{:linkbutton
label="Ajouter durée"
href="add_duration.html?line_id=%s"|args:$line_id
shape="help"
target="_dialog"
}}
{{else}}
{{:linkbutton
label="Amortissements"
href="amortization.html?line_id=%s"|args:$line_id
shape="table"
}}
{{/if}}
</td>
</tr>
{{/select}}
</tbody>
</table>
</section>
<form method="post" action="">
<fieldset>
<legend>Ajouter une immobilisation</legend>
<p class="submit">
{{:linkbutton
label="Ajouter une immobilisation"
shape="plus"
href="add_asset.html"
target="_dialog"
}}
</p>
</fieldset>
</form>
{{:admin_footer}} {{:admin_footer}}

118
modif_infos.html Normal file
View File

@ -0,0 +1,118 @@
{{* -*- brindille -*- *}}
{{:admin_header title="Modifier informations amortissement" custom_css=$custom_css current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index"}}
{{/if}}
{{* infos de l'immobilisation *}}
{{:assign var="immo_id" value=$_GET.immo_id|intval}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$immo_id|intval}}
{{/load}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="change"}}
{{* chercher la date d'acquisition de l'immobilisation *}}
{{#select
trans.date as date_achat
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 = $immo_id
assign=ligne_immo
}}
{{/select}}
{{if $_POST.no_amort}}
{{* ne pas amortir *}}
{{:assign duration=0}}
{{:assign date_debut=$ligne_immo.date_achat|parse_date}}
{{:assign status="ignored"}}
{{else}}
{{* vérifier que la date d'acquisition est antérieure à la date de mise en service *}}
{{:assign date_debut=$_POST.date_mes|or:$ligne_immo.date_achat|parse_date}}
{{if $date_debut|strtotime < $ligne_immo.date_achat|strtotime}}
{{:assign dd=$date_debut|date_short}}
{{:assign da=$ligne_immo.date_achat|date_short}}
{{:error message="Erreur : la date de mise en service (%s) ne peut être antérieure à la date d'acquisition (%s)"|args:$dd:$da}}
{{/if}}
{{:assign duration=$_POST.duree|intval}}
{{if $duration <= 0}}
{{:error message="Erreur : la durée d'amortissement doit être strictement positive"}}
{{/if}}
{{:assign status="managed"}}
{{/if}}
{{* enregistrer les infos modifiées de l'immobilisation *}}
{{:save
key=$info_immo.key
validate_schema="schema.json"
type="immo"
line=$immo_id
duration=$duration
date=$date_debut
status=$status
}}
{{if $_POST.no_amort}}
{{:assign amort="autres"}}
{{else}}
{{:assign amort="encours"}}
{{/if}}
{{:redirect force="index.html?ok=1&msg=infos&amort=%s"|args:$amort}}
{{else}}
{{:form_errors}}
{{/form}}
{{* modifier la date de mise en service et durée d'amortissement *}}
{{if $_GET.amort == 0}}
{{:assign checked=1}}
{{:assign disabled=1}}
{{else}}
{{:assign checked=0}}
{{:assign disabled=0}}
{{/if}}
<form method="post" action="">
<fieldset id="infos_immo">
<legend></legend>
<dl>
{{if $checked}}
{{:assign helptext = "Dé-cocher pour amortir"}}
{{else}}
{{:assign helptext = "Cocher pour ne pas amortir"}}
{{/if}}
{{:input id="no_amort" type="checkbox" value=1 name="no_amort" label="Ne pas amortir" default=$checked help=$helptext onclick="toggleInputs('infos_immo','f_no_amort_1')"}}
{{:input type="date" name="date_mes" label="Date de mise en service" default=$info_immo.date disabled=$disabled help="à renseigner uniquement si différente de la date d'acquisition"}}
{{:input type="number" name="duree" label="Durée d'amortissement" default=$info_immo.duration required=true min=1 disabled=$disabled}}
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="change" label="Modifier" shape="right" class="main"}}
</p>
</form>
{{* activer/désactiver les champs de saisie *}}
<script type="text/javascript">
function toggleInputs(idfs, idcb) {
const noamort = document.getElementById(idcb);
const fs = document.getElementById(idfs);
for (let field of fs.querySelectorAll("input")) {
if (field == noamort) { continue }
if (noamort.checked) {
field.setAttribute("disabled","disabled");
}
else {
field.removeAttribute("disabled");
}
}
}
</script>
{{:admin_footer}}

View File

@ -1,5 +1,5 @@
name="Gestion des amortissements" name="Amortissements"
description="Gestion des amortissements pour le logiciel de comptabilité Paheko" description="Gestion des amortissements pour le logiciel de comptabilité Paheko (v0.16)"
author="Jean-Christophe Engel" author="Jean-Christophe Engel"
author_url="https://git.roflcopter.fr/lesanges" author_url="https://git.roflcopter.fr/lesanges"
home_button=false home_button=false

View File

@ -1,81 +1,254 @@
{{* -*- brindille -*- *}} {{* -*- brindille -*- *}}
{{:admin_header title="Ajout amortissement" current="module_amortissement"}} {{*
Créer une écriture d'amortissement
@param immo_id : id de la ligne d'immobilisation
*}}
{{* barre de navigation *}} {{* Infos de l'immobilisation *}}
{{if ! $dialog}} {{#select
{{:include file="_nav.html" current="amortization"}} line.id as immo_id,
line.id_account as account_id,
line.debit as montant,
line.id_project as project_id,
trans.id as trans_id,
trans.label,
trans.date,
y.id as year_id,
y.start_date,
y.end_date,
project.label as project_label
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
INNER JOIN acc_years AS y ON trans.id_year = y.id
LEFT JOIN acc_projects AS project ON line.id_project = project.id
WHERE line.id = :line_id;
:line_id = $_GET.immo_id|intval
assign=ligne_immo
}}
{{else}}
{{:error message="Immobilisation %s non trouvée"|args:$_GET.immo_id}}
{{/select}}
{{:assign date_debut=$ligne_immo.date}}
{{#load type="immo" where="$$.line = :line_id" :line_id=$_GET.immo_id|intval}}
{{:assign duree=$duration}}
{{:assign date_debut=$date}}
{{else}}
{{:error message="Vous devez renseigner la date de mise en service et la durée d'immobilisation"}}
{{/load}}
{{* chercher des écritures d'amortissement liées à l'immobilisation *}}
{{#select
SUM(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,
MAX(trans.date) as amort_date,
COUNT(trans.id) as amort_number,
trans.label as trans_label,
trans.id_year as amort_year,
account.id as account_id,
account.code as account_code,
account.label as account_label
FROM acc_transactions_lines as l_immo
INNER JOIN acc_transactions as t_immo on t_immo.id = l_immo.id_transaction
INNER JOIN acc_transactions_links as links
ON (t_immo.id = links.id_transaction
OR
t_immo.id = links.id_related)
INNER JOIN acc_transactions_lines as l_amort on amort_trans_id = l_amort.id_transaction
INNER join acc_transactions as trans on l_amort.id_transaction = trans.id
INNER join acc_accounts as account on l_amort.id_account = account.id
WHERE l_immo.id = :line_id AND account.code LIKE '28%'
ORDER BY trans.date DESC LIMIT 1;
:line_id = $_GET.immo_id|intval
assign=amort_line
}}
{{/select}}
{{if $amort_line.amort_number == 0}}
{{* 1er amortissement *}}
{{* déterminer le compte d'amortissement en fonction du compte d'immobilisation *}}
{{#select code, label from acc_accounts where id = :id; :id=$ligne_immo.account_id assign=amort_account}}
{{/select}}
{{:include
file="./_get_amort_code.html"
code_immo=$amort_account.code
keep="code_amort"
}}
{{:assign var=amort_label value="Amortissement %s"|args:$amort_account.label}}
{{:assign var=libelle value="Amortissement %s"|args:$ligne_immo.label}}
{{else}}
{{* amortissements suivants *}}
{{:assign date_debut=$amort_line.amort_date|strtotime}}
{{:assign date_debut="%d+(60*60*24)"|math:$date_debut|date:"Y-m-d"}}
{{:assign var=code_amort value=$amort_line.account_code}}
{{:assign var=amort_label value=$amort_line.account_label}}
{{:assign var=libelle value=$amort_line.amort_label}}
{{/if}} {{/if}}
{{*
lister les exercices qui englobent la date de mise en service de l'immo
ou la date du dernier amortissement
*}}
{{:assign msg_years=""}}
{{#years closed=false order="start_date" where="start_date <= :debut AND :debut <= end_date"
:debut=$date_debut assign=years.}}
{{if $amort_line.amort_number == 0}}
{{:assign ts_debut=$date_debut|strtotime}}
{{else}}
{{:assign ts_debut=$start_date|strtotime}}
{{/if}}
{{:assign ts_fin=$end_date|strtotime}}
{{:assign debut=$start_date|date_short}}
{{:assign fin=$end_date|date_short}}
{{:assign var="open_years.%d"|args:$id value=$label|cat:" (du "|cat:$debut|cat:" au "|cat:$fin|cat:")"}}
{{:assign var="years_data.%d"|args:$id value=$ts_debut|cat:" "|cat:$ts_fin}}
{{:assign msg_years=$msg_years|cat:"\n"|cat:" - "|cat:$label|cat:" : "|cat:$debut|cat:" à "|cat:$fin}}
{{else}}
{{:error message="Aucun exercice ouvert pour enregistrer un amortissement"}}
{{/years}}
{{* Traiter l'envoi du formulaire *}} {{* Traiter l'envoi du formulaire *}}
{{#form on="save"}} {{#form on="save"}}
{{* enregistrer l'écriture *}} {{* vérifier que la date est située dans un exercice compatible *}}
{{:assign var="linked_transactions." value=$_GET.trans_id}} {{:assign ts_date = $_POST.date_amort|parse_date|strtotime}}
{{:assign ok=false}}
{{#foreach from=$years}}
{{if $id == $_POST.id_year}}
{{:assign selected_chart=$id_chart}}
{{if $start_date|strtotime <= $ts_date && $ts_date <= $end_date|strtotime}}
{{:assign ok=true}}
{{:break}}
{{/if}}
{{/if}}
{{/foreach}}
{{if ! $ok}}
{{:error message="La date choisie n'est dans aucun exercice compatible !\nExercices compatibles : %s"|args:$msg_years}}
{{/if}}
{{* déterminer le numéro des comptes au cas où la clé serait un identifiant *}}
{{:include
file="_get_codes.html"
account=$_POST.debit_account
keep="account_code"
}}
{{:assign debit_account=$account_code}}
{{:include
file="_get_codes.html"
account=$_POST.credit_account
keep="account_code"
}}
{{:assign credit_account=$account_code}}
{{* vérifier :
- que le compte d'amortissement débute par un préfixe correct (280, 281, ...)
- est présent dans le PC de l'exercice correspondant à la date
*}}
{{:read file="./defaut.json" assign="config_json"}}
{{:assign config_defaut=$config_json|json_decode}}
{{:assign var="prefix_array" value=$config_defaut.prefixes|keys}}
{{#foreach from=$prefix_array item="code"}}
{{* déterminer le numéro du compte d'amortissement associé au compte d'immobilisation *}}
{{:include
file="./_get_amort_code.html"
code_immo=$code
keep="code_amort"
}}
{{:assign var="amort_array." value=$code_amort|intval}}
{{/foreach}}
{{:include
file="_check_account.html"
account=$credit_account
chart_id=$selected_chart
prefix_array=$amort_array
keep="account_ok"
}}
{{if $account_ok == null}}
{{:assign compte=$credit_account|implode:""}}
{{:redirect url="add_account.html?account=%s&chart=%s&immo_id=%s"|args:$compte:$selected_chart:$_GET.immo_id}}
{{/if}}
{{* vérifier que le montant ne dépasse pas le solde restant *}}
{{:assign solde="%d-%d"|math:$ligne_immo.montant:$amort_line.amort_amount}}
{{if $_POST.montant|trim|money_int > $solde|intval}}
{{:assign solde=$solde|money_raw}}
{{:error message="Le montant indiqué « %s » dépasse le solde à amortir « %s »"|args:$_POST.montant:$solde}}
{{/if}}
{{* enregistrer l'écriture *}}
{{:assign {{:assign
var="lines." var="lines."
debit=$_POST.montant debit=$_POST.montant
account=$_POST.debit_account|keys|key:0 account=$debit_account|keys|key:0
id_project=$_GET.project_id id_project=$_GET.project_id
label=$_POST.designation label=$_POST.designation
}} }}
{{:assign {{:assign
var="lines." var="lines."
credit=$_POST.montant credit=$_POST.montant
account=$_POST.credit_account|keys|key:0 account=$credit_account|keys|key:0
id_project=$_GET.project_id id_project=$_GET.project_id
label=$_POST.designation label=$_POST.designation
}} }}
{{:api {{:api
method="POST" method="POST"
path="accounting/transaction" path="accounting/transaction"
assign="result" assign="result"
assign_code="result_code" assign_code="result_code"
id_year=$_POST.id_year|intval id_year=$_POST.id_year
type="advanced" type="advanced"
date=$_POST.date date=$_POST.date_amort
label=$_POST.designation label=$_POST.designation
lines=$lines lines=$lines
linked_transactions=$_GET.trans_id|intval linked_transactions=$ligne_immo.trans_id|intval
}} }}
{{:redirect force="amortization.html?line_id=%s&ok=1&msg=amortissement"|args:$_GET.line_id}} {{:redirect force="amortization.html?immo_id=%s&ok=1&msg=amortissement"|args:$_GET.immo_id}}
{{/form}} {{/form}}
{{* Préparer les infos pour le formulaire *}} {{:admin_header title="Ajout amortissement" current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subcurrent="encours" subsubcurrent="amortization"}}
{{/if}}
{{:form_errors}}
{{:assign var=selected_year value=$years.0.id}}
{{:assign var=date_amort value=$years.0.end_date}}
{{:include file="_calcul_dates.html" date_debut=$date_debut date_fin=$date_amort keep="nbjours"}}
{{* montant de l'amortissement *}}
{{:assign montant_amort="%f/%f/365*%d"|math:$ligne_immo.montant:$duree:$nbjours|intval}}
{{:assign montant_amort="min(%f, %d-%d)"|math:$montant_amort:$ligne_immo.montant:$amort_line.amort_amount}}
{{:assign var="debit_account.6811" value="6811 — Dot. aux amortissements des immobilisations"}} {{:assign var="debit_account.6811" value="6811 — Dot. aux amortissements des immobilisations"}}
{{:assign var="credit_account.%s"|args:$code_amort value="%s — "|args:$code_amort|cat:$amort_label}}
{{* {{* -------------------------------------------------------------------------------- *}}
déterminer le compte d'amortissement en fonction du compte
d'immobilisation => ajouter un 8 après le 2 de tête
*}}
{{#select code, label from acc_accounts where id = :id; :id=$_GET.account assign=amort_account}}{{/select}}
{{:assign c1=$amort_account.code|substr:0:1}}
{{:assign reste=$amort_account.code|substr:1}}
{{:assign amort_code=$c1|cat:8|cat:$reste}}
{{:assign var="credit_account.%s"|args:$amort_code value="%s — Amortissements "|args:$amort_code|cat:$amort_account.label}}
{{#select id, label, end_date from acc_years where id=:id; :id=$_GET.year assign=year}}{{/select}} <div id="f_erreur" class="hidden">
<p class="block error">La date saisie n'est pas dans l'exercice choisi !</p>
{{#years closed=false}} </div>
{{:assign var="open_years.%d"|args:$id value=$label}}
{{/years}}
<form method="post" action=""> <form method="post" action="">
<fieldset class="ajout_amort"> <fieldset class="ajout_amort">
<legend>Ajouter une écriture d'amortissement</legend> <legend>Ajouter une écriture d'amortissement</legend>
<dl> <dl>
{{:input type="select" default=$year.id name="id_year" label="Exercice" required=true options=$open_years}} {{:input type="select" default=$selected_year name="id_year" label="Exercice" required=true default_empty="— Faire un choix —" options=$open_years}}
{{:input type="date" name="date" label="Date" required=true default=$year.end_date|date_short}} {{:input type="date" name="date_amort" label="Date" required=true default=$date_amort|date_short}}
{{:input type="text" name="designation" label="Désignation" required=true default=$_GET.label}} {{:input type="text" name="designation" label="Désignation" required=true default=$libelle}}
{{:input type="money" name="montant" label="Montant" required=true default=$_GET.amount}} {{:input type="money" name="montant" label="Montant" required=true default=$montant_amort}}
{{:input {{:input
type="list" type="list"
name="debit_account" name="debit_account"
label="Compte de débit" label="Compte de débit"
required=true required=true
target="!acc/charts/accounts/selector.php?&key=code&year=%d"|args:$year.id target="!acc/charts/accounts/selector.php?codes=%s&id_year=%d"|args:"68*":$selected_year
default=$debit_account default=$debit_account
}} }}
{{:input {{:input
@ -83,9 +256,15 @@
name="credit_account" name="credit_account"
label="Compte d'amortissement (280xx ou 281xx)" label="Compte d'amortissement (280xx ou 281xx)"
required=true required=true
target="!acc/charts/accounts/selector.php?key=code&year=%d"|args:$year.id target="!acc/charts/accounts/selector.php?codes=%s&id_year=%d"|args:"28*":$selected_year
default=$credit_account default=$credit_account
}} }}
<div id="donnees" class="hidden">
{{:input type="text" name="montant_immo" default=$ligne_immo.montant}}
{{:input type="text" name="duree_amort" default=$duree}}
{{:input type="text" name="somme_amort" default=$amort_line.amort_amount}}
{{:input type="select" name="years_data" options=$years_data}}
</div>
</dl> </dl>
</fieldset> </fieldset>
@ -94,3 +273,48 @@
</p> </p>
</form> </form>
{{:admin_footer}} {{:admin_footer}}
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript">
/*
afficher la date de fin de l'exercice choisi
mettre à jour le numéro d'exercice dans les sélecteur de comptes
recalculer le montant de l'amortissement
*/
function redisplayData(evt,
f_immo = 'f_montant_immo',
f_duree = 'f_duree_amort',
f_amort = 'f_somme_amort',
f_years_data = 'f_years_data',
f_years_select = 'f_id_year',
f_date = 'f_date_amort',
f_montant = 'f_montant',
f_erreur = 'f_erreur'
)
{
setDateEnd(f_years_select, f_date, f_years_data);
setSelectorYear(['credit_account', 'debit_account'], f_years_select);
displayAmort(f_immo, f_duree, f_amort, f_years_data, f_years_select, f_montant, f_erreur);
}
function redisplayAmort(evt,
f_immo = 'f_montant_immo',
f_duree = 'f_duree_amort',
f_amort = 'f_somme_amort',
f_years_data = 'f_years_data',
f_years_select = 'f_id_year',
f_date = 'f_date_amort',
f_montant = 'f_montant',
f_erreur = 'f_erreur'
)
{
displayAmort(f_immo, f_duree, f_amort, f_years_data, f_years_select, f_montant, f_erreur, f_date);
}
(function () {
setDateEnd('f_id_year', 'f_date_amort', 'f_years_data');
document.getElementById('f_id_year').onchange = redisplayData;
document.getElementById('f_date_amort').onchange = redisplayAmort;
})();
</script>

View File

@ -14,13 +14,15 @@
"description": "durée de l'amortissement en années", "description": "durée de l'amortissement en années",
"type": "integer" "type": "integer"
}, },
"amort" : { "date" : {
"description": "id lignes écritures amortissements", "description" : "date de mise en service de l'immobilisation",
"type": ["array", "null"], "type" : ["string", "null"],
"items": { "format" : "date"
"type": "integer" },
} "status" : {
"type" : ["string", "null"],
"enum" : ["managed", "archived", "ignored"]
} }
}, },
"required": ["type", "line", "duration"] "required": ["type", "line", "duration", "date"]
} }

141
scripts.js Normal file
View File

@ -0,0 +1,141 @@
// activer/désactiver les champs passés en paramètres
function toggleInputs(idcb, idfields) {
const elem = document.getElementById(idcb);
for (let id of idfields) {
const field = document.getElementById(id);
if (elem.checked) {
field.removeAttribute("disabled");
}
else {
field.setAttribute("disabled","disabled");
}
}
}
function toggleVisibility(idcheck, fields) {
const elem = document.getElementById(idcheck);
for (let id of fields) {
const field = document.getElementById(id);
if (elem.checked) {
field.setAttribute('class', '');
} else {
field.setAttribute('class', 'hidden');
}
}
}
// fixer l'exercice des sélecteurs de compte
function setAccountYear(button_names, id_year) {
for (const name of button_names) {
const button = document.querySelector("button[data-name=" + name + "]");
const b_value = button.value;
const new_value = b_value.replace(/id_year=\d+/, 'id_year=' + id_year);
button.setAttribute('value', new_value);
}
}
/**
* renvoyer la valeur en secondes d'une date au format j/m/a
* @param {string} date
*/
function str2sec(date) {
const jma = date.split('/');
const dd = new Date(jma[2], jma[1]-1, jma[0]);
return dd.getTime()/1000;
}
// renvoyer la valeur en secondes d'un champ date
function getDate(idelem) {
return str2sec(document.getElementById(idelem).value);
}
// (unused) désactiver les options du sélecteur qui ne sont pas dans un tableau de valeurs
function disableOptions(idSelect, init, values) {
for (let i = init; i < idSelect.options.length; ++i) {
const choix = idSelect.options[i];
if (! values.includes(choix.value)) {
choix.setAttribute('disabled', 'true');
choix.removeAttribute('selected');
}
}
}
// afficher la date de fin de l'exercice choisi
function setDateEnd(id_exercices, id_date, id_years) {
const selected_year = document.getElementById(id_exercices).value;
if (selected_year == '') {
document.getElementById(id_date).value = '';
return;
}
const years_data = document.getElementById(id_years);
for (const choix of years_data.options) {
if (choix.value == selected_year) {
const epox = choix.text.split(' ');
const date_fin = new Date(epox[1] * 1000);
document.getElementById(id_date).value = date_fin.toLocaleDateString();
break;
}
}
}
// renvoyer la valeur numérique d'un montant formaté en €
function getNumber(text) {
return Number(text.replace(/ /g, '').replace(/,/, '.').replace(/€/, ''));
}
// calculer le montant d'un amortissement
// @param montant immo
// @param durée immo (années)
// @param somme amortissements
// @param date début
// @param date de fin
// @result montant de l'amortissement
function computeAmort(montant_immo, duree_immo, somme_amort, date_debut, date_fin) {
const nbjours = 1 + (date_fin - date_debut) / (60*60*24);
return Math.round(Math.min(montant_immo / duree_immo / 365 * nbjours, montant_immo - somme_amort));
}
// calculer et afficher le montant de l'amortissement
function displayAmort(id_immo, id_duree, id_amort, id_years, id_exercices, id_montant, id_erreur, id_date=null)
{
const div_erreur = document.getElementById(id_erreur);
div_erreur.setAttribute('class', 'hidden');
// document.getElementById(id_erreur).setAttribute('class', 'hidden');
let case_montant = document.getElementById(id_montant);
const selected_year = document.getElementById(id_exercices).value;
if (selected_year == '') {
case_montant.value = '';
return;
}
const years_data = document.getElementById(id_years);
let date_debut, date_fin;
for (const choix of years_data.options) {
if (choix.value == selected_year) {
const epox = choix.text.split(' ');
date_debut = epox[0];
date_fin = epox[1];
break;
}
}
if (id_date != null) {
const date_choisie = str2sec(document.getElementById(id_date).value);
console.log("date_choisie = " + date_choisie + ", date_debut=" + date_debut + ", date_fin = " + date_fin);
if (date_debut <= date_choisie && date_choisie <= date_fin) {
date_fin = date_choisie;
} else {
div_erreur.setAttribute('class', '');
// document.getElementById(id_erreur).setAttribute('class', '');
}
}
const montant_immo = Number(document.getElementById(id_immo).value);
const duree_immo = Number(document.getElementById(id_duree).value);
const somme_amort = Number(document.getElementById(id_amort).value);
const montant_amort = computeAmort(montant_immo, duree_immo, somme_amort, date_debut, date_fin);
case_montant.value = montant_amort/100;
case_montant.innerText = montant_amort;
}
function setSelectorYear(button_names, f_years_selector) {
const selected_year = document.getElementById(f_years_selector).value;
setAccountYear(button_names, selected_year);
}

View File

@ -2,3 +2,42 @@
pointer-events: none; pointer-events: none;
font-style : oblique; font-style : oblique;
} }
.nombre {
text-align: right !important;
}
.aide {
list-style: revert;
padding: revert;
line-height : 1.5em;
}
h2[class="aide"], h3[class="aide"] {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.informations {
margin-top : 0.5em;
margin-bottom : 0.5em;
padding : 0.5em;
}
.informations legend {
font-weight: bold;
border-bottom : solid 1px var(--gLightBorderColor);
margin-bottom : 0.5em;
}
.informations dt::after {
content: ' :';
}
.informations dl.describe > dt {
margin-right: 0;
}
nav.amort aside {
margin-top : 0;
}

536
write_exit.html Normal file
View File

@ -0,0 +1,536 @@
{{* -*- brindille -*- *}}
{{*
Enregistrer les écritures de sortie du bilan
paramètres :
- immo_id : numéro de ligne de l'écriture d'immobilisation
- amort_amount : montant des amortissements
- year : exercice de la date de sortie de l'immobilisation
- date_mes : date de mise en service de l'immobilisation
- date_debut : date de début de la période d'amortissement complémentaire
- exit_date : date de sortie de l'immobilisation
- duree_amort : durée de l'amortiseement (optionnel)
- cession : montant de la cession (optionnel)
*}}
{{#select
line.debit as montant,
line.id_transaction,
line.id_account,
trans.date as date_achat,
trans.label,
id_project
FROM acc_transactions_lines AS line
INNER JOIN acc_transactions AS trans ON line.id_transaction = trans.id
WHERE line.id = :immo_id;
:immo_id = $_GET.immo_id|intval
assign="ligne_immo"
}}
{{/select}}
{{#load type="immo" assign="info_immo" where="$$.line = :line_id" :line_id=$_GET.immo_id|intval}}
{{/load}}
{{* date de début de l'exercice *}}
{{#select start_date FROM acc_years WHERE id = :year_id; :year_id = $_GET.year}}
{{*:assign date_debut=$start_date*}}
{{/select}}
{{*if $date_debut < "2025-01-01"*}}
{{:assign vnc_code=675}}
{{:assign cession_code=775}}
{{*
{{else}}
{{:assign vnc_code=657}}
{{:assign cession_code=757}}
{{/if}}
*}}
{{:assign valeur_nette="%f-%f"|math:$ligne_immo.montant:$_GET.amort_amount}}
{{:assign amort_comp=0}} {{* amortissement complémentaire jqà date sortie *}}
{{:assign amort_except=0}} {{* amortissement exceptionnel jqà date fin amortissement *}}
{{if $valeur_nette > 0}}
{{:assign nbjours="1+(%d-%d)/(60*60*24)"|math:$_GET.exit_date:$_GET.date_debut}}
{{:assign annuite="%f/%f"|math:$ligne_immo.montant:$_GET.duree_amort}}
{{:assign amort_comp="round(%f/365*%f, 0)"|math:$annuite:$nbjours}}
{{:assign amort_comp="min(%f, %f)"|math:$valeur_nette:$amort_comp}}
{{if $_GET.cession == null}}
{{:assign amort_except="%f-%f-%f"|math:$ligne_immo.montant:$_GET.amort_amount:$amort_comp}}
{{/if}}
{{/if}}
{{if $_GET.cession == null}}
{{:assign montant_cession=0}}
{{else}}
{{:assign montant_cession="%f*100"|math:$_GET.cession}}
{{/if}}
{{* TODO : faut-il forcer les 3 sélecteurs de compte d'amortissement à avoir toujours la même valeur ? *}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save"}}
{{*
{{if $_POST.amort_comp_account != null}
{{:assign account=$_POST.amort_comp_account}}
{{elseif $_POST.amort_except_account != null}
{{:assign account=$_POST.amort_except_account}}
{{elseif $_POST.amort_sortie_account != null}
{{:assign account=$_POST.amort_sortie_account}}
{{/if}}
*}}
{{:assign account=$_POST.amort_sortie_account}}
{{:include
file="_get_codes.html"
account=$account
keep="account_code"
}}
{{:assign amort_account=$account_code|keys|key:0}}
{{if $valeur_nette > 0}}
{{* immo non totalement amortie *}}
{{* lignes d'écriture de l'amortissement complémentaire *}}
{{:include
file="_get_codes.html"
account=$_POST.comp_account
keep="account_code"
}}
{{:assign comp_account=$account_code|keys|key:0}}
{{:assign libelle="Amortissement complémentaire "|cat:$ligne_immo.label}}
{{:assign
var="lines."
debit="%f/100"|math:$amort_comp
account=$comp_account
id_project=$ligne_immo.id_project
label=$libelle
}}
{{:assign
var="lines."
credit="%f/100"|math:$amort_comp
account=$amort_account
id_project=$ligne_immo.id_project
label=$libelle
}}
{{:assign valeur_nette="%f-%f"|math:$valeur_nette:$amort_comp}}
{{if $_GET.cession == null && $amort_except > 0}}
{{* lignes d'écriture de l'amortissement exceptionnel *}}
{{:include
file="_get_codes.html"
account=$_POST.except_account
keep="account_code"
}}
{{:assign except_account=$account_code|keys|key:0}}
{{:assign libelle="Amortissement exceptionnel "|cat:$ligne_immo.label}}
{{:assign
var="lines."
debit="%f/100"|math:$amort_except
account=$except_account
id_project=$ligne_immo.id_project
label=$libelle
}}
{{:assign
var="lines."
credit="%f/100"|math:$amort_except
account=$amort_account
id_project=$ligne_immo.id_project
label=$libelle
}}
{{:assign valeur_nette="%f-%f"|math:$valeur_nette:$amort_except}}
{{/if}}
{{:api
method="POST"
path="accounting/transaction"
assign="result"
assign_code="result_code"
id_year=$_GET.year
type="advanced"
date=$_GET.exit_date
label="Amortissement final "|cat:$ligne_immo.label
lines=$lines
linked_transactions=$ligne_immo.id_transaction
}}
{{/if}}
{{* écriture de sortie du bilan *}}
{{:assign libelle="Sortie du bilan de "|cat:$ligne_immo.label}}
{{:assign lines=null}}
{{:assign
var="lines."
id_account=$ligne_immo.id_account
credit="%f/100"|math:$ligne_immo.montant
id_project=$ligne_immo.id_project
label=$libelle
}}
{{:assign
var="lines."
account=$amort_account
debit="(%f-%f)/100"|math:$ligne_immo.montant:$valeur_nette
id_project=$ligne_immo.id_project
label=$libelle
}}
{{if $valeur_nette > 0}}
{{:assign
var="lines."
account=$vnc_code
debit="%f/100"|math:$valeur_nette
id_project=$ligne_immo.id_project
label=$libelle
}}
{{/if}}
{{:api
method="POST"
path="accounting/transaction"
assign="result"
assign_code="result_code"
id_year=$_GET.year
type="advanced"
date=$_GET.exit_date
label=$libelle
lines=$lines
linked_transactions=$ligne_immo.id_transaction
}}
{{if $montant_cession > 0}}
{{* Cession de l'immobilisation *}}
{{:assign libelle="Produit cession "|cat:$ligne_immo.label}}
{{:include
file="_get_codes.html"
account=$_POST.creance_account
keep="account_code"
}}
{{:assign creance_account=$account_code|keys|key:0}}
{{:include
file="_get_codes.html"
account=$_POST.cession_account
keep="account_code"
}}
{{:assign cession_account=$account_code|keys|key:0}}
{{:api
method="POST"
path="accounting/transaction"
assign="result"
assign_code="result_code"
id_year=$_GET.year
type="credit"
date=$_GET.exit_date
label=$libelle
amount="%f/100"|math:$montant_cession
debit=$creance_account
credit=$cession_account
id_project=$ligne_immo.id_project
linked_transactions=$ligne_immo.id_transaction
}}
{{/if}}
{{if $info_immo != null}}
{{* mettre à jour l'état de l'immobilisation *}}
{{:save
key=$info_immo.key
status="archived"
}}
{{else}}
{{:save
key=""|uuid
validate_schema="schema.json"
type="immo"
line=$_GET.immo_id|intval
duration=$_GET.duree_amort|intval
date=$_GET.date_mes|date:"Y-m-d"
status="archived"
}}
{{/if}}
{{:redirect to="index.html?amort=archive"}}
{{/form}}
{{:admin_header title="Sortie du bilan" custom_css="./style.css" current="module_amortissement"}}
{{* barre de navigation *}}
{{if ! $dialog}}
{{:include file="_nav.html" current="index" subsubcurrent="balance_exit"}}
{{/if}}
{{:form_errors}}
{{* Préparer les infos pour le formulaire *}}
{{* déterminer les comptes pour les différentes écritures *}}
{{:assign var="comp_account.6811" value="6811 — Dot. aux amortissements des immobilisations"}}
{{:assign var="except_account.687" value="687 — Dot. aux amortissements & provisions - Charges exceptionnelles"}}
{{#select code, label from acc_accounts where id = :id;
:id=$ligne_immo.id_account
assign=immo_account_info
}}
{{/select}}
{{:include
file="./_get_amort_code.html"
code_immo=$immo_account_info.code
keep="code_amort"
}}
{{:assign
var="amort_account.%s"|args:$code_amort
value="%s — Amortissements "|args:$code_amort|cat:$immo_account_info.label}}
{{:assign
var="immo_account.%s"|args:$immo_account_info.code
value="%s — Immobilisation "|args::$immo_account_info.code|cat:$immo_account_info.label}}
{{:assign
var="vnc_account.%s"|args:$vnc_code
value="%s — Valeurs comptables des éléments d'actifs cédés"|args:$vnc_code}}
{{:assign
var="cession_account.%s"|args:$cession_code
value="%s — Produits des cessions d'actif"|args:$cession_code}}
{{:assign var="creance_account.462" value="462 — Créances sur cessions d'immobilisations"}}
{{:read file="./defaut.json" assign="config_json"}}
{{:assign config_defaut=$config_json|json_decode}}
{{:assign var="prefix_array" value=$config_defaut.prefixes|keys}}
{{#foreach from=$prefix_array item="code"}}
{{:assign var="pattern_array." value="%s*"|args:$code}}
{{/foreach}}
{{:assign patterns=$pattern_array|implode:"|"}}
<h3>Sortir l'immobilisation « {{$ligne_immo.label}} » du bilan</h3>
<form method="post" action="">
<div class="informations">
<legend>Données de l'imobilisation</legend>
<dl class="describe">
<dt>Montant</dt>
<dd class="money">{{$ligne_immo.montant|money_currency:false}}</dd>
<dt>Date d'acquisition</dt>
<dd >{{$ligne_immo.date_achat|date_short}}</dd>
{{if $_GET.date_mes != $ligne_immo.date_achat|strtotime}}
<dt>Date de mise en service</dt>
<dd>{{$_GET.date_mes|date:"d/m/Y"}}</dd>
{{/if}}
{{if $_GET.duree_amort != null}}
<dt>Durée de l'amortissement</dt>
<dd class="num">{{$_GET.duree_amort}} ans</dd>
{{/if}}
<dt>Montant des amortissements</dt>
<dd class="money">{{$_GET.amort_amount|money_currency:false}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Valeur nette résiduelle</dt>
<dd class="money">{{$valeur_nette|money_currency:false}} <span class="help">(à la date de début de l'exercice)</span></dd>
<dt>Date de sortie</dt>
<dd>{{$_GET.exit_date|date:"d/m/Y"}}</dd>
{{if $amort_comp > 0}}
{{:assign valeur_nette="%f-%f"|math:$valeur_nette:$amort_comp}}
<dt>Amortissement complémentaire</dt>
<dd class="money">{{$amort_comp|money_currency:false}} <span class="help">(jusqu'à la date de sortie)</span></dd>
<dt>Total des amortissements</dt>
<dd class="money">{{"%f+%f"|math:$_GET.amort_amount:$amort_comp|money_currency:false}} <span class="help">(à la date de sortie)</span></dd>
<dt>Valeur nette résiduelle</dt>
<dd class="money">{{$valeur_nette|money_currency:false}} <span class="help">(à la date de sortie)</span></dd>
{{/if}}
{{if $montant_cession == 0}}
{{if $amort_except > 0}}
<dt>Amortissement exceptionnel</dt>
<dd class="money">{{$amort_except|money_currency:false}}</dd>
{{/if}}
{{else}}
<dt>Montant de la cession</dt>
<dd class="money">{{$montant_cession|money_currency:false}}</dd>
{{/if}}
</dl>
</div>
<fieldset>
<legend>Écritures de sortie du bilan</legend>
{{* Amortissement complémentaire *}}
{{if $amort_comp > 0}}
<table class="list">
<thead>
<tr>
<td>Amortissement complémentaire</td>
<td>Débit</td>
<td>Crédit</td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="3" class="help">
Entre la date de début de l'exercice et la date de sortie du bilan
</td>
</tr>
<tr>
<td>
{{:input
type="list"
name="comp_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:"68*":$_GET.year
default=$comp_account
}}
</td>
<td>{{$amort_comp|money_currency:false}}</td>
<td></td>
</tr>
<tr>
<td>
{{:input
type="list"
name="amort_comp_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:"28*":$_GET.year
default=$amort_account
}}
</td>
<td></td>
<td>{{$amort_comp|money_currency:false}}</td>
</tr>
</tbody>
</table>
{{/if}}
{{* Amortissement exceptionnel *}}
{{if $montant_cession == 0 && $amort_except > 0}}
<table class="list">
<thead>
<tr>
<td>Amortissement exceptionnel</td>
<td>Débit</td>
<td>Crédit</td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="3" class="help">
Montant de l'immobilisation non encore amortie (valeur nette résiduelle à la date de sortie)
</td>
</tr>
<tr>
<td>
{{:input
type="list"
name="except_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:"687*":$_GET.year
default=$except_account
}}
</td>
<td>{{$amort_except|money_currency:false}}</td>
<td></td>
</tr>
<tr>
<td>
{{:input
type="list"
name="amort_except_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:"28*":$_GET.year
default=$amort_account
}}
</td>
<td></td>
<td>{{$amort_except|money_currency:false}}</td>
</tr>
</tbody>
</table>
{{/if}}
{{* Sortie du bilan *}}
<table class="list">
<thead>
<tr>
<td>Sortie du bilan</td>
<td>Débit</td>
<td>Crédit</td>
</tr>
</thead>
<tbody>
<tr>
<td>
{{:input
type="list"
name="amort_sortie_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:"28*":$_GET.year
default=$amort_account
}}
</td>
{{if $montant_cession == 0}}
{{:assign montant=$ligne_immo.montant}}
{{else}}
{{:assign montant="%f+%f"|math:$_GET.amort_amount:$amort_comp}}
{{/if}}
<td>{{$montant|money_currency:false}}</td>
<td></td>
</tr>
{{if $montant_cession > 0 && $valeur_nette > 0}}
<tr>
<td>
{{:input
type="list"
name="vnc_account"
target="!acc/charts/accounts/selector.php?codes=%s*&year=%d"|args:$vnc_code:$_GET.year
default=$vnc_account
}}
</td>
<td>{{$valeur_nette|money_currency:false}}</td>
<td></td>
</tr>
{{/if}}
<tr>
<td> {{* style="pointer-events: none; opacity: 0.6;">*}}
{{:input
type="list"
name="immo_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:$patterns:$_GET.year
default=$immo_account
}}
</td>
<td></td>
<td>{{$ligne_immo.montant|money_currency:false}}</td>
</tr>
</tbody>
</table>
{{* comptabilisation du produit de la cession *}}
{{if $montant_cession > 0}}
<table class="list">
<thead>
<tr>
<td>Comptabilisation de la cession</td>
<td>Débit</td>
<td>Crédit</td>
</tr>
</thead>
<tbody>
<tr>
<td>
{{:input
type="list"
name="creance_account"
target="!acc/charts/accounts/selector.php?codes=%s&year=%d"|args:"462*":$_GET.year
default=$creance_account
}}
</td>
<td>{{$montant_cession|money_currency:false}}</td>
<td></td>
</tr>
<tr>
<td>
{{:input
type="list"
name="cession_account"
target="!acc/charts/accounts/selector.php?codes=%s*&year=%d"|args:$cession_code:$_GET.year
default=$cession_account
}}
</td>
<td></td>
<td>{{$montant_cession|money_currency:false}}</td>
</tr>
</tbody>
</table>
{{/if}}
</fieldset>
<p class="submit">
{{:button type="submit" name="save" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
{{:admin_footer}}