Merge branch 'allocations_logement' of https://github.com/CatalaLang/catala into allocations_logement

This commit is contained in:
Lilya Slimani 2022-05-02 11:42:21 +02:00
commit cd4e9f48d0
42 changed files with 1436 additions and 784 deletions

View File

@ -20,7 +20,7 @@ jobs:
- name: Install external dependencies
run: |
sudo apt-get update && sudo apt-get install python3-dev virtualenv python3-setuptools python3-pip python3-pygments man2html rsync colordiff npm nodejs libmpc-dev ninja-build
sudo apt-get update && sudo apt-get install python3-dev virtualenv python3-setuptools python3-pip python3-pygments man2html rsync colordiff npm nodejs libmpc-dev ninja-build pandoc
sudo python3 -m pip install --upgrade pip
sudo python3 -m pip install virtualenv
sudo make pygments

View File

@ -10,7 +10,7 @@ export
# Dependencies
##########################################
EXECUTABLES = man2html virtualenv python3 colordiff node pygmentize nodejs npm ninja
EXECUTABLES = man2html virtualenv python3 colordiff node pygmentize nodejs npm ninja pandoc
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(warning [WARNING] No "$(exec)" executable found. \
Please install this executable for everything to work smoothly)))

View File

@ -171,7 +171,8 @@ let filename_to_expected_output_descr (output_dir : string) (filename : string)
else
let scope_name_regex = Re.Pcre.regexp "\\.(.+)" in
let scope_name =
(Re.Pcre.extract ~rex:scope_name_regex second_extension).(1)
try (Re.Pcre.extract ~rex:scope_name_regex second_extension).(1)
with Not_found -> ""
in
(Filename.remove_extension filename, Some scope_name)
in

View File

@ -99,6 +99,7 @@ type unop =
| GetMonth
| GetYear
| RoundMoney
| RoundDecimal
type operator = Ternop of ternop | Binop of binop | Unop of unop

View File

@ -98,6 +98,7 @@ type unop =
| GetMonth
| GetYear
| RoundMoney
| RoundDecimal
type operator = Ternop of ternop | Binop of binop | Unop of unop

View File

@ -268,6 +268,8 @@ let rec evaluate_operator
A.ELit (LRat Runtime.(decimal_of_integer i))
| A.Unop A.RoundMoney, [ ELit (LMoney m) ] ->
A.ELit (LMoney Runtime.(money_round m))
| A.Unop A.RoundDecimal, [ ELit (LRat m) ] ->
A.ELit (LRat Runtime.(decimal_round m))
| A.Unop (A.Log (entry, infos)), [ e' ] ->
if !Cli.trace_flag then (
match entry with

View File

@ -210,7 +210,8 @@ let format_unop (fmt : Format.formatter) (op : unop Pos.marked) : unit =
| GetDay -> "get_day"
| GetMonth -> "get_month"
| GetYear -> "get_year"
| RoundMoney -> "round_money")
| RoundMoney -> "round_money"
| RoundDecimal -> "round_decimal")
let needs_parens (e : expr Pos.marked) : bool =
match Pos.unmark e with EAbs _ | ETuple (_, Some _) -> true | _ -> false

View File

@ -197,6 +197,7 @@ let op_type (op : A.operator Pos.marked) : typ Pos.marked UnionFind.elem =
| A.Unop A.GetMonth -> arr dat it
| A.Unop A.GetYear -> arr dat it
| A.Unop A.RoundMoney -> arr mt mt
| A.Unop A.RoundDecimal -> arr rt rt
| A.Unop A.IntToRat -> arr it rt
| Binop (Mult (KDate | KDuration)) | Binop (Div KDate) | Unop (Minus KDate) ->
Errors.raise_spanned_error pos "This operator is not available!"

View File

@ -123,6 +123,7 @@ let format_unop (fmt : Format.formatter) (op : Dcalc.Ast.unop Pos.marked) : unit
| GetMonth -> Format.fprintf fmt "%s" "month_number_of_date"
| GetYear -> Format.fprintf fmt "%s" "year_of_date"
| RoundMoney -> Format.fprintf fmt "%s" "money_round"
| RoundDecimal -> Format.fprintf fmt "%s" "decimal_round"
let avoid_keywords (s : string) : string =
if

View File

