fix(#131): polish fiche AM — champs pro, places, vigilance et photo.
Fiche pro entièrement éditable, places déclarées en lecture seule avec alerte rouge, icône vigilance sur la liste AM, et cadrage photo aligné sur le wizard validation. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
import 'package:p_tits_pas/models/assistante_maternelle_model.dart';
|
||||
|
||||
/// Places disponibles attendues : capacité max − enfants rattachés.
|
||||
int? amExpectedPlacesAvailable({
|
||||
required int? maxChildren,
|
||||
required int childrenCount,
|
||||
}) {
|
||||
if (maxChildren == null) return null;
|
||||
return (maxChildren - childrenCount).clamp(0, maxChildren);
|
||||
}
|
||||
|
||||
/// True si la valeur déclarée par l'AM ne correspond pas au calcul métier.
|
||||
bool amHasPlacesInconsistency({
|
||||
required int? maxChildren,
|
||||
required int? placesAvailable,
|
||||
required int childrenCount,
|
||||
}) {
|
||||
final expected = amExpectedPlacesAvailable(
|
||||
maxChildren: maxChildren,
|
||||
childrenCount: childrenCount,
|
||||
);
|
||||
if (expected == null) return false;
|
||||
if (placesAvailable == null) return childrenCount > (maxChildren ?? 0);
|
||||
return placesAvailable != expected;
|
||||
}
|
||||
|
||||
String? amPlacesVigilanceMessage(AssistanteMaternelleModel am) {
|
||||
if (!amHasPlacesInconsistency(
|
||||
maxChildren: am.maxChildren,
|
||||
placesAvailable: am.placesAvailable,
|
||||
childrenCount: am.children.length,
|
||||
)) {
|
||||
return null;
|
||||
}
|
||||
final stored = am.placesAvailable;
|
||||
final expected = amExpectedPlacesAvailable(
|
||||
maxChildren: am.maxChildren,
|
||||
childrenCount: am.children.length,
|
||||
);
|
||||
final storedLabel = stored?.toString() ?? 'non renseigné';
|
||||
final expectedLabel = expected?.toString() ?? '–';
|
||||
return 'Point de vigilance : l\'AM déclare $storedLabel place(s) disponible(s), '
|
||||
'alors que capacité ${am.maxChildren ?? '–'} − '
|
||||
'${am.children.length} enfant(s) rattaché(s) = $expectedLabel.';
|
||||
}
|
||||
@@ -10,7 +10,25 @@ String formatIsoDateFr(String? s, {String ifEmpty = '–'}) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Parties d'âge calendaire entre [birth] et [reference] (date-only).
|
||||
/// Convertit `dd/MM/yyyy` (ou ISO) en `yyyy-MM-dd` pour l'API.
|
||||
String? parseFrDateToIso(String text) {
|
||||
final t = text.trim();
|
||||
if (t.isEmpty) return null;
|
||||
try {
|
||||
return DateFormat('dd/MM/yyyy')
|
||||
.parseStrict(t)
|
||||
.toIso8601String()
|
||||
.split('T')
|
||||
.first;
|
||||
} catch (_) {
|
||||
try {
|
||||
return DateTime.parse(t).toIso8601String().split('T').first;
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
({int years, int months, int days}) computeChildAgeParts(
|
||||
DateTime birth,
|
||||
DateTime reference,
|
||||
|
||||
Reference in New Issue
Block a user