Sauvegarde unique sur un objet métier lié

Bonjour,

Je n’arrive pas à sauvegarder les données de l’objet souhait orientation qu’une seule fois.
Une fois les données saisies et enregistrer une fois lorsque je modifie une donnée elle est réinitialisé avec la première valeur saisie.
Je vous joins une copie extraite des données en jeu.


Le lien entre le dossier pmfp et l’objet souhait/orientation est un lien de ce type

Nous affichons les données d’un dossier PMFP dans un onglet.
Ensuite sur une action le dossier change d’état et passe à un état (favorable) qui affiche l’onglet souhait/orientation.
Je peux saisir l’onglet et enregistrer.
Ensuite si je veux modifié une donnée l’enregistrement ne fait rien comme s’il y avait un rechargement de l’ancienne donnée.
L’utilisateur qui utilise ces objets (dossier PMFP et souhait orientation) à des droits CRU.
Tous les utilisateurs ont des droits CRUD sur l’objet parent le dossier.

Est ce que vous pourriez m’aider sur une piste ?

Cordialement
Thierry

en complément.
J’ai activé les logs mais je n’ai rien vu de spéciale.
J’ai débugger et la chose curieuse c’est que sur le prevalidate de l’objet Souhait Orientation la valeur est celle en base au lieu de celle saisie.

Bonjour Thierry,

Est-ce qu’il y a du code particulier sur l’objet Souhait Orientation ?
Si oui, est-ce que t’as essayé de le mettre en commentaire ?

Bonjour Alistair,
non rien de particulier, il y a juste un fieldcompletion qui a du code, sinon j’ai mis le initCreate et le prevalidate mais juste pour debugger, ils font rien.

Pour reformuler le problème et pour être sûr que j’ai bien compris.

Tu modifies la valeur d’un champ de l’objet Souhait orientation (objet avec attributs incorporés au parent : Dossier PMPF) et la modification n’est pas prise en compte lors de l’enregistrement du parent ? C’est bien ça ?

As-tu essayé de modifier les valeurs d’un souhait orientation sans passer par un Dossier ? En accès direct depuis un domaine par exemple.
Comment est créé le record souhait orientation au moment du changement de statut du Dossier ?
Est-ce qu’il est possible que cette création soit appelée à chaque enregistrement du Dossier (création sur une valeur d’un statut par exemple) ?

Oui je modifie un champ de l’objet Souhait et lorsque j’enregistre le dossier PMFP qui est lié à lobjet souhait il n’y a pas de changement sauf lors du premier enregistrement juste après la création du record.

J’ai essayé de faire un put via api et cela fonctionne je n’ai pas essayé depuis un domaine.
Le record souhait est crée lors du changement d’état du dossier PMPF, ainsi lorsqu’il passe à Favorable il y a création du record souhait lié à ce même dossier et également modification du lien de cardinalité en passant de 0,1 à 1,1. J’ai mis ce code en commentaire sans modifiaction du comportement.

Est-ce que tu peux essayer en mise à jour depuis un domaine ?

Je vais essayer et je te tiens au courant

Cela fonctionne lorsque c’est dans un menu.

Il y a sûrement quelque chose au niveau du save du Dossier qui vient écraser ce que tu as saisi dans l’objet souhait.

Est-ce que tu peux me partager le code de Dossier ?

Si on ne trouve toujours pas, je te propose qu’on regarde ça en live ensemble.

Je t’envoi le code du dossiers.
Il y a un truc mais je ne vois pas quoi. En essayant de debuger je vois bien que les valeurs sont perdu et recherger par quelques choses…
Ok pour faire en live si tu peux.

package com.simplicite.objects.ladnext;

import java.util.*;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import static com.simplicite.commons.ladnext.Constantes.*;
import com.simplicite.commons.ladnext.EmailRequestToCreateDto;
import com.simplicite.util.*;
import com.simplicite.util.exceptions.GetException;
import com.simplicite.util.exceptions.SaveException;
import com.simplicite.util.exceptions.UpdateException;
import com.simplicite.util.exceptions.ValidateException;
import com.simplicite.util.tools.BusinessObjectTool;

import java.time.*;

import org.json.JSONArray;
import org.json.JSONObject;

import org.apache.commons.lang3.StringUtils;

