Bonjour,
nous avons un objet BCSIRCMModificationRequest, composé de 26 champs, correspondant à des demandes d’évolutions.
Une demande a un type qui définit quels sont les champs a vraiment renseignés.
Côte back, aucun soucis , l’utilisateurs peut créer autant de demandes qu’il veut et en alternant les types (actuellement il y en a deux) :
Nous avons développé une page publique permettant à utilisateur non connecté de soumettre également des demandes. Voici le code simplifié :
var BCSIRCMPublicModificationRequest = typeof BCSIRCMPublicModificationRequest !== "undefined" ? BCSIRCMPublicModificationRequest : (function($) {
var appSimplicite, translationMap, modificationRequest, application, scope;
var $main, $popup, manager, userId;
function init(parameterMap) {
appSimplicite = new Simplicite.Ajax(ROOT, "uipublic");
appSimplicite.setErrorHandler(showSimpliciteError);
appSimplicite.getTexts(function (texts) {
translationMap = texts;
$main = $("#main");
modificationRequest = appSimplicite.getBusinessObject("BCSIRCMModificationRequest");
modificationRequest.getMetaData(function() {
// Construction d'un formulaire HTML
// Construction d'un bouton dont le clique appelle la fonction submitRequest;
});
});
}
function submitRequest(parameterMap) {
modificationRequest.getForCreate(function() {
modificationRequest.item.RCMRequestType = parameterMap["REQUEST_TYPE"];
modificationRequest.item.RCMLang = parameterMap["LANG"];
modificationRequest.item.RCMApplicant = userId;
modificationRequest.item.RCMRequestDate = (new Date()).toISOString().replace('T', ' ').substring(0, 19);
if (modificationRequest.item.RCMRequestType == "FLOW" || parameterMap["REQUEST_TYPE"] == "FLOW_DEL") {
modificationRequest.item.RCMSenderApplication = $("#RCMSenderApplication").val();
modificationRequest.item.RCMReceiverApplication = $("#RCMReceiverApplication").val();
modificationRequest.item.RCMMessageComment = $("#RCMMessageComment").val();
modificationRequest.item.RCMMessageId = parameterMap["FLOW_ID"];
} else if (modificationRequest.item.RCMRequestType == "SCOPE" || parameterMap["REQUEST_TYPE"] == "SCOPE_DEL") {
modificationRequest.item.RCMApplication = $("#RCMApplication").val();
modificationRequest.item.RCMScope = $("#RCMScope").val();
modificationRequest.item.RCMScopeDate = $("#RCMScopeDate").val();
}
modificationRequest.create(function(result) {
showSuccessMessage(translationMap["SUCCESS_CREATE_REQUEST"]);
hideErrorMessage();
$main.html("");
});
});
}
return { init : init };
})(jQuery);
Nous rencontrons un problème systématique lors de la création d’une demande d’évolution dont le type est différent de la première demande.
Scénario :
- Clearer le cache de la plateforme
- Aller sur la page de demande de modification de type FLOW
- Renseigner et soumettre la demande ==> ça passe (On peut répéter les étapes 2 et 3 pour créer plusieurs demandes sans problème)
- Aller sur la page de demande de modification de type SCOPE
- Renseigner et soumettre la demande ==> ça ne passe pas mais la demande est bien enregistrée
- Ouvrir un nouvel onglet sur ui sur la plateforme et clearer la plateforme.
- Resoumettre la demande ==> ca passe. Par contre si je vas sur le formulaire de type FLOW, j’obtiens cette fois l’erreur.
Si à la place de l’étape 6, au lieu de clearer la plateforme, je crée une demande de type SCOPE dans la partie ui classique, j’obtiens le même résultat à l’étape 7.
Nous ne constatons aucun log d’erreur.
Notre objet a bien une clé fonctionnelle. Elle est composée d’un Datetime et d’une FK vers l’objet User.
Nous avons bien recréé les index.
Avez-vous une piste pour cette erreur ?
Pour info, une même page publique ne peut pas soumettre 2 demandes à la suite. Il faut soit recharger la page, soit ouvrir un second onglet.
Voici le code simplifé de l’objet :
public class BCSIRCMModificationRequest extends ObjectDB {
private static final long serialVersionUID = 1L;
@Override
public void initCreate() {
resetUpdatableValueField();
this.getField("RCMRequestType").setUpdatable(true);
this.getField("RCMApplicant").setUpdatable(true);
this.getField("RCMRequestDate").setUpdatable(true);
if (!"public".equals(this.getGrant().getLogin())) {
this.getField("RCMApplicant").setValue(this.getGrant().getUserId(this.getGrant().getLogin()));
this.getField("RCMRequestDate").setValue(new Date());
}
this.setSave(true);
this.setSaveAndClose(true);
}
public void resetUpdatableValueField() {
for (ObjectField objectField : this.getFields()) {
if ("SUBMIT".equals(this.getStatusField().getValue())) {
objectField.setUpdatable(objectField.getUpdatableDefault());
} else {
objectField.setUpdatable(false);
}
}
}
@Override
public List<String> preValidate() {
List<String> messageList = new ArrayList<>();
for (ObjectField objectField : this.getFields()) {
objectField.setRequired(objectField.getRequiredDefault());
}
if ("FLOW".equals(this.getFieldValue("RCMRequestType"))
|| "FLOW_DEL".equals(this.getFieldValue("RCMRequestType"))) {
messageList.addAll(preValidateMessageRequest("FLOW_DEL".equals(this.getFieldValue("RCMRequestType"))));
}
if ("SCOPE".equals(this.getFieldValue("RCMRequestType"))
|| "SCOPE_DEL".equals(this.getFieldValue("RCMRequestType"))) {
messageList.addAll(preValidateScopeRequest("SCOPE_DEL".equals(this.getFieldValue("RCMRequestType"))));
}
return messageList;
}
public List<String> preValidateMessageRequest(boolean deletion) {
if (StringUtils.isBlank(this.getFieldValue("RCMSenderApplication"))) {
this.getField("RCMApplication").setRequired(false);
} else {
this.getField("RCMApplication").setValue(this.getFieldValue("RCMSenderApplication"));
}
this.getField("RCMSenderApplication").setRequired(true);
this.getField("RCMReceiverApplication").setRequired(true);
this.getField("RCMMessageComment").setRequired(!deletion);
this.getField("RCMMessageId").setRequired(deletion);
return new ArrayList<>();
}
public List<String> preValidateScopeRequest(boolean deletion) {
this.getField("RCMScope").setRequired(true);
this.getField("RCMScopeDate").setRequired(!deletion);
return new ArrayList<>();
}
@Override
public List<String> postValidate() {
List<String> messageList = new ArrayList<>();
if (!"SUBMIT".equals(this.getStatusField().getValue()) && "SUBMIT".equals(this.getStatusField().getOldValue())){
if ("ACCEPTED".equals(this.getStatusField().getValue())) {
ObjectDB object = prepareObjectDB(messageList);
if (object != null) {
List<String> objectMessageList = object.validate();
if (objectMessageList != null && !objectMessageList.isEmpty()) {
messageList.add(Message.formatError("RCM_CU_" + this.getFieldValue("RCMRequestType").replace("_DEL", "") + "_ERROR", null, null));
}
}
}
this.getField("RCMValidator").setValue(this.getGrant().getUserId(this.getGrant().getLogin()));
}
return messageList;
}
@Override
public String preCreate() {
this.getField("RCMDescription").setValue(buildDescription());
return null;
}
public String buildDescription() {
StringBuilder sb = new StringBuilder();
this.getFields().stream()
.filter(field -> field.isVisibleOnForm()
&& !StringUtils.isBlank(field.getValue())
&& field.getType() != 0
&& !(this.getFieldValue("RCMRequestType").startsWith("FLOW") && field.getInput().startsWith("RCMApplication")))
.forEach(field -> {
sb.append(field.getDisplay()).append(" : ").append(field.getDisplayValue()).append("\n");
});
return sb.toString();
}
}
Cordialement
Amandine TRIDOU
[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-07-01 16:42 (revision ca0a90ddbcc304cf5649bcbcda1bba00f665a37b)
Encoding=UTF-8
EndpointIP=21.0.9.3
EndpointURL=http://0e26dcd6c27b:8080
TimeZone=Europe/Paris
SystemDate=2020-07-08 14:55:29