@ -28,18 +28,17 @@ module C = Cli
(** Espaces various LaTeX-sensitive characters *)
let pre_latexify (s : string) : string =
(* first we substitute the annoying characters *)
let substitute s (old_s, new_s) =
R.substitute ~rex:(R.regexp old_s) ~subst:(fun _ -> new_s) s
in
[
("\\$", "\\$");
("%", "\\%");
("\\_", "\\_");
("\\#", "\\#");
("1er", "1\\textsuperscript{er}");
("\\^", "\\textasciicircum");
]
|> List.fold_left substitute s
let s =
[ ("1er", "1\\textsuperscript{er}"); ("\\^", "\\textasciicircum") ]
|> List.fold_left substitute s
in
(* Then we send to pandoc, to ensure the markdown features used in the
original document are correctly printed! *)
run_pandoc s Cli.Latex
(** Usage: [wrap_latex source_files custom_pygments language fmt wrapped]
@ -55,14 +54,68 @@ let wrap_latex
\\usepackage[utf8]{inputenc}\n\
\\usepackage{amssymb}\n\
\\usepackage{babel}\n\
\\usepackage{lmodern}\n\
\\usepackage{fontspec}\n\
\\usepackage[hidelinks]{hyperref}\n\
\\setmainfont{Marianne}\n\
\\usepackage{minted}\n\
\\usepackage{longtable}\n\
\\usepackage{booktabs}\n\
\\usepackage{newunicodechar}\n\
\\usepackage{textcomp}\n\
\\usepackage[hidelinks]{hyperref}\n\
\\usepackage[dvipsnames]{xcolor}\n\
\\usepackage{fullpage}\n\
\\usepackage[left=2cm,right=2cm,top=3cm,bottom=3cm,headheight=2cm]{geometry}\n\
\\usepackage[many]{tcolorbox}\n\n\
\\usepackage{fancyhdr}\n\
\\pagestyle{fancy}\n\
\\fancyhf{}\n\
\\fancyhead[C]{\\leftmark}\n\
\\fancyfoot[C]{\\thepage}\n\
\\renewcommand{\\headrulewidth}{0.5pt}\n\
\\renewcommand{\\footrulewidth}{0.5pt}\n\
\\usepackage{titlesec}\n\
\\titleclass{\\subsubsubsection}{straight}[\\subsection]\n\
\\newcounter{subsubsubsection}[subsubsection]\n\
\\renewcommand\\thesubsubsubsection{\\thesubsubsection.\\arabic{subsubsubsection}}\n\
\\titleformat{\\subsubsubsection}{\\normalfont\\normalsize\\bfseries}{\\thesubsubsubsection}{1em}{}\n\
\\titlespacing*{\\subsubsubsection}{0pt}{3.25ex plus 1ex minus \
.2ex}{1.5ex plus .2ex}\n\
\\titleclass{\\subsubsubsubsection}{straight}[\\subsubsection]\n\
\\newcounter{subsubsubsubsection}[subsubsubsection]\n\
\\renewcommand\\thesubsubsubsubsection{\\thesubsubsubsection.\\arabic{subsubsubsubsection}}\n\
\\titleformat{\\subsubsubsubsection}{\\normalfont\\normalsize\\bfseries}{\\thesubsubsubsubsection}{0.75em}{}\n\
\\titlespacing*{\\subsubsubsubsection}{0pt}{2.75ex plus 1ex minus \
.2ex}{1.25ex plus .2ex}\n\
\\titleclass{\\subsubsubsubsubsection}{straight}[\\subsubsubsection]\n\
\\newcounter{subsubsubsubsubsection}[subsubsubsubsection]\n\
\\renewcommand\\thesubsubsubsubsubsection{\\thesubsubsubsubsection.\\arabic{subsubsubsubsubsection}}\n\
\\titleformat{\\subsubsubsubsubsection}{\\normalfont\\normalsize\\bfseries}{\\thesubsubsubsubsubsection}{0.7em}{}\n\
\\titlespacing*{\\subsubsubsubsubsection}{0pt}{2.5ex plus 1ex minus \
.2ex}{1.1ex plus .2ex}\n\
\\titleclass{\\subsubsubsubsubsubsection}{straight}[\\subsubsubsubsection]\n\
\\newcounter{subsubsubsubsubsubsection}[subsubsubsubsubsection]\n\
\\renewcommand\\thesubsubsubsubsubsubsection{\\thesubsubsubsubsubsection.\\arabic{subsubsubsubsubsubsection}}\n\
\\titleformat{\\subsubsubsubsubsubsection}{\\normalfont\\normalsize\\bfseries}{\\thesubsubsubsubsubsubsection}{0.6em}{}\n\
\\titlespacing*{\\subsubsubsubsubsubsection}{0pt}{2.25ex plus 1ex minus \
.2ex}{1ex plus .2ex}\n\
\\makeatletter\n\
\\def\\toclevel@subsubsubsection{4}\n\
\\def\\toclevel@subsubsubsubsection{5}\n\
\\def\\toclevel@subsubsubsubsubsection{6}\n\
\\def\\toclevel@subsubsubsubsubsubsection{7}\n\
\\def\\toclevel@paragraph{8}\n\
\\def\\toclevel@subparagraph{9}\n\
\\def\\l@subsection{\\@dottedtocline{1}{1em}{0.5em}}\n\
\\def\\l@subsubsection{\\@dottedtocline{2}{2em}{1em}}\n\
\\def\\l@subsubsubsection{\\@dottedtocline{3}{3em}{1.5em}}\n\
\\def\\l@subsubsubsubsection{\\@dottedtocline{5}{4em}{2em}}\n\
\\def\\l@subsubsubsubsubsection{\\@dottedtocline{6}{5em}{2.5em}}\n\
\\def\\l@subsubsubsubsubsubsection{\\@dottedtocline{7}{6em}{3em}}\n\
\\def\\l@paragraph{\\@dottedtocline{8}{7em}{3.5em}}\n\
\\def\\l@subparagraph{\\@dottedtocline{9}{8em}{4em}}\n\
\\makeatother\n\
\\setcounter{secnumdepth}{0}\n\
\\setcounter{tocdepth}{9}\n\
\\newunicodechar{÷}{$\\div$}\n\
\\newunicodechar{×}{$\\times$}\n\
\\newunicodechar{}{$\\leqslant$}\n\
@ -78,7 +131,8 @@ let wrap_latex
rulecolor=\\color{gray!70},\n\
firstnumber=last,\n\
codes={\\catcode`\\$=3\\catcode`\\^=7}\n\
}\n\n\
}\n\
\\newcommand{\\tightlist}{\\setlength{\\itemsep}{0pt}\\setlength{\\parskip}{0pt}}\n\n\
\\title{\n\
%s\n\
}\n\
@ -89,7 +143,10 @@ let wrap_latex
\\maketitle\n\n\
%s : \n\
\\begin{itemize}%s\\end{itemize}\n\n\
\\[\\star\\star\\star\\]\\\\\n"
\\clearpage\n\
\\tableofcontents\n\n\
\\[\\star\\star\\star\\]\n\
\\clearpage"
(match language with Fr -> "french" | En -> "english" | Pl -> "polish")
(literal_title language)
(literal_generated_by language)
@ -116,17 +173,41 @@ let wrap_latex
(** {1 Weaving} *)
(** [check_exceeding_lines max_len start_line filename content] prints a warning
message for each lines of [content] exceeding [max_len] characters. *)
let check_exceeding_lines
?(max_len = 80) (start_line : int) (filename : string) (content : string) =
content |> String.split_on_char '\n'
|> List.iteri (fun i s ->
if String.length s > max_len then (
Cli.warning_print "The line %s in %s is exceeding %s characters:"
(Cli.with_style
ANSITerminal.[ Bold; yellow ]
"%d"
(start_line + i + 1))
(Cli.with_style ANSITerminal.[ Bold; magenta ] "%s" filename)
(Cli.with_style ANSITerminal.[ Bold; red ] "%d" max_len);
Cli.warning_print "%s%s" (String.sub s 0 max_len)
(Cli.with_style
ANSITerminal.[ red ]
"%s"
String.(sub s max_len (length s - max_len)))))
let rec law_structure_to_latex
(language : C.backend_lang) (fmt : Format.formatter) (i : A.law_structure) :
unit =
match i with
| A.LawHeading (heading, children) ->
Format.fprintf fmt "\\%s*{%s}\n\n"
Format.fprintf fmt "\\%s{%s}\n\n"
(match heading.law_heading_precedence with
| 0 -> "section"
| 1 -> "subsection"
| 2 -> "subsubsection"
| 3 -> "paragraph"
| 3 -> "subsubsubsection"
| 4 -> "subsubsubsubsection"
| 5 -> "subsubsubsubsubsection"
| 6 -> "subsubsubsubsubsubsection"
| 7 -> "paragraph"
| _ -> "subparagraph")
(pre_latexify (Pos.unmark heading.law_heading_name));
Format.pp_print_list
@ -164,22 +245,24 @@ let rec law_structure_to_latex
| En -> "Metadata"
| Pl -> "Metadane"
in
let start_line = Pos.get_start_line (Pos.get_position c) - 1 in
let filename = Filename.basename (Pos.get_file (Pos.get_position c)) in
let block_content = Pos.unmark c in
check_exceeding_lines start_line filename block_content;
Format.fprintf fmt
"\\begin{tcolorbox}[colframe=OliveGreen, breakable, \
title=\\textcolor{black}{\\texttt{%s}},title after \
break=\\textcolor{black}{\\texttt{%s}},before skip=1em, after \
skip=1em]\n\
\\begin{minted}[numbersep=9mm, firstnumber=%d, \
\\begin{minted}[breaklines, numbersep=9mm, firstnumber=%d, \
label={\\hspace*{\\fill}\\texttt{%s}}]{%s}\n\
```catala\n\
%s```\n\
\\end{minted}\n\
\\end{tcolorbox}"
metadata_title metadata_title
(Pos.get_start_line (Pos.get_position c) - 1)
(pre_latexify (Filename.basename (Pos.get_file (Pos.get_position c))))
metadata_title metadata_title start_line (pre_latexify filename)
(get_language_extension language)
(Pos.unmark c)
block_content
(** {1 API} *)

View File

@ -41,3 +41,40 @@ let get_language_extension = function
| Fr -> "catala_fr"
| En -> "catala_en"
| Pl -> "catala_pl"
let raise_failed_pandoc (command : string) (error_code : int) : 'a =
Errors.raise_error
"Weaving failed: pandoc command \"%s\" returned with error code %d" command
error_code
let run_pandoc (s : string) (backend : Utils.Cli.backend_option) : string =
let pandoc = "pandoc" in
let tmp_file_in = Filename.temp_file "catala_pandoc" "in" in
let tmp_file_out = Filename.temp_file "catala_pandoc" "out" in
let oc = open_out tmp_file_in in
Printf.fprintf oc "%s" s;
close_out oc;
let pandoc_args =
[|
"-f";
"markdown+multiline_tables";
"-t";
(match backend with
| Cli.Html -> "html"
| Cli.Latex -> "latex"
| _ -> failwith "should not happen");
"-o";
tmp_file_out;
|]
in
let cmd =
Format.sprintf "%s %s %s" pandoc
(String.concat " " (Array.to_list pandoc_args))
tmp_file_in
in
let return_code = Sys.command cmd in
if return_code <> 0 then raise_failed_pandoc cmd return_code;
let oc = open_in tmp_file_out in
let tmp_file_as_string = really_input_string oc (in_channel_length oc) in
close_in oc;
tmp_file_as_string

View File

@ -35,3 +35,7 @@ val literal_last_modification : Cli.backend_lang -> string
val get_language_extension : Cli.backend_lang -> string
(** Return the file extension corresponding to the given {!type:
Utils.Cli.backend_lang}. *)
val run_pandoc : string -> Cli.backend_option -> string
(** Runs the [pandoc] on a string to pretty-print markdown features into the
desired format. *)

View File