/** Business object LadDossiers */
public class LadDossiers extends ObjectDB {
    private static final long serialVersionUID = 1L;

    private static final String INCOMPLET_001 = "LDM_INCOMPLET_001";
    private static final String INCOMPLET_002 = "LDM_INCOMPLET_002";
    private static final String INCOMPLET_003 = "LDM_INCOMPLET_003";
    private static final String INCOMPLET_004 = "LDM_INCOMPLET_004";

    public static class TemplateId {
        @JsonProperty("templateCode")
        String templateCode;

        @JsonProperty("templateValue")
        Integer templateValue;
    }

    @Override
    public void initCreate() {
        setUpFunctionalId();
    }
    
    @Override
    public void initUpdate() {
        Grant g = getGrant();
        AppLog.info(
                LadDossiers.class,
                "initUpdate",
                g.getLogin() + "," + g.hasResponsibility("LADOM_GROUP_API"),
                null);

         AppLog.info(
                LadDossiers.class,
                "initUpdate", 
                         " ladSouhFormationSouhaite " + getFieldValue("ladSouhFormationSouhaite"),
                null);
                
        if (g.hasResponsibility("LADOM_GROUP_API")) {
            setFieldValue("ladDosCreepar",  replaceApiByNomPrenom(getFieldValue("ladDossiersFunctionalId"), g));
        } else {
            setFieldValue("ladDosCreepar", g.getLogin());
        }
    }

    @Override
    public String postCreate() {
        Grant g = getGrant();

        AppLog.info(
                LadDossiers.class,
                "postCreate",
                g.getLogin() + "," + g.hasResponsibility("LADOM_GROUP_API") + "," + getFieldValue("ladDossiersFunctionalId"),
                null);

        updateCreeByDossier(g,getFieldValue("ladDossiersFunctionalId"),g.hasResponsibility("LADOM_GROUP_API"));

        return null;
    }

    /*
    	@Override
    	public String[] getTargetObject(String rowId, String[] row) {

    		AppLog.debug(LadDossiers.class, "getTargetObject", "rowId " + rowId , null);

    		//
    		if (rowId.equals(ObjectField.DEFAULT_ROW_ID)) {
    			return null;
    		}

    		if (row==null && (rowId.equals(getRowId()) || select(rowId))) {
    			row = getValues();
    		}

    		String target = null;

    		if (row!=null) {
    			String type = row[getFieldIndex("ladDossiersTypedeparcours")];

    			AppLog.debug(LadDossiers.class, "getTargetObject", "type " + type , null);

    			//10 PMFP, 20 ACT, 30 PME OBS : FUNERAIRE
    			if (type.equals("ACT")) {
    				target = "LadDossierAct";
    			} else {
    				if (type.equals("PMFP")) {
    					target = "LadDossierPmfp";
    				} else {
    					if (type.equals("PME")) {
    						target = "LadDossierPme";
    					} else {
    						target = "LadDossierFuneraire";
    					}
    				}
    			}
    		}
    		AppLog.debug(LadDossiers.class, "getTargetObject", "target " + target , null);

    		if (target==null) {
    			return null; // no redirection
    		}

    		String t[] = new String[3];
    		t[0] = target; // target object
    		t[1] = "the_ajax_"+target; // main target instance
    		t[2] = rowId; // target id
    		return t;
    	}

    */

    /** private */
    private void setUpFunctionalId() {
        try {
            UUID uuid = UUID.randomUUID();
            int countThatUuid;
            int cpt = 0;
            do {
                String countThatUuidQuery =
                        String.format(
                                "select count(*) from lad_dossiers where lad_dos_func_id = '%s' ",
                                uuid);
                countThatUuid = Integer.parseInt(getGrant().simpleQuery(countThatUuidQuery));
                cpt++;
            } while (countThatUuid == 0 && cpt < 10);

            setFieldValue("ladDossiersFunctionalId", uuid.toString());
        } catch (Exception e) {
            AppLog.error("Error init uuid", e, getGrant());
        }
    }

