Files
Colin Maudry ded5e66ccc fix(backup): nettoyer le fichier temporaire en cas d'erreur dans restore (#89)
Wraps temp file operations in try/except to ensure the temporary database file is always cleaned up, even if an exception occurs during write_snapshot or verify_integrity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 17:21:28 +02:00

198 lines
7.1 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "c5b66458e29113e9",
"metadata": {},
"outputs": [],
"source": [
"import polars as pl\n",
"\n",
"pl.Config(\n",
" fmt_str_lengths=120,\n",
" fmt_table_cell_list_len=50,\n",
" set_tbl_rows=100,\n",
" tbl_cols=-1,\n",
")\n",
"\n",
"for methode_dividendes in (\"flat\", \"progressif\"):\n",
" df: pl.DataFrame = pl.DataFrame()\n",
"\n",
" for i in range(0, 11):\n",
" benefice_reel = 3000\n",
" ca = 50000\n",
" depenses_pro = 5000\n",
" remuneration_plus_is = ca - depenses_pro - benefice_reel\n",
" is_minimal = benefice_reel * 0.15\n",
"\n",
" salaires_brut = (remuneration_plus_is - is_minimal) * i / 10\n",
"\n",
" def taux_dividendes():\n",
" taux = {}\n",
" if methode_dividendes == \"flat\":\n",
" taux = {\"retenue_source\": 0.7, \"abattement\": 0}\n",
" elif methode_dividendes == \"progressif\":\n",
" taux = {\"retenue_source\": 0.828, \"abattement\": 0.6}\n",
" return taux\n",
"\n",
" def calcul_cout_dividendes():\n",
" return remuneration_plus_is - salaires_brut - is_minimal\n",
"\n",
" def calcul_dividendes_bruts():\n",
" return calcul_cout_dividendes() / 1.15\n",
"\n",
" def calcul_cout_remuneration():\n",
" return calcul_dividendes_bruts() * 1.15 + salaires_brut\n",
"\n",
" def calcul_dividendes_net():\n",
" dividendes_bruts = calcul_dividendes_bruts()\n",
" dividendes_net = dividendes_bruts * taux_dividendes()[\"retenue_source\"]\n",
" return dividendes_net\n",
"\n",
" def calcul_salaires_net():\n",
" return salaires_brut * 0.563\n",
"\n",
" def calcul_revenu_imposable():\n",
" return (calcul_salaires_net() * 0.9) + (\n",
" calcul_dividendes_net() * taux_dividendes()[\"abattement\"]\n",
" )\n",
"\n",
" def calcul_revenu_net():\n",
" return calcul_salaires_net() + calcul_dividendes_net()\n",
"\n",
" def calcul_benefice():\n",
" return ca - depenses_pro - salaires_brut\n",
"\n",
" def calcul_is():\n",
" return (calcul_benefice() - is_minimal) * 0.15\n",
"\n",
" def calcul_ir(revenu):\n",
" tranches_ir = [[11488, 0], [29315, 0.11], [83283, 0.3]]\n",
" revenu_restant = revenu\n",
" ir = 0\n",
" for tranche in tranches_ir:\n",
" if revenu_restant > 0:\n",
" ir_tranche = min(revenu_restant, tranche[0]) * tranche[1]\n",
" ir = +ir_tranche\n",
" revenu_restant = revenu_restant - tranche[0]\n",
"\n",
" return ir\n",
"\n",
" def calcul_revenu_ae():\n",
" apres_cotisations = calcul_cout_remuneration() * 0.76 - depenses_pro\n",
" impots = calcul_ir(apres_cotisations * 0.66)\n",
" return apres_cotisations - impots\n",
"\n",
" def fmt(value):\n",
" return str(int(value))\n",
"\n",
" # print(salaires_brut)\n",
" # print(calcul_cout_dividendes())\n",
" # print(calcul_dividendes_bruts())\n",
" # print(calcul_is())\n",
" # print(\"\")\n",
" # print(\"\")\n",
" #\n",
" # print(salaires_brut + calcul_dividendes_bruts() + calcul_is(), \" == \", remuneration_plus_is)\n",
"\n",
" # assert salaires_brut + calcul_dividendes_bruts() + calcul_is() == remuneration_plus_is\n",
"\n",
" row: dict = {\n",
" \"Salaires bruts\": [fmt(salaires_brut / 12)],\n",
" \"Dividendes bruts\": [fmt(calcul_cout_dividendes() / 12)],\n",
" \"Benefice\": [fmt(calcul_benefice())],\n",
" \"Benefice réél\": [\n",
" fmt(calcul_benefice() - calcul_is() - calcul_dividendes_bruts())\n",
" ],\n",
" \"IS\": [fmt(calcul_is())],\n",
" \"IR\": [fmt(calcul_ir(calcul_revenu_imposable()) / 12)],\n",
" \"IS + IR\": [fmt(calcul_is() + calcul_ir(calcul_revenu_imposable()))],\n",
" \"Salaires net\": [fmt(calcul_salaires_net() / 12)],\n",
" \"Dividendes net\": [fmt(calcul_dividendes_net() / 12)],\n",
" \"Revenu net ap. impôts\": [\n",
" fmt((calcul_revenu_net() - calcul_ir(calcul_revenu_imposable())) / 12)\n",
" ],\n",
" \"Revenue AE ap. impôts\": [fmt(calcul_revenu_ae() / 12)],\n",
" }\n",
"\n",
" df = pl.concat([df, pl.from_dict(row)])\n",
"\n",
" print(df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "initial_id",
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from dash import ALL, Dash, Input, Output, Patch, State, callback, dcc, html\n",
"\n",
"app = Dash()\n",
"\n",
"app.layout = html.Div(\n",
" [\n",
" html.Button(\"Add Filter\", id=\"add-filter-btn\", n_clicks=0),\n",
" html.Div(id=\"dropdown-container-div\", children=[]),\n",
" html.Div(id=\"dropdown-container-output-div\"),\n",
" ]\n",
")\n",
"\n",
"\n",
"@callback(\n",
" Output(\"dropdown-container-div\", \"children\"), Input(\"add-filter-btn\", \"n_clicks\")\n",
")\n",
"def display_dropdowns(n_clicks):\n",
" patched_children = Patch()\n",
" new_dropdown = dcc.Dropdown(\n",
" [\"NYC\", \"MTL\", \"LA\", \"TOKYO\"],\n",
" id={\"type\": \"city-filter-dropdown\", \"index\": n_clicks},\n",
" )\n",
" patched_children.append(new_dropdown)\n",
" return patched_children\n",
"\n",
"\n",
"@callback(\n",
" Output(\"dropdown-container-output-div\", \"children\"),\n",
" Input({\"type\": \"city-filter-dropdown\", \"index\": ALL}, \"value\"),\n",
" State({\"type\": \"city-dynamic-dropdown\", \"index\": ALL}, \"id\"),\n",
")\n",
"def display_output(values, ids):\n",
" return html.Div(\n",
" [html.Div(f\"Dropdown {i + 1} = {value}\") for (i, value) in enumerate(values)]\n",
" + [html.P(ids)],\n",
" )\n",
"\n",
"\n",
"if __name__ == \"__main__\":\n",
" app.run(debug=True)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}