@ -146,6 +146,13 @@ let decimal_to_string ~(max_prec_digits : int) (i : decimal) : string =
(if List.length !digits - leading_zeroes !digits = max_prec_digits then ""
else "")
let decimal_round (q : decimal) : decimal =
(* Implements the workaround by
https://gmplib.org/list-archives/gmp-discuss/2009-May/003767.html *)
let n = Q.num q in
let d = Q.den q in
Q.of_bigint Z.(fdiv ((of_int 2 * n) + d) (of_int 2 * d))
let integer_of_string (s : string) : integer = Z.of_string s
let integer_to_string (i : integer) : string = Z.to_string i
let integer_to_int (i : integer) : int = Z.to_int i

View File

@ -103,6 +103,7 @@ val decimal_to_string : max_prec_digits:int -> decimal -> string
val decimal_of_integer : integer -> decimal
val decimal_of_float : float -> decimal
val decimal_to_float : decimal -> float
val decimal_round : decimal -> decimal
(**{2 Integers} *)

View File

@ -103,6 +103,7 @@ let format_unop (fmt : Format.formatter) (op : Dcalc.Ast.unop Pos.marked) : unit
| GetMonth -> Format.fprintf fmt "%s" "month_number_of_date"
| GetYear -> Format.fprintf fmt "%s" "year_of_date"
| RoundMoney -> Format.fprintf fmt "%s" "money_round"
| RoundDecimal -> Format.fprintf fmt "%s" "decimal_round"
let avoid_keywords (s : string) : string =
if

View File

@ -304,6 +304,7 @@ type builtin_expression =
| GetMonth
| GetYear
| RoundMoney
| RoundDecimal
[@@deriving
visitors { variety = "map"; name = "builtin_expression_map"; nude = true },
visitors { variety = "iter"; name = "builtin_expression_iter"; nude = true }]

View File

@ -889,6 +889,9 @@ let rec translate_expr
Bindlib.box (Desugared.Ast.EOp (Dcalc.Ast.Unop Dcalc.Ast.GetYear), pos)
| Builtin RoundMoney ->
Bindlib.box (Desugared.Ast.EOp (Dcalc.Ast.Unop Dcalc.Ast.RoundMoney), pos)
| Builtin RoundDecimal ->
Bindlib.box
(Desugared.Ast.EOp (Dcalc.Ast.Unop Dcalc.Ast.RoundDecimal), pos)
and disambiguate_match_and_build_expression
(scope : Scopelang.Ast.ScopeName.t)
@ -1058,14 +1061,18 @@ let merge_conditions
| Some precond, Some cond ->
let op_term =
( Desugared.Ast.EOp (Dcalc.Ast.Binop Dcalc.Ast.And),
Pos.get_position (Bindlib.unbox precond) )
Pos.get_position (Bindlib.unbox cond) )
in
Bindlib.box_apply2
(fun precond cond ->
( Desugared.Ast.EApp (op_term, [ precond; cond ]),
Pos.get_position precond ))
Pos.get_position cond ))
precond cond
| Some cond, None | None, Some cond -> cond
| Some precond, None ->
Bindlib.box_apply
(fun precond -> (Pos.unmark precond, default_pos))
precond
| None, Some cond -> cond
| None, None ->
Bindlib.box (Desugared.Ast.ELit (Dcalc.Ast.LBool true), default_pos)

View File

@ -224,6 +224,9 @@ module R = Re.Pcre
#ifndef MR_RoundMoney
#define MR_RoundMoney MS_RoundMoney
#endif
#ifndef MR_RoundDecimal
#define MR_RoundDecimal MS_RoundDecimal
#endif
#ifndef MR_GetDay
#define MR_GetDay MS_GetDay
#endif
@ -323,6 +326,7 @@ let lex_builtin (s : string) : Ast.builtin_expression option =
| MR_GetMonth, eof -> Some GetMonth
| MR_GetYear, eof -> Some GetYear
| MR_RoundMoney, eof -> Some RoundMoney
| MR_RoundDecimal, eof -> Some RoundDecimal
| _ -> None
(** Regexp matching any digit character.

View File

@ -100,6 +100,7 @@
(* Builtins *)
#define MS_RoundMoney "round_money"
#define MS_RoundDecimal "round_decimal"
#define MS_IntToDec "integer_to_decimal"
#define MS_GetDay "get_day"
#define MS_GetMonth "get_month"

View File

@ -121,6 +121,8 @@
(* Builtins *)
#define MS_RoundMoney "arrondi_argent"
#define MS_RoundDecimal "arrondi_décimal"
#define MR_RoundDecimal "arrondi_d", 0xE9, "cimal"
#define MS_IntToDec "entier_vers_décimal"
#define MR_IntToDec "entier_vers_d", 0xE9, "cimal"
#define MS_GetDay "accès_jour"

View File

@ -107,6 +107,8 @@
(* Builtins *)
#define MS_RoundDecimal "zaokrąglony_dziesiętny"
#define MR_RoundDecimal "zaokr",0x0105,"glony_dziesi", 0x0119, "tny"
#define MS_RoundMoney "zaokrąglony_pieniądze"
#define MR_RoundMoney "zaokr",0x0105,"glony_pieni", 0x0105, "dze"
#define MS_IntToDec "calkowita_wers_dziesiętny"

View File

@ -301,11 +301,11 @@ let process_data_decl
| Some use ->
Errors.raise_multispanned_error
[
( Some "first use",
( Some "First use:",
Pos.get_position (Desugared.Ast.ScopeVar.get_info use) );
(Some "second use", pos);
(Some "Second use:", pos);
]
"var name \"%a\" already used"
"Variable name \"%a\" already used"
(Utils.Cli.format_with_style [ ANSITerminal.yellow ])
name
| None ->

View File

@ -241,7 +241,7 @@ let set_option_globals options : unit =
disable_counterexamples := options.disable_counterexamples;
avoid_exceptions_flag := options.avoid_exceptions
let version = "0.5.0"
let version = "0.6.0"
let info =
let doc =

View File

@ -598,6 +598,8 @@ let rec translate_op
failwith
"[Z3 encoding] GetYear operator only supported in comparisons with \
literal"
| RoundDecimal ->
failwith "[Z3 encoding] RoundDecimal operator not implemented yet"
| RoundMoney ->
failwith "[Z3 encoding] RoundMoney operator not implemented yet")

View File

@ -46,7 +46,7 @@ help : ../Makefile.common.mk
#> <target_file>.pdf : Weaves the file to PDF (via LaTeX)
%.pdf: %.tex
cd $(@D) && $(LATEXMK) -g -pdf -halt-on-error -shell-escape $(%F)
cd $(@D) && $(LATEXMK) -g -xelatex -halt-on-error -shell-escape $(%F)
#> <target_file>.html : Weaves the file to HTML
%.html: %.catala_$(CATALA_LANG)

View File

@ -25,7 +25,7 @@ of the Catala programming language development.
Building and running examples is done via Makefiles. Each example directory
contains its own Makefile, which includes `Makefile.common.mk`. This common
Makefiles defines a list of targets that call the Catala compiler with the
right options. Each of these targers can be called from the root of the
right options. Each of these targets can be called from the root of the
repository with:
make -C examples/<directory of example> <name of target>
@ -44,7 +44,13 @@ file `examples/foo/foo.catala_en`) list.
When invoking any of these targets, additional options to the Catala compiler
can be passed using the `CATALA_OPTS` Makefile variable.
> **Remark**: don't forget to run `make pygments` before generating LaTex or PDF files.
Important
: Before trying to generates LaTex or PDF files:
1. don't forget to run `make pygments`,
2. and you need to have the font
[Marianne](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/223019527/Typographie+-+Typography)
installed in your machine.
## Testing examples

View File