    private void updateCreeByDossier(Grant g, String uuidDos, boolean isApi){
        ObjectDB o = g.getTmpObject("LadDossiers");
        o.resetFilters();
        o.getField("ladDossiersFunctionalId").setFilter(uuidDos);
        final List<String[]> rows = o.search(false);
        for (String[] row : rows) {
            o.setValues(row, true);
            if (isApi) {
                o.setFieldValue("ladDosCreepar",  replaceApiByNomPrenom(uuidDos, g));
            }else {
                o.setFieldValue("ladDosCreepar", g.getLogin());
            }
            o.save();
        }
    }

    private String replaceApiByNomPrenom(String uuid, Grant g) {
        String resultNom = "ladomAPI";
        try {
            String nomPrenom =
                    String.format(
                            "select lad_demandeur_nom,"
                                    + "lad_demandeur_prenom, "
                                    + "lad_dossiers_numerodossier "
                                    + "from lad_dossiers dos "
                                    + "join lad_demandeur dem on (dos.lad_dosact_dem_id = dem.row_id or "
                                    + "dos.lad_dospme_dem_id = dem.row_id \n"
                                    + "or dos.lad_dospmfp_dem_id = dem.row_id or dos.lad_obs_dem_id = dem.row_id)\n"
                                    + " where lad_dos_func_id = '%s' ",
                            uuid);
            List<String[]> listNomPrenom = getGrant().query(nomPrenom);
            AppLog.debug(
                    LadDossiers.class,
                    "replaceApiByNomPrenom",
                    "query " + nomPrenom + " nom,prenom,numdossier " + listNomPrenom,
                    null);

            for (String[] nomprenom : listNomPrenom) {
                resultNom = nomprenom[0] + " " + nomprenom[1];
            }
            return resultNom;
        } catch (Exception e) {
            AppLog.error("Error replaceApiByNomPrenom", e, getGrant());
            return "";
        }
    }

    /** Méthode planifié via cron */
    public void relanceDocAllDos() {
        Grant g = getGrant();
        LocalDate currentDate = LocalDate.parse(Tool.getCurrentDate());

        AppLog.info(getClass(), "Begin relanceDocAllDos", ":" + currentDate, g);

        controleEtRelance(g, INCOMPLET_001, 1);
        controleEtRelance(g, INCOMPLET_002, 7);
        controleEtRelance(g, INCOMPLET_003, 14);
        controleEtRelance(g, INCOMPLET_004, 21);

        AppLog.info(getClass(), "End relanceDocAllDos", ":" + currentDate, g);
    }

