Appli Flutter se connecte bien à l'API.

This commit is contained in:
DahoudG
2025-09-12 03:15:21 +00:00
parent 8184bc77bb
commit 3df010add7
33 changed files with 3124 additions and 339 deletions

View File

@@ -0,0 +1,186 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'membre_model.g.dart';
/// Modèle de données pour un membre UnionFlow
/// Aligné avec MembreDTO du serveur API
@JsonSerializable()
class MembreModel extends Equatable {
/// ID unique du membre
final String? id;
/// Numéro unique du membre (format: UF-YYYY-XXXXXXXX)
@JsonKey(name: 'numeroMembre')
final String numeroMembre;
/// Nom de famille du membre
final String nom;
/// Prénom du membre
final String prenom;
/// Adresse email
final String email;
/// Numéro de téléphone
final String telephone;
/// Date de naissance
@JsonKey(name: 'dateNaissance')
final DateTime? dateNaissance;
/// Adresse complète
final String? adresse;
/// Ville
final String? ville;
/// Code postal
@JsonKey(name: 'codePostal')
final String? codePostal;
/// Pays
final String? pays;
/// Profession
final String? profession;
/// Statut du membre (ACTIF, INACTIF, SUSPENDU)
final String statut;
/// Date d'adhésion
@JsonKey(name: 'dateAdhesion')
final DateTime dateAdhesion;
/// Date de création
@JsonKey(name: 'dateCreation')
final DateTime dateCreation;
/// Date de dernière modification
@JsonKey(name: 'dateModification')
final DateTime? dateModification;
/// Indique si le membre est actif
final bool actif;
/// Version pour optimistic locking
final int version;
const MembreModel({
this.id,
required this.numeroMembre,
required this.nom,
required this.prenom,
required this.email,
required this.telephone,
this.dateNaissance,
this.adresse,
this.ville,
this.codePostal,
this.pays,
this.profession,
required this.statut,
required this.dateAdhesion,
required this.dateCreation,
this.dateModification,
required this.actif,
required this.version,
});
/// Constructeur depuis JSON
factory MembreModel.fromJson(Map<String, dynamic> json) =>
_$MembreModelFromJson(json);
/// Conversion vers JSON
Map<String, dynamic> toJson() => _$MembreModelToJson(this);
/// Nom complet du membre
String get nomComplet => '$prenom $nom';
/// Initiales du membre
String get initiales {
final prenomInitial = prenom.isNotEmpty ? prenom[0].toUpperCase() : '';
final nomInitial = nom.isNotEmpty ? nom[0].toUpperCase() : '';
return '$prenomInitial$nomInitial';
}
/// Adresse complète formatée
String get adresseComplete {
final parts = <String>[];
if (adresse?.isNotEmpty == true) parts.add(adresse!);
if (ville?.isNotEmpty == true) parts.add(ville!);
if (codePostal?.isNotEmpty == true) parts.add(codePostal!);
if (pays?.isNotEmpty == true) parts.add(pays!);
return parts.join(', ');
}
/// Copie avec modifications
MembreModel copyWith({
String? id,
String? numeroMembre,
String? nom,
String? prenom,
String? email,
String? telephone,
DateTime? dateNaissance,
String? adresse,
String? ville,
String? codePostal,
String? pays,
String? profession,
String? statut,
DateTime? dateAdhesion,
DateTime? dateCreation,
DateTime? dateModification,
bool? actif,
int? version,
}) {
return MembreModel(
id: id ?? this.id,
numeroMembre: numeroMembre ?? this.numeroMembre,
nom: nom ?? this.nom,
prenom: prenom ?? this.prenom,
email: email ?? this.email,
telephone: telephone ?? this.telephone,
dateNaissance: dateNaissance ?? this.dateNaissance,
adresse: adresse ?? this.adresse,
ville: ville ?? this.ville,
codePostal: codePostal ?? this.codePostal,
pays: pays ?? this.pays,
profession: profession ?? this.profession,
statut: statut ?? this.statut,
dateAdhesion: dateAdhesion ?? this.dateAdhesion,
dateCreation: dateCreation ?? this.dateCreation,
dateModification: dateModification ?? this.dateModification,
actif: actif ?? this.actif,
version: version ?? this.version,
);
}
@override
List<Object?> get props => [
id,
numeroMembre,
nom,
prenom,
email,
telephone,
dateNaissance,
adresse,
ville,
codePostal,
pays,
profession,
statut,
dateAdhesion,
dateCreation,
dateModification,
actif,
version,
];
@override
String toString() => 'MembreModel(id: $id, numeroMembre: $numeroMembre, '
'nomComplet: $nomComplet, email: $email, statut: $statut)';
}

View File