@ -15,3 +15,4 @@ _minted*
*.new
*.ml
*.py
*.xdv

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
# Circulaire de la CNAV 2022-3 du 11/01/2022 "Revalorisation à compter du 1er janvier 2022"
Lien: https://www.legislation.cnav.fr/Documents/circulaire_cnav_2022_03_11012022.pdf
[Lien vers le texte](https://www.legislation.cnav.fr/Documents/circulaire_cnav_2022_03_11012022.pdf)
## Allocation de solidarité aux personnes âgées
@ -8,10 +8,10 @@ Lien: https://www.legislation.cnav.fr/Documents/circulaire_cnav_2022_03_11012022
Le montant de lAspa sélève, à compter du 1er janvier 2022, à :
Bénéficiaire | Montant annuel | Montant mensuel
-------------------------------------------------
Personne seule | 11 001,44 € | 916,78 €
Couple marié | 17 079,77 € | 1 423,31 €
Bénéficiaire Montant annuel Montant mensuel
-------------- -------------- ---------------
Personne seule 11 001,44 € 916,78 €
Couple marié 17 079,77 € 1 423,31 €
```catala
# Pas important pour nous
@ -20,14 +20,14 @@ Couple marié | 17 079,77 € | 1 423,31 €
Pour prétendre à cette allocation non contributive, les plafonds de ressources sont fixés à:
Bénéficiaire | Montant annuel | Montant mensuel
-------------------------------------------------
Personne seule | 11 001,44€ | 916,78 €
Couple marié | 17 079,77 € | 1 423,31 €
Bénéficiaire Montant annuel Montant mensuel
-------------- -------------- -----------------
Personne seule 11 001,44€ 916,78 €
Couple marié 17 079,77 € 1 423,31 €
```catala
# Uniquement la valeur du plafond individuel est important pour l'éligibilité aux APL
# Uniquement la valeur du plafond individuel est important pour l'éligibilité
# aux APL
champ d'application ÉligibilitéAidePersonnelleLogement:
définition plafond_individuel_l815_9_sécu sous condition
date_ouverture_droits >=@ |2022-01-01| et

View File

@ -38,17 +38,19 @@ la résidence principale.
```catala
champ d'application ÉligibilitéAidePersonnelleLogement:
assertion ménage.logement.résidence_principale
règle condition_logement_résidence_principale sous condition
ménage.logement.résidence_principale
conséquence rempli
```
##### Chapitre II : Conditions générales d'attribution
```catala
# Ce chapitre définit diverses conditions d'éligibilité concernant le logement.
# La structure de ces conditions comporte des exceptions négatives à une condition
# positive. Il n'y a pas vraiment de bonne manière de modéliser cela en Catala
# pour le moment à part le code ci-dessous qui récapitule la méta-structure
# logique des articles de loi de ce chapitre.
# La structure de ces conditions comporte des exceptions négatives à une
# condition positive. Il n'y a pas vraiment de bonne manière de modéliser
# cela en Catala pour le moment à part le code ci-dessous qui récapitule
# la méta-structure logique des articles de loi de ce chapitre.
champ d'application ÉligibilitéAidePersonnelleLogement:
règle éligibilité_logement sous condition
@ -56,6 +58,7 @@ champ d'application ÉligibilitéAidePersonnelleLogement:
# portant toutes sur le logement définies au long des diverses parties
# du code de la construction et de l'habitation. Attention, ne pas oublier
# de modifier cette liste en cas de rajout d'une sous-condition.
condition_logement_résidence_principale et # L821-2
condition_logement_bailleur et # L831-1
condition_logement_prêt et # L831-2
condition_logement_mode_occupation et
@ -123,8 +126,8 @@ champ d'application ÉligibilitéAidePersonnelleLogement:
-- AccessionPropriétéLocalUsageExclusifHabitation:
ménage.logement.résidence_principale
-- SousLocataire: vrai
-- LocationAccession: vrai # Justifié par L831-2, avec une exception à venir
-- ModeOccupation.Autre: faux
-- LocationAccession: vrai # Justifié par L831-2, avec une
# exception à venir
conséquence rempli
```
@ -161,7 +164,8 @@ Ces seuils ne peuvent excéder 20 % de la propriété ou de l'usufruit du logeme
```catala
champ d'application ÉligibilitéAidePersonnelleLogement:
étiquette l822_3_2 exception l822_3_1 règle condition_logement_mode_occupation sous condition
étiquette l822_3_2 exception l822_3_1
règle condition_logement_mode_occupation sous condition
usufruit_ou_propriété_famille et
(selon ménage.logement.propriétaire sous forme
-- DemandeurOuConjointOuParentOuViaPartsSociétés de parts: parts
@ -197,7 +201,8 @@ exception cas_base_l822_4 règle condition_logement_location_tiers
selon ménage.logement.loué_ou_sous_loué_à_des_tiers sous forme
-- LouéOuSousLouéÀDesTiers.Non: vrai
-- LouéOuSousLouéÀDesTiers.Oui de personne:
personne.age_personne_sous_location <= 30 ou personne.conforme_article_l442_1
personne.age_personne_sous_location <= 30 ou
personne.conforme_article_l442_1
conséquence rempli
```
@ -231,12 +236,9 @@ patrimoine, lorsque cette valeur est supérieure à un montant fixé par voie
réglementaire.
```catala
# Cet article est une déclaration d'intention qui donne des propriétée sur la formule
# de calcul. Dans le futur il serait interessant de vérifier que la formule est bien
# de cette forme là.
# Cet article est une déclaration d'intention qui donne des propriétée sur
# la formule de calcul. Dans le futur il serait interessant de vérifier que
# la formule est bien de cette forme là.
champ d'application ÉligibilitéAidePersonnelleLogement:
définition patrimoine_total_demandeur égal à
demandeur.patrimoine.produisant_revenu_période_r822_3_3_r822_4 +€
@ -247,7 +249,6 @@ champ d'application ÉligibilitéAidePersonnelleLogement:
patrimoine_total_demandeur
sinon
0€
```
Par dérogation à la règle énoncée au premier alinéa, lorsque le demandeur d'une
@ -264,7 +265,6 @@ champ d'application ÉligibilitéAidePersonnelleLogement:
(prestation = AllocationSoutienEnfantHandicapé) ou
(prestation = AllocationAdulteHandicapé)
conséquence égal à 0€
```
La même dérogation s'applique au demandeur d'une aide personnelle au logement
@ -295,11 +295,9 @@ Les conditions de prise en compte des ressources, notamment les périodes de ré
retenues, peuvent varier en fonction de la nature des ressources.
```catala
# Cet article est une déclaration d'intention qui donne des propriétée sur la formule
# de calcul. Dans le futur il serait interessant de vérifier que la formule est bien
# de cette forme là.
# Cet article est une déclaration d'intention qui donne des propriétée sur
# la formule de calcul. Dans le futur il serait interessant de vérifier que
# la formule est bien de cette forme là.
```
###### Article L822-7 | LEGIARTI000038814932
@ -313,7 +311,8 @@ contrat de travail autre qu'un contrat à durée indéterminée.
champ d'application ÉligibilitéAidePersonnelleLogement:
règle condition_spécifique_prise_en_compte_revenus_demandeur sous condition
(demandeur.age_demandeur <= 25) et non (demandeur.contrat_de_travail sous forme CDI)
(demandeur.age_demandeur <= 25) et
non (demandeur.contrat_de_travail sous forme CDI)
conséquence rempli
```
@ -347,7 +346,8 @@ l'article 6 de la loi n° 89-462 du 6 juillet 1989 tendant à améliorer les rap
locatifs et portant modification de la loi n° 86-1290 du 23 décembre 1986.
```catala
# todo informatique: structure inverse de la structure avec des conditions chainées
# TODO informatique: structure inverse de la structure avec des conditions
# chainées
champ d'application ÉligibilitéAidePersonnelleLogement:
règle condition_non_ouverture_l822_9_decence_logement
sous condition non ménage.logement.logement_decent_l89_462
@ -360,18 +360,19 @@ s'il répond à ces mêmes exigences, de l'ensemble des éléments, équipements
pièces dont dispose chaque colocataire.
```catala
# ne nécessite pas de code particulier
# Ne nécessite pas de code particulier
```
Les modalités d'application du présent article sont fixées par voie réglementaire.
####### Article L822-10 | LEGIARTI000038814924
###### Article L822-10 | LEGIARTI000038814924
L'attribution d'une aide personnelle au logement est subordonnée au
respect de conditions de peuplement des logements.
```catala
# todo informatique: structure inverse de la structure avec des conditions chainées
# TODO informatique: structure inverse de la structure avec des conditions
# chainées
champ d'application ÉligibilitéAidePersonnelleLogement:
règle condition_non_ouverture_l822_10_peuplement_logement
sous condition condition_peuplement_logement_l822_10
@ -407,10 +408,11 @@ prévues à l'article L. 512-2 du code de la sécurité sociale.
```catala
# Cet article indique ce qu'on prend en compte mais pas comment on le prend
# en compte, donc rien à formaliser, le code viendra dans la partie réglementaire
# et décrétale qui se réferera elle à L823-1. Il sera peut-être utile par la suite
# de vérifier que les parties réglementaire et décrétale se conforment bien à
# L823-1 mais nous laissons cela pour le futur.
# en compte, donc rien à formaliser, le code viendra dans la partie
# réglementaire et décrétale qui se réferera elle à L823-1. Il sera
# peut-être utile par la suite de vérifier que les parties réglementaire
# et décrétale se conforment bien à L823-1 mais nous laissons cela pour
# le futur.
```
###### Article L823-2 | LEGIARTI000038814918
@ -435,7 +437,7 @@ déclaration énumération PriseEnCharge:
-- RésidenceAlternéeAllocationsPartagée
```
###### Article Article L823-3 | LEGIARTI000038814916
###### Article L823-3 | LEGIARTI000038814916
Sont assimilées aux loyers :
@ -516,7 +518,7 @@ réglementaire.
# Rien à faire ici.
```
##### Article L823-7 | LEGIARTI000038814908
###### Article L823-7 | LEGIARTI000038814908
L'aide personnelle au logement peut ne pas être versée lorsque son montant
mensuel est inférieur à un montant, qui peut varier selon la nature de l'aide
@ -657,7 +659,8 @@ ou par la section 3 du chapitre Ier du titre II du livre III ;
```catala
champ d'application ÉligibilitéAidePersonnelleLogement:
étiquette l831_1_4 exception l831_1_2 règle condition_logement_bailleur sous condition
étiquette l831_1_4 exception l831_1_2
règle condition_logement_bailleur sous condition
selon ménage.logement.mode_occupation sous forme
-- Locataire de location:
(selon location.bailleur.type_bailleur sous forme
@ -706,8 +709,8 @@ mentionné au 1° ou au 6° de l'article L. 831-1 signé après le 31 décembre
n'ouvrent pas droit à l'aide personnalisée au logement.
```catala
# TODO informatique: vérifier que cette exception a un groupe lui même exception a un groupe
# est bien encodé dans le calcul par défaut.
# TODO informatique: vérifier que cette exception a un groupe lui même
# exception a un groupe est bien encodé dans le calcul par défaut.
champ d'application ÉligibilitéAidePersonnelleLogement:
étiquette l831_2_base règle condition_logement_prêt rempli
# Cas de base implicite
@ -794,13 +797,16 @@ concernés par la réduction de loyer de solidarité définie à l'article L. 44
est fixée par voie réglementaire.
```catala
champ d'application CalculAidePersonnelleLogement:
définition aide_finale_locatif état réduction_loyer_solidarité égal à
si aide_finale_locatif -€ réduction_loyer_solidarité *€ fraction_l832_3 >=€ 0€ alors
aide_finale_locatif -€ réduction_loyer_solidarité *€ fraction_l832_3
champ d'application CalculAidePersonnelleLogementLocatif:
définition aide_finale état réduction_loyer_solidarité égal à
si
aide_finale -€ réduction_loyer_solidarité *€ fraction_l832_3 >=€
0€
alors
aide_finale -€ réduction_loyer_solidarité *€ fraction_l832_3
sinon 0€
assertion fraction_l832_3 >=. 90% et fraction_l832_3 <=. 98%
assertion fraction_l832_3 >=. 90% et fraction_l832_3 <=. 98%
```
###### Article L832-4 | LEGIARTI000038814870
@ -961,7 +967,7 @@ l'allocation de logement conservé par l'organisme payeur au titre de la périod
le paiement de la part de loyer non perçue correspondant au montant de l'allocation conservé.
####### Article L843-4 | LEGIARTI000038814833
###### Article L843-4 | LEGIARTI000038814833
Lors d'un changement de locataire, s'il est, de nouveau, constaté que le logement n'est pas conforme
aux caractéristiques de décence mentionnées à l'article L. 822-9, l'allocation de logement n'est pas

View File

@ -230,7 +230,8 @@ janvier 2019 et à 10 838,40 euros par an à compter du 1er janvier 2020 ;
```catala
# Uniquement la valeur du plafond individuel est important pour l'éligibilité aux APL
# Uniquement la valeur du plafond individuel est importante pour
# l'éligibilité aux APL.
champ d'application ÉligibilitéAidePersonnelleLogement:
définition plafond_individuel_l815_9_sécu sous condition
@ -248,7 +249,8 @@ champ d'application ÉligibilitéAidePersonnelleLogement:
date_ouverture_droits <@ |2021-01-01|
conséquence égal à 10 838,40€
# TODO juridique: trouver les décrets définissant les montants pour 2021 et 2022
# TODO juridique: trouver les décrets définissant les montants pour
# 2021 et 2022
```
b) Lorsque les deux conjoints, concubins ou partenaires liés par un pacte civil