    /** private */
    private void controleEtRelance(Grant g, String templateCode, int delay) {
        // init conf sendinblue
        AppLog.info(
                getClass(),
                "Begin controleEtRelance",
                " templateCode, delay " + templateCode + "," + delay,
                g);

        int templateId = 0;
        final String service = "/smtp/email";
        final String sendIndBlueEndPoint = g.getSystemParam("LAD_SENDINBLUE_ENDPOINT");
        final JSONObject configMailService =
                new JSONObject(g.getSystemParam("LADOM_SENDINDBLUE_SERVICE"));
        final String apiKey = configMailService.get("mail.apikey").toString();
        final boolean isActive = configMailService.get("mail.actif").toString().equals("true");
        
        final String url = sendIndBlueEndPoint + service;
        final JSONArray template = configMailService.getJSONArray("mail.templateId");
        
        // Surchage template Id pour mail
        try {
            ObjectMapper mapper = new ObjectMapper();
            LadDossiers.TemplateId[] listTmpId =
                    mapper.readValue(template.toString(), LadDossiers.TemplateId[].class);
            
            for (LadDossiers.TemplateId tmpId : listTmpId) {
                if (templateCode.equals(tmpId.templateCode)) {
                    templateId = tmpId.templateValue;
                }
            }
            AppLog.info(
                    getClass(), "controleEtRelance", "Surchage de templateId:" + templateId, g);
        } catch (Exception e) {
            AppLog.error(getClass(), "controleEtRelance", "------------", e, g);
        }

        try {
            // Recherche des dossiers Incomplet
            String query =
                    " select dos.row_id, lad_dossiers_numerodossier ,lad_demandeur_nom,lad_demandeur_prenom,lad_demandeur_mail "
                            + " from lad_dossiers dos "
                            + " join lad_demandeur dem on (dos.lad_dosact_dem_id = dem.row_id or "
                            + " dos.lad_dospme_dem_id = dem.row_id or "
                            + " dos.lad_dospmfp_dem_id = dem.row_id or "
                            + " dos.lad_obs_dem_id= dem.row_id) "
                            + " where (lad_dossier_act_statut = 'INCOMPLET' or "
                            + " lad_dossier_pme_statut = 'INCOMPLET' or "
                            + " lad_dossier_pmfp_statut = 'INCOMPLET' or  "
                            + " lad_dossier_obs_statut = 'INCOMPLET') "
                            + " AND to_char(dos.updated_dt,'YYYYMMDD') = to_char(now() + '" + delay + " DAY','YYYYMMDD');";
                            // Cas MySQL
                            //+ " AND STR_TO_DATE(dos.updated_dt, '%Y-%m-%d') = DATE_SUB(CURDATE(), INTERVAL "
                            // Cas HSQL
                             //" AND CAST(dos.updated_dt AS DATE) = DATE_SUB(current_date, INTERVAL "
                            //+ delay
                            //+ " DAY);";

            AppLog.debug(getClass(), "controleEtRelance", "query:" + query, g);

            List<String[]> listDossier = g.query(query);
            for (String[] cur : listDossier) {
                // select data
                String rowId = cur[0];
                String type = cur[1] != null ? cur[1].replaceAll("[0-9]", "") : "";

                // Init content POST
                EmailRequestToCreateDto.ToMail toMail = new EmailRequestToCreateDto.ToMail();
                toMail.setName(cur[2] != null ? cur[2] : "");
                toMail.setEmail(cur[4] != null ? cur[4] : "");
                List<EmailRequestToCreateDto.ToMail> to = new ArrayList<>();
                to.add(toMail);
                EmailRequestToCreateDto.ParamsTemplate paramsTemplate =
                        new EmailRequestToCreateDto.ParamsTemplate();
                paramsTemplate.setLadDemandeurMail(cur[4] != null ? cur[4] : "");
                // paramsTemplate.setFIDENT("NumeroSiam");
                // paramsTemplate.setNDOSDEM("123456789");
                paramsTemplate.setLadDossiersNumerodossier(cur[1] != null ? cur[1] : "");
                String subject = "Relance";

                EmailRequestToCreateDto body = new EmailRequestToCreateDto();
                body.setParams(paramsTemplate);
                body.setTemplateId(templateId);
                body.setTo(to);
                body.setSubject(subject);

                AppLog.debug(getClass(), "controleEtRelance", "  rowId " + rowId, g);

                if (isActive) {
                    // envoi mail
                    com.simplicite.commons.ladnext.LadomProxyService.sendMail(
                            url, apiKey, body.toJson(body));
                    // mise à jour statut dossier si 21 relance
                    if (templateCode.equals(INCOMPLET_004)) {
                        // mise à ABANDON etat dossier
                        updateDossier(rowId, "ABANDON", type);
                    }
                }
            }
            AppLog.info(getClass(), "End controleEtRelance", " delay " + delay, g);
        } catch (Exception e) {
            AppLog.error(getClass(), "controleEtRelance", "------------", e, g);
        }
    }

    /**
     * @param rowId
     * @param statutDossier
     * @param type
     */
    private void updateDossier(String rowId, String statutDossier, String type) {
        String target = "";
        String statut = "";
        switch (type) {
            case "ACT":
                target = "LadDossierAct";
                statut = "ladDossierActStatut";
                break;
            case "PMFP":
                target = "LadDossierPmfp";
                statut = "ladDossierPmfpStatut";
                break;
            case "PME":
                target = "LadDossierPme";
                statut = "ladDossierPmeStatut";
                break;
            case "OBS":
                target = "LadDossierFuneraire";
                statut = "ladObsStatut";
                break;
        }

        ObjectDB messageObj;
        BusinessObjectTool messageTool;
        messageObj = getGrant().getProcessObject(target);
        messageTool = messageObj.getTool();
        try {
            messageTool.getForUpsert(new JSONObject().put("row_id", rowId));

            messageObj.setFieldValue(statut, statutDossier);

        } catch (GetException e) {
            AppLog.error(getClass(), "GetException", e.getMessage(), null, getGrant());
        }
        try {
            messageTool.validateAndUpdate();
        } catch (ValidateException ev) {
            AppLog.error(getClass(), "ValidateException", ev.getMessage(), null, getGrant());
        } catch (UpdateException ex) {
            AppLog.error(getClass(), "UpdateException", ex.getMessage(), null, getGrant());
        } catch (SaveException es) {
            AppLog.error(getClass(), "SaveException", es.getMessage(), null, getGrant());
        }
    }
    
