Fix montants (locale) + timeout fetch Indy + message d'erreur
This commit is contained in:
Binary file not shown.
Binary file not shown.
+15
-3
@@ -5,7 +5,7 @@ normalise au format attendu par l'import (réutilisé par la page /import/).
|
||||
La « catégorie » Indy est un numéro de compte du plan comptable (PCG) ; on le
|
||||
mappe vers nos catégories. Montants en centimes, signés. `tva_intracom` => UE.
|
||||
|
||||
⚠️ API non officielle d'Indy : pour les données de l'utilisateur. Le token JWT
|
||||
API non officielle d'Indy : pour les données de l'utilisateur. Le token JWT
|
||||
expire (~1 h) et doit être renouvelé.
|
||||
"""
|
||||
from decimal import Decimal
|
||||
@@ -96,14 +96,26 @@ def fetch_transactions(token, date_debut=None, date_fin=None, search="", page=1,
|
||||
params["dateFrom"] = date_debut
|
||||
if date_fin:
|
||||
params["dateTo"] = date_fin
|
||||
timeout = httpx.Timeout(12.0, connect=8.0)
|
||||
try:
|
||||
with httpx.Client(base_url=base_url.rstrip("/"), headers=headers,
|
||||
timeout=30, follow_redirects=True) as c:
|
||||
timeout=timeout, follow_redirects=True) as c:
|
||||
r = c.get(TRANSACTIONS_PATH, params=params)
|
||||
if r.status_code != 200:
|
||||
return r.status_code, [], f"HTTP {r.status_code} (token expiré ?)"
|
||||
return r.status_code, [], (
|
||||
f"HTTP {r.status_code} — token expire, ou requete bloquee par "
|
||||
f"Cloudflare depuis le serveur.")
|
||||
if "json" not in r.headers.get("content-type", "").lower():
|
||||
return r.status_code, [], (
|
||||
"Reponse non-JSON (probablement Cloudflare). Le conteneur n'arrive "
|
||||
"pas a joindre Indy directement. Recupere le CSV depuis ton poste "
|
||||
"(MCP/CLI) et colle-le ci-dessous.")
|
||||
data = r.json()
|
||||
return 200, data.get("transactions", []), None
|
||||
except httpx.TimeoutException:
|
||||
return None, [], ("Delai depasse en joignant Indy : le conteneur n'a peut-etre "
|
||||
"pas d'acces Internet, ou Cloudflare bloque. Utilise le CSV "
|
||||
"depuis ton poste.")
|
||||
except Exception as ex: # noqa: BLE001
|
||||
return None, [], f"{type(ex).__name__}: {ex}"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
{% load l10n %}<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
@@ -128,8 +128,8 @@
|
||||
{% for val,lab in regimes %}<option value="{{ val }}" {% if val == l.regime %}selected{% endif %}>{{ lab }}</option>{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
<td><input type="number" step="0.01" name="l_taux" value="{{ l.taux }}" class="num" style="width:70px"></td>
|
||||
<td><input type="number" step="0.01" name="l_montant" value="{{ l.montant }}" class="num" style="width:100px"></td>
|
||||
<td><input type="number" step="0.01" name="l_taux" value="{{ l.taux|unlocalize }}" class="num" style="width:70px"></td>
|
||||
<td><input type="number" step="0.01" name="l_montant" value="{{ l.montant|unlocalize }}" class="num" style="width:100px"></td>
|
||||
<td>{{ l.type }}</td>
|
||||
<input type="hidden" name="l_activite" value="{{ l.activite }}">
|
||||
<input type="hidden" name="l_indy_id" value="{{ l.indy_id }}">
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
"""Page d'installation du favori « Indy → CSV »."""
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.shortcuts import render
|
||||
|
||||
|
||||
@login_required
|
||||
def bookmarklet(request):
|
||||
return render(request, "compta/bookmarklet.html", {})
|
||||
Reference in New Issue
Block a user