4848import org .openimis .imisclaims .network .exception .HttpException ;
4949import org .openimis .imisclaims .tools .Log ;
5050import org .openimis .imisclaims .usecase .FetchInsureeInquire ;
51+ import org .openimis .imisclaims .util .FamilyTypeConstants ;
52+ import org .openimis .imisclaims .domain .entity .Family ;
5153import org .openimis .imisclaims .util .DateUtils ;
5254import org .openimis .imisclaims .util .TextViewUtils ;
5355
@@ -226,7 +228,7 @@ private Insuree getDataFromDb(String chfid) {
226228 SQLiteDatabase db = openOrCreateDatabase (SQLHandler .DB_NAME_DATA , SQLiteDatabase .OPEN_READONLY , null );
227229 String [] columns = {"CHFID" , "Photo" , "InsureeName" , "DOB" , "Gender" , "ProductCode" , "ProductName" , "ExpiryDate" , "Status" , "DedType" , "Ded1" , "Ded2" , "Ceiling1" , "Ceiling2" };
228230 String [] selectionArgs = {chfid };
229- Cursor c = db .query ("tblPolicyInquiry" , columns , "Trim(CHFID )=?" , selectionArgs , null , null , null );
231+ Cursor c = db .query ("tblPolicyInquiry" , columns , "Trim(InsureeNumber )=?" , selectionArgs , null , null , null );
230232 String name = null ;
231233 Date dateOfBirth = null ;
232234 String gender = null ;
@@ -331,43 +333,134 @@ public void renderResult(@Nullable Insuree insuree) {
331333 }
332334 }
333335
336+ /**
337+ * Détermine si les sous-familles polygames doivent être affichées
338+ * Logique avancée :
339+ * - Si la famille actuelle est polygame : afficher les sous-familles
340+ * - Si l'assuré appartient à une sous-famille ET le parent est polygame ET l'assuré est le chef du parent : afficher les sous-familles du parent
341+ * - Sinon : afficher les membres normaux
342+ */
343+ private boolean shouldShowPolygamousSubFamilies (Insuree insuree , String familyType , Family parentFamily ) {
344+ // Vérifier si la famille actuelle est polygame
345+ boolean isPolygamyFamilyType = FamilyTypeConstants .isPolygamyFamilyType (familyType );
346+
347+ if (isPolygamyFamilyType ) {
348+ Log .d (LOG_TAG , "👑 Famille actuelle polygame - Affichage des sous-familles" );
349+ return true ;
350+ }
351+
352+ // Si pas de parent, pas de logique avancée
353+ if (parentFamily == null ) {
354+ Log .d (LOG_TAG , "👥 Pas de famille parent - Affichage des membres normaux" );
355+ return false ;
356+ }
357+
358+ // Vérifier si le parent est polygame
359+ boolean isParentPolygamy = FamilyTypeConstants .isPolygamyFamilyType (parentFamily .getFamilyType ());
360+
361+ if (!isParentPolygamy ) {
362+ Log .d (LOG_TAG , "👥 Parent non-polygame - Affichage des membres normaux" );
363+ return false ;
364+ }
365+
366+ // Vérifier si l'assuré est le chef du parent polygame
367+ // Note: Insuree n'a pas d'UUID, on utilise le chfId comme identifiant
368+ String insureeChfId = insuree .getChfId ();
369+ String parentHeadUuid = parentFamily .getHeadInsureeUuid ();
370+
371+ // Si on n'a pas l'information du chef du parent, on ne peut pas déterminer
372+ // si l'assuré est le chef du parent, donc on affiche les membres normaux
373+ if (parentHeadUuid == null ) {
374+ Log .d (LOG_TAG , "ℹ️ Chef du parent non disponible - Affichage des membres normaux" );
375+ return false ;
376+ }
377+
378+ // Note: Comparaison simplifiée car on n'a pas l'UUID de l'assuré
379+ // Pour l'instant, on considère que l'assuré n'est pas le chef du parent
380+ // Cette logique pourrait nécessiter une amélioration avec plus d'informations
381+ boolean isInsureeParentHead = false ; // Temporairement désactivé car pas d'UUID insuree
382+
383+ if (isInsureeParentHead ) {
384+ Log .d (LOG_TAG , "👑 Assuré est chef du parent polygame - Affichage des sous-familles du parent" );
385+ return true ;
386+ } else {
387+ Log .d (LOG_TAG , "👥 Assuré n'est pas chef du parent polygame - Affichage des membres normaux" );
388+ return false ;
389+ }
390+ }
391+
392+ /**
393+ * Détecte automatiquement si la famille est polygame ou monogame
394+ * et affiche le contenu approprié selon la logique avancée
395+ */
334396 private void checkFamilyTypeAndRender (Insuree insuree ) {
335397 String familyUuid = insuree .getFamilyUuid ();
336398
337- // Vérification du type de famille
338-
339399 if (!global .isNetworkAvailable ()) {
340400 renderInsureeBasicInfo (insuree );
341401 return ;
342402 }
343403
344404 new Thread (() -> {
345405 try {
406+ // Étape 1: Récupérer les informations de la famille et du parent
346407 GetFamilyMembersGraphQLRequest familyRequest = new GetFamilyMembersGraphQLRequest (sqlHandler );
347408 String familyType = familyRequest .getFamilyType (familyUuid );
409+ Family parentFamily = familyRequest .getParentFamily (familyUuid );
348410
349- GetPolygamousSubFamiliesGraphQLRequest polygamousRequest = new GetPolygamousSubFamiliesGraphQLRequest ( sqlHandler );
350- String detectedType = polygamousRequest . detectFamilyType ( familyUuid );
351- boolean isPolygamousCheck = polygamousRequest . isPolygamousFamily ( familyUuid );
352- List < PolygamousSubFamily > polygamousSubFamilies = polygamousRequest . get ( familyUuid );
411+ Log . d ( LOG_TAG , "🔍 Analyse famille - UUID: " + familyUuid + ", Type: " + familyType );
412+ if ( parentFamily != null ) {
413+ Log . d ( LOG_TAG , "🔍 Parent trouvé - UUID: " + parentFamily . getUuid () + ", Type: " + parentFamily . getFamilyType () );
414+ }
353415
354- boolean isPolygamous = polygamousSubFamilies != null && !polygamousSubFamilies .isEmpty ();
416+ // Étape 2: Déterminer si on doit afficher les sous-familles polygames
417+ boolean shouldShowPolygamous = shouldShowPolygamousSubFamilies (insuree , familyType , parentFamily );
355418
356- runOnUiThread (() -> {
357- if (isPolygamous ) {
358- renderPolygamousFamily (insuree , polygamousSubFamilies );
359- } else {
360- renderMonogamousFamily (insuree );
419+ if (shouldShowPolygamous ) {
420+ // Déterminer quelle famille utiliser pour récupérer les sous-familles
421+ String targetFamilyUuid = familyUuid ;
422+ if (parentFamily != null && !FamilyTypeConstants .isPolygamyFamilyType (familyType )) {
423+ // Si la famille actuelle n'est pas polygame mais le parent l'est, utiliser le parent
424+ targetFamilyUuid = parentFamily .getUuid ();
425+ Log .d (LOG_TAG , "👑 Utilisation du parent polygame pour les sous-familles: " + targetFamilyUuid );
361426 }
362- });
427+
428+ // Récupérer et afficher les chefs de sous-familles
429+ GetPolygamousSubFamiliesGraphQLRequest polygamousRequest = new GetPolygamousSubFamiliesGraphQLRequest (sqlHandler );
430+ List <PolygamousSubFamily > polygamousSubFamilies = polygamousRequest .get (targetFamilyUuid );
431+
432+ runOnUiThread (() -> {
433+ if (polygamousSubFamilies != null && !polygamousSubFamilies .isEmpty ()) {
434+ Log .d (LOG_TAG , "✅ Affichage de " + polygamousSubFamilies .size () + " chefs de sous-familles" );
435+ renderPolygamousFamily (insuree , polygamousSubFamilies );
436+ } else {
437+ Log .w (LOG_TAG , "⚠️ Aucun chef de sous-famille trouvé" );
438+ renderInsureeBasicInfo (insuree );
439+ }
440+ });
441+ } else {
442+ // Afficher les membres normaux
443+ Log .d (LOG_TAG , "👥 Affichage des membres de famille normaux" );
444+ runOnUiThread (() -> {
445+ renderMonogamousFamily (insuree );
446+ });
447+ }
448+
363449 } catch (Exception e ) {
364- Log .e (LOG_TAG , "Error checking family type" , e );
450+ Log .e (LOG_TAG , "❌ Erreur lors de la détection du type de famille " , e );
365451 runOnUiThread (() -> renderInsureeBasicInfo (insuree ));
366452 }
367453 }).start ();
368454 }
369455
456+ /**
457+ * Affiche une famille polygame avec ses chefs de sous-familles
458+ * @param insuree L'assuré principal
459+ * @param polygamousSubFamilies Liste des chefs de sous-familles à afficher
460+ */
370461 private void renderPolygamousFamily (Insuree insuree , List <PolygamousSubFamily > polygamousSubFamilies ) {
462+ Log .d (LOG_TAG , "👑 Rendu famille polygame - " + polygamousSubFamilies .size () + " chefs de sous-familles" );
463+
371464 renderInsureeBasicInfoForPolygamous (insuree );
372465
373466 if (polygamousSubFamilyAdapter == null ) {
@@ -376,8 +469,10 @@ private void renderPolygamousFamily(Insuree insuree, List<PolygamousSubFamily> p
376469 showSubFamilyMembers (subFamily );
377470 });
378471 listViewPolygamousSubFamilies .setAdapter (polygamousSubFamilyAdapter );
472+ Log .d (LOG_TAG , "✅ Adapter polygame créé et configuré" );
379473 } else {
380474 polygamousSubFamilyAdapter .updateData (polygamousSubFamilies );
475+ Log .d (LOG_TAG , "🔄 Adapter polygame mis à jour" );
381476 }
382477 llPolygamousSubFamilies .setVisibility (View .VISIBLE );
383478
@@ -390,13 +485,22 @@ private void renderPolygamousFamily(Insuree insuree, List<PolygamousSubFamily> p
390485 }
391486 }
392487
488+ /**
489+ * Affiche une famille monogame avec ses membres normaux
490+ * @param insuree L'assuré principal
491+ */
393492 private void renderMonogamousFamily (Insuree insuree ) {
493+ Log .d (LOG_TAG , "👥 Rendu famille monogame - Chargement des membres de famille" );
494+
394495 renderInsureeBasicInfo (insuree );
395496 loadFamilyMembers (insuree .getFamilyUuid ());
396497
498+ // Masquer la section des sous-familles polygames
397499 if (llPolygamousSubFamilies != null ) {
398500 llPolygamousSubFamilies .setVisibility (View .GONE );
399501 }
502+
503+ Log .d (LOG_TAG , "✅ Interface famille monogame configurée" );
400504 }
401505
402506 private void renderInsureeBasicInfo (Insuree insuree ) {
@@ -473,7 +577,7 @@ private void renderInsureeBasicInfo(Insuree insuree) {
473577 }
474578
475579 String expiryDate = policy .getExpiryDate () != null ?
476- DateUtils .toDateString (policy .getExpiryDate ()) : null ;
580+ DateUtils .toExpiryDateString (policy .getExpiryDate ()) : null ;
477581 String status = policy .getStatus ().name ();
478582 String heading1 ;
479583 if (expiryDate != null ) {
@@ -578,8 +682,15 @@ protected String buildEnquireValue(@Nullable Number value, @StringRes int labelI
578682 }
579683 }
580684
685+ /**
686+ * Charge et affiche les membres d'une famille monogame
687+ * @param familyUuid UUID de la famille dont charger les membres
688+ */
581689 private void loadFamilyMembers (String familyUuid ) {
690+ Log .d (LOG_TAG , "👥 Chargement des membres de famille monogame - UUID: " + familyUuid );
691+
582692 if (!global .isNetworkAvailable ()) {
693+ Log .w (LOG_TAG , "⚠️ Pas de connexion réseau - Masquage des membres de famille" );
583694 if (llFamilyMembers != null ) {
584695 llFamilyMembers .setVisibility (View .GONE );
585696 }
@@ -593,19 +704,24 @@ private void loadFamilyMembers(String familyUuid) {
593704
594705 runOnUiThread (() -> {
595706 if (familyMembers != null && !familyMembers .isEmpty ()) {
707+ Log .d (LOG_TAG , "✅ " + familyMembers .size () + " membres de famille chargés" );
708+
596709 if (familyMemberAdapter == null ) {
597710 familyMemberAdapter = new FamilyMemberAdapter (this , familyMembers );
598711 listViewFamilyMembers .setAdapter (familyMemberAdapter );
712+ Log .d (LOG_TAG , "✅ Adapter membres de famille créé" );
599713 } else {
600714 familyMemberAdapter .updateData (familyMembers );
715+ Log .d (LOG_TAG , "🔄 Adapter membres de famille mis à jour" );
601716 }
602717 llFamilyMembers .setVisibility (View .VISIBLE );
603718 } else {
719+ Log .w (LOG_TAG , "⚠️ Aucun membre de famille trouvé" );
604720 llFamilyMembers .setVisibility (View .GONE );
605721 }
606722 });
607723 } catch (Exception e ) {
608- Log .e (LOG_TAG , "Error loading family members " , e );
724+ Log .e (LOG_TAG , "❌ Erreur lors du chargement des membres de famille " , e );
609725 runOnUiThread (() -> {
610726 if (llFamilyMembers != null ) {
611727 llFamilyMembers .setVisibility (View .GONE );
0 commit comments