@@ -0,0 +1,54 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'membre_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
MembreModel _$MembreModelFromJson(Map<String, dynamic> json) => MembreModel(
id: json['id'] as String?,
numeroMembre: json['numeroMembre'] as String,
nom: json['nom'] as String,
prenom: json['prenom'] as String,
email: json['email'] as String,
telephone: json['telephone'] as String,
dateNaissance: json['dateNaissance'] == null
? null
: DateTime.parse(json['dateNaissance'] as String),
adresse: json['adresse'] as String?,
ville: json['ville'] as String?,
codePostal: json['codePostal'] as String?,
pays: json['pays'] as String?,
profession: json['profession'] as String?,
statut: json['statut'] as String,
dateAdhesion: DateTime.parse(json['dateAdhesion'] as String),
dateCreation: DateTime.parse(json['dateCreation'] as String),
dateModification: json['dateModification'] == null
? null
: DateTime.parse(json['dateModification'] as String),
actif: json['actif'] as bool,
version: (json['version'] as num).toInt(),
);
Map<String, dynamic> _$MembreModelToJson(MembreModel instance) =>
<String, dynamic>{
'id': instance.id,
'numeroMembre': instance.numeroMembre,
'nom': instance.nom,
'prenom': instance.prenom,
'email': instance.email,
'telephone': instance.telephone,
'dateNaissance': instance.dateNaissance?.toIso8601String(),
'adresse': instance.adresse,
'ville': instance.ville,
'codePostal': instance.codePostal,
'pays': instance.pays,
'profession': instance.profession,
'statut': instance.statut,
'dateAdhesion': instance.dateAdhesion.toIso8601String(),
'dateCreation': instance.dateCreation.toIso8601String(),
'dateModification': instance.dateModification?.toIso8601String(),
'actif': instance.actif,
'version': instance.version,
};

View File

@@ -0,0 +1,206 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'wave_checkout_session_model.g.dart';
/// Modèle pour les sessions de paiement Wave Money
/// Aligné avec WaveCheckoutSessionDTO du serveur API
@JsonSerializable()
class WaveCheckoutSessionModel extends Equatable {
/// ID unique de la session
final String? id;
/// ID de la session Wave (retourné par l'API Wave)
@JsonKey(name: 'waveSessionId')
final String waveSessionId;
/// URL de la session de paiement Wave
@JsonKey(name: 'waveUrl')
final String? waveUrl;
/// Montant du paiement
final double montant;
/// Devise (XOF pour la Côte d'Ivoire)
final String devise;
/// URL de succès (redirection après paiement réussi)
@JsonKey(name: 'successUrl')
final String successUrl;
/// URL d'erreur (redirection après échec)
@JsonKey(name: 'errorUrl')
final String errorUrl;
/// Statut de la session
final String statut;
/// ID de l'organisation qui effectue le paiement
@JsonKey(name: 'organisationId')
final String? organisationId;
/// Nom de l'organisation
@JsonKey(name: 'nomOrganisation')
final String? nomOrganisation;
/// ID du membre qui effectue le paiement
@JsonKey(name: 'membreId')
final String? membreId;
/// Nom du membre
@JsonKey(name: 'nomMembre')
final String? nomMembre;
/// Type de paiement (COTISATION, ADHESION, AIDE, EVENEMENT)
@JsonKey(name: 'typePaiement')
final String? typePaiement;
/// Description du paiement
final String? description;
/// Référence externe
@JsonKey(name: 'referenceExterne')
final String? referenceExterne;
/// Date de création
@JsonKey(name: 'dateCreation')
final DateTime dateCreation;
/// Date d'expiration
@JsonKey(name: 'dateExpiration')
final DateTime? dateExpiration;
/// Date de dernière modification
@JsonKey(name: 'dateModification')
final DateTime? dateModification;
/// Indique si la session est active
final bool actif;
/// Version pour optimistic locking
final int version;
const WaveCheckoutSessionModel({
this.id,
required this.waveSessionId,
this.waveUrl,
required this.montant,
required this.devise,
required this.successUrl,
required this.errorUrl,
required this.statut,
this.organisationId,
this.nomOrganisation,
this.membreId,
this.nomMembre,
this.typePaiement,
this.description,
this.referenceExterne,
required this.dateCreation,
this.dateExpiration,
this.dateModification,
required this.actif,
required this.version,
});
/// Constructeur depuis JSON
factory WaveCheckoutSessionModel.fromJson(Map<String, dynamic> json) =>
_$WaveCheckoutSessionModelFromJson(json);
/// Conversion vers JSON
Map<String, dynamic> toJson() => _$WaveCheckoutSessionModelToJson(this);
/// Montant formaté avec devise
String get montantFormate => '${montant.toStringAsFixed(0)} $devise';
/// Indique si la session est expirée
bool get estExpiree {
if (dateExpiration == null) return false;
return DateTime.now().isAfter(dateExpiration!);
}
/// Indique si la session est en attente
bool get estEnAttente => statut == 'PENDING' || statut == 'EN_ATTENTE';
/// Indique si la session est réussie
bool get estReussie => statut == 'SUCCESS' || statut == 'REUSSIE';
/// Indique si la session a échoué
bool get aEchoue => statut == 'FAILED' || statut == 'ECHEC';
/// Copie avec modifications
WaveCheckoutSessionModel copyWith({
String? id,
String? waveSessionId,
String? waveUrl,
double? montant,
String? devise,
String? successUrl,
String? errorUrl,
String? statut,
String? organisationId,
String? nomOrganisation,
String? membreId,
String? nomMembre,
String? typePaiement,
String? description,
String? referenceExterne,
DateTime? dateCreation,
DateTime? dateExpiration,
DateTime? dateModification,
bool? actif,
int? version,
}) {
return WaveCheckoutSessionModel(
id: id ?? this.id,
waveSessionId: waveSessionId ?? this.waveSessionId,
waveUrl: waveUrl ?? this.waveUrl,
montant: montant ?? this.montant,
devise: devise ?? this.devise,
successUrl: successUrl ?? this.successUrl,
errorUrl: errorUrl ?? this.errorUrl,
statut: statut ?? this.statut,
organisationId: organisationId ?? this.organisationId,
nomOrganisation: nomOrganisation ?? this.nomOrganisation,
membreId: membreId ?? this.membreId,
nomMembre: nomMembre ?? this.nomMembre,
typePaiement: typePaiement ?? this.typePaiement,
description: description ?? this.description,
referenceExterne: referenceExterne ?? this.referenceExterne,
dateCreation: dateCreation ?? this.dateCreation,
dateExpiration: dateExpiration ?? this.dateExpiration,
dateModification: dateModification ?? this.dateModification,
actif: actif ?? this.actif,
version: version ?? this.version,
);
}
@override
List<Object?> get props => [
id,
waveSessionId,
waveUrl,
montant,
devise,
successUrl,
errorUrl,
statut,
organisationId,
nomOrganisation,
membreId,
nomMembre,
typePaiement,
description,
referenceExterne,
dateCreation,
dateExpiration,
dateModification,
actif,
version,
];
@override
String toString() => 'WaveCheckoutSessionModel(id: $id, '
'waveSessionId: $waveSessionId, montant: $montantFormate, '
'statut: $statut, typePaiement: $typePaiement)';
}