    public void updateDossierActPerime() {
    	Grant g = getGrant();
        LocalDate currentDate = LocalDate.parse(Tool.getCurrentDate());

        AppLog.info(getClass(), "Begin updateDossierActPerime", ":" + currentDate, g);
        
        // Requete pour recuperer les dossiers ACT dont le bon est arrive a expiration
        try {
            // Recherche des dossiers Incomplet
            String query = "select dos.row_id, dos.lad_dossier_act_statut "
				+ "from lad_dossiers dos "
				+ "join lad_bon_act bon on (bon.ladbonact_laddossieract_id = dos.row_id) "
				+ "where to_char(bon.lad_bon_act_date_fin_validite, 'YYYYMMDD') < to_char(now(), 'YYYYMMDD');";
            
            AppLog.info(getClass(), "updateDossierActPerime", "query:" + query, g);
            
            List<String[]> listeDossiers = g.query(query);
            for (String[] cur : listeDossiers) {
                // select data
                String rowId = cur[0];
                String statut = cur[1];
                // Pour eviter de mettre a jour les dossiers deja a "perime", on ne prend que ceux qui sont au statut "favorable" et "bon emis"
                AppLog.info(getClass(), "updateDossierActPerime", "dossiers a mettre a jour : row_id = " + rowId + " - statut : " + statut, g);
                if (StringUtils.equals(LISTCODE_ETATDOSSIER_BON_EMIS, statut) || StringUtils.equals(LISTCODE_ETATDOSSIER_FAVORABLE, statut)) {
                	// mise à ABANDON etat dossier
                        updateDossier(rowId, LISTCODE_ETATDOSSIER_PERIME, "ACT");
                }
            }
            LocalDate currentDateFin = LocalDate.parse(Tool.getCurrentDate());
            AppLog.info(getClass(), "End updateDossierActPerime", ":" + currentDateFin, g);
            
            
        } catch (Exception e) {
        	AppLog.error(getClass(), "updateDossierActPerime", "------------", e, g);
        }
    }
}

Le voici. ET pour info quand je modifie les autres données onglet principales ou les PJ cela fonctionne.

Dans ton code, je ne vois pas de référence à l’objet LadSouhaitOrientation, c’est normal ?

oui l’objet Souhait Orientation est lié aux dossiers PMFP, mais il n’y a pas de référence non plus dans ce dossier

package com.simplicite.objects.ladnext;

import java.util.*;

import static com.simplicite.commons.ladnext.Constantes.*;
import static com.simplicite.commons.ladnext.SendInBlueService.buildMailAccepationPmeDemandeur;
import static com.simplicite.commons.ladnext.SendInBlueService.buildMailAccepationRefusPmfpDemandeur;

import com.simplicite.commons.ladnext.IdUtils;
import com.simplicite.commons.ladnext.DateUtils;
import com.simplicite.commons.ladnext.SecuriteSocialeUtils;

import com.simplicite.util.*;
import com.simplicite.util.tools.*;

import java.time.*;
import java.time.format.*;

import com.simplicite.util.exceptions.GetException;
import com.simplicite.util.exceptions.ValidateException;
import com.simplicite.util.exceptions.UpdateException;
import com.simplicite.util.exceptions.SaveException;

import org.json.JSONObject;
import org.apache.commons.lang3.StringUtils;

/**
 * Business object LadDossierPmfp
 */
public class LadDossierPmfp extends LadDossiers {
    private static final long serialVersionUID = 1L;

    /**
     * pre
     **/