View File

@ -32,8 +32,6 @@ déclaration énumération TypePrêt:
-- D331_63_64
-- D331_59_8
-- D331_76_1
-- Autre
# TODO informatique: mettre option pas de prêt
déclaration énumération TitulairePrêt:
-- Demandeur
@ -60,7 +58,6 @@ déclaration énumération ModeOccupation:
contenu Propriétaire
-- SousLocataire contenu Location
-- LocationAccession contenu Propriétaire
-- Autre
déclaration énumération ParentOuAutre:
-- DemandeurOuConjointOuParentOuViaPartsSociétés contenu décimal
@ -101,7 +98,8 @@ déclaration énumération Parenté:
déclaration structure ParentÀCharge:
donnée âge contenu durée
donnée ressources contenu argent
donnée ascendant_descendant_collatéral_deuxième_troisième_degré contenu booléen
donnée ascendant_descendant_collatéral_deuxième_troisième_degré
contenu booléen
donnée parenté contenu Parenté
donnée incapacité_80_pourcent_ou_restriction_emploi contenu booléen
donnée bénéficiaire_l161_19_l351_8_l643_3_sécu contenu booléen
@ -126,7 +124,8 @@ déclaration structure Ménage:
donnée nombre_autres_occupants_logement contenu entier
donnée situation_familiale contenu SituationFamiliale
donnée condition_rattaché_foyer_fiscal_parent_ifi contenu booléen
donnée nombre_enfants_à_naître_après_troisième_mois_grossesse contenu entier
donnée nombre_enfants_à_naître_après_troisième_mois_grossesse
contenu entier
donnée date_naissance_troisième_enfant_ou_dernier_si_plus contenu
DateNaissanceTroisièmeOuDernierPlusEnfant
@ -149,40 +148,49 @@ déclaration énumération Nationalité:
déclaration champ d'application ÉligibilitéAidePersonnelleLogement:
entrée ménage contenu Ménage
interne condition_prêt condition dépend de Prêt
entrée demandeur contenu Demandeur
entrée sortie date_ouverture_droits contenu date
interne patrimoine_total_demandeur contenu argent
# Différentes conditions pour l'éligibilité
interne condition_prêt condition dépend de Prêt
interne condition_spécifique_prise_en_compte_revenus_demandeur condition
interne condition_nationalité condition
interne caractéristiques_prêt_l831_1_1 condition dépend de Prêt
interne caractéristiques_prêt_l831_1_6 condition dépend de Prêt
interne prise_en_compte_personne_à_charge condition
dépend de PersonneÀCharge
interne personnes_à_charge_prises_en_compte contenu collection PersonneÀCharge
interne condition_logement_résidence_principale condition
interne condition_logement_mode_occupation condition
interne condition_logement_location_tiers condition
interne condition_logement_bailleur condition
interne condition_logement_prêt condition
interne condition_logement_surface_minimale_sans_seuil_m_carrés contenu entier
interne nombre_personnes_logement contenu entier
interne condition_logement_surface_minimale_sans_seuil_m_carrés
contenu entier
interne condition_logement_surface condition
interne usufruit_ou_propriété_famille contenu booléen
interne seuil_l822_3_parts_propriété contenu décimal
interne seuil_l822_3_parts_usufruit contenu décimal
interne seuil_l822_5_patrimoine contenu argent
interne patrimoine_pris_en_compte contenu argent
interne condition_non_ouverture_l822_8 condition
interne condition_non_ouverture_l822_9_decence_logement condition
interne condition_non_ouverture_l822_10_peuplement_logement condition
interne condition_peuplement_logement_l822_10 condition
interne éligibilité_logement condition
interne prise_en_compte_personne_à_charge condition
dépend de PersonneÀCharge
interne personnes_à_charge_prises_en_compte
contenu collection PersonneÀCharge
# Autres variables
interne patrimoine_total_demandeur contenu argent
interne caractéristiques_prêt_l831_1_1 condition dépend de Prêt
interne caractéristiques_prêt_l831_1_6 condition dépend de Prêt
interne nombre_personnes_logement contenu entier
interne usufruit_ou_propriété_famille contenu booléen
interne seuil_l822_3_parts_propriété contenu décimal
interne seuil_l822_3_parts_usufruit contenu décimal
interne seuil_l822_5_patrimoine contenu argent
interne patrimoine_pris_en_compte contenu argent
interne âge_l351_8_1_sécu contenu durée
interne âge_l161_17_2_sécu contenu durée
interne plafond_individuel_l815_9_sécu contenu argent
sortie éligibilité condition
ouverture_droits_retraite champ d'application OuvertureDroitsRetraite
sortie éligibilité condition
champ d'application ÉligibilitéAidePersonnelleLogement:
règle éligibilité sous condition
condition_nationalité et
@ -195,21 +203,25 @@ déclaration champ d'application ÉligibilitéPrimeDeDéménagement:
entrée ménage contenu Ménage
entrée demandeur contenu Demandeur
entrée date_ouverture_droits contenu date
entrée dépenses_justifiées_réellement_engagées contenu argent
interne condition_rang_enfant condition
interne condition_période_déménagement condition
éligibilité_apl champ d'application ÉligibilitéAidePersonnelleLogement
interne éligibilité_logement condition
interne délai_après_emménagement_l823_8_2 contenu durée
entrée dépenses_justifiées_réellement_engagées contenu argent
sortie montant_prime_déménagement contenu argent
interne plafond_d823_22 contenu argent
éligibilité_apl champ d'application ÉligibilitéAidePersonnelleLogement
base_mensuelle_allocations_familiales champ d'application
BaseMensuelleAllocationsFamiliales
sortie montant_prime_déménagement contenu argent
champ d'application ÉligibilitéPrimeDeDéménagement:
définition éligibilité_apl.ménage égal à ménage
définition éligibilité_apl.demandeur égal à demandeur
définition éligibilité_apl.date_ouverture_droits égal à date_ouverture_droits
définition éligibilité_apl.date_ouverture_droits égal à
date_ouverture_droits
définition base_mensuelle_allocations_familiales.date_courante égal à
date_ouverture_droits
@ -224,28 +236,31 @@ déclaration énumération PaiementLogementDistinctProfessionnel:
déclaration champ d'application RessourcesAidePersonnelleLogement:
entrée ressources_demandeur contenu argent
entrée ressources_conjoint contenu argent
interne ressources_personnes_vivant_habituellement_foyer contenu argent
interne ressources_prises_en_compte contenu argent
entrée personnes_vivant_habituellement_foyer contenu
collection PersonneVivantHabituellementAuFoyer
entrée demandeur_exerce_activité_rémunérée contenu booléen
entrée conjoint_exerce_activité_rémunérée contenu booléen
entrée personnes_à_charge contenu collection PersonneÀCharge
entrée situation_familiale contenu SituationFamiliale
entrée mode_occupation contenu ModeOccupation
entrée condition_âge_bourse_enseignement_supérieur condition
entrée demandeur_poursuit_des_études condition
entrée date_demande_ou_reexamen_droit contenu date
entrée paiement_logement_distinct_professionnel contenu
PaiementLogementDistinctProfessionnel
interne ressources_personnes_vivant_habituellement_foyer contenu argent
interne abattement_r_822_8 contenu argent
interne montant_forfaitaire_r_822_8 contenu argent
interne abattement_r_822_7 contenu argent
interne montant_forfaitaire_r_822_7 contenu argent
interne abattement_r_822_10 contenu argent
entrée demandeur_exerce_activité_rémunérée contenu booléen
entrée conjoint_exerce_activité_rémunérée contenu booléen
entrée personnes_à_charge contenu collection PersonneÀCharge
entrée situation_familiale contenu SituationFamiliale
interne ressources_forfaitaires_r822_20 contenu argent
base_mensuelle_allocations_familiales champ d'application
BaseMensuelleAllocationsFamiliales
entrée mode_occupation contenu ModeOccupation
entrée condition_âge_bourse_enseignement_supérieur condition
entrée demandeur_poursuit_des_études condition
entrée date_demande_ou_reexamen_droit contenu date
interne ressources_forfaitaires_r822_20 contenu argent
sortie ressources_prises_en_compte contenu argent
déclaration énumération ZoneDHabitation:
-- Zone1
@ -260,7 +275,7 @@ déclaration énumération CatégorieCalculAPL:
déclaration énumération TypeTravauxLogement:
-- SurLocauxNonHabitation
-- SurLogementExistant
# TODO informatique: rajouter cas où pas de travaux.
-- PasDeTravaux
déclaration énumération AmélioréParOccupant:
-- Oui
@ -279,10 +294,49 @@ déclaration structure TrancheRevenu:
donnée bas contenu argent
donnée taux contenu décimal
déclaration champ d'application CalculAidePersonnelleLogement:
sortie aide_finale contenu argent
déclaration champ d'application ContributionsSocialesAidePersonnelleLogement:
sortie montant contenu argent dépend de argent
interne aide_finale_locatif contenu argent
déclaration champ d'application CalculAidePersonnelleLogementLocatif:
entrée loyer_principal contenu argent
entrée ressources_ménage_arrondies contenu argent
entrée bénéficiaire_aide_adulte_ou_enfant_handicapés
contenu booléen
entrée date_courante contenu date
entrée nombre_personnes_à_charge contenu entier
entrée situation_familiale_calcul_apl contenu SituationFamilialeCalculAPL
entrée zone contenu ZoneDHabitation
entrée logement_est_chambre contenu booléen
entrée personnes_âgées_ou_handicap_adultes_hébergées_onéreux_particuliers
contenu booléen
entrée type_aide contenu TypeAidePersonnelleLogement
entrée colocation contenu booléen
entrée réduction_loyer_solidarité contenu argent
interne loyer_éligible contenu argent
interne taux_loyer_éligible contenu décimal
état formule
état arrondi
interne rapport_loyers contenu décimal
interne loyer_référence contenu argent
interne fraction_l832_3 contenu décimal
interne plafond_dégressivité_d823_16 contenu argent
interne plafond_suppression_d823_16 contenu argent
interne montant_forfaitaire_d823_16 contenu argent
interne montant_minimal_aide_d823_16 contenu argent
interne abattement_forfaitaire_d823_17 contenu argent
interne taux_prise_compte_ressources contenu décimal
sortie montant_forfaitaire_charges_d823_16 contenu argent
sortie plafond_loyer_d823_16_2 contenu argent
sortie participation_minimale contenu argent
sortie taux_composition_familiale contenu décimal
sortie participation_personnelle contenu argent
contributions_sociales champ d'application
ContributionsSocialesAidePersonnelleLogement
sortie aide_finale contenu argent
état formule
état diminué
état minoration_forfaitaire
@ -290,121 +344,152 @@ déclaration champ d'application CalculAidePersonnelleLogement:
état réduction_loyer_solidarité
état montant_minimal
interne aide_finale_accession_propriété contenu argent
état formule
état minoration_forfaitaire
état abattement
état contributions_sociales_arrondi
état montant_minimal
interne aide_finale_logement_foyer contenu argent
état formule
état minoration_forfaitaire
état abattement
état contributions_sociales_arrondi
état montant_minimal
interne tranches_revenus_d832_26 contenu collection TrancheRevenu
entrée type_prêt contenu TypePrêt
interne taux_francs_vers_euros contenu décimal
entrée ancienneté_logement contenu NeufOuAncien
déclaration champ d'application CalculAidePersonnelleLogementFoyer:
entrée mode_occupation contenu ModeOccupation
interne catégorie_calcul_apl contenu CatégorieCalculAPL
interne loyer_éligible contenu argent
interne mensualité_éligible contenu argent
entrée loyer_principal contenu argent
entrée mensualité_principale contenu argent
entrée date_courante contenu date
entrée logement_est_chambre contenu booléen
entrée personnes_âgées_ou_handicapées_adultes_hébergées_à_titre_onéreux_chez_des_particuliers contenu booléen
entrée zone contenu ZoneDHabitation
entrée situation_familiale contenu SituationFamiliale
interne situation_familiale_calcul_apl contenu SituationFamilialeCalculAPL
interne fraction_l832_3 contenu décimal
entrée ressources_ménage_arrondies contenu argent
entrée nombre_personnes_à_charge contenu entier
entrée type_aide contenu TypeAidePersonnelleLogement
entrée situation_familiale_calcul_apl contenu SituationFamilialeCalculAPL
entrée zone contenu ZoneDHabitation
entrée date_courante contenu date
interne plafond_dégressivité_d823_16 contenu argent
interne plafond_suppression_d823_16 contenu argent
sortie montant_forfaitaire_charges_d823_16 contenu argent
sortie montant_forfaitaire_charges_d832_10 contenu argent
sortie plafond_loyer_d823_16_2 contenu argent
interne loyer_référence contenu argent
interne rapport_loyers contenu décimal
entrée colocation contenu booléen
contexte condition_2_du_832_25 contenu booléen
interne mensualité_minimale contenu argent
interne montant_limite_tranches_d832_15_1 contenu argent
interne taux_tranche_inférieure_d832_15_1 contenu décimal
interne taux_tranche_supérieure_d832_15_1 contenu décimal
entrée type_travaux_logement contenu TypeTravauxLogement
entrée date_signature_prêt contenu date
# TODO informatique: mettre un type option là
entrée local_habité_première_fois_bénéficiaire contenu booléen
# TODO informatique: mettre un type option là
entrée date_entrée_logement contenu date
# TODO informatique: mettre un type option là
interne plafond_menusalité_d832_10_3 contenu argent
état base
état copropriétaires
entrée copropriété contenu booléen
interne calcul_plafond_menusalité_d832_10_3 contenu argent dépend de date
interne équivalence_minimale_loyer contenu argent
interne coefficient_prise_en_charge_d832_25 contenu décimal
état formule
état arrondi
état seuil
interne coefficient_multiplicateur_d832_25 contenu argent
interne coefficient_r_d832_25 contenu argent
interne n_nombre_parts_d832_25 contenu décimal
interne équivalence_loyer_éligible contenu argent
interne dépense_nette_minimale_d832_10 contenu argent dépend de argent
état avant_abattement
état après_abattement
interne dépense_nette_minimale_d832_27 contenu argent dépend de argent
état avant_abattement
état après_abattement
interne coefficient_multiplicateur_d832_17_3 contenu décimal
interne coefficient_multiplicateur_d832_11 contenu argent
interne coefficient_multiplicateur_d832_25 contenu argent
interne coefficient_r_d832_25 contenu argent
interne n_nombre_parts_d832_11 contenu décimal
interne n_nombre_parts_d832_25 contenu décimal
interne coefficient_prise_en_charge_d832_10 contenu décimal
interne coefficient_prise_en_charge_d832_25 contenu décimal
sortie participation_personnelle contenu argent
interne montant_forfaitaire_d832_10 contenu argent
interne montant_forfaitaire_d823_16 contenu argent
interne montant_forfaitaire_d832_24 contenu argent
interne montant_forfaitaire_d832_26 contenu argent
interne montant_forfaitaire_d832_27 contenu argent
interne condition_2_du_832_25 contenu booléen
entrée bénéficiaire_aide_adulte_ou_enfant_handicapés condition
interne montant_contributions_sociales contenu argent dépend de argent
entrée réduction_loyer_solidarité contenu argent
interne montant_minimal_aide_d832_10 contenu argent
interne montant_minimal_aide_d823_16 contenu argent
interne montant_minimal_aide_d823_24 contenu argent
sortie participation_minimale contenu argent
interne tranches_revenus_d832_26 contenu collection TrancheRevenu
contributions_sociales champ d'application
ContributionsSocialesAidePersonnelleLogement
sortie équivalence_minimale_loyer contenu argent
sortie aide_finale contenu argent
état formule
état minoration_forfaitaire
état abattement
état contributions_sociales_arrondi
état montant_minimal
déclaration champ d'application CalculAidePersonnelleLogementAccessionPropriété:
entrée mensualité_principale contenu argent
entrée ressources_ménage_arrondies contenu argent
entrée nombre_personnes_à_charge contenu entier
entrée situation_familiale_calcul_apl contenu SituationFamilialeCalculAPL
entrée type_travaux_logement contenu TypeTravauxLogement
entrée date_signature_prêt contenu date
entrée local_habité_première_fois_bénéficiaire contenu booléen
entrée date_entrée_logement contenu date
entrée copropriété contenu booléen
entrée situation_r822_11_13_17 contenu booléen
entrée équivalence_minimale_loyer contenu argent
entrée zone contenu ZoneDHabitation
entrée type_prêt contenu TypePrêt
entrée ancienneté_logement contenu NeufOuAncien
entrée date_courante contenu date
interne mensualité_éligible contenu argent
interne mensualité_minimale contenu argent
interne plafond_mensualité_d832_10_3 contenu argent
état base
état copropriétaires
interne calcul_plafond_mensualité_d832_10_3 contenu argent dépend de date
interne n_nombre_parts_d832_11 contenu décimal
interne coefficient_prise_en_charge_d832_10 contenu décimal
état formule
état arrondi
état seuil
interne dépense_nette_minimale_d832_10 contenu argent dépend de argent
état avant_abattement
état après_abattement
interne ressources_ménage_avec_d832_18 contenu argent
interne montant_forfaitaire_charges_d832_10 contenu argent
interne montant_forfaitaire_d832_10 contenu argent
interne montant_minimal_aide_d832_10 contenu argent
interne coefficient_multiplicateur_d832_17_3 contenu décimal
interne coefficient_multiplicateur_d832_11 contenu argent
interne coefficient_multiplicateur_d832_18 contenu décimal
interne montant_limite_tranches_d832_15_1 contenu argent
interne taux_tranche_inférieure_d832_15_1 contenu décimal
interne taux_tranche_supérieure_d832_15_1 contenu décimal
interne taux_francs_vers_euros contenu décimal
contributions_sociales champ d'application
ContributionsSocialesAidePersonnelleLogement
sortie aide_finale contenu argent
état formule
état minoration_forfaitaire
état abattement
état contributions_sociales_arrondi
état montant_minimal
déclaration structure InformationsCalculAPLLocatif:
donnée loyer_principal contenu argent
donnée bénéficiaire_aide_adulte_ou_enfant_handicapés contenu booléen
donnée logement_est_chambre contenu booléen
donnée colocation contenu booléen
donnée personnes_âgées_ou_handicap_adultes_hébergées_onéreux_particuliers
contenu booléen
# TODO informatique et juridique: calculer type_aide!
donnée type_aide contenu TypeAidePersonnelleLogement
donnée réduction_loyer_solidarité contenu argent
déclaration structure InformationsCalculAPLAccessionPropriété:
donnée mensualité_principale contenu argent
donnée date_signature_prêt contenu date
donnée date_entrée_logement contenu date
donnée type_travaux_logement contenu TypeTravauxLogement
donnée local_habité_première_fois_bénéficiaire contenu booléen
donnée copropriété contenu booléen
donnée situation_r822_11_13_17 contenu booléen
donnée type_prêt contenu TypePrêt
donnée ancienneté_logement contenu NeufOuAncien
déclaration énumération InformationsCalculAPL:
-- InfosLocatif contenu InformationsCalculAPLLocatif
-- InfosLogementFoyer
-- InfosAccessionPropriété contenu
InformationsCalculAPLAccessionPropriété
déclaration champ d'application CalculAidePersonnelleLogement:
entrée mode_occupation contenu ModeOccupation
entrée informations_calcul contenu InformationsCalculAPL
entrée ressources_ménage contenu argent
état sans_arrondi
état avec_arrondi
interne ressources_ménage_avec_d832_18 contenu argent
interne coefficient_multiplicateur_d832_18 contenu décimal
interne abattement_forfaitaire_d823_17 contenu argent
interne taux_prise_compte_ressources contenu décimal
interne taux_loyer_éligible contenu décimal
sortie taux_composition_familiale contenu décimal
entrée situation_r822_11_13_17 contenu booléen
entrée situation_familiale contenu SituationFamiliale
entrée nombre_personnes_à_charge contenu entier
entrée zone contenu ZoneDHabitation
entrée date_courante contenu date
champ d'application CalculAidePersonnelleLogement:
# Valeur par défaut pour ce plafond quand il n'est pas applicable.
définition calcul_plafond_menusalité_d832_10_3 de date_signature_prêt sous condition
type_prêt sous forme TypePrêt.Autre
conséquence égal à 0 €
interne catégorie_calcul_apl contenu CatégorieCalculAPL
interne situation_familiale_calcul_apl contenu SituationFamilialeCalculAPL
locatif champ d'application CalculAidePersonnelleLogementLocatif
logement_foyer champ d'application CalculAidePersonnelleLogementFoyer
accession_propriété champ d'application
CalculAidePersonnelleLogementAccessionPropriété
sortie aide_finale contenu argent
champ d'application ContributionsSocialesAidePersonnelleLogement:
# TODO juridique: mettre ce bout de code à côté des articles de loi qui le
# justifient. (Pas de CSG mais la CRDS pour les APL)
définition montant_contributions_sociales de aide_finale égal à
définition montant de aide_finale égal à
aide_finale *€ 0,5%
déclaration champ d'application OuvertureDroitsRetraite:
@ -426,20 +511,17 @@ déclaration énumération ModeOccupationImpayé:
-- ImpayéPrêt
déclaration champ d'application ImpayéDépenseLogement:
interne seuil_impayé_dépense_de_logement contenu argent
entrée mode_occupation contenu ModeOccupation
interne mode_occupation_impayé contenu ModeOccupationImpayé
entrée aide_versée contenu VersementÀ
entrée montant_charges contenu argent
entrée montant_apl contenu argent
entrée montant_charges contenu argent
entrée dépense_logement contenu DépenseLogement
entrée montant_dette contenu argent
interne seuil_impayé_dépense_de_logement contenu argent
interne mode_occupation_impayé contenu ModeOccupationImpayé
interne dépense_logement_brute contenu DépenseLogement
interne dépense_logement_nette contenu DépenseLogement
entrée montant_dette contenu argent
sortie montant_impayé contenu argent
```

View File

@ -1,2 +0,0 @@
[RESULT] Computation successful! Results:
[RESULT] éligible = true

View File

@ -4,43 +4,26 @@
```catala
déclaration champ d'application Exemple1 :
calcul champ d'application CalculAidePersonnelleLogement
calcul champ d'application CalculAidePersonnelleLogementLocatif
sortie montant contenu argent
champ d'application Exemple1:
définition montant égal à calcul.aide_finale
définition calcul.ancienneté_logement égal à Neuf
définition calcul.mode_occupation égal à Locataire contenu (Location {
-- bailleur: Bailleur {
-- type_bailleur: BailleurPrivé
-- respecte_convention_titre_V: vrai
-- respecte_convention_titre_II: vrai
-- construit_amélioré_conditions_l831_1_4: faux
-- acquisition_aides_état_prêt_titre_II_ou_livre_III: faux
}
})
définition calcul.loyer_principal égal à 700 €
définition calcul.mensualité_principale égal à 0 €
définition calcul.date_courante égal à |2021-10-3|
définition calcul.logement_est_chambre égal à faux
définition calcul.personnes_âgées_ou_handicapées_adultes_hébergées_à_titre_onéreux_chez_des_particuliers
définition calcul.personnes_âgées_ou_handicap_adultes_hébergées_onéreux_particuliers
égal à faux
définition calcul.zone égal à Zone1
définition calcul.situation_familiale égal à Mariés
définition calcul.situation_familiale_calcul_apl égal à Couple
définition calcul.nombre_personnes_à_charge égal à 3
définition calcul.type_aide égal à AidePersonnaliséeLogement
# TODO juridique: trouver articles loi qui calculent le type d'aide
# à partir des caractéristiques du ménage et l'implémenter.
définition calcul.colocation égal à faux
définition calcul.type_travaux_logement égal à SurLogementExistant
définition calcul.local_habité_première_fois_bénéficiaire égal à faux
définition calcul.date_entrée_logement égal à |2020-05-20|
définition calcul.copropriété égal à faux
définition calcul.réduction_loyer_solidarité égal à 0 €
définition calcul.ressources_ménage égal à 35 999 €
définition calcul.situation_r822_11_13_17 égal à faux
définition calcul.type_prêt égal à TypePrêt.Autre
définition calcul.date_signature_prêt égal à |2020-05-03|
définition calcul.ressources_ménage_arrondies égal à 36 000 €
définition calcul.bénéficiaire_aide_adulte_ou_enfant_handicapés égal à faux
assertion montant = 0 €
assertion calcul.montant_forfaitaire_charges_d823_16 = 91,09 €
assertion calcul.plafond_loyer_d823_16_2 = 524,20 €