View File

@@ -0,0 +1,61 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'wave_checkout_session_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
WaveCheckoutSessionModel _$WaveCheckoutSessionModelFromJson(
Map<String, dynamic> json) =>
WaveCheckoutSessionModel(
id: json['id'] as String?,
waveSessionId: json['waveSessionId'] as String,
waveUrl: json['waveUrl'] as String?,
montant: (json['montant'] as num).toDouble(),
devise: json['devise'] as String,
successUrl: json['successUrl'] as String,
errorUrl: json['errorUrl'] as String,
statut: json['statut'] as String,
organisationId: json['organisationId'] as String?,
nomOrganisation: json['nomOrganisation'] as String?,
membreId: json['membreId'] as String?,
nomMembre: json['nomMembre'] as String?,
typePaiement: json['typePaiement'] as String?,
description: json['description'] as String?,
referenceExterne: json['referenceExterne'] as String?,
dateCreation: DateTime.parse(json['dateCreation'] as String),
dateExpiration: json['dateExpiration'] == null
? null
: DateTime.parse(json['dateExpiration'] as String),
dateModification: json['dateModification'] == null
? null
: DateTime.parse(json['dateModification'] as String),
actif: json['actif'] as bool,
version: (json['version'] as num).toInt(),
);
Map<String, dynamic> _$WaveCheckoutSessionModelToJson(
WaveCheckoutSessionModel instance) =>
<String, dynamic>{
'id': instance.id,
'waveSessionId': instance.waveSessionId,
'waveUrl': instance.waveUrl,
'montant': instance.montant,
'devise': instance.devise,
'successUrl': instance.successUrl,
'errorUrl': instance.errorUrl,
'statut': instance.statut,
'organisationId': instance.organisationId,
'nomOrganisation': instance.nomOrganisation,
'membreId': instance.membreId,
'nomMembre': instance.nomMembre,
'typePaiement': instance.typePaiement,
'description': instance.description,
'referenceExterne': instance.referenceExterne,
'dateCreation': instance.dateCreation.toIso8601String(),
'dateExpiration': instance.dateExpiration?.toIso8601String(),
'dateModification': instance.dateModification?.toIso8601String(),
'actif': instance.actif,
'version': instance.version,
};