    @Override
    public List<String> preValidate() {
        List<String> msgs = new ArrayList<>();
        Grant g = getGrant();

        // Regle de gestion permanente : tous les documents eligibles doivent etre collectes
        String message = com.simplicite.commons.ladnext.LadUtils.controlePresencePieceJointe(this.getOldStatus(), this.getStatus(), OBJ_NAME_DOSSIER_PMFP, KEY_JUSTIF_DOSSIERPMFP, getRowId(), g);
        if (StringUtils.isNotEmpty(message)) {
            msgs.add(Message.formatError(message, null, FIELD_JUSTIF_PJ));
        }

        String numeroSiam = "";
        if (getFieldValue(FIELD_PMFP_DEMANDEUR_NUMERO_SIAM) != null) {
            numeroSiam = getFieldValue(FIELD_PMFP_DEMANDEUR_NUMERO_SIAM);
        } else {
            if (getParentObject() != null) {
                numeroSiam = getParentObject().getFieldValue(FIELD_DEM_NUMEROSIAM);
            }
        }

        AppLog.debug(LadDossierAct.class, "preValidate", "numero SIAM : " + numeroSiam, null);

        if (numeroSiam == null || numeroSiam.isEmpty()) {
            msgs.add(Message.formatError(MSG_ERR_DEMANDEUR, null, FIELD_DEM_NUMEROSIAM));
        }

        // Si Numero Securite Social non valide, affichage d un message
        if (!SecuriteSocialeUtils.validateNumeroSecuriteSocial(
                getFieldValue(FIELD_PMFP_NUMEROSECURITESOCIAL))) {
            msgs.add(
                    Message.formatError(
                            MSG_ERR_NUMEROSECURITESOCIAL, null, FIELD_PMFP_NUMEROSECURITESOCIAL));
        }

        // Date d inscription a Pole Emploi doit etre superieure a 1900 et inferieure ou egale a la
        // date du jour
        if (!getFieldValue(FIELD_PMFP_DATEINSCRIPTIONPOLEEMPLOI).isEmpty()
                && !DateUtils.isDateInferieureOuEgaleDateDuJour(
                getFieldValue(FIELD_PMFP_DATEINSCRIPTIONPOLEEMPLOI))) {
            msgs.add(
                    Message.formatError(
                            MSG_ERR_DATEINSCRIPTIONPOLEEMPLOI,
                            null,
                            FIELD_PMFP_DATEINSCRIPTIONPOLEEMPLOI));
        }

        return msgs;
    }

 /*   @Override
    public String preSave() {
        return super.preSave();
    }
*/
    @Override
    public void preSearch() {
        setFieldFilter(FIELD_DOSSIERS_TYPEDEPARCOURS, LISTCODE_TYPEDEPARCOURS_PMFP);
    }

    /**
     * init
     **/

    @Override
    public void initCreate() {
        setFieldValue(FIELD_DOSSIERS_TYPEDEPARCOURS, LISTCODE_TYPEDEPARCOURS_PMFP);
        super.initCreate();
    }

    @Override
    public void initList(ObjectDB parent) {
        setFieldValue(FIELD_DOSSIERS_TYPEDEPARCOURS, LISTCODE_TYPEDEPARCOURS_PMFP);
    }

    @Override
    public void initUpdate() {
        setFieldValue(FIELD_DOSSIERS_TYPEDEPARCOURS, LISTCODE_TYPEDEPARCOURS_PMFP);
        boolean ongletSouhaitVisible = getFieldArea("LadDossierPmfp-9").isVisible();
        getLink("LadSouhaitOrientation", "ladSouhDospmfpId").setMinOccurs(ongletSouhaitVisible ? 1 : 0);

        boolean ongletFormationVisible = LISTCODE_ETATDOSSIER_ELIGIBLE.equals(getFieldValue(FIELD_PMFP_STATUT));
        getLink("LadFormations", "LadFormations_LadDossierPmfp_id").setMinOccurs(ongletFormationVisible ? 1 : 0);

        super.initUpdate();

    }

    /**
     * post
     **/

    @Override
    public String postCreate() {

        Grant g = getGrant();

        
        String numeroSiam = "";
        if (getFieldValue(FIELD_PMFP_DEMANDEUR_NUMERO_SIAM) != null) {
            numeroSiam = getFieldValue(FIELD_PMFP_DEMANDEUR_NUMERO_SIAM);
        } else {
            if (getParentObject() != null) {
                numeroSiam = getParentObject().getFieldValue(FIELD_DEM_NUMEROSIAM);
            }
        }

		AppLog.info(LadDossierPmfp.class, "postCreate", "numero SIAM : " + numeroSiam, null);
  
        BusinessObjectTool objT = this.getTool();
        try {
            this.setFieldValue(
                    FIELD_DOSSIERS_NUMERODOSSIER,
                    IdUtils.genererNumeroDossier(numeroSiam, LISTCODE_TYPEDEPARCOURS_PMFP, g));
            objT.validateAndSave();
        } catch (Exception e) {
            AppLog.error("Erreur lors de la generation du numero de dossier", e, g);
        }

        // Init liste des justificatifs PMPFP
        List<String[]> listDocuments =
                com.simplicite.commons.ladnext.LadUtils.listDocumentsParType(g, "PMFP");

        ObjectDB objDossier = g.getTmpObject(OBJ_NAME_DOSSIER_PMFP);
        String rowIdDos = getRowId();
        ObjectDB objJustif = g.getTmpObject(OBJ_NAME_JUSTIFICATIFS);
        BusinessObjectTool justifTool = objJustif.getTool();
        // mise à jour de de la liste des documents pour le dossier courant

        for (String[] cur : listDocuments) {
            objDossier.resetValues();
            String rowId = cur[0]; //
            String libelle = cur[1];
            String description = cur[2];
            String eligible = cur[4];
            String typejustificatif = cur[3];

            boolean exists = false;
            try {
                exists =
                        justifTool.getForUpsert(
                                new JSONObject()
                                        .put(FIELD_JUSTIF_TYPEDOCID, rowId)
                                        .put(FIELD_JUSTIF_DOSPFMPID, rowIdDos)
                                        .put(FIELD_JUSTIF_DEMANDEURID, this.getFieldValue(FIELD_PMFP_DEMANDEURID)));

                if (!exists) {
                    objJustif.setFieldValue(FIELD_JUSTIF_TYPEDOCID, rowId);
                    objJustif.setFieldValue(FIELD_JUSTIF_DOSPFMPID, rowIdDos);
                    objJustif.setFieldValue(FIELD_JUSTIF_TYPEDOCLIBELLE, libelle);
                    objJustif.setFieldValue(FIELD_JUSTIF_TYPEDOCDESC, description);
                    objJustif.setFieldValue(FIELD_JUSTIF_NUMERO_SIAM, numeroSiam);
                    objJustif.setFieldValue(FIELD_JUSTIF_DEMANDEURID, this.getFieldValue(FIELD_PMFP_DEMANDEURID));
                    objJustif.setFieldValue(FIELD_JUSTIF_TYPEDOCELIGIBLE, eligible);
                }

            } catch (GetException e) {
                AppLog.error(getClass(), "GetException", e.getMessage(), null, getGrant());
            }
            try {
                justifTool.validateAndSave();
            } catch (ValidateException ev) {
                AppLog.error(getClass(), "ValidateException", ev.getMessage(), null, getGrant());
            } catch (UpdateException ex) {
                AppLog.error(getClass(), "UpdateException", ex.getMessage(), null, getGrant());
            } catch (SaveException es) {
                AppLog.error(getClass(), "SaveException", es.getMessage(), null, getGrant());
            }
        }

        return super.postCreate();
    }

    @Override
    public String postUpdate() {

        if (getField(FIELD_PMFP_STATUT).hasChanged()) {
            String etat = getFieldValue(FIELD_PMFP_STATUT);
            //envoi mail en fonction de l'état du dossier
            if (LISTCODE_ETATDOSSIER_ELIGIBLE.equals(etat)) {
                buildMailAccepationRefusPmfpDemandeur(getGrant(),
                        getFieldValue("ladDemandeurNom"), getFieldValue("ladDemandeurPrenom"),
                        getFieldValue("ladDemandeurMail"),
                        getFieldValue(FIELD_DOSSIERS_NUMERODOSSIER),
                        "LDM_PMFP_EVA_ACCEPTER");
            } else {
                if (LISTCODE_ETATDOSSIER_INELIGIBLE.equals(etat)) {
                    buildMailAccepationRefusPmfpDemandeur(getGrant(),
                            getFieldValue("ladDemandeurNom"), getFieldValue("ladDemandeurPrenom"),
                            getFieldValue("ladDemandeurMail"),
                            getFieldValue(FIELD_DOSSIERS_NUMERODOSSIER),
                            "LDM_PMFP_EVA_REFUS");
                }
            }
        }
        return super.postUpdate();
    }
}