View File

@ -65,3 +65,21 @@ champ d'application BaseMensuelleAllocationsFamiliales :
date_courante <@ |2022-04-01|
conséquence égal à 414,81 €
```
## Instruction interministérielle n°DSS/2B/2022/82 du 28 mars 2022 relative à la revalorisation au 1er avril 2022 des prestations familiales servies en métropole, en Guadeloupe, en Guyane, en Martinique, à la Réunion, à Saint-Barthélemy, à Saint-Martin et dans le département de Mayotte
Au 1er avril 2022, le coefficient de revalorisation de la base mensuelle de
calcul des allocations familiales (BMAF) est ainsi fixé à 1,018 soit un taux
de revalorisation de la BMAF de 1,8 %. Le montant de cette base mensuelle,
en pourcentage duquel sont fixées les prestations familiales, est donc porté
de 414,81 € au 1er avril 2021 à 422,28 € au 1er avril 2022.
```catala
champ d'application BaseMensuelleAllocationsFamiliales :
définition montant
sous condition
date_courante >=@ |2022-04-01| et
date_courante <@ |2023-04-01|
conséquence égal à 422,28 €
```

View File

@ -9,7 +9,7 @@
# This file should be in sync with compiler/runtime.{ml, mli} !
from gmpy2 import log2, mpz, mpq, mpfr, t_divmod, sign # type: ignore
from gmpy2 import log2, mpz, mpq, mpfr, t_divmod, f_div, sign # type: ignore
import datetime
import dateutil.relativedelta
from typing import NewType, List, Callable, Tuple, Optional, TypeVar, Iterable, Union, Any
@ -397,6 +397,12 @@ def decimal_of_integer(d: Integer) -> Decimal:
def decimal_to_string(precision: int, i: Decimal) -> str:
return "{1:.{0}}".format(precision, mpfr(i.value, precision * 10 // 2))
def decimal_round(q: Decimal) -> Decimal:
# Implements the workaround by
# https://gmplib.org/list-archives/gmp-discuss/2009-May/003767.html *)
return f_div(2*q.numerator + q.denominator, 2*q.denominator) # type:ignore
# --------
# Integers
# --------

View File

@ -0,0 +1,5 @@
[RESULT] Computation successful! Results:
[RESULT] x = 84.648665
[RESULT] x1 = 85.
[RESULT] y = 4.368297
[RESULT] y1 = 4.

View File

@ -0,0 +1,15 @@
## Article
```catala
declaration scope A:
output x content decimal
output y content decimal
output x1 content decimal
output y1 content decimal
scope A:
definition x equals 84.648665
definition y equals 4.368297
definition x1 equals round_decimal of x
definition y1 equals round_decimal of y
```