1 package fr.ifremer.dali.ui.swing.content.home.survey;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import fr.ifremer.dali.dto.data.survey.SurveyDTO;
27 import fr.ifremer.dali.dto.enums.SynchronizationStatusValues;
28 import fr.ifremer.dali.service.DaliServiceLocator;
29 import fr.ifremer.dali.ui.swing.action.AbstractDaliAction;
30 import fr.ifremer.dali.ui.swing.content.home.HomeUIModel;
31 import fr.ifremer.dali.ui.swing.content.home.SearchAction;
32 import fr.ifremer.dali.ui.swing.content.home.survey.validate.ValidateSurveyUI;
33 import fr.ifremer.quadrige3.synchro.vo.SynchroImportContextVO;
34 import fr.ifremer.quadrige3.ui.swing.synchro.action.ImportDataSynchroAtOnceAction;
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37
38 import javax.swing.JOptionPane;
39 import java.util.Collection;
40 import java.util.Set;
41 import java.util.stream.Collectors;
42
43 import static org.nuiton.i18n.I18n.t;
44
45
46
47
48
49 public class UnvalidateSurveyAction extends AbstractDaliAction<SurveysTableUIModel, SurveysTableUI, SurveysTableUIHandler> {
50
51 private enum Action {
52 UNVALIDATE,
53 IMPORT_DATA
54 }
55
56 private Action action;
57
58 private Collection<? extends SurveyDTO> surveyRows;
59
60 private String unvalidationComment;
61
62
63
64
65 private static final Log LOG = LogFactory.getLog(UnvalidateSurveyAction.class);
66
67
68
69
70
71
72 public UnvalidateSurveyAction(final SurveysTableUIHandler handler) {
73 super(handler, false);
74 }
75
76
77
78
79 @Override
80 public boolean prepareAction() throws Exception {
81
82
83 action = Action.UNVALIDATE;
84
85 if (!super.prepareAction()) {
86 return false;
87 }
88
89 if (getModel().getSelectedRows().isEmpty()) {
90 LOG.warn("Aucune Observation de selectionne");
91 return false;
92 }
93
94 if (!getContext().getDataContext().isRecorderValidator()) {
95 displayErrorMessage(t("dali.action.unvalidate.survey.title"), t("dali.action.unvalidate.survey.error.forbidden"));
96 return false;
97 }
98
99 surveyRows = getModel().getSelectedRows();
100
101
102 boolean isSynchronized = false;
103 boolean isQualified = false;
104 for (SurveyDTO survey : surveyRows) {
105
106
107 if (survey.getValidationDate() == null) {
108 displayWarningMessage(t("dali.action.unvalidate.survey.title"), t("dali.action.unvalidate.survey.error.notValid"));
109 return false;
110 }
111
112 if (SynchronizationStatusValues.SYNCHRONIZED.equals(survey.getSynchronizationStatus())) {
113 isSynchronized = true;
114 }
115
116 if (survey.getQualificationDate() != null) {
117 isQualified = true;
118 }
119 }
120
121 if (isSynchronized) {
122 displayWarningMessage(t("dali.action.unvalidate.survey.title"), t("dali.action.unvalidate.survey.warning.isSynchronized"));
123 }
124 if (isQualified) {
125
126 if (!getContext().getDataContext().isRecorderQualifier()) {
127
128 displayWarningMessage(t("dali.action.unvalidate.survey.title"), t("dali.action.unvalidate.survey.error.isQualified"));
129 return false;
130 }
131
132 displayWarningMessage(t("dali.action.unvalidate.survey.title"), t("dali.action.unvalidate.survey.warning.isQualified"));
133 }
134
135
136 try {
137 boolean doUpdate = checkDataUpdate();
138 if (doUpdate) {
139 action = Action.IMPORT_DATA;
140 }
141 } catch (Exception e) {
142 LOG.warn("Connection to synchronization server failed, data updates ignored");
143 }
144
145 if (action == Action.UNVALIDATE) {
146
147 ValidateSurveyUI validateSurveyUI = new ValidateSurveyUI(getContext());
148 validateSurveyUI.getModel().setUnValidation(true);
149 getHandler().openDialog(validateSurveyUI);
150
151 if (validateSurveyUI.getModel().isValid()) {
152 unvalidationComment = validateSurveyUI.getModel().getComment();
153 } else {
154
155 return false;
156 }
157 }
158
159 return true;
160
161 }
162
163
164
165
166 @Override
167 public void doAction() throws Exception {
168
169 if (action == Action.UNVALIDATE) {
170
171 boolean isModifyModelState = getModel().isModify();
172
173
174 getContext().getObservationService().unvalidateSurveys(surveyRows, unvalidationComment, createProgressionUIModel());
175
176 getModel().setModify(isModifyModelState);
177
178 } else if (action == Action.IMPORT_DATA) {
179
180 doImportData();
181 LOG.info("Data have been imported, stop unvalidation action");
182
183 }
184 }
185
186 private boolean checkDataUpdate() {
187
188 Set<String> programCodes = surveyRows.stream().map(survey -> survey.getProgram().getCode()).collect(Collectors.toSet());
189
190 getContext().getSynchroContext().setImportDataProgramCodes(programCodes);
191
192 SynchroImportContextVO contextResult = DaliServiceLocator.instance().getSynchroRestClientService().checkImportDataContext(
193 getContext().getAuthenticationInfo(),
194 getContext().getSynchroContext().getSynchroImportContext()
195 );
196
197 if (contextResult.isWithData()) {
198
199
200 return getContext().getDialogHelper().showConfirmDialog(
201 t("dali.action.unvalidate.survey.updateAvailable"),
202 t("dali.action.unvalidate.survey.title"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
203
204 }
205
206 return false;
207 }
208
209 private void doImportData() {
210
211
212 String oldDescription = getActionDescription();
213
214
215 ImportDataSynchroAtOnceAction importAction = getContext().getActionFactory().createLogicAction(getContext().getMainUI().getHandler(), ImportDataSynchroAtOnceAction.class);
216
217
218 forceActionDescription(t("dali.action.synchro.import.data"));
219
220
221 getContext().getActionEngine().runInternalAction(importAction);
222
223
224 forceActionDescription(oldDescription);
225
226 }
227
228
229
230
231 @Override
232 public void postSuccessAction() {
233
234 if (action == Action.IMPORT_DATA) {
235
236 SearchAction searchAction = getActionFactory().createLogicAction(getHandler().getHomeUIHandler(), SearchAction.class);
237 getActionEngine().runInternalAction(searchAction);
238 }
239
240
241 getModel().getMainUIModel().firePropertyChanged(HomeUIModel.PROPERTY_SELECTED_SURVEY, null, null);
242
243 super.postSuccessAction();
244
245 }
246
247 }