Je ne reproduis pas en implémentant également la méthode setMinOccurs.
Dans ton code, il semblerait que le lien soit rendu visible selon la visibilité d’une zone d’attribut (visible selon un certain statut ?) :

boolean ongletSouhaitVisible = getFieldArea("LadDossierPmfp-9").isVisible();
getLink("LadSouhaitOrientation", "ladSouhDospmfpId").setMinOccurs(ongletSouhaitVisible ? 1 : 0);

A noter qu’appeler setMinOccurs(0) ne supprime pas le record de l’objet incorporé si un enregistrement existe.

Dans le doute, peux-tu me fournir le code de LadSouhaitOrientation ?

Oui il y a un bien une visibilité de la zone lorsque le dossier est au statut favorable.
Je t’envoi le code (j’ai ajouté des prevalidates depuis mais c’était absent)

package com.simplicite.objects.ladnext;

import java.util.*;
import com.simplicite.util.*;

import com.simplicite.commons.ladnext.*;

import static com.simplicite.commons.ladnext.Constantes.*;

/**
 * Business object LadSouhaitOrientation
 */
public class LadSouhaitOrientation extends ObjectDB {
	private static final long serialVersionUID = 1L;


	@Override
	public void initCreate() {
	    String uuid = Tool.randomUUID();
	    if (getFieldValue("ladCleSouhait").isEmpty()){
            setFieldValue("ladCleSouhait", uuid);
        }
    }
	
	@Override
    public List<String> preValidate() {
        List<String> msgs = new ArrayList<>();
        boolean checkMsgs = false;
        Grant g = getGrant();

         AppLog.debug(
                LadSouhaitOrientation.class,
                "preValidate",
				 "ladCleSouhait " + getFieldValue("ladCleSouhait") +
                         " ladSouhFormationSouhaite " + getFieldValue("ladSouhFormationSouhaite"),
                null);
/*
        if (getFieldValue(FIELD_SOUHFORMATIONSOUHAITE).isEmpty()) {
            msgs.add(Message.formatError(MSG_ERR_CHAMP_OBLI, null, FIELD_SOUHFORMATIONSOUHAITE));
        }
        if (getFieldValue(FIELD_SOUHREGION).isEmpty()) {
            msgs.add(Message.formatError(MSG_ERR_CHAMP_OBLI, null, FIELD_SOUHREGION));
        }
        if (getFieldValue(FIELD_SOUHMETIER).isEmpty()) {
            msgs.add(Message.formatError(MSG_ERR_CHAMP_OBLI, null, FIELD_SOUHMETIER));
        }
        //Section evaluation
        if (getFieldArea("LadSouhaitOrientation-3").isVisible()) {
            if (getFieldValue(FIELD_SOUHELIGIBILITEPASSEPORTMOBILITE).isEmpty()) {
                msgs.add(Message.formatError(MSG_ERR_CHAMP_OBLI, null, FIELD_SOUHELIGIBILITEPASSEPORTMOBILITE));
            }
            if (getFieldValue(FIELD_SOUHDATEEVALUATION).isEmpty()) {
                msgs.add(Message.formatError(MSG_ERR_CHAMP_OBLI, null, FIELD_SOUHDATEEVALUATION));
            }
        }
*/
        return msgs;
    }
    
	@Override
    public List<String> fieldCompletion(String input, String query, String context) {
        List<String> list = new ArrayList<>();
        AppLog.debug(
                LadSouhaitOrientation.class,
                "fieldCompletion",
                "input " + input + " query " + query + " context " + context,
                null);

        // Recuperation de la liste des métiers
        if ("ladSouhMetier".equals(input)) {
            ObjectDB objMet = getGrant().getTmpObject("LadRefMetier");
    		list = LadPmeUtils.getListeMetier(query,objMet);
        }
        // Recuperation de la liste des regions
        if ("ladSouhRegion".equals(input)) {
            ObjectDB objMet = getGrant().getTmpObject("LadRefRegion");
    		list = LadPmeUtils.getListeRegion(query,objMet);
        }
        return list;
        
    }
}

Je viens de trouver pourquoi ça ne fonctionnait pas. Il faut que les attributs de ton objet LadSouhaitOrientation soient modifiables “Partout” (sauf pour l’id et autres champs calculés).

Super merci cela fonctionne.

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.