Tony CHEMIT pushed to branch develop-9.0.x at ultreiaio / ird-observe

Commits:

22 changed files:

Changes:

  • client/datasource/editor/ps/src/main/i18n/getters/jaxx.getter
    ... ... @@ -186,6 +186,7 @@ observe.data.ps.observation.Catch.catchWeight
    186 186
     observe.data.ps.observation.Catch.maxWeight
    
    187 187
     observe.data.ps.observation.Catch.meanLength
    
    188 188
     observe.data.ps.observation.Catch.meanWeight
    
    189
    +observe.data.ps.observation.Catch.minMaxWeight
    
    189 190
     observe.data.ps.observation.Catch.minWeight
    
    190 191
     observe.data.ps.observation.Catch.reasonForDiscard
    
    191 192
     observe.data.ps.observation.Catch.totalCount
    

  • client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SetCatchUI.jaxx
    ... ... @@ -125,10 +125,13 @@
    125 125
             </row>
    
    126 126
             <row>
    
    127 127
                 <cell>
    
    128
    -                <JLabel id='minWeightLabel'/>
    
    128
    +                <JLabel id='minMaxWeightLabel'/>
    
    129 129
                 </cell>
    
    130 130
                 <cell weightx='1'>
    
    131
    -                <NumberEditor id='minWeight' styleClass="float2"/>
    
    131
    +                <JPanel layout="{new GridLayout()}">
    
    132
    +                    <NumberEditor id='minWeight' styleClass="float2"/>
    
    133
    +                    <NumberEditor id='maxWeight' styleClass="float2"/>
    
    134
    +                </JPanel>
    
    132 135
                 </cell>
    
    133 136
             </row>
    
    134 137
             <row>
    
    ... ... @@ -139,15 +142,6 @@
    139 142
                     <NumberEditor id='meanWeight' styleClass="float2"/>
    
    140 143
                 </cell>
    
    141 144
             </row>
    
    142
    -        <row>
    
    143
    -            <cell>
    
    144
    -                <JLabel id='maxWeightLabel'/>
    
    145
    -            </cell>
    
    146
    -            <cell weightx='1'>
    
    147
    -                <NumberEditor id='maxWeight' styleClass="float2"/>
    
    148
    -            </cell>
    
    149
    -        </row>
    
    150
    -
    
    151 145
             <!-- taille moyenne -->
    
    152 146
             <row>
    
    153 147
                 <cell>
    

  • core/api/services/src/main/i18n/getters/labels.getter
    ... ... @@ -1038,6 +1038,7 @@ observe.data.ps.observation.Catch.meanWeight
    1038 1038
     observe.data.ps.observation.Catch.meanWeight.short
    
    1039 1039
     observe.data.ps.observation.Catch.meanWeightComputed.computed.tip
    
    1040 1040
     observe.data.ps.observation.Catch.meanWeightComputed.observed.tip
    
    1041
    +observe.data.ps.observation.Catch.minMaxWeight
    
    1041 1042
     observe.data.ps.observation.Catch.minWeight
    
    1042 1043
     observe.data.ps.observation.Catch.minWeight.short
    
    1043 1044
     observe.data.ps.observation.Catch.reasonForDiscard
    

  • core/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/common/TripSpi.java
    ... ... @@ -45,6 +45,7 @@ import fr.ird.observe.entities.referential.ps.common.AcquisitionStatus;
    45 45
     import fr.ird.observe.entities.referential.ps.common.ObservedSystem;
    
    46 46
     import fr.ird.observe.entities.referential.ps.common.Program;
    
    47 47
     import fr.ird.observe.entities.referential.ps.logbook.WellContentStatus;
    
    48
    +import fr.ird.observe.persistence.SqlHelper;
    
    48 49
     import fr.ird.observe.spi.service.ServiceContext;
    
    49 50
     import io.ultreia.java4all.util.Dates;
    
    50 51
     import io.ultreia.java4all.util.sql.SqlScriptWriter;
    
    ... ... @@ -330,8 +331,8 @@ public class TripSpi extends GeneratedTripSpi {
    330 331
                                  toId(observationsDataQuality),
    
    331 332
                                  toId(observer),
    
    332 333
                                  commentFormat.apply(observationsComment),
    
    333
    -                             escapeString(formsUrl),
    
    334
    -                             escapeString(reportsUrl),
    
    334
    +                             SqlHelper.escapeString(formsUrl),
    
    335
    +                             SqlHelper.escapeString(reportsUrl),
    
    335 336
                                  newId);
    
    336 337
         }
    
    337 338
     
    

  • core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/DataWriter.java
    ... ... @@ -77,7 +77,7 @@ public abstract class DataWriter<E extends DataEntity, R extends DataReader<E>>
    77 77
         }
    
    78 78
     
    
    79 79
         public static String escapeString(String comment) {
    
    80
    -        return DataDtoEntityContext.escapeString(comment);
    
    80
    +        return SqlHelper.escapeString(comment);
    
    81 81
         }
    
    82 82
     
    
    83 83
         public static String roundFloat2(Float comment) {
    

  • core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_0.java
    ... ... @@ -23,7 +23,8 @@ package fr.ird.observe.spi.migration.v9;
    23 23
      */
    
    24 24
     
    
    25 25
     import com.google.auto.service.AutoService;
    
    26
    -import fr.ird.observe.spi.context.DataDtoEntityContext;
    
    26
    +import fr.ird.observe.dto.StringCleaner;
    
    27
    +import fr.ird.observe.persistence.SqlHelper;
    
    27 28
     import fr.ird.observe.spi.migration.ByMajorMigrationVersionResource;
    
    28 29
     import io.ultreia.java4all.util.Version;
    
    29 30
     import io.ultreia.java4all.util.sql.SqlQuery;
    
    ... ... @@ -254,6 +255,7 @@ public class DataSourceMigrationForVersion_9_0 extends ByMajorMigrationVersionRe
    254 255
                 executor.addScript("96", "add_referential_ps_common_ObservedSystem_finalize");
    
    255 256
             }
    
    256 257
         }
    
    258
    +
    
    257 259
         private void migrateCatches(MigrationVersionResourceExecutor executor) {
    
    258 260
     
    
    259 261
             Function<String, String> commentFormat = executor.commentFormat();
    
    ... ... @@ -395,7 +397,7 @@ public class DataSourceMigrationForVersion_9_0 extends ByMajorMigrationVersionRe
    395 397
                                                 sample.topiaId,
    
    396 398
                                                 sample.topiaVersion,
    
    397 399
                                                 sample.topiaCreateDate,
    
    398
    -                                            DataDtoEntityContext.escapeString(sample.homeId),
    
    400
    +                                            SqlHelper.escapeString(StringCleaner.ALL.apply(sample.homeId)),
    
    399 401
                                                 stringFormat.apply(sample.comment),
    
    400 402
                                                 sample.set,
    
    401 403
                                                 sample.lastUpdateDate
    
    ... ... @@ -564,31 +566,39 @@ public class DataSourceMigrationForVersion_9_0 extends ByMajorMigrationVersionRe
    564 566
                                                 sampleMeasure.topiaId,
    
    565 567
                                                 sampleMeasure.topiaVersion,
    
    566 568
                                                 sampleMeasure.topiaCreateDate,
    
    567
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.homeId == null ? null : sampleMeasure.homeId.replaceAll("'", "")),
    
    569
    +                                            SqlHelper.escapeString(sampleMeasure.homeId == null ? null : sampleMeasure.homeId.replaceAll("'", "")),
    
    568 570
                                                 sampleMeasure.length,
    
    569 571
                                                 sampleMeasure.isLengthComputed,
    
    570
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.picturesReferences == null ? null : sampleMeasure.picturesReferences.replaceAll("'", "")),
    
    572
    +                                            SqlHelper.escapeString(sampleMeasure.picturesReferences == null ? null : sampleMeasure.picturesReferences.replaceAll("'", "")),
    
    571 573
                                                 sampleMeasure.weight,
    
    572 574
                                                 sampleMeasure.isWeightComputed,
    
    573 575
                                                 sampleMeasure.count,
    
    574 576
                                                 sampleMeasure.acquisitionMode,
    
    575
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.species),
    
    577
    +                                            SqlHelper.escapeString(sampleMeasure.species),
    
    576 578
                                                 sampleId,
    
    577
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.sex),
    
    579
    +                                            SqlHelper.escapeString(sampleMeasure.sex),
    
    578 580
                                                 sampleMeasure.lastUpdateDate,
    
    579
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.sizeMeasureType),
    
    580
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.weightMeasureType),
    
    581
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.tagNumber),
    
    582
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.speciesFate),
    
    581
    +                                            SqlHelper.escapeString(sampleMeasure.sizeMeasureType),
    
    582
    +                                            SqlHelper.escapeString(sampleMeasure.weightMeasureType),
    
    583
    +                                            SqlHelper.escapeString(sampleMeasure.tagNumber),
    
    584
    +                                            SqlHelper.escapeString(sampleMeasure.speciesFate),
    
    583 585
                                                 sampleMeasure.sample_idx,
    
    584
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.lengthMeasureMethod),
    
    585
    -                                            DataDtoEntityContext.escapeString(sampleMeasure.weightMeasureMethod)
    
    586
    +                                            SqlHelper.escapeString(sampleMeasure.lengthMeasureMethod),
    
    587
    +                                            SqlHelper.escapeString(sampleMeasure.weightMeasureMethod)
    
    586 588
                 ));
    
    587 589
             }
    
    588 590
         }
    
    589 591
     
    
    590 592
         @Override
    
    591 593
         public void generateFinalizeSqlScript(MigrationVersionResourceExecutor executor) {
    
    594
    +        long stringFixedCount = new FixStringHelper(executor).execute();
    
    595
    +        if (stringFixedCount > 0) {
    
    596
    +            log.warn(String.format("Fix %s string rows(s).", stringFixedCount));
    
    597
    +        }
    
    598
    +        long commentFixedCount = new FixCommentHelper(executor).execute();
    
    599
    +        if (commentFixedCount > 0) {
    
    600
    +            log.warn(String.format("Fix %s comment rows(s).", commentFixedCount));
    
    601
    +        }
    
    592 602
             migrateIdx(executor, "ps_observation", "catch", "set");
    
    593 603
             migrateIdx(executor, "ps_observation", "SampleMeasure", "sample");
    
    594 604
         }
    

  • core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/DiscardedTargetCatchRecord.java
    ... ... @@ -22,6 +22,8 @@ package fr.ird.observe.spi.migration.v9;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    +import fr.ird.observe.dto.StringCleaner;
    
    26
    +import fr.ird.observe.persistence.SqlHelper;
    
    25 27
     import fr.ird.observe.spi.context.DataDtoEntityContext;
    
    26 28
     
    
    27 29
     import java.sql.Connection;
    
    ... ... @@ -56,19 +58,19 @@ public class DiscardedTargetCatchRecord {
    56 58
     
    
    57 59
         public static PreparedStatement prepareStatement(Connection connection) throws SQLException {
    
    58 60
             return connection.prepareStatement("SELECT" +
    
    59
    -                                     /* 01 */      " REPLACE(tc.topiaId, '.TargetCatch', '.Catch')," +
    
    60
    -                                     /* 02 */      " tc.topiaVersion + 1," +
    
    61
    -                                     /* 03 */      " tc.topiaCreateDate," +
    
    62
    -                                     /* 04 */      " tc.homeId," +
    
    63
    -                                     /* 05 */      " tc.catchWeight," +
    
    64
    -                                     /* 06 */      " tc.weightCategory," +
    
    65
    -                                     /* 07 */      " tc.comment," +
    
    66
    -                                     /* 08 */      " tc.reasonForDiscard," +
    
    67
    -                                     /* 09 */      " tc.set," +
    
    68
    -                                     /* 10 */      " tc.lastUpdateDate," +
    
    69
    -                                     /* 11 */      " tc.well," +
    
    70
    -                                     /* 12 */      " -tc.set_idx," +
    
    71
    -                                     /* 13 */      " tc.weightMeasureMethod" +
    
    61
    +                                                   /* 01 */      " REPLACE(tc.topiaId, '.TargetCatch', '.Catch')," +
    
    62
    +                                                   /* 02 */      " tc.topiaVersion + 1," +
    
    63
    +                                                   /* 03 */      " tc.topiaCreateDate," +
    
    64
    +                                                   /* 04 */      " tc.homeId," +
    
    65
    +                                                   /* 05 */      " tc.catchWeight," +
    
    66
    +                                                   /* 06 */      " tc.weightCategory," +
    
    67
    +                                                   /* 07 */      " tc.comment," +
    
    68
    +                                                   /* 08 */      " tc.reasonForDiscard," +
    
    69
    +                                                   /* 09 */      " tc.set," +
    
    70
    +                                                   /* 10 */      " tc.lastUpdateDate," +
    
    71
    +                                                   /* 11 */      " tc.well," +
    
    72
    +                                                   /* 12 */      " -tc.set_idx," +
    
    73
    +                                                   /* 13 */      " tc.weightMeasureMethod" +
    
    72 74
                                                        " FROM ps_observation.TargetCatch tc" +
    
    73 75
                                                        " WHERE tc.discarded");
    
    74 76
         }
    
    ... ... @@ -132,24 +134,24 @@ public class DiscardedTargetCatchRecord {
    132 134
                                          "%17$s, " +
    
    133 135
                                          "%18$s" +
    
    134 136
                                          ");",
    
    135
    -                /*1*/                DataDtoEntityContext.escapeString(id),
    
    137
    +                /*1*/                SqlHelper.escapeString(id),
    
    136 138
                     /*2*/                topiaVersion,
    
    137 139
                     /*3*/                DataDtoEntityContext.timestamp(topiaCreateDate),
    
    138
    -                /*4*/                DataDtoEntityContext.escapeString(homeId),
    
    140
    +                /*4*/                SqlHelper.escapeString(StringCleaner.ALL.apply(homeId)),
    
    139 141
                     /*5*/                catchWeight,
    
    140 142
                     /*6*/                weightCategoryRecord.getMinWeight(),
    
    141 143
                     /*7*/                weightCategoryRecord.getMaxWeight(),
    
    142 144
                     /*8*/                null,
    
    143 145
                     /*9*/                getComment(weightCategoryRecord, commentFormat),
    
    144
    -                /*10*/               DataDtoEntityContext.escapeString(reasonForDiscardId),
    
    145
    -                /*11*/               DataDtoEntityContext.escapeString(weightCategoryRecord.getSpeciesId()),
    
    146
    -                /*12*/               DataDtoEntityContext.escapeString(DataSourceMigrationForVersion_9_0.SPECIES_FATE_5),
    
    147
    -                /*13*/               DataDtoEntityContext.escapeString(setId),
    
    146
    +                /*10*/               SqlHelper.escapeString(reasonForDiscardId),
    
    147
    +                /*11*/               SqlHelper.escapeString(weightCategoryRecord.getSpeciesId()),
    
    148
    +                /*12*/               SqlHelper.escapeString(DataSourceMigrationForVersion_9_0.SPECIES_FATE_5),
    
    149
    +                /*13*/               SqlHelper.escapeString(setId),
    
    148 150
                     /*14*/               DataDtoEntityContext.timestamp(lastUpdateDate),
    
    149
    -                /*15*/               DataDtoEntityContext.escapeString(getWell()),
    
    151
    +                /*15*/               SqlHelper.escapeString(StringCleaner.ALL.apply(well)),
    
    150 152
                     /*16*/               setIdx,
    
    151
    -                /*17*/               DataDtoEntityContext.escapeString(weightMeasureMethodId == null ? "fr.ird.referential.common.WeightMeasureMethod#666#03" : weightCategoryId),
    
    152
    -                /*18*/               DataDtoEntityContext.escapeString(DataSourceMigrationForVersion_9_0.INFORMATION_SOURCE_O)
    
    153
    +                /*17*/               SqlHelper.escapeString(weightMeasureMethodId == null ? "fr.ird.referential.common.WeightMeasureMethod#666#03" : weightCategoryId),
    
    154
    +                /*18*/               SqlHelper.escapeString(DataSourceMigrationForVersion_9_0.INFORMATION_SOURCE_O)
    
    153 155
             );
    
    154 156
         }
    
    155 157
     
    
    ... ... @@ -160,14 +162,4 @@ public class DiscardedTargetCatchRecord {
    160 162
             return stringFormat.apply(comment + "\n" + weightCategoryRecord.toComment());
    
    161 163
         }
    
    162 164
     
    
    163
    -    public String getWell() {
    
    164
    -        String result = well;
    
    165
    -        if (result!=null) {
    
    166
    -            result = well.trim();
    
    167
    -            if (well.startsWith("'")) {
    
    168
    -                result = result.substring(1);
    
    169
    -            }
    
    170
    -        }
    
    171
    -        return result;
    
    172
    -    }
    
    173 165
     }

  • core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/FixCommentHelper.java
    1
    +package fr.ird.observe.spi.migration.v9;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Core :: Persistence :: Resources
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2022 IRD, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import org.apache.logging.log4j.LogManager;
    
    26
    +import org.apache.logging.log4j.Logger;
    
    27
    +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor;
    
    28
    +
    
    29
    +import java.sql.PreparedStatement;
    
    30
    +import java.sql.ResultSet;
    
    31
    +import java.util.Objects;
    
    32
    +import java.util.concurrent.atomic.AtomicLong;
    
    33
    +import java.util.function.Function;
    
    34
    +
    
    35
    +/**
    
    36
    + * To auto-trim string comment fields.
    
    37
    + * <p>
    
    38
    + * <strong>Note:</strong> If fixed value is empty or blank then set {@code null} value.
    
    39
    + * <p>
    
    40
    + * Created on 11/11/2022.
    
    41
    + *
    
    42
    + * @author Tony Chemit - dev@tchemit.fr
    
    43
    + * @since 9.0.17
    
    44
    + */
    
    45
    +public class FixCommentHelper {
    
    46
    +
    
    47
    +    private static final Logger log = LogManager.getLogger(FixCommentHelper.class);
    
    48
    +
    
    49
    +    private final MigrationVersionResourceExecutor executor;
    
    50
    +    private final AtomicLong count = new AtomicLong();
    
    51
    +    private final Function<String, String> commentFormat;
    
    52
    +
    
    53
    +    public FixCommentHelper(MigrationVersionResourceExecutor executor) {
    
    54
    +        this.executor = Objects.requireNonNull(executor);
    
    55
    +        commentFormat = executor.commentFormat();
    
    56
    +    }
    
    57
    +
    
    58
    +    public long execute() {
    
    59
    +
    
    60
    +        fixField("common.Vessel", "comment");
    
    61
    +
    
    62
    +        fixField("ll_common.GearUseFeatures", "comment");
    
    63
    +        fixField("ll_common.Program", "comment");
    
    64
    +        fixField("ll_common.Trip", "generalComment");
    
    65
    +        fixField("ll_common.Trip", "logbookComment");
    
    66
    +        fixField("ll_common.Trip", "observationsComment");
    
    67
    +
    
    68
    +        fixField("ll_landing.Landing", "comment");
    
    69
    +
    
    70
    +        fixField("ll_logbook.Activity", "comment");
    
    71
    +        fixField("ll_logbook.Catch", "comment");
    
    72
    +        fixField("ll_logbook.Set", "comment");
    
    73
    +        fixField("ll_logbook.Sample", "comment");
    
    74
    +
    
    75
    +        fixField("ll_observation.Activity", "comment");
    
    76
    +        fixField("ll_observation.Branchline", "comment");
    
    77
    +        fixField("ll_observation.Catch", "comment");
    
    78
    +        fixField("ll_observation.Set", "comment");
    
    79
    +
    
    80
    +        fixField("ps_common.GearUseFeatures", "comment");
    
    81
    +        fixField("ps_common.Program", "comment");
    
    82
    +        fixField("ps_common.Trip", "generalComment");
    
    83
    +        fixField("ps_common.Trip", "logbookComment");
    
    84
    +        fixField("ps_common.Trip", "observationsComment");
    
    85
    +
    
    86
    +        fixField("ps_localmarket.Batch", "origin");
    
    87
    +        fixField("ps_localmarket.Sample", "comment");
    
    88
    +        fixField("ps_localmarket.SampleSpecies", "comment");
    
    89
    +        fixField("ps_localmarket.Survey", "comment");
    
    90
    +
    
    91
    +        fixField("ps_logbook.Activity", "comment");
    
    92
    +        fixField("ps_logbook.Catch", "comment");
    
    93
    +        fixField("ps_logbook.FloatingObject", "comment");
    
    94
    +        fixField("ps_logbook.Route", "comment");
    
    95
    +        fixField("ps_logbook.Sample", "comment");
    
    96
    +        fixField("ps_logbook.SampleSpecies", "comment");
    
    97
    +        fixField("ps_logbook.TransmittingBuoy", "comment");
    
    98
    +
    
    99
    +        fixField("ps_observation.Activity", "comment");
    
    100
    +        fixField("ps_observation.Catch", "comment");
    
    101
    +        fixField("ps_observation.FloatingObject", "comment");
    
    102
    +        fixField("ps_observation.NonTargetCatchRelease", "comment");
    
    103
    +        fixField("ps_observation.Route", "comment");
    
    104
    +        fixField("ps_observation.Set", "comment");
    
    105
    +        fixField("ps_observation.TransmittingBuoy", "comment");
    
    106
    +        return count.get();
    
    107
    +    }
    
    108
    +
    
    109
    +    public void fixField(String gav, String field) {
    
    110
    +
    
    111
    +        executor.doSqlWork(connection -> {
    
    112
    +            try (PreparedStatement statement = connection.prepareStatement(String.format("SELECT topiaId, %2$s FROM %1$s WHERE %2$s IS NOT NULL", gav, field))) {
    
    113
    +                try (ResultSet resultSet = statement.executeQuery()) {
    
    114
    +                    while (resultSet.next()) {
    
    115
    +                        String fieldValue = resultSet.getString(2);
    
    116
    +                        String fixFieldValue = fieldValue.trim();
    
    117
    +                        if (!fieldValue.equals(fixFieldValue)) {
    
    118
    +                            if (fixFieldValue.isEmpty()) {
    
    119
    +                                fixFieldValue = null;
    
    120
    +                            }
    
    121
    +                            String id = resultSet.getString(1);
    
    122
    +                            String finalFieldValue = commentFormat.apply(fixFieldValue);
    
    123
    +                            log.info(String.format("Fix comment field %s.%s[%s] from\n[%s]\nto\n[%s]", gav, field, id, fieldValue, fixFieldValue));
    
    124
    +                            executor.writeSql(String.format("UPDATE %s SET %s = %s WHERE topiaId = '%s';", gav, field, finalFieldValue, id));
    
    125
    +                            count.incrementAndGet();
    
    126
    +                        }
    
    127
    +                    }
    
    128
    +                }
    
    129
    +            }
    
    130
    +        });
    
    131
    +
    
    132
    +    }
    
    133
    +}

  • core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/FixStringHelper.java
    1
    +package fr.ird.observe.spi.migration.v9;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Core :: Persistence :: Resources
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2022 IRD, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import fr.ird.observe.dto.StringCleaner;
    
    26
    +import fr.ird.observe.persistence.SqlHelper;
    
    27
    +import org.apache.logging.log4j.LogManager;
    
    28
    +import org.apache.logging.log4j.Logger;
    
    29
    +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor;
    
    30
    +
    
    31
    +import java.sql.Connection;
    
    32
    +import java.sql.PreparedStatement;
    
    33
    +import java.sql.ResultSet;
    
    34
    +import java.sql.SQLException;
    
    35
    +import java.util.Collections;
    
    36
    +import java.util.Map;
    
    37
    +import java.util.Objects;
    
    38
    +import java.util.Set;
    
    39
    +import java.util.TreeMap;
    
    40
    +import java.util.TreeSet;
    
    41
    +import java.util.concurrent.atomic.AtomicLong;
    
    42
    +
    
    43
    +/**
    
    44
    + * To auto-trim string fields and remove any {@code '} characters inside it.
    
    45
    + * <p>
    
    46
    + * <strong>Note:</strong> If fixed value is empty or blank then set {@code null} value.
    
    47
    + * <p>
    
    48
    + * Created on 11/11/2022.
    
    49
    + *
    
    50
    + * @author Tony Chemit - dev@tchemit.fr
    
    51
    + * @since 9.0.17
    
    52
    + */
    
    53
    +public class FixStringHelper {
    
    54
    +
    
    55
    +    private static final Logger log = LogManager.getLogger(FixStringHelper.class);
    
    56
    +
    
    57
    +    private final MigrationVersionResourceExecutor executor;
    
    58
    +    private final AtomicLong count = new AtomicLong();
    
    59
    +
    
    60
    +    public FixStringHelper(MigrationVersionResourceExecutor executor) {
    
    61
    +        this.executor = Objects.requireNonNull(executor);
    
    62
    +    }
    
    63
    +
    
    64
    +    static class FixStringEntityModel {
    
    65
    +
    
    66
    +        private final String gav;
    
    67
    +        private final Map<String, StringCleaner> fieldsActions;
    
    68
    +        private final Set<String> fieldsDeleteIfNull;
    
    69
    +
    
    70
    +        static FixStringEntityModel on(String gav, StringCleaner cleaner, String firstField, String... fields) {
    
    71
    +            return new FixStringEntityModel(gav).add(cleaner, firstField, fields);
    
    72
    +        }
    
    73
    +
    
    74
    +        static FixStringEntityModel onI18n(String gav, StringCleaner cleaner, String firstField, String... fields) {
    
    75
    +            return on(gav, StringCleaner.TRIM, "label1", "label2", "label3").add(cleaner, firstField, fields);
    
    76
    +        }
    
    77
    +
    
    78
    +        private FixStringEntityModel(String gav) {
    
    79
    +            this.gav = gav;
    
    80
    +            this.fieldsActions = new TreeMap<>();
    
    81
    +            this.fieldsDeleteIfNull = new TreeSet<>();
    
    82
    +        }
    
    83
    +
    
    84
    +        FixStringEntityModel add(StringCleaner cleaner, String firstField, String... fields) {
    
    85
    +            fieldsActions.put(firstField, cleaner);
    
    86
    +            for (String field : fields) {
    
    87
    +                fieldsActions.put(field, cleaner);
    
    88
    +            }
    
    89
    +            return this;
    
    90
    +        }
    
    91
    +
    
    92
    +        FixStringEntityModel deleteIfNull(String firstField, String... fields) {
    
    93
    +            fieldsDeleteIfNull.add(firstField);
    
    94
    +            Collections.addAll(fieldsDeleteIfNull, fields);
    
    95
    +            return this;
    
    96
    +        }
    
    97
    +
    
    98
    +    }
    
    99
    +
    
    100
    +    public long execute() {
    
    101
    +        executor.doSqlWork(connection -> {
    
    102
    +            execute(connection, FixStringEntityModel.onI18n("common.Country", StringCleaner.ALL, "code", "iso2Code", "iso3Code"));
    
    103
    +            execute(connection, FixStringEntityModel.onI18n("common.DataQuality", StringCleaner.ALL, "code"));
    
    104
    +            execute(connection, FixStringEntityModel.onI18n("common.FpaZone", StringCleaner.ALL, "code"));
    
    105
    +            execute(connection, FixStringEntityModel.onI18n("common.Gear", StringCleaner.ALL, "code"));
    
    106
    +            execute(connection, FixStringEntityModel.onI18n("common.GearCharacteristic", StringCleaner.ALL, "code"));
    
    107
    +            execute(connection, FixStringEntityModel.onI18n("common.GearCharacteristicType", StringCleaner.ALL, "code"));
    
    108
    +            execute(connection, FixStringEntityModel.onI18n("common.Harbour", StringCleaner.ALL, "code"));
    
    109
    +            execute(connection, FixStringEntityModel.on("common.LengthLengthParameter", StringCleaner.ALL, "coefficients", "inputOutputFormula", "outputInputFormula"));
    
    110
    +            execute(connection, FixStringEntityModel.onI18n("common.LengthMeasureMethod", StringCleaner.ALL, "code"));
    
    111
    +            execute(connection, FixStringEntityModel.on("common.LengthWeightParameter", StringCleaner.ALL, "coefficients", "lengthWeightFormula", "weightLengthFormula"));
    
    112
    +            execute(connection, FixStringEntityModel.onI18n("common.Ocean", StringCleaner.ALL, "code"));
    
    113
    +            execute(connection, FixStringEntityModel.onI18n("common.Organism", StringCleaner.ALL, "code"));
    
    114
    +            // not removing single quotes
    
    115
    +            execute(connection, FixStringEntityModel.on("common.Person", StringCleaner.TRIM, "firstName", "lastName"));
    
    116
    +            execute(connection, FixStringEntityModel.onI18n("common.Sex", StringCleaner.ALL, "code"));
    
    117
    +            execute(connection, FixStringEntityModel.on("common.ShipOwner", StringCleaner.ALL, "code", "label"));
    
    118
    +            execute(connection, FixStringEntityModel.onI18n("common.SizeMeasureType", StringCleaner.ALL, "code"));
    
    119
    +            execute(connection, FixStringEntityModel.onI18n("common.Species", StringCleaner.ALL, "scientificLabel"));
    
    120
    +            execute(connection, FixStringEntityModel.onI18n("common.SpeciesGroup", StringCleaner.ALL, "code"));
    
    121
    +            execute(connection, FixStringEntityModel.onI18n("common.SpeciesGroupReleaseMode", StringCleaner.ALL, "code"));
    
    122
    +            execute(connection, FixStringEntityModel.onI18n("common.SpeciesList", StringCleaner.ALL, "code"));
    
    123
    +            execute(connection, FixStringEntityModel.onI18n("common.Vessel", StringCleaner.ALL, "code"));
    
    124
    +            execute(connection, FixStringEntityModel.onI18n("common.VesselType", StringCleaner.ALL, "code"));
    
    125
    +            execute(connection, FixStringEntityModel.on("common.VesselSizeCategory", StringCleaner.ALL, "code", "capacityLabel", "gaugeLabel"));
    
    126
    +            execute(connection, FixStringEntityModel.onI18n("common.WeightMeasureMethod", StringCleaner.ALL, "code"));
    
    127
    +            execute(connection, FixStringEntityModel.onI18n("common.WeightMeasureType", StringCleaner.ALL, "code"));
    
    128
    +            execute(connection, FixStringEntityModel.onI18n("common.Wind", StringCleaner.ALL, "code"));
    
    129
    +
    
    130
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.BaitSettingStatus", StringCleaner.ALL, "code"));
    
    131
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.BaitType", StringCleaner.ALL, "code"));
    
    132
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.CatchFate", StringCleaner.ALL, "code"));
    
    133
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.HealthStatus", StringCleaner.ALL, "code"));
    
    134
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.HookSize", StringCleaner.ALL, "code"));
    
    135
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.HookType", StringCleaner.ALL, "code"));
    
    136
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.LightsticksColor", StringCleaner.ALL, "code"));
    
    137
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.LightsticksType", StringCleaner.ALL, "code"));
    
    138
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.LineType", StringCleaner.ALL, "code"));
    
    139
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.MitigationType", StringCleaner.ALL, "code"));
    
    140
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.ObservationMethod", StringCleaner.ALL, "code"));
    
    141
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.OnBoardProcessing", StringCleaner.ALL, "code"));
    
    142
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.Program", StringCleaner.ALL, "code"));
    
    143
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.SettingShape", StringCleaner.ALL, "code"));
    
    144
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.TripType", StringCleaner.ALL, "code"));
    
    145
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.VesselActivity", StringCleaner.ALL, "code"));
    
    146
    +            execute(connection, FixStringEntityModel.onI18n("ll_common.WeightDeterminationMethod", StringCleaner.ALL, "code"));
    
    147
    +
    
    148
    +            execute(connection, FixStringEntityModel.onI18n("ll_landing.Company", StringCleaner.ALL, "code"));
    
    149
    +            execute(connection, FixStringEntityModel.onI18n("ll_landing.Conservation", StringCleaner.ALL, "code"));
    
    150
    +            execute(connection, FixStringEntityModel.onI18n("ll_landing.DataSource", StringCleaner.ALL, "code"));
    
    151
    +
    
    152
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.BaitHaulingStatus", StringCleaner.ALL, "code"));
    
    153
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.EncounterType", StringCleaner.ALL, "code"));
    
    154
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.HookPosition", StringCleaner.ALL, "code"));
    
    155
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.ItemHorizontalPosition", StringCleaner.ALL, "code"));
    
    156
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.ItemVerticalPosition", StringCleaner.ALL, "code"));
    
    157
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.MaturityStatus", StringCleaner.ALL, "code"));
    
    158
    +            execute(connection, FixStringEntityModel.on("ll_observation.SensorBrand", StringCleaner.ALL, "brandName", "code"));
    
    159
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.SensorDataFormat", StringCleaner.ALL, "code"));
    
    160
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.SensorType", StringCleaner.ALL, "code"));
    
    161
    +            execute(connection, FixStringEntityModel.onI18n("ll_observation.StomachFullness", StringCleaner.ALL, "code"));
    
    162
    +
    
    163
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.AcquisitionStatus", StringCleaner.ALL, "code"));
    
    164
    +            // not set to null if empty (special value FOB has an empty code)
    
    165
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.ObjectMaterial", StringCleaner.REMOVE_SINGLE_QUOTE_AND_TRIM, "code"));
    
    166
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.ObjectMaterialType", StringCleaner.ALL, "code"));
    
    167
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.ObjectOperation", StringCleaner.ALL, "code"));
    
    168
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.ObservedSystem", StringCleaner.ALL, "code"));
    
    169
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.Program", StringCleaner.ALL, "code"));
    
    170
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.ReasonForNoFishing", StringCleaner.ALL, "code"));
    
    171
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.ReasonForNullSet", StringCleaner.ALL, "code"));
    
    172
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.SampleType", StringCleaner.ALL, "code"));
    
    173
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.SchoolType", StringCleaner.ALL, "code"));
    
    174
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.SpeciesFate", StringCleaner.ALL, "code"));
    
    175
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.TransmittingBuoyOperation", StringCleaner.ALL, "code"));
    
    176
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.TransmittingBuoyOwnership", StringCleaner.ALL, "code"));
    
    177
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.TransmittingBuoyType", StringCleaner.ALL, "code"));
    
    178
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.VesselActivity", StringCleaner.ALL, "code"));
    
    179
    +            execute(connection, FixStringEntityModel.onI18n("ps_common.WeightCategory", StringCleaner.ALL, "code"));
    
    180
    +
    
    181
    +            execute(connection, FixStringEntityModel.onI18n("ps_landing.Destination", StringCleaner.ALL, "code"));
    
    182
    +            execute(connection, FixStringEntityModel.onI18n("ps_landing.Fate", StringCleaner.ALL, "code"));
    
    183
    +
    
    184
    +            execute(connection, FixStringEntityModel.onI18n("ps_localmarket.BatchComposition", StringCleaner.ALL, "code"));
    
    185
    +            execute(connection, FixStringEntityModel.onI18n("ps_localmarket.BatchWeightType", StringCleaner.ALL, "code"));
    
    186
    +            execute(connection, FixStringEntityModel.onI18n("ps_localmarket.Packaging", StringCleaner.ALL, "code"));
    
    187
    +
    
    188
    +            execute(connection, FixStringEntityModel.onI18n("ps_logbook.InformationSource", StringCleaner.ALL, "code"));
    
    189
    +            execute(connection, FixStringEntityModel.onI18n("ps_logbook.SampleQuality", StringCleaner.ALL, "code"));
    
    190
    +            execute(connection, FixStringEntityModel.onI18n("ps_logbook.SetSuccessStatus", StringCleaner.ALL, "code"));
    
    191
    +            execute(connection, FixStringEntityModel.onI18n("ps_logbook.WellContentStatus", StringCleaner.ALL, "code"));
    
    192
    +            execute(connection, FixStringEntityModel.onI18n("ps_logbook.WellSamplingConformity", StringCleaner.ALL, "code"));
    
    193
    +            execute(connection, FixStringEntityModel.onI18n("ps_logbook.WellSamplingStatus", StringCleaner.ALL, "code"));
    
    194
    +
    
    195
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.DetectionMode", StringCleaner.ALL, "code"));
    
    196
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.InformationSource", StringCleaner.ALL, "code"));
    
    197
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.NonTargetCatchReleaseConformity", StringCleaner.ALL, "code"));
    
    198
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.NonTargetCatchReleaseStatus", StringCleaner.ALL, "code"));
    
    199
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.NonTargetCatchReleasingTime", StringCleaner.ALL, "code"));
    
    200
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.ReasonForDiscard", StringCleaner.ALL, "code"));
    
    201
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.SpeciesStatus", StringCleaner.ALL, "code"));
    
    202
    +            execute(connection, FixStringEntityModel.onI18n("ps_observation.SurroundingActivity", StringCleaner.ALL, "code"));
    
    203
    +
    
    204
    +            execute(connection, FixStringEntityModel.on("ll_common.GearUseFeaturesMeasurement", StringCleaner.ALL, "measurementValue").deleteIfNull("measurementValue"));
    
    205
    +            execute(connection, FixStringEntityModel.on("ll_common.Trip", StringCleaner.ALL, "ersId", "homeId"));
    
    206
    +
    
    207
    +            execute(connection, FixStringEntityModel.on("ll_logbook.Catch", StringCleaner.ALL, "photoReferences", "tagNumber"));
    
    208
    +            execute(connection, FixStringEntityModel.on("ll_logbook.SamplePart", StringCleaner.ALL, "tagNumber"));
    
    209
    +            execute(connection, FixStringEntityModel.on("ll_logbook.Set", StringCleaner.ALL, "homeId"));
    
    210
    +
    
    211
    +            execute(connection, FixStringEntityModel.on("ll_observation.Catch", StringCleaner.ALL, "photoReferences", "tagNumber"));
    
    212
    +            execute(connection, FixStringEntityModel.on("ll_observation.SensorUsed", StringCleaner.ALL, "sensorSerialNo"));
    
    213
    +            execute(connection, FixStringEntityModel.on("ll_observation.Set", StringCleaner.ALL, "homeId"));
    
    214
    +            execute(connection, FixStringEntityModel.on("ll_observation.Tdr", StringCleaner.ALL, "serialNo"));
    
    215
    +
    
    216
    +            execute(connection, FixStringEntityModel.on("ps_common.GearUseFeaturesMeasurement", StringCleaner.ALL, "measurementValue").deleteIfNull("measurementValue"));
    
    217
    +            execute(connection, FixStringEntityModel.on("ps_common.Trip", StringCleaner.ALL, "ersId", "formsUrl", "homeId", "reportsUrl"));
    
    218
    +
    
    219
    +            execute(connection, FixStringEntityModel.on("ps_localmarket.Sample", StringCleaner.ALL, "number"));
    
    220
    +
    
    221
    +            execute(connection, FixStringEntityModel.on("ps_logbook.Catch", StringCleaner.ALL, "well"));
    
    222
    +            execute(connection, FixStringEntityModel.on("ps_logbook.FloatingObject", StringCleaner.ALL, "supportVesselName"));
    
    223
    +            execute(connection, FixStringEntityModel.on("ps_logbook.Sample", StringCleaner.ALL, "well"));
    
    224
    +            execute(connection, FixStringEntityModel.on("ps_logbook.TransmittingBuoy", StringCleaner.ALL, "code"));
    
    225
    +            execute(connection, FixStringEntityModel.on("ps_logbook.WellPlan", StringCleaner.ALL, "well"));
    
    226
    +
    
    227
    +            execute(connection, FixStringEntityModel.on("ps_observation.Activity", StringCleaner.ALL, "ersId"));
    
    228
    +            execute(connection, FixStringEntityModel.on("ps_observation.FloatingObject", StringCleaner.ALL, "supportVesselName"));
    
    229
    +            execute(connection, FixStringEntityModel.on("ps_observation.SampleMeasure", StringCleaner.ALL, "picturesReferences", "tagNumber"));
    
    230
    +            execute(connection, FixStringEntityModel.on("ps_observation.Set", StringCleaner.ALL, "supportVesselName"));
    
    231
    +            execute(connection, FixStringEntityModel.on("ps_observation.TransmittingBuoy", StringCleaner.ALL, "code"));
    
    232
    +        });
    
    233
    +        return count.get();
    
    234
    +    }
    
    235
    +
    
    236
    +    void execute(Connection connection, FixStringEntityModel model) throws SQLException {
    
    237
    +        for (Map.Entry<String, StringCleaner> entry : model.fieldsActions.entrySet()) {
    
    238
    +            execute(connection, model.gav, entry.getKey(), entry.getValue(), model.fieldsDeleteIfNull.contains(entry.getKey()));
    
    239
    +        }
    
    240
    +    }
    
    241
    +
    
    242
    +    void execute(Connection connection, String gav, String field, StringCleaner cleaner, boolean deleteIfNull) throws SQLException {
    
    243
    +        try (PreparedStatement statement = connection.prepareStatement(String.format("SELECT topiaId, %2$s FROM %1$s WHERE %2$s IS NOT NULL", gav, field))) {
    
    244
    +            try (ResultSet resultSet = statement.executeQuery()) {
    
    245
    +                while (resultSet.next()) {
    
    246
    +                    String fieldValue = resultSet.getString(2);
    
    247
    +                    String fixFieldValue = cleaner.apply(fieldValue);
    
    248
    +                    if (!fieldValue.equals(fixFieldValue)) {
    
    249
    +                        String id = resultSet.getString(1);
    
    250
    +                        if (deleteIfNull && fixFieldValue == null) {
    
    251
    +                            log.warn(String.format("Delete row since field is empty %s.%s[%s] (was '%s')", gav, field, id, fieldValue));
    
    252
    +                            executor.writeSql(String.format("DELETE FROM %1$s WHERE topiaId = '%2$s';", gav, id));
    
    253
    +                        } else {
    
    254
    +                            log.info(String.format("Fix string field %s.%s[%s] from\n[%s]\n to\n[%s]", gav, field, id, fieldValue, fixFieldValue));
    
    255
    +                            String finalFieldValue = SqlHelper.escapeString(fixFieldValue);
    
    256
    +                            executor.writeSql(String.format("UPDATE %1$s SET %2$s = %3$s WHERE topiaId = '%4$s';", gav, field, finalFieldValue, id));
    
    257
    +                        }
    
    258
    +                        count.incrementAndGet();
    
    259
    +                    }
    
    260
    +                }
    
    261
    +            }
    
    262
    +        }
    
    263
    +    }
    
    264
    +}

  • core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/NotDiscardedTargetCatchRecord.java
    ... ... @@ -22,6 +22,8 @@ package fr.ird.observe.spi.migration.v9;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    +import fr.ird.observe.dto.StringCleaner;
    
    26
    +import fr.ird.observe.persistence.SqlHelper;
    
    25 27
     import fr.ird.observe.spi.context.DataDtoEntityContext;
    
    26 28
     
    
    27 29
     import java.sql.Connection;
    
    ... ... @@ -42,19 +44,19 @@ class NotDiscardedTargetCatchRecord {
    42 44
     
    
    43 45
         public static PreparedStatement prepareStatement(Connection connection) throws SQLException {
    
    44 46
             return connection.prepareStatement("SELECT" +
    
    45
    -                                       /* 01 */    " REPLACE(tc.topiaId, '.TargetCatch', '.Catch')," +
    
    46
    -                                       /* 02 */    " tc.topiaVersion + 1," +
    
    47
    -                                       /* 03 */    " tc.topiaCreateDate," +
    
    48
    -                                       /* 04 */    " tc.homeId," +
    
    49
    -                                       /* 05 */    " tc.catchWeight," +
    
    50
    -                                       /* 06 */    " tc.weightCategory," +
    
    51
    -                                       /* 07 */    " tc.comment," +
    
    52
    -                                       /* 08 */    " tc.set," +
    
    53
    -                                       /* 09 */    " tc.lastUpdateDate," +
    
    54
    -                                       /* 10 */    " tc.well," +
    
    55
    -                                       /* 11 */    " -tc.set_idx," +
    
    56
    -                                       /* 12 */    " tc.weightMeasureMethod," +
    
    57
    -                                       /* 13 */    " s.targetcatchcompositionestimatedbyobserver " +
    
    47
    +                                                   /* 01 */    " REPLACE(tc.topiaId, '.TargetCatch', '.Catch')," +
    
    48
    +                                                   /* 02 */    " tc.topiaVersion + 1," +
    
    49
    +                                                   /* 03 */    " tc.topiaCreateDate," +
    
    50
    +                                                   /* 04 */    " tc.homeId," +
    
    51
    +                                                   /* 05 */    " tc.catchWeight," +
    
    52
    +                                                   /* 06 */    " tc.weightCategory," +
    
    53
    +                                                   /* 07 */    " tc.comment," +
    
    54
    +                                                   /* 08 */    " tc.set," +
    
    55
    +                                                   /* 09 */    " tc.lastUpdateDate," +
    
    56
    +                                                   /* 10 */    " tc.well," +
    
    57
    +                                                   /* 11 */    " -tc.set_idx," +
    
    58
    +                                                   /* 12 */    " tc.weightMeasureMethod," +
    
    59
    +                                                   /* 13 */    " s.targetcatchcompositionestimatedbyobserver " +
    
    58 60
                                                        " FROM ps_observation.TargetCatch tc INNER JOIN ps_observation.set s on s.topiaId = tc.set" +
    
    59 61
                                                        " WHERE NOT tc.discarded AND NOT ( weightCategory IS NULL AND catchweight IS NULL AND well IS NULL AND broughtondeck IS NULL AND reasonfordiscard IS NULL )");
    
    60 62
         }
    
    ... ... @@ -131,24 +133,24 @@ class NotDiscardedTargetCatchRecord {
    131 133
                                          "%16$s, " +
    
    132 134
                                          "%17$s, " +
    
    133 135
                                          "%18$s);",
    
    134
    -                /*1*/          DataDtoEntityContext.escapeString(id),
    
    136
    +                /*1*/          SqlHelper.escapeString(id),
    
    135 137
                     /*2*/          topiaVersion,
    
    136 138
                     /*3*/          DataDtoEntityContext.timestamp(topiaCreateDate),
    
    137
    -                /*4*/          DataDtoEntityContext.escapeString(homeId),
    
    139
    +                /*4*/          SqlHelper.escapeString(StringCleaner.ALL.apply(homeId)),
    
    138 140
                     /*5*/          catchWeight,
    
    139 141
                     /*6*/          weightCategoryRecord.getMinWeight(),
    
    140 142
                     /*7*/          weightCategoryRecord.getMaxWeight(),
    
    141 143
                     /*8*/          null,
    
    142 144
                     /*9*/          getComment(weightCategoryRecord, commentFormat),
    
    143 145
                     /*10*/         null,
    
    144
    -                /*11*/         DataDtoEntityContext.escapeString(weightCategoryRecord.getSpeciesId()),
    
    145
    -                /*12*/         DataDtoEntityContext.escapeString("10".equals(weightCategoryRecord.getCode()) ? DataSourceMigrationForVersion_9_0.SPECIES_FATE_15 : DataSourceMigrationForVersion_9_0.SPECIES_FATE_6),
    
    146
    -                /*13*/         DataDtoEntityContext.escapeString(setId),
    
    146
    +                /*11*/         SqlHelper.escapeString(weightCategoryRecord.getSpeciesId()),
    
    147
    +                /*12*/         SqlHelper.escapeString("10".equals(weightCategoryRecord.getCode()) ? DataSourceMigrationForVersion_9_0.SPECIES_FATE_15 : DataSourceMigrationForVersion_9_0.SPECIES_FATE_6),
    
    148
    +                /*13*/         SqlHelper.escapeString(setId),
    
    147 149
                     /*14*/         DataDtoEntityContext.timestamp(lastUpdateDate),
    
    148
    -                /*15*/         DataDtoEntityContext.escapeString(getWell()),
    
    150
    +                /*15*/         SqlHelper.escapeString(StringCleaner.ALL.apply(well)),
    
    149 151
                     /*16*/         setIdx,
    
    150
    -                /*17*/         DataDtoEntityContext.escapeString(weightMeasureMethodId == null ? "fr.ird.referential.common.WeightMeasureMethod#666#03" : weightCategoryId),
    
    151
    -                /*18*/         DataDtoEntityContext.escapeString(targetCatchCompositionEstimatedByObserver ? DataSourceMigrationForVersion_9_0.INFORMATION_SOURCE_P : DataSourceMigrationForVersion_9_0.INFORMATION_SOURCE_U)
    
    152
    +                /*17*/         SqlHelper.escapeString(weightMeasureMethodId == null ? "fr.ird.referential.common.WeightMeasureMethod#666#03" : weightCategoryId),
    
    153
    +                /*18*/         SqlHelper.escapeString(targetCatchCompositionEstimatedByObserver ? DataSourceMigrationForVersion_9_0.INFORMATION_SOURCE_P : DataSourceMigrationForVersion_9_0.INFORMATION_SOURCE_U)
    
    152 154
             );
    
    153 155
         }
    
    154 156
     
    
    ... ... @@ -158,16 +160,4 @@ class NotDiscardedTargetCatchRecord {
    158 160
             }
    
    159 161
             return stringFormat.apply(comment + "\n" + weightCategoryRecord.toComment());
    
    160 162
         }
    
    161
    -
    
    162
    -
    
    163
    -    public String getWell() {
    
    164
    -        String result = well;
    
    165
    -        if (result!=null) {
    
    166
    -            result = well.trim();
    
    167
    -            if (well.startsWith("'")) {
    
    168
    -                result = result.substring(1);
    
    169
    -            }
    
    170
    -        }
    
    171
    -        return result;
    
    172
    -    }
    
    173 163
     }

  • core/persistence/resources/src/main/resources/db/migration/v9/9.0/99_2_drop_tables-H2.sql
    ... ... @@ -25,12 +25,12 @@ ALTER TABLE ps_observation.Set DROP COLUMN targetdiscardcatchcompositionestimate
    25 25
     ALTER TABLE ll_common.Trip DROP COLUMN program;
    
    26 26
     ALTER TABLE ps_common.Trip DROP COLUMN program;
    
    27 27
     
    
    28
    --- DROP TABLE ps_observation.NonTargetLength;
    
    29
    --- DROP TABLE ps_observation.NonTargetSample;
    
    30
    --- DROP TABLE ps_observation.NonTargetCatch;
    
    31
    --- DROP TABLE ps_observation.TargetCatch;
    
    32
    --- DROP TABLE ps_observation.TargetSample;
    
    33
    --- DROP TABLE ps_observation.TargetLength;
    
    28
    +DROP TABLE ps_observation.NonTargetLength;
    
    29
    +DROP TABLE ps_observation.NonTargetSample;
    
    30
    +DROP TABLE ps_observation.NonTargetCatch;
    
    31
    +DROP TABLE ps_observation.TargetCatch;
    
    32
    +DROP TABLE ps_observation.TargetSample;
    
    33
    +DROP TABLE ps_observation.TargetLength;
    
    34 34
     DROP TABLE ps_observation.ReasonForNullSet;
    
    35 35
     DROP TABLE ps_observation.ReasonForNoFishing;
    
    36 36
     DROP TABLE ps_observation.WeightCategory;
    

  • core/persistence/resources/src/main/resources/db/migration/v9/9.0/99_2_drop_tables-PG.sql
    ... ... @@ -25,12 +25,12 @@ ALTER TABLE ps_observation.Set DROP COLUMN targetdiscardcatchcompositionestimate
    25 25
     ALTER TABLE ll_common.Trip DROP COLUMN program CASCADE;
    
    26 26
     ALTER TABLE ps_common.Trip DROP COLUMN program CASCADE;
    
    27 27
     
    
    28
    --- DROP TABLE ps_observation.NonTargetLength CASCADE;
    
    29
    --- DROP TABLE ps_observation.NonTargetSample CASCADE;
    
    30
    --- DROP TABLE ps_observation.NonTargetCatch CASCADE;
    
    31
    --- DROP TABLE ps_observation.TargetLength CASCADE;
    
    32
    --- DROP TABLE ps_observation.TargetSample CASCADE;
    
    33
    --- DROP TABLE ps_observation.TargetCatch CASCADE;
    
    28
    +DROP TABLE ps_observation.NonTargetLength CASCADE;
    
    29
    +DROP TABLE ps_observation.NonTargetSample CASCADE;
    
    30
    +DROP TABLE ps_observation.NonTargetCatch CASCADE;
    
    31
    +DROP TABLE ps_observation.TargetLength CASCADE;
    
    32
    +DROP TABLE ps_observation.TargetSample CASCADE;
    
    33
    +DROP TABLE ps_observation.TargetCatch CASCADE;
    
    34 34
     DROP TABLE ps_observation.ReasonForNullSet CASCADE;
    
    35 35
     DROP TABLE ps_observation.ReasonForNoFishing CASCADE;
    
    36 36
     DROP TABLE ps_observation.WeightCategory CASCADE;
    

  • core/services/i18n/src/main/i18n/translations/services_en_GB.properties
    ... ... @@ -1244,6 +1244,7 @@ observe.data.ps.observation.Catch.meanWeight.short=Mean weight
    1244 1244
     observe.data.ps.observation.Catch.meanWeight.validation.notFilled=Weight or mean size must be filled.
    
    1245 1245
     observe.data.ps.observation.Catch.meanWeightComputed.computed.tip=Mean weight was computed (%s)
    
    1246 1246
     observe.data.ps.observation.Catch.meanWeightComputed.observed.tip=Mean weight was observed
    
    1247
    +observe.data.ps.observation.Catch.minMaxWeight=Lower / upper weight limit (in kg)
    
    1247 1248
     observe.data.ps.observation.Catch.minWeight=Lower weight limit (in kg)
    
    1248 1249
     observe.data.ps.observation.Catch.minWeight.short=Min weight (in kg)
    
    1249 1250
     observe.data.ps.observation.Catch.reasonForDiscard=Reason for discard
    

  • core/services/i18n/src/main/i18n/translations/services_es_ES.properties
    ... ... @@ -1244,6 +1244,7 @@ observe.data.ps.observation.Catch.meanWeight.short=Peso medio
    1244 1244
     observe.data.ps.observation.Catch.meanWeight.validation.notFilled=Debe seleccionar uno de los dos valores (peso medio o talla media).
    
    1245 1245
     observe.data.ps.observation.Catch.meanWeightComputed.computed.tip=El peso medio se calculó
    
    1246 1246
     observe.data.ps.observation.Catch.meanWeightComputed.observed.tip=El peso medio se observó
    
    1247
    +observe.data.ps.observation.Catch.minMaxWeight=Lower / upper weight limit (in kg) TODO
    
    1247 1248
     observe.data.ps.observation.Catch.minWeight=Lower weight limit (in kg) TODO
    
    1248 1249
     observe.data.ps.observation.Catch.minWeight.short=Max weight (in kg)
    
    1249 1250
     observe.data.ps.observation.Catch.reasonForDiscard=Razón del descarte
    

  • core/services/i18n/src/main/i18n/translations/services_fr_FR.properties
    ... ... @@ -1244,6 +1244,7 @@ observe.data.ps.observation.Catch.meanWeight.short=Poids moy
    1244 1244
     observe.data.ps.observation.Catch.meanWeight.validation.notFilled=Une des deux valeurs (poids moyen ou taille moyenne) devrait être renseignée.
    
    1245 1245
     observe.data.ps.observation.Catch.meanWeightComputed.computed.tip=Le poids moyen a été calculé (%s)
    
    1246 1246
     observe.data.ps.observation.Catch.meanWeightComputed.observed.tip=Le poids moyen a été observé
    
    1247
    +observe.data.ps.observation.Catch.minMaxWeight=Borne de poids inférieure / supérieure (en kg)
    
    1247 1248
     observe.data.ps.observation.Catch.minWeight=Borne de poids inférieure (en kg)
    
    1248 1249
     observe.data.ps.observation.Catch.minWeight.short=Poids min (en kg)
    
    1249 1250
     observe.data.ps.observation.Catch.reasonForDiscard=Raison rejet
    

  • core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ValidateService-dataResult.json
    ... ... @@ -43828,7 +43828,7 @@
    43828 43828
                 "topiaVersion": 16,
    
    43829 43829
                 "topiaCreateDate": "2009-04-15T00:00:00.009Z"
    
    43830 43830
               },
    
    43831
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    43831
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    43832 43832
               "catchWeight": 1.0,
    
    43833 43833
               "well": "2",
    
    43834 43834
               "id": "fr.ird.data.ps.observation.Catch#1554060786914#0.3899957341641852",
    
    ... ... @@ -43874,7 +43874,7 @@
    43874 43874
                 "topiaVersion": 16,
    
    43875 43875
                 "topiaCreateDate": "2009-04-15T00:00:00.004Z"
    
    43876 43876
               },
    
    43877
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    43877
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    43878 43878
               "catchWeight": 1.0,
    
    43879 43879
               "well": "2",
    
    43880 43880
               "id": "fr.ird.data.ps.observation.Catch#1554060786914#0.455212337619455",
    
    ... ... @@ -43920,7 +43920,7 @@
    43920 43920
                 "topiaVersion": 16,
    
    43921 43921
                 "topiaCreateDate": "2009-04-15T00:00:00.010Z"
    
    43922 43922
               },
    
    43923
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    43923
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    43924 43924
               "catchWeight": 16.0,
    
    43925 43925
               "well": "1",
    
    43926 43926
               "id": "fr.ird.data.ps.observation.Catch#1554228692388#0.40195828823649804",
    
    ... ... @@ -43966,7 +43966,7 @@
    43966 43966
                 "topiaVersion": 15,
    
    43967 43967
                 "topiaCreateDate": "2009-04-15T00:00:00.001Z"
    
    43968 43968
               },
    
    43969
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    43969
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    43970 43970
               "catchWeight": 1.0,
    
    43971 43971
               "well": "1",
    
    43972 43972
               "id": "fr.ird.data.ps.observation.Catch#1554228692388#0.5827043409961202",
    
    ... ... @@ -44012,7 +44012,7 @@
    44012 44012
                 "topiaVersion": 15,
    
    44013 44013
                 "topiaCreateDate": "2009-04-15T00:00:00.001Z"
    
    44014 44014
               },
    
    44015
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44015
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44016 44016
               "catchWeight": 4.0,
    
    44017 44017
               "well": "1",
    
    44018 44018
               "id": "fr.ird.data.ps.observation.Catch#1554228964667#0.3873882731438876",
    
    ... ... @@ -44058,7 +44058,7 @@
    44058 44058
                 "topiaVersion": 16,
    
    44059 44059
                 "topiaCreateDate": "2009-04-15T00:00:00.010Z"
    
    44060 44060
               },
    
    44061
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44061
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44062 44062
               "catchWeight": 27.0,
    
    44063 44063
               "well": "1",
    
    44064 44064
               "id": "fr.ird.data.ps.observation.Catch#1554228964667#0.6898347092973715",
    
    ... ... @@ -44104,7 +44104,7 @@
    44104 44104
                 "topiaVersion": 15,
    
    44105 44105
                 "topiaCreateDate": "2009-04-15T00:00:00.001Z"
    
    44106 44106
               },
    
    44107
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44107
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44108 44108
               "catchWeight": 1.0,
    
    44109 44109
               "well": "4",
    
    44110 44110
               "id": "fr.ird.data.ps.observation.Catch#1554228964683#0.5525193499129678",
    
    ... ... @@ -44150,7 +44150,7 @@
    44150 44150
                 "topiaVersion": 16,
    
    44151 44151
                 "topiaCreateDate": "2009-04-15T00:00:00.010Z"
    
    44152 44152
               },
    
    44153
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44153
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44154 44154
               "catchWeight": 39.0,
    
    44155 44155
               "well": "4",
    
    44156 44156
               "id": "fr.ird.data.ps.observation.Catch#1554228964683#0.6111969202426193",
    
    ... ... @@ -44196,7 +44196,7 @@
    44196 44196
                 "topiaVersion": 16,
    
    44197 44197
                 "topiaCreateDate": "2009-04-15T00:00:00.010Z"
    
    44198 44198
               },
    
    44199
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44199
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44200 44200
               "catchWeight": 15.0,
    
    44201 44201
               "well": "4",
    
    44202 44202
               "id": "fr.ird.data.ps.observation.Catch#1554229020077#0.06929838028483837",
    
    ... ... @@ -44242,7 +44242,7 @@
    44242 44242
                 "topiaVersion": 16,
    
    44243 44243
                 "topiaCreateDate": "2009-04-15T00:00:00.010Z"
    
    44244 44244
               },
    
    44245
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44245
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44246 44246
               "catchWeight": 25.0,
    
    44247 44247
               "well": "2",
    
    44248 44248
               "id": "fr.ird.data.ps.observation.Catch#1554229020077#0.764944972601716",
    
    ... ... @@ -44288,7 +44288,7 @@
    44288 44288
                 "topiaVersion": 15,
    
    44289 44289
                 "topiaCreateDate": "2009-04-15T00:00:00.001Z"
    
    44290 44290
               },
    
    44291
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44291
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44292 44292
               "catchWeight": 1.0,
    
    44293 44293
               "well": "3",
    
    44294 44294
               "id": "fr.ird.data.ps.observation.Catch#1554659569269#0.5089206009917716",
    
    ... ... @@ -44334,7 +44334,7 @@
    44334 44334
                 "topiaVersion": 16,
    
    44335 44335
                 "topiaCreateDate": "2009-04-15T00:00:00.010Z"
    
    44336 44336
               },
    
    44337
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44337
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44338 44338
               "catchWeight": 53.0,
    
    44339 44339
               "well": "3",
    
    44340 44340
               "id": "fr.ird.data.ps.observation.Catch#1554659569269#0.9595940690443661",
    
    ... ... @@ -44470,7 +44470,7 @@
    44470 44470
                 "topiaVersion": 19,
    
    44471 44471
                 "topiaCreateDate": "2009-04-15T00:00:00.005Z"
    
    44472 44472
               },
    
    44473
    -          "speciesFateLabel": "Conservé (en cuve, poisson séché ou salé)",
    
    44473
    +          "speciesFateLabel": "Conservé à destination de la conserverie",
    
    44474 44474
               "catchWeight": 12.0,
    
    44475 44475
               "well": "3T",
    
    44476 44476
               "id": "fr.ird.data.ps.observation.Catch#1612860304046#0.051529228859696796",
    

  • core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ValidateService-referentialResult.json
    ... ... @@ -10711,7 +10711,7 @@
    10711 10711
               },
    
    10712 10712
               "startDate": "1970-01-01T00:00:00.000Z",
    
    10713 10713
               "lengthWeightFormula": "a * Math.pow(L, b)",
    
    10714
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    10714
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    10715 10715
               "sizeMeasureType": {
    
    10716 10716
                 "code": "DW",
    
    10717 10717
                 "label": "Disk Width",
    
    ... ... @@ -10751,9 +10751,9 @@
    10751 10751
               "sexLabel": "Indéterminé",
    
    10752 10752
               "species": {
    
    10753 10753
                 "code": "248",
    
    10754
    -            "label": "Mantes, diables de mer nca ",
    
    10754
    +            "label": "Mantes, diables de mer nca",
    
    10755 10755
                 "faoCode": "MAN",
    
    10756
    -            "scientificLabel": "Mobulidae ",
    
    10756
    +            "scientificLabel": "Mobulidae",
    
    10757 10757
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    10758 10758
                 "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    10759 10759
                 "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1445863056144#0.9820877553253712",
    
    ... ... @@ -10771,7 +10771,7 @@
    10771 10771
               },
    
    10772 10772
               "startDate": "1970-01-01T00:00:00.000Z",
    
    10773 10773
               "lengthWeightFormula": "a * Math.pow(L, b)",
    
    10774
    -          "weightLengthFormula": " Math.pow(P/a, 1/b) ",
    
    10774
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    10775 10775
               "sizeMeasureType": {
    
    10776 10776
                 "code": "DW",
    
    10777 10777
                 "label": "Disk Width",
    
    ... ... @@ -10831,7 +10831,7 @@
    10831 10831
               },
    
    10832 10832
               "startDate": "1970-01-01T00:00:00.000Z",
    
    10833 10833
               "lengthWeightFormula": "a * Math.pow(L, b)",
    
    10834
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    10834
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    10835 10835
               "sizeMeasureType": {
    
    10836 10836
                 "code": "FL",
    
    10837 10837
                 "label": "Fork Length",
    
    ... ... @@ -10871,7 +10871,7 @@
    10871 10871
               "sexLabel": "Indéterminé",
    
    10872 10872
               "species": {
    
    10873 10873
                 "code": "376",
    
    10874
    -            "label": "Rémora des espadons ",
    
    10874
    +            "label": "Rémora des espadons",
    
    10875 10875
                 "faoCode": "REY",
    
    10876 10876
                 "scientificLabel": "Remora brachyptera",
    
    10877 10877
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -10890,7 +10890,7 @@
    10890 10890
                 "topiaCreateDate": "2010-07-24T00:00:00.161Z"
    
    10891 10891
               },
    
    10892 10892
               "startDate": "1970-01-01T00:00:00.000Z",
    
    10893
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    10893
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    10894 10894
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    10895 10895
               "sizeMeasureType": {
    
    10896 10896
                 "code": "TL",
    
    ... ... @@ -10931,7 +10931,7 @@
    10931 10931
               "sexLabel": "Indéterminé",
    
    10932 10932
               "species": {
    
    10933 10933
                 "code": "375",
    
    10934
    -            "label": "Rémora des marlins ",
    
    10934
    +            "label": "Rémora des marlins",
    
    10935 10935
                 "faoCode": "REZ",
    
    10936 10936
                 "scientificLabel": "Remora osteochir",
    
    10937 10937
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -10950,8 +10950,8 @@
    10950 10950
                 "topiaCreateDate": "2010-07-24T00:00:00.164Z"
    
    10951 10951
               },
    
    10952 10952
               "startDate": "1970-01-01T00:00:00.000Z",
    
    10953
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    10954
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    10953
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    10954
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    10955 10955
               "sizeMeasureType": {
    
    10956 10956
                 "code": "TL",
    
    10957 10957
                 "label": "Total Length",
    
    ... ... @@ -11010,8 +11010,8 @@
    11010 11010
                 "topiaCreateDate": "2010-07-24T00:00:00.160Z"
    
    11011 11011
               },
    
    11012 11012
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11013
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11014
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    11013
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11014
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11015 11015
               "sizeMeasureType": {
    
    11016 11016
                 "code": "FL",
    
    11017 11017
                 "label": "Fork Length",
    
    ... ... @@ -11071,7 +11071,7 @@
    11071 11071
               },
    
    11072 11072
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11073 11073
               "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11074
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    11074
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11075 11075
               "sizeMeasureType": {
    
    11076 11076
                 "code": "FL",
    
    11077 11077
                 "label": "Fork Length",
    
    ... ... @@ -11173,7 +11173,7 @@
    11173 11173
                 "code": "0",
    
    11174 11174
                 "label": "Famille Clupeidae",
    
    11175 11175
                 "faoCode": "CLP",
    
    11176
    -            "scientificLabel": "Clupeidae ",
    
    11176
    +            "scientificLabel": "Clupeidae",
    
    11177 11177
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    11178 11178
                 "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    11179 11179
                 "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -11231,7 +11231,7 @@
    11231 11231
                 "code": "0",
    
    11232 11232
                 "label": "Famille Clupeidae",
    
    11233 11233
                 "faoCode": "CLP",
    
    11234
    -            "scientificLabel": "Clupeidae ",
    
    11234
    +            "scientificLabel": "Clupeidae",
    
    11235 11235
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    11236 11236
                 "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    11237 11237
                 "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -11306,7 +11306,7 @@
    11306 11306
                 "topiaCreateDate": "2012-06-14T00:00:00.193Z"
    
    11307 11307
               },
    
    11308 11308
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11309
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11309
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11310 11310
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11311 11311
               "sizeMeasureType": {
    
    11312 11312
                 "code": "FL",
    
    ... ... @@ -11366,7 +11366,7 @@
    11366 11366
                 "topiaCreateDate": "2012-06-14T00:00:00.193Z"
    
    11367 11367
               },
    
    11368 11368
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11369
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11369
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11370 11370
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11371 11371
               "sizeMeasureType": {
    
    11372 11372
                 "code": "FL",
    
    ... ... @@ -11422,8 +11422,8 @@
    11422 11422
                 "topiaCreateDate": "2011-06-22T00:00:00.188Z"
    
    11423 11423
               },
    
    11424 11424
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11425
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11426
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    11425
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11426
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11427 11427
               "sizeMeasureType": {
    
    11428 11428
                 "code": "TL",
    
    11429 11429
                 "label": "Total Length",
    
    ... ... @@ -11478,8 +11478,8 @@
    11478 11478
                 "topiaCreateDate": "2011-06-22T00:00:00.188Z"
    
    11479 11479
               },
    
    11480 11480
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11481
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11482
    -          "weightLengthFormula": "Math.pow(P/a, 1/b) ",
    
    11481
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11482
    +          "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11483 11483
               "sizeMeasureType": {
    
    11484 11484
                 "code": "TL",
    
    11485 11485
                 "label": "Total Length",
    
    ... ... @@ -11519,7 +11519,7 @@
    11519 11519
               "sexLabel": "Indéterminé",
    
    11520 11520
               "species": {
    
    11521 11521
                 "code": "0",
    
    11522
    -            "label": "Rémora commun ",
    
    11522
    +            "label": "Rémora commun",
    
    11523 11523
                 "faoCode": "EHN",
    
    11524 11524
                 "scientificLabel": "Echeneis naucrates",
    
    11525 11525
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -11534,7 +11534,7 @@
    11534 11534
                 "topiaCreateDate": "2011-06-22T00:00:00.080Z"
    
    11535 11535
               },
    
    11536 11536
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11537
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11537
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11538 11538
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11539 11539
               "sizeMeasureType": {
    
    11540 11540
                 "code": "TL",
    
    ... ... @@ -11575,7 +11575,7 @@
    11575 11575
               "sexLabel": "Indéterminé",
    
    11576 11576
               "species": {
    
    11577 11577
                 "code": "0",
    
    11578
    -            "label": "Rémora commun ",
    
    11578
    +            "label": "Rémora commun",
    
    11579 11579
                 "faoCode": "EHN",
    
    11580 11580
                 "scientificLabel": "Echeneis naucrates",
    
    11581 11581
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -11590,7 +11590,7 @@
    11590 11590
                 "topiaCreateDate": "2011-06-22T00:00:00.080Z"
    
    11591 11591
               },
    
    11592 11592
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11593
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11593
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11594 11594
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11595 11595
               "sizeMeasureType": {
    
    11596 11596
                 "code": "TL",
    
    ... ... @@ -11648,7 +11648,7 @@
    11648 11648
                 "topiaCreateDate": "2011-06-22T00:00:00.142Z"
    
    11649 11649
               },
    
    11650 11650
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11651
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11651
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11652 11652
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11653 11653
               "sizeMeasureType": {
    
    11654 11654
                 "code": "TL",
    
    ... ... @@ -11706,7 +11706,7 @@
    11706 11706
                 "topiaCreateDate": "2011-06-22T00:00:00.142Z"
    
    11707 11707
               },
    
    11708 11708
               "startDate": "1970-01-01T00:00:00.000Z",
    
    11709
    -          "lengthWeightFormula": "a * Math.pow(L, b) ",
    
    11709
    +          "lengthWeightFormula": "a * Math.pow(L, b)",
    
    11710 11710
               "weightLengthFormula": "Math.pow(P/a, 1/b)",
    
    11711 11711
               "sizeMeasureType": {
    
    11712 11712
                 "code": "TL",
    
    ... ... @@ -11747,7 +11747,7 @@
    11747 11747
               "sexLabel": "Indéterminé",
    
    11748 11748
               "species": {
    
    11749 11749
                 "code": "321",
    
    11750
    -            "label": "Porc-épic boubou ",
    
    11750
    +            "label": "Porc-épic boubou",
    
    11751 11751
                 "faoCode": "DIY",
    
    11752 11752
                 "scientificLabel": "Diodon hystrix",
    
    11753 11753
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -13489,7 +13489,7 @@
    13489 13489
               "sexLabel": "Indéterminé",
    
    13490 13490
               "species": {
    
    13491 13491
                 "code": "340",
    
    13492
    -            "label": "Calicagère bleue ",
    
    13492
    +            "label": "Calicagère bleue",
    
    13493 13493
                 "faoCode": "KYC",
    
    13494 13494
                 "scientificLabel": "Kyphosus cinerascens",
    
    13495 13495
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -13549,7 +13549,7 @@
    13549 13549
               "sexLabel": "Indéterminé",
    
    13550 13550
               "species": {
    
    13551 13551
                 "code": "334",
    
    13552
    -            "label": "Kyphosus calicagères nca ",
    
    13552
    +            "label": "Kyphosus calicagères nca",
    
    13553 13553
                 "faoCode": "KYP",
    
    13554 13554
                 "scientificLabel": "Kyphosus spp",
    
    13555 13555
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -13609,7 +13609,7 @@
    13609 13609
               "sexLabel": "Indéterminé",
    
    13610 13610
               "species": {
    
    13611 13611
                 "code": "334",
    
    13612
    -            "label": "Kyphosus calicagères nca ",
    
    13612
    +            "label": "Kyphosus calicagères nca",
    
    13613 13613
                 "faoCode": "KYP",
    
    13614 13614
                 "scientificLabel": "Kyphosus spp",
    
    13615 13615
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -13729,7 +13729,7 @@
    13729 13729
               "sexLabel": "Indéterminé",
    
    13730 13730
               "species": {
    
    13731 13731
                 "code": "359",
    
    13732
    -            "label": "Sériole limon ",
    
    13732
    +            "label": "Sériole limon",
    
    13733 13733
                 "faoCode": "YTL",
    
    13734 13734
                 "scientificLabel": "Seriola rivoliana",
    
    13735 13735
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -13789,7 +13789,7 @@
    13789 13789
               "sexLabel": "Indéterminé",
    
    13790 13790
               "species": {
    
    13791 13791
                 "code": "359",
    
    13792
    -            "label": "Sériole limon ",
    
    13792
    +            "label": "Sériole limon",
    
    13793 13793
                 "faoCode": "YTL",
    
    13794 13794
                 "scientificLabel": "Seriola rivoliana",
    
    13795 13795
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -13909,7 +13909,7 @@
    13909 13909
               "sexLabel": "Indéterminé",
    
    13910 13910
               "species": {
    
    13911 13911
                 "code": "312",
    
    13912
    -            "label": "Comète maquereau ",
    
    13912
    +            "label": "Comète maquereau",
    
    13913 13913
                 "faoCode": "MSD",
    
    13914 13914
                 "scientificLabel": "Decapterus macarellus",
    
    13915 13915
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -13969,7 +13969,7 @@
    13969 13969
               "sexLabel": "Indéterminé",
    
    13970 13970
               "species": {
    
    13971 13971
                 "code": "312",
    
    13972
    -            "label": "Comète maquereau ",
    
    13972
    +            "label": "Comète maquereau",
    
    13973 13973
                 "faoCode": "MSD",
    
    13974 13974
                 "scientificLabel": "Decapterus macarellus",
    
    13975 13975
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -14389,7 +14389,7 @@
    14389 14389
               "sexLabel": "Indéterminé",
    
    14390 14390
               "species": {
    
    14391 14391
                 "code": "367",
    
    14392
    -            "label": "Carangue paia ",
    
    14392
    +            "label": "Carangue paia",
    
    14393 14393
                 "faoCode": "URU",
    
    14394 14394
                 "scientificLabel": "Uraspis uraspis",
    
    14395 14395
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -14749,7 +14749,7 @@
    14749 14749
               "sexLabel": "Indéterminé",
    
    14750 14750
               "species": {
    
    14751 14751
                 "code": "315",
    
    14752
    -            "label": "Carangue des îles ",
    
    14752
    +            "label": "Carangue des îles",
    
    14753 14753
                 "faoCode": "NGT",
    
    14754 14754
                 "scientificLabel": "Carangoides orthogrammus",
    
    14755 14755
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -15049,7 +15049,7 @@
    15049 15049
               "sexLabel": "Indéterminé",
    
    15050 15050
               "species": {
    
    15051 15051
                 "code": "345",
    
    15052
    -            "label": "Compère océanique ",
    
    15052
    +            "label": "Compère océanique",
    
    15053 15053
                 "faoCode": "LGH",
    
    15054 15054
                 "scientificLabel": "Lagocephalus lagocephalus",
    
    15055 15055
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -15109,7 +15109,7 @@
    15109 15109
               "sexLabel": "Indéterminé",
    
    15110 15110
               "species": {
    
    15111 15111
                 "code": "345",
    
    15112
    -            "label": "Compère océanique ",
    
    15112
    +            "label": "Compère océanique",
    
    15113 15113
                 "faoCode": "LGH",
    
    15114 15114
                 "scientificLabel": "Lagocephalus lagocephalus",
    
    15115 15115
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -15289,7 +15289,7 @@
    15289 15289
               "sexLabel": "Indéterminé",
    
    15290 15290
               "species": {
    
    15291 15291
                 "code": "346",
    
    15292
    -            "label": "Croupia roche ",
    
    15292
    +            "label": "Croupia roche",
    
    15293 15293
                 "faoCode": "LOB",
    
    15294 15294
                 "scientificLabel": "Lobotes surinamensis",
    
    15295 15295
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -15409,7 +15409,7 @@
    15409 15409
               "sexLabel": "Indéterminé",
    
    15410 15410
               "species": {
    
    15411 15411
                 "code": "346",
    
    15412
    -            "label": "Croupia roche ",
    
    15412
    +            "label": "Croupia roche",
    
    15413 15413
                 "faoCode": "LOB",
    
    15414 15414
                 "scientificLabel": "Lobotes surinamensis",
    
    15415 15415
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -17682,7 +17682,7 @@
    17682 17682
               "sexLabel": "Indéterminé",
    
    17683 17683
               "species": {
    
    17684 17684
                 "code": "321",
    
    17685
    -            "label": "Porc-épic boubou ",
    
    17685
    +            "label": "Porc-épic boubou",
    
    17686 17686
                 "faoCode": "DIY",
    
    17687 17687
                 "scientificLabel": "Diodon hystrix",
    
    17688 17688
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -17982,7 +17982,7 @@
    17982 17982
               "sexLabel": "Indéterminé",
    
    17983 17983
               "species": {
    
    17984 17984
                 "code": "316",
    
    17985
    -            "label": "Carangue vorace ",
    
    17985
    +            "label": "Carangue vorace",
    
    17986 17986
                 "faoCode": "CXS",
    
    17987 17987
                 "scientificLabel": "Caranx sexfasciatus",
    
    17988 17988
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -18343,7 +18343,7 @@
    18343 18343
               "sexLabel": "Indéterminé",
    
    18344 18344
               "species": {
    
    18345 18345
                 "code": "304",
    
    18346
    -            "label": "Baliste cabri ",
    
    18346
    +            "label": "Baliste cabri",
    
    18347 18347
                 "faoCode": "TRG",
    
    18348 18348
                 "scientificLabel": "Balistes carolinensis",
    
    18349 18349
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -18403,7 +18403,7 @@
    18403 18403
               "sexLabel": "Indéterminé",
    
    18404 18404
               "species": {
    
    18405 18405
                 "code": "341",
    
    18406
    -            "label": "Calicagère blanche ",
    
    18406
    +            "label": "Calicagère blanche",
    
    18407 18407
                 "faoCode": "KYS",
    
    18408 18408
                 "scientificLabel": "Kyphosus sectatrix",
    
    18409 18409
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -18463,7 +18463,7 @@
    18463 18463
               "sexLabel": "Indéterminé",
    
    18464 18464
               "species": {
    
    18465 18465
                 "code": "352",
    
    18466
    -            "label": "Poules d\u0027eau ",
    
    18466
    +            "label": "Poules d\u0027eau",
    
    18467 18467
                 "faoCode": "BAT",
    
    18468 18468
                 "scientificLabel": "Platax spp",
    
    18469 18469
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -19903,7 +19903,7 @@
    19903 19903
               "sexLabel": "Indéterminé",
    
    19904 19904
               "species": {
    
    19905 19905
                 "code": "309",
    
    19906
    -            "label": "Orphie plate ",
    
    19906
    +            "label": "Orphie plate",
    
    19907 19907
                 "faoCode": "BAF",
    
    19908 19908
                 "scientificLabel": "Ablennes hians",
    
    19909 19909
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -19963,7 +19963,7 @@
    19963 19963
               "sexLabel": "Indéterminé",
    
    19964 19964
               "species": {
    
    19965 19965
                 "code": "309",
    
    19966
    -            "label": "Orphie plate ",
    
    19966
    +            "label": "Orphie plate",
    
    19967 19967
                 "faoCode": "BAF",
    
    19968 19968
                 "scientificLabel": "Ablennes hians",
    
    19969 19969
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -20263,7 +20263,7 @@
    20263 20263
               "sexLabel": "Indéterminé",
    
    20264 20264
               "species": {
    
    20265 20265
                 "code": "364",
    
    20266
    -            "label": "Aiguille crocodile ",
    
    20266
    +            "label": "Aiguille crocodile",
    
    20267 20267
                 "faoCode": "BTS",
    
    20268 20268
                 "scientificLabel": "Tylosurus crocodilus",
    
    20269 20269
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -20323,7 +20323,7 @@
    20323 20323
               "sexLabel": "Indéterminé",
    
    20324 20324
               "species": {
    
    20325 20325
                 "code": "364",
    
    20326
    -            "label": "Aiguille crocodile ",
    
    20326
    +            "label": "Aiguille crocodile",
    
    20327 20327
                 "faoCode": "BTS",
    
    20328 20328
                 "scientificLabel": "Tylosurus crocodilus",
    
    20329 20329
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -20813,9 +20813,9 @@
    20813 20813
               "sexLabel": "Indéterminé",
    
    20814 20814
               "species": {
    
    20815 20815
                 "code": "324",
    
    20816
    -            "label": "Rémora ",
    
    20816
    +            "label": "Rémora",
    
    20817 20817
                 "faoCode": "HTL",
    
    20818
    -            "scientificLabel": "Phtheirichthys lineatus ",
    
    20818
    +            "scientificLabel": "Phtheirichthys lineatus",
    
    20819 20819
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    20820 20820
                 "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    20821 20821
                 "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -20933,9 +20933,9 @@
    20933 20933
               "sexLabel": "Indéterminé",
    
    20934 20934
               "species": {
    
    20935 20935
                 "code": "324",
    
    20936
    -            "label": "Rémora ",
    
    20936
    +            "label": "Rémora",
    
    20937 20937
                 "faoCode": "HTL",
    
    20938
    -            "scientificLabel": "Phtheirichthys lineatus ",
    
    20938
    +            "scientificLabel": "Phtheirichthys lineatus",
    
    20939 20939
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    20940 20940
                 "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    20941 20941
                 "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -20993,7 +20993,7 @@
    20993 20993
               "sexLabel": "Indéterminé",
    
    20994 20994
               "species": {
    
    20995 20995
                 "code": "331",
    
    20996
    -            "label": "Demi-bec volant ",
    
    20996
    +            "label": "Demi-bec volant",
    
    20997 20997
                 "faoCode": "EXQ",
    
    20998 20998
                 "scientificLabel": "Euleptorhamphus velox",
    
    20999 20999
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -21353,7 +21353,7 @@
    21353 21353
               "sexLabel": "Indéterminé",
    
    21354 21354
               "species": {
    
    21355 21355
                 "code": "368",
    
    21356
    -            "label": "Comètes nca ",
    
    21356
    +            "label": "Comètes nca",
    
    21357 21357
                 "faoCode": "SDX",
    
    21358 21358
                 "scientificLabel": "Decapterus spp",
    
    21359 21359
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -21413,7 +21413,7 @@
    21413 21413
               "sexLabel": "Indéterminé",
    
    21414 21414
               "species": {
    
    21415 21415
                 "code": "368",
    
    21416
    -            "label": "Comètes nca ",
    
    21416
    +            "label": "Comètes nca",
    
    21417 21417
                 "faoCode": "SDX",
    
    21418 21418
                 "scientificLabel": "Decapterus spp",
    
    21419 21419
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -30074,7 +30074,7 @@
    30074 30074
               "sexLabel": "Indéterminé",
    
    30075 30075
               "species": {
    
    30076 30076
                 "code": "210",
    
    30077
    -            "label": "Renards de mer nca ",
    
    30077
    +            "label": "Renards de mer nca",
    
    30078 30078
                 "faoCode": "THR",
    
    30079 30079
                 "scientificLabel": "Alopias spp",
    
    30080 30080
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -30134,7 +30134,7 @@
    30134 30134
               "sexLabel": "Indéterminé",
    
    30135 30135
               "species": {
    
    30136 30136
                 "code": "210",
    
    30137
    -            "label": "Renards de mer nca ",
    
    30137
    +            "label": "Renards de mer nca",
    
    30138 30138
                 "faoCode": "THR",
    
    30139 30139
                 "scientificLabel": "Alopias spp",
    
    30140 30140
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -31346,7 +31346,7 @@
    31346 31346
               "sexLabel": "Indéterminé",
    
    31347 31347
               "species": {
    
    31348 31348
                 "code": "230",
    
    31349
    -            "label": "Requins-scies nca ",
    
    31349
    +            "label": "Requins-scies nca",
    
    31350 31350
                 "faoCode": "PWS",
    
    31351 31351
                 "scientificLabel": "Pristiophorus spp",
    
    31352 31352
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -31406,7 +31406,7 @@
    31406 31406
               "sexLabel": "Indéterminé",
    
    31407 31407
               "species": {
    
    31408 31408
                 "code": "230",
    
    31409
    -            "label": "Requins-scies nca ",
    
    31409
    +            "label": "Requins-scies nca",
    
    31410 31410
                 "faoCode": "PWS",
    
    31411 31411
                 "scientificLabel": "Pristiophorus spp",
    
    31412 31412
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -31466,7 +31466,7 @@
    31466 31466
               "sexLabel": "Indéterminé",
    
    31467 31467
               "species": {
    
    31468 31468
                 "code": "232",
    
    31469
    -            "label": "Anges de mer nca ",
    
    31469
    +            "label": "Anges de mer nca",
    
    31470 31470
                 "faoCode": "ASK",
    
    31471 31471
                 "scientificLabel": "Squatinidae",
    
    31472 31472
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    ... ... @@ -31526,7 +31526,7 @@
    31526 31526
               "sexLabel": "Indéterminé",
    
    31527 31527
               "species": {
    
    31528 31528
                 "code": "232",
    
    31529
    -            "label": "Anges de mer nca ",
    
    31529
    +            "label": "Anges de mer nca",
    
    31530 31530
                 "faoCode": "ASK",
    
    31531 31531
                 "scientificLabel": "Squatinidae",
    
    31532 31532
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    ... ... @@ -32006,7 +32006,7 @@
    32006 32006
               "sexLabel": "Indéterminé",
    
    32007 32007
               "species": {
    
    32008 32008
                 "code": "372",
    
    32009
    -            "label": "Luvar ",
    
    32009
    +            "label": "Luvar",
    
    32010 32010
                 "faoCode": "LVM",
    
    32011 32011
                 "scientificLabel": "Luvarus imperialis",
    
    32012 32012
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -32066,7 +32066,7 @@
    32066 32066
               "sexLabel": "Indéterminé",
    
    32067 32067
               "species": {
    
    32068 32068
                 "code": "376",
    
    32069
    -            "label": "Rémora des espadons ",
    
    32069
    +            "label": "Rémora des espadons",
    
    32070 32070
                 "faoCode": "REY",
    
    32071 32071
                 "scientificLabel": "Remora brachyptera",
    
    32072 32072
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -32126,7 +32126,7 @@
    32126 32126
               "sexLabel": "Indéterminé",
    
    32127 32127
               "species": {
    
    32128 32128
                 "code": "375",
    
    32129
    -            "label": "Rémora des marlins ",
    
    32129
    +            "label": "Rémora des marlins",
    
    32130 32130
                 "faoCode": "REZ",
    
    32131 32131
                 "scientificLabel": "Remora osteochir",
    
    32132 32132
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -32366,9 +32366,9 @@
    32366 32366
               "sexLabel": "Indéterminé",
    
    32367 32367
               "species": {
    
    32368 32368
                 "code": "248",
    
    32369
    -            "label": "Mantes, diables de mer nca ",
    
    32369
    +            "label": "Mantes, diables de mer nca",
    
    32370 32370
                 "faoCode": "MAN",
    
    32371
    -            "scientificLabel": "Mobulidae ",
    
    32371
    +            "scientificLabel": "Mobulidae",
    
    32372 32372
                 "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    32373 32373
                 "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    32374 32374
                 "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1445863056144#0.9820877553253712",
    
    ... ... @@ -35440,7 +35440,7 @@
    35440 35440
           "reference": {
    
    35441 35441
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35442 35442
             "content": {
    
    35443
    -          "firstName": "Alicia ",
    
    35443
    +          "firstName": "Alicia",
    
    35444 35444
               "lastName": "Moreno",
    
    35445 35445
               "captain": false,
    
    35446 35446
               "observer": true,
    
    ... ... @@ -35521,7 +35521,7 @@
    35521 35521
           "reference": {
    
    35522 35522
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35523 35523
             "content": {
    
    35524
    -          "firstName": "J. ",
    
    35524
    +          "firstName": "J.",
    
    35525 35525
               "lastName": "Quinquis",
    
    35526 35526
               "captain": false,
    
    35527 35527
               "observer": true,
    
    ... ... @@ -35548,7 +35548,7 @@
    35548 35548
           "reference": {
    
    35549 35549
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35550 35550
             "content": {
    
    35551
    -          "firstName": "Cristina ",
    
    35551
    +          "firstName": "Cristina",
    
    35552 35552
               "lastName": "Ortiz",
    
    35553 35553
               "captain": false,
    
    35554 35554
               "observer": true,
    
    ... ... @@ -35602,7 +35602,7 @@
    35602 35602
           "reference": {
    
    35603 35603
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35604 35604
             "content": {
    
    35605
    -          "firstName": "Laura ",
    
    35605
    +          "firstName": "Laura",
    
    35606 35606
               "lastName": "Quintero",
    
    35607 35607
               "captain": false,
    
    35608 35608
               "observer": true,
    
    ... ... @@ -35629,7 +35629,7 @@
    35629 35629
           "reference": {
    
    35630 35630
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35631 35631
             "content": {
    
    35632
    -          "firstName": "P. ",
    
    35632
    +          "firstName": "P.",
    
    35633 35633
               "lastName": "Ragot",
    
    35634 35634
               "captain": false,
    
    35635 35635
               "observer": true,
    
    ... ... @@ -35683,7 +35683,7 @@
    35683 35683
           "reference": {
    
    35684 35684
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35685 35685
             "content": {
    
    35686
    -          "firstName": "Susana ",
    
    35686
    +          "firstName": "Susana",
    
    35687 35687
               "lastName": "Razquin",
    
    35688 35688
               "captain": false,
    
    35689 35689
               "observer": true,
    
    ... ... @@ -35710,7 +35710,7 @@
    35710 35710
           "reference": {
    
    35711 35711
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35712 35712
             "content": {
    
    35713
    -          "firstName": "F. ",
    
    35713
    +          "firstName": "F.",
    
    35714 35714
               "lastName": "Ruchon",
    
    35715 35715
               "captain": false,
    
    35716 35716
               "observer": true,
    
    ... ... @@ -35737,7 +35737,7 @@
    35737 35737
           "reference": {
    
    35738 35738
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35739 35739
             "content": {
    
    35740
    -          "firstName": "Rafael Sánchez ",
    
    35740
    +          "firstName": "Rafael Sánchez",
    
    35741 35741
               "lastName": "Robles",
    
    35742 35742
               "captain": false,
    
    35743 35743
               "observer": true,
    
    ... ... @@ -35791,7 +35791,7 @@
    35791 35791
           "reference": {
    
    35792 35792
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35793 35793
             "content": {
    
    35794
    -          "firstName": "Miriam ",
    
    35794
    +          "firstName": "Miriam",
    
    35795 35795
               "lastName": "Rodriguez",
    
    35796 35796
               "captain": false,
    
    35797 35797
               "observer": true,
    
    ... ... @@ -35818,7 +35818,7 @@
    35818 35818
           "reference": {
    
    35819 35819
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35820 35820
             "content": {
    
    35821
    -          "firstName": "V. ",
    
    35821
    +          "firstName": "V.",
    
    35822 35822
               "lastName": "Rigolet",
    
    35823 35823
               "captain": false,
    
    35824 35824
               "observer": true,
    
    ... ... @@ -35953,7 +35953,7 @@
    35953 35953
           "reference": {
    
    35954 35954
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35955 35955
             "content": {
    
    35956
    -          "firstName": "Sonia ",
    
    35956
    +          "firstName": "Sonia",
    
    35957 35957
               "lastName": "Vega",
    
    35958 35958
               "captain": false,
    
    35959 35959
               "observer": true,
    
    ... ... @@ -35980,7 +35980,7 @@
    35980 35980
           "reference": {
    
    35981 35981
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    35982 35982
             "content": {
    
    35983
    -          "firstName": "Eva Mº del Rio ",
    
    35983
    +          "firstName": "Eva Mº del Rio",
    
    35984 35984
               "lastName": "Zarraga",
    
    35985 35985
               "captain": false,
    
    35986 35986
               "observer": true,
    
    ... ... @@ -36007,7 +36007,7 @@
    36007 36007
           "reference": {
    
    36008 36008
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    36009 36009
             "content": {
    
    36010
    -          "firstName": "Virgilia ",
    
    36010
    +          "firstName": "Virgilia",
    
    36011 36011
               "lastName": "Yance",
    
    36012 36012
               "captain": false,
    
    36013 36013
               "observer": true,
    
    ... ... @@ -36061,7 +36061,7 @@
    36061 36061
           "reference": {
    
    36062 36062
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    36063 36063
             "content": {
    
    36064
    -          "firstName": "Razquin ",
    
    36064
    +          "firstName": "Razquin",
    
    36065 36065
               "lastName": "Urdiain",
    
    36066 36066
               "captain": false,
    
    36067 36067
               "observer": true,
    
    ... ... @@ -36088,7 +36088,7 @@
    36088 36088
           "reference": {
    
    36089 36089
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    36090 36090
             "content": {
    
    36091
    -          "firstName": "T. ",
    
    36091
    +          "firstName": "T.",
    
    36092 36092
               "lastName": "Vanhoutte",
    
    36093 36093
               "captain": false,
    
    36094 36094
               "observer": true,
    
    ... ... @@ -38410,7 +38410,7 @@
    38410 38410
           "reference": {
    
    38411 38411
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38412 38412
             "content": {
    
    38413
    -          "firstName": "David ",
    
    38413
    +          "firstName": "David",
    
    38414 38414
               "lastName": "Acuña",
    
    38415 38415
               "captain": false,
    
    38416 38416
               "observer": true,
    
    ... ... @@ -38437,7 +38437,7 @@
    38437 38437
           "reference": {
    
    38438 38438
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38439 38439
             "content": {
    
    38440
    -          "firstName": "Patricia ",
    
    38440
    +          "firstName": "Patricia",
    
    38441 38441
               "lastName": "Arbona",
    
    38442 38442
               "captain": false,
    
    38443 38443
               "observer": true,
    
    ... ... @@ -38518,7 +38518,7 @@
    38518 38518
           "reference": {
    
    38519 38519
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38520 38520
             "content": {
    
    38521
    -          "firstName": "Beatriz ",
    
    38521
    +          "firstName": "Beatriz",
    
    38522 38522
               "lastName": "Bastos",
    
    38523 38523
               "captain": false,
    
    38524 38524
               "observer": true,
    
    ... ... @@ -38599,7 +38599,7 @@
    38599 38599
           "reference": {
    
    38600 38600
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38601 38601
             "content": {
    
    38602
    -          "firstName": "Mª Carmen ",
    
    38602
    +          "firstName": "Mª Carmen",
    
    38603 38603
               "lastName": "Arenas",
    
    38604 38604
               "captain": false,
    
    38605 38605
               "observer": true,
    
    ... ... @@ -38653,7 +38653,7 @@
    38653 38653
           "reference": {
    
    38654 38654
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38655 38655
             "content": {
    
    38656
    -          "firstName": "Raquel ",
    
    38656
    +          "firstName": "Raquel",
    
    38657 38657
               "lastName": "Bello",
    
    38658 38658
               "captain": false,
    
    38659 38659
               "observer": true,
    
    ... ... @@ -38680,7 +38680,7 @@
    38680 38680
           "reference": {
    
    38681 38681
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38682 38682
             "content": {
    
    38683
    -          "firstName": "P. ",
    
    38683
    +          "firstName": "P.",
    
    38684 38684
               "lastName": "Corler",
    
    38685 38685
               "captain": false,
    
    38686 38686
               "observer": true,
    
    ... ... @@ -38707,7 +38707,7 @@
    38707 38707
           "reference": {
    
    38708 38708
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38709 38709
             "content": {
    
    38710
    -          "firstName": "Rosa ",
    
    38710
    +          "firstName": "Rosa",
    
    38711 38711
               "lastName": "Delgado de Molina Acevedo",
    
    38712 38712
               "captain": false,
    
    38713 38713
               "observer": true,
    
    ... ... @@ -38761,7 +38761,7 @@
    38761 38761
           "reference": {
    
    38762 38762
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38763 38763
             "content": {
    
    38764
    -          "firstName": "Alejandro ",
    
    38764
    +          "firstName": "Alejandro",
    
    38765 38765
               "lastName": "Cruz Reyes",
    
    38766 38766
               "captain": false,
    
    38767 38767
               "observer": true,
    
    ... ... @@ -38788,7 +38788,7 @@
    38788 38788
           "reference": {
    
    38789 38789
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38790 38790
             "content": {
    
    38791
    -          "firstName": "Mª Jose Bayarri ",
    
    38791
    +          "firstName": "Mª Jose Bayarri",
    
    38792 38792
               "lastName": "Clariana",
    
    38793 38793
               "captain": false,
    
    38794 38794
               "observer": true,
    
    ... ... @@ -38815,7 +38815,7 @@
    38815 38815
           "reference": {
    
    38816 38816
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38817 38817
             "content": {
    
    38818
    -          "firstName": "Eugenia Pia ",
    
    38818
    +          "firstName": "Eugenia Pia",
    
    38819 38819
               "lastName": "Fernández",
    
    38820 38820
               "captain": false,
    
    38821 38821
               "observer": true,
    
    ... ... @@ -38842,7 +38842,7 @@
    38842 38842
           "reference": {
    
    38843 38843
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38844 38844
             "content": {
    
    38845
    -          "firstName": "E. ",
    
    38845
    +          "firstName": "E.",
    
    38846 38846
               "lastName": "Devaux",
    
    38847 38847
               "captain": false,
    
    38848 38848
               "observer": true,
    
    ... ... @@ -38896,7 +38896,7 @@
    38896 38896
           "reference": {
    
    38897 38897
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38898 38898
             "content": {
    
    38899
    -          "firstName": "Carmen ",
    
    38899
    +          "firstName": "Carmen",
    
    38900 38900
               "lastName": "Gutierrez",
    
    38901 38901
               "captain": false,
    
    38902 38902
               "observer": true,
    
    ... ... @@ -38923,7 +38923,7 @@
    38923 38923
           "reference": {
    
    38924 38924
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38925 38925
             "content": {
    
    38926
    -          "firstName": "Ricardo ",
    
    38926
    +          "firstName": "Ricardo",
    
    38927 38927
               "lastName": "Iglesias",
    
    38928 38928
               "captain": false,
    
    38929 38929
               "observer": true,
    
    ... ... @@ -38950,7 +38950,7 @@
    38950 38950
           "reference": {
    
    38951 38951
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38952 38952
             "content": {
    
    38953
    -          "firstName": "Rut ",
    
    38953
    +          "firstName": "Rut",
    
    38954 38954
               "lastName": "Hernández",
    
    38955 38955
               "captain": false,
    
    38956 38956
               "observer": true,
    
    ... ... @@ -38977,7 +38977,7 @@
    38977 38977
           "reference": {
    
    38978 38978
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    38979 38979
             "content": {
    
    38980
    -          "firstName": "Celso A. ",
    
    38980
    +          "firstName": "Celso A.",
    
    38981 38981
               "lastName": "Hernández Díaz",
    
    38982 38982
               "captain": false,
    
    38983 38983
               "observer": true,
    
    ... ... @@ -39004,7 +39004,7 @@
    39004 39004
           "reference": {
    
    39005 39005
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39006 39006
             "content": {
    
    39007
    -          "firstName": "Alfonso ",
    
    39007
    +          "firstName": "Alfonso",
    
    39008 39008
               "lastName": "Gonzalez",
    
    39009 39009
               "captain": false,
    
    39010 39010
               "observer": true,
    
    ... ... @@ -39085,7 +39085,7 @@
    39085 39085
           "reference": {
    
    39086 39086
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39087 39087
             "content": {
    
    39088
    -          "firstName": "Raquel ",
    
    39088
    +          "firstName": "Raquel",
    
    39089 39089
               "lastName": "Maestre",
    
    39090 39090
               "captain": false,
    
    39091 39091
               "observer": true,
    
    ... ... @@ -39112,7 +39112,7 @@
    39112 39112
           "reference": {
    
    39113 39113
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39114 39114
             "content": {
    
    39115
    -          "firstName": "Ph. ",
    
    39115
    +          "firstName": "Ph.",
    
    39116 39116
               "lastName": "Le Niliot",
    
    39117 39117
               "captain": false,
    
    39118 39118
               "observer": true,
    
    ... ... @@ -39139,7 +39139,7 @@
    39139 39139
           "reference": {
    
    39140 39140
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39141 39141
             "content": {
    
    39142
    -          "firstName": "Iñigo ",
    
    39142
    +          "firstName": "Iñigo",
    
    39143 39143
               "lastName": "Labarga",
    
    39144 39144
               "captain": false,
    
    39145 39145
               "observer": true,
    
    ... ... @@ -39166,7 +39166,7 @@
    39166 39166
           "reference": {
    
    39167 39167
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39168 39168
             "content": {
    
    39169
    -          "firstName": "C. ",
    
    39169
    +          "firstName": "C.",
    
    39170 39170
               "lastName": "Labaisse",
    
    39171 39171
               "captain": false,
    
    39172 39172
               "observer": true,
    
    ... ... @@ -39193,7 +39193,7 @@
    39193 39193
           "reference": {
    
    39194 39194
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39195 39195
             "content": {
    
    39196
    -          "firstName": "Noemí ",
    
    39196
    +          "firstName": "Noemí",
    
    39197 39197
               "lastName": "Martinez",
    
    39198 39198
               "captain": false,
    
    39199 39199
               "observer": true,
    
    ... ... @@ -39247,7 +39247,7 @@
    39247 39247
           "reference": {
    
    39248 39248
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    39249 39249
             "content": {
    
    39250
    -          "firstName": "Laura Entrambasaguas ",
    
    39250
    +          "firstName": "Laura Entrambasaguas",
    
    39251 39251
               "lastName": "Monsell",
    
    39252 39252
               "captain": false,
    
    39253 39253
               "observer": true,
    
    ... ... @@ -43653,7 +43653,7 @@
    43653 43653
           "reference": {
    
    43654 43654
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    43655 43655
             "content": {
    
    43656
    -          "firstName": " Benoit",
    
    43656
    +          "firstName": "Benoit",
    
    43657 43657
               "lastName": "Dumeau ",
    
    43658 43658
               "captain": false,
    
    43659 43659
               "observer": true,
    
    ... ... @@ -44220,7 +44220,7 @@
    44220 44220
           "reference": {
    
    44221 44221
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    44222 44222
             "content": {
    
    44223
    -          "firstName": "Damenéko Jean-Marc ",
    
    44223
    +          "firstName": "Damenéko Jean-Marc",
    
    44224 44224
               "lastName": "Zouhoury",
    
    44225 44225
               "captain": false,
    
    44226 44226
               "observer": true,
    
    ... ... @@ -48216,7 +48216,7 @@
    48216 48216
           "reference": {
    
    48217 48217
             "type": "fr.ird.observe.dto.referential.common.PersonReference",
    
    48218 48218
             "content": {
    
    48219
    -          "firstName": "Zegbehi Magloire ",
    
    48219
    +          "firstName": "Zegbehi Magloire",
    
    48220 48220
               "lastName": "Gnadou",
    
    48221 48221
               "captain": false,
    
    48222 48222
               "observer": false,
    
    ... ... @@ -56754,7 +56754,7 @@
    56754 56754
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    56755 56755
             "content": {
    
    56756 56756
               "code": "210",
    
    56757
    -          "label": "Renards de mer nca ",
    
    56757
    +          "label": "Renards de mer nca",
    
    56758 56758
               "faoCode": "THR",
    
    56759 56759
               "scientificLabel": "Alopias spp",
    
    56760 56760
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -56940,13 +56940,13 @@
    56940 56940
             },
    
    56941 56941
             {
    
    56942 56942
               "fieldName": "uri",
    
    56943
    -          "scope": "WARNING",
    
    56944
    -          "message": "Le champ n\u0027est pas renseigné."
    
    56943
    +          "scope": "ERROR",
    
    56944
    +          "message": "Le champ (s\u0027il est renseigné) ne doit pas être consituté que d\u0027espaces."
    
    56945 56945
             },
    
    56946 56946
             {
    
    56947 56947
               "fieldName": "uri",
    
    56948
    -          "scope": "ERROR",
    
    56949
    -          "message": "Le champ (s\u0027il est renseigné) ne doit pas être consituté que d\u0027espaces."
    
    56948
    +          "scope": "WARNING",
    
    56949
    +          "message": "Le champ n\u0027est pas renseigné."
    
    56950 56950
             },
    
    56951 56951
             {
    
    56952 56952
               "fieldName": "wormsId",
    
    ... ... @@ -57520,7 +57520,7 @@
    57520 57520
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    57521 57521
             "content": {
    
    57522 57522
               "code": "230",
    
    57523
    -          "label": "Requins-scies nca ",
    
    57523
    +          "label": "Requins-scies nca",
    
    57524 57524
               "faoCode": "PWS",
    
    57525 57525
               "scientificLabel": "Pristiophorus spp",
    
    57526 57526
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -57594,7 +57594,7 @@
    57594 57594
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    57595 57595
             "content": {
    
    57596 57596
               "code": "232",
    
    57597
    -          "label": "Anges de mer nca ",
    
    57597
    +          "label": "Anges de mer nca",
    
    57598 57598
               "faoCode": "ASK",
    
    57599 57599
               "scientificLabel": "Squatinidae",
    
    57600 57600
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    ... ... @@ -58217,7 +58217,7 @@
    58217 58217
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58218 58218
             "content": {
    
    58219 58219
               "code": "304",
    
    58220
    -          "label": "Baliste cabri ",
    
    58220
    +          "label": "Baliste cabri",
    
    58221 58221
               "faoCode": "TRG",
    
    58222 58222
               "scientificLabel": "Balistes carolinensis",
    
    58223 58223
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -58402,7 +58402,7 @@
    58402 58402
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58403 58403
             "content": {
    
    58404 58404
               "code": "309",
    
    58405
    -          "label": "Orphie plate ",
    
    58405
    +          "label": "Orphie plate",
    
    58406 58406
               "faoCode": "BAF",
    
    58407 58407
               "scientificLabel": "Ablennes hians",
    
    58408 58408
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -58518,7 +58518,7 @@
    58518 58518
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58519 58519
             "content": {
    
    58520 58520
               "code": "312",
    
    58521
    -          "label": "Comète maquereau ",
    
    58521
    +          "label": "Comète maquereau",
    
    58522 58522
               "faoCode": "MSD",
    
    58523 58523
               "scientificLabel": "Decapterus macarellus",
    
    58524 58524
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -58629,7 +58629,7 @@
    58629 58629
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58630 58630
             "content": {
    
    58631 58631
               "code": "315",
    
    58632
    -          "label": "Carangue des îles ",
    
    58632
    +          "label": "Carangue des îles",
    
    58633 58633
               "faoCode": "NGT",
    
    58634 58634
               "scientificLabel": "Carangoides orthogrammus",
    
    58635 58635
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -58666,7 +58666,7 @@
    58666 58666
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58667 58667
             "content": {
    
    58668 58668
               "code": "316",
    
    58669
    -          "label": "Carangue vorace ",
    
    58669
    +          "label": "Carangue vorace",
    
    58670 58670
               "faoCode": "CXS",
    
    58671 58671
               "scientificLabel": "Caranx sexfasciatus",
    
    58672 58672
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -58851,7 +58851,7 @@
    58851 58851
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58852 58852
             "content": {
    
    58853 58853
               "code": "321",
    
    58854
    -          "label": "Porc-épic boubou ",
    
    58854
    +          "label": "Porc-épic boubou",
    
    58855 58855
               "faoCode": "DIY",
    
    58856 58856
               "scientificLabel": "Diodon hystrix",
    
    58857 58857
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -58962,9 +58962,9 @@
    58962 58962
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    58963 58963
             "content": {
    
    58964 58964
               "code": "324",
    
    58965
    -          "label": "Rémora ",
    
    58965
    +          "label": "Rémora",
    
    58966 58966
               "faoCode": "HTL",
    
    58967
    -          "scientificLabel": "Phtheirichthys lineatus ",
    
    58967
    +          "scientificLabel": "Phtheirichthys lineatus",
    
    58968 58968
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    58969 58969
               "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    58970 58970
               "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -59221,7 +59221,7 @@
    59221 59221
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59222 59222
             "content": {
    
    59223 59223
               "code": "331",
    
    59224
    -          "label": "Demi-bec volant ",
    
    59224
    +          "label": "Demi-bec volant",
    
    59225 59225
               "faoCode": "EXQ",
    
    59226 59226
               "scientificLabel": "Euleptorhamphus velox",
    
    59227 59227
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -59332,7 +59332,7 @@
    59332 59332
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59333 59333
             "content": {
    
    59334 59334
               "code": "334",
    
    59335
    -          "label": "Kyphosus calicagères nca ",
    
    59335
    +          "label": "Kyphosus calicagères nca",
    
    59336 59336
               "faoCode": "KYP",
    
    59337 59337
               "scientificLabel": "Kyphosus spp",
    
    59338 59338
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -59564,7 +59564,7 @@
    59564 59564
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59565 59565
             "content": {
    
    59566 59566
               "code": "340",
    
    59567
    -          "label": "Calicagère bleue ",
    
    59567
    +          "label": "Calicagère bleue",
    
    59568 59568
               "faoCode": "KYC",
    
    59569 59569
               "scientificLabel": "Kyphosus cinerascens",
    
    59570 59570
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -59601,7 +59601,7 @@
    59601 59601
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59602 59602
             "content": {
    
    59603 59603
               "code": "341",
    
    59604
    -          "label": "Calicagère blanche ",
    
    59604
    +          "label": "Calicagère blanche",
    
    59605 59605
               "faoCode": "KYS",
    
    59606 59606
               "scientificLabel": "Kyphosus sectatrix",
    
    59607 59607
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -59764,7 +59764,7 @@
    59764 59764
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59765 59765
             "content": {
    
    59766 59766
               "code": "345",
    
    59767
    -          "label": "Compère océanique ",
    
    59767
    +          "label": "Compère océanique",
    
    59768 59768
               "faoCode": "LGH",
    
    59769 59769
               "scientificLabel": "Lagocephalus lagocephalus",
    
    59770 59770
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -59801,7 +59801,7 @@
    59801 59801
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59802 59802
             "content": {
    
    59803 59803
               "code": "346",
    
    59804
    -          "label": "Croupia roche ",
    
    59804
    +          "label": "Croupia roche",
    
    59805 59805
               "faoCode": "LOB",
    
    59806 59806
               "scientificLabel": "Lobotes surinamensis",
    
    59807 59807
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -59949,7 +59949,7 @@
    59949 59949
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    59950 59950
             "content": {
    
    59951 59951
               "code": "350",
    
    59952
    -          "label": "Poissons marins nca ",
    
    59952
    +          "label": "Poissons marins nca",
    
    59953 59953
               "faoCode": "MZZ",
    
    59954 59954
               "scientificLabel": "Osteichthyes",
    
    59955 59955
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1464000000000#99",
    
    ... ... @@ -60028,7 +60028,7 @@
    60028 60028
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    60029 60029
             "content": {
    
    60030 60030
               "code": "352",
    
    60031
    -          "label": "Poules d\u0027eau ",
    
    60031
    +          "label": "Poules d\u0027eau",
    
    60032 60032
               "faoCode": "BAT",
    
    60033 60033
               "scientificLabel": "Platax spp",
    
    60034 60034
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -60292,7 +60292,7 @@
    60292 60292
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    60293 60293
             "content": {
    
    60294 60294
               "code": "359",
    
    60295
    -          "label": "Sériole limon ",
    
    60295
    +          "label": "Sériole limon",
    
    60296 60296
               "faoCode": "YTL",
    
    60297 60297
               "scientificLabel": "Seriola rivoliana",
    
    60298 60298
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -60482,7 +60482,7 @@
    60482 60482
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    60483 60483
             "content": {
    
    60484 60484
               "code": "364",
    
    60485
    -          "label": "Aiguille crocodile ",
    
    60485
    +          "label": "Aiguille crocodile",
    
    60486 60486
               "faoCode": "BTS",
    
    60487 60487
               "scientificLabel": "Tylosurus crocodilus",
    
    60488 60488
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -62686,7 +62686,7 @@
    62686 62686
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    62687 62687
             "content": {
    
    62688 62688
               "code": "0",
    
    62689
    -          "label": "Thon rouge de l\u0027Atlantique ",
    
    62689
    +          "label": "Thon rouge de l\u0027Atlantique",
    
    62690 62690
               "faoCode": "BFT",
    
    62691 62691
               "scientificLabel": "Thunnus thynnus",
    
    62692 62692
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -62719,9 +62719,9 @@
    62719 62719
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    62720 62720
             "content": {
    
    62721 62721
               "code": "0",
    
    62722
    -          "label": "Mobula coilloti ",
    
    62722
    +          "label": "Mobula coilloti",
    
    62723 62723
               "faoCode": "RMC",
    
    62724
    -          "scientificLabel": "Mobula coilloti ",
    
    62724
    +          "scientificLabel": "Mobula coilloti",
    
    62725 62725
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    62726 62726
               "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    62727 62727
               "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1445863056144#0.9820877553253712",
    
    ... ... @@ -62791,13 +62791,13 @@
    62791 62791
             },
    
    62792 62792
             {
    
    62793 62793
               "fieldName": "uri",
    
    62794
    -          "scope": "WARNING",
    
    62795
    -          "message": "Le champ n\u0027est pas renseigné."
    
    62794
    +          "scope": "ERROR",
    
    62795
    +          "message": "Le champ (s\u0027il est renseigné) ne doit pas être consituté que d\u0027espaces."
    
    62796 62796
             },
    
    62797 62797
             {
    
    62798 62798
               "fieldName": "uri",
    
    62799
    -          "scope": "ERROR",
    
    62800
    -          "message": "Le champ (s\u0027il est renseigné) ne doit pas être consituté que d\u0027espaces."
    
    62799
    +          "scope": "WARNING",
    
    62800
    +          "message": "Le champ n\u0027est pas renseigné."
    
    62801 62801
             },
    
    62802 62802
             {
    
    62803 62803
               "fieldName": "wormsId",
    
    ... ... @@ -62811,9 +62811,9 @@
    62811 62811
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    62812 62812
             "content": {
    
    62813 62813
               "code": "0",
    
    62814
    -          "label": "Sergent-major ",
    
    62814
    +          "label": "Sergent-major",
    
    62815 62815
               "faoCode": "ABU",
    
    62816
    -          "scientificLabel": "Abudefduf saxatilis ",
    
    62816
    +          "scientificLabel": "Abudefduf saxatilis",
    
    62817 62817
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    62818 62818
               "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    62819 62819
               "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -62850,7 +62850,7 @@
    62850 62850
               "code": "0",
    
    62851 62851
               "label": "Famille Clupeidae",
    
    62852 62852
               "faoCode": "CLP",
    
    62853
    -          "scientificLabel": "Clupeidae ",
    
    62853
    +          "scientificLabel": "Clupeidae",
    
    62854 62854
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    62855 62855
               "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    62856 62856
               "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -62916,7 +62916,7 @@
    62916 62916
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    62917 62917
             "content": {
    
    62918 62918
               "code": "0",
    
    62919
    -          "label": "Rémora commun ",
    
    62919
    +          "label": "Rémora commun",
    
    62920 62920
               "faoCode": "EHN",
    
    62921 62921
               "scientificLabel": "Echeneis naucrates",
    
    62922 62922
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -62994,9 +62994,9 @@
    62994 62994
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    62995 62995
             "content": {
    
    62996 62996
               "code": "0",
    
    62997
    -          "label": "Oreosoma atlanticum ",
    
    62997
    +          "label": "Oreosoma atlanticum",
    
    62998 62998
               "faoCode": "OOT",
    
    62999
    -          "scientificLabel": "Oreosoma atlanticum ",
    
    62999
    +          "scientificLabel": "Oreosoma atlanticum",
    
    63000 63000
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    63001 63001
               "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    63002 63002
               "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1239832683689#0.12092280503502995",
    
    ... ... @@ -63241,13 +63241,13 @@
    63241 63241
           "messages": [
    
    63242 63242
             {
    
    63243 63243
               "fieldName": "uri",
    
    63244
    -          "scope": "WARNING",
    
    63245
    -          "message": "Le champ n\u0027est pas renseigné."
    
    63244
    +          "scope": "ERROR",
    
    63245
    +          "message": "Le champ (s\u0027il est renseigné) ne doit pas être consituté que d\u0027espaces."
    
    63246 63246
             },
    
    63247 63247
             {
    
    63248 63248
               "fieldName": "uri",
    
    63249
    -          "scope": "ERROR",
    
    63250
    -          "message": "Le champ (s\u0027il est renseigné) ne doit pas être consituté que d\u0027espaces."
    
    63249
    +          "scope": "WARNING",
    
    63250
    +          "message": "Le champ n\u0027est pas renseigné."
    
    63251 63251
             },
    
    63252 63252
             {
    
    63253 63253
               "fieldName": "wormsId",
    
    ... ... @@ -66923,7 +66923,7 @@
    66923 66923
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    66924 66924
             "content": {
    
    66925 66925
               "code": "111",
    
    66926
    -          "label": "Makaire bleu indo-pacifique ",
    
    66926
    +          "label": "Makaire bleu indo-pacifique",
    
    66927 66927
               "faoCode": "1BUM",
    
    66928 66928
               "scientificLabel": "Makaira mazara",
    
    66929 66929
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499467326#0.537910396233201",
    
    ... ... @@ -67076,9 +67076,9 @@
    67076 67076
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67077 67077
             "content": {
    
    67078 67078
               "code": "248",
    
    67079
    -          "label": "Mantes, diables de mer nca ",
    
    67079
    +          "label": "Mantes, diables de mer nca",
    
    67080 67080
               "faoCode": "MAN",
    
    67081
    -          "scientificLabel": "Mobulidae ",
    
    67081
    +          "scientificLabel": "Mobulidae",
    
    67082 67082
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    67083 67083
               "weightMeasureTypeId": "fr.ird.referential.common.WeightMeasureType#1239832686139#0.2",
    
    67084 67084
               "speciesGroupId": "fr.ird.referential.common.SpeciesGroup#1445863056144#0.9820877553253712",
    
    ... ... @@ -67155,7 +67155,7 @@
    67155 67155
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67156 67156
             "content": {
    
    67157 67157
               "code": "250",
    
    67158
    -          "label": "Torpilles, raies électriq. nca ",
    
    67158
    +          "label": "Torpilles, raies électriq. nca",
    
    67159 67159
               "faoCode": "TOD",
    
    67160 67160
               "scientificLabel": "Torpedinidae",
    
    67161 67161
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499468646#0.710986209334806",
    
    ... ... @@ -67188,7 +67188,7 @@
    67188 67188
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67189 67189
             "content": {
    
    67190 67190
               "code": "367",
    
    67191
    -          "label": "Carangue paia ",
    
    67191
    +          "label": "Carangue paia",
    
    67192 67192
               "faoCode": "URU",
    
    67193 67193
               "scientificLabel": "Uraspis uraspis",
    
    67194 67194
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -67225,7 +67225,7 @@
    67225 67225
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67226 67226
             "content": {
    
    67227 67227
               "code": "368",
    
    67228
    -          "label": "Comètes nca ",
    
    67228
    +          "label": "Comètes nca",
    
    67229 67229
               "faoCode": "SDX",
    
    67230 67230
               "scientificLabel": "Decapterus spp",
    
    67231 67231
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -67373,7 +67373,7 @@
    67373 67373
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67374 67374
             "content": {
    
    67375 67375
               "code": "372",
    
    67376
    -          "label": "Luvar ",
    
    67376
    +          "label": "Luvar",
    
    67377 67377
               "faoCode": "LVM",
    
    67378 67378
               "scientificLabel": "Luvarus imperialis",
    
    67379 67379
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336",
    
    ... ... @@ -67494,7 +67494,7 @@
    67494 67494
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67495 67495
             "content": {
    
    67496 67496
               "code": "375",
    
    67497
    -          "label": "Rémora des marlins ",
    
    67497
    +          "label": "Rémora des marlins",
    
    67498 67498
               "faoCode": "REZ",
    
    67499 67499
               "scientificLabel": "Remora osteochir",
    
    67500 67500
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -67531,7 +67531,7 @@
    67531 67531
             "type": "fr.ird.observe.dto.referential.common.SpeciesReference",
    
    67532 67532
             "content": {
    
    67533 67533
               "code": "376",
    
    67534
    -          "label": "Rémora des espadons ",
    
    67534
    +          "label": "Rémora des espadons",
    
    67535 67535
               "faoCode": "REY",
    
    67536 67536
               "scientificLabel": "Remora brachyptera",
    
    67537 67537
               "sizeMeasureTypeId": "fr.ird.referential.common.SizeMeasureType#1433499466532#0.844473292818293",
    
    ... ... @@ -68238,17 +68238,17 @@
    68238 68238
             {
    
    68239 68239
               "fieldName": "species",
    
    68240 68240
               "scope": "ERROR",
    
    68241
    -          "message": "Le référentiel sélectionné «SPY - Sphyrnidae - Famille Sphyrnidae» (à la position 24) est désactivé."
    
    68241
    +          "message": "Le référentiel sélectionné «LKY - Lepidochelys kempii - Tortue de Kemp» (à la position 120) est désactivé."
    
    68242 68242
             },
    
    68243 68243
             {
    
    68244 68244
               "fieldName": "species",
    
    68245 68245
               "scope": "ERROR",
    
    68246
    -          "message": "Le référentiel sélectionné «LKY - Lepidochelys kempii - Tortue de Kemp» (à la position 120) est désactivé."
    
    68246
    +          "message": "Le référentiel sélectionné «SPY - Sphyrnidae - Famille Sphyrnidae» (à la position 24) est désactivé."
    
    68247 68247
             },
    
    68248 68248
             {
    
    68249 68249
               "fieldName": "species",
    
    68250 68250
               "scope": "ERROR",
    
    68251
    -          "message": "Le référentiel sélectionné «1BUM - Makaira mazara - Makaire bleu indo-pacifique » (à la position 191) est désactivé."
    
    68251
    +          "message": "Le référentiel sélectionné «1BUM - Makaira mazara - Makaire bleu indo-pacifique» (à la position 191) est désactivé."
    
    68252 68252
             },
    
    68253 68253
             {
    
    68254 68254
               "fieldName": "uri",
    
    ... ... @@ -68504,7 +68504,7 @@
    68504 68504
             {
    
    68505 68505
               "fieldName": "species",
    
    68506 68506
               "scope": "ERROR",
    
    68507
    -          "message": "Le référentiel sélectionné «SPY - Sphyrnidae - Famille Sphyrnidae» (à la position 24) est désactivé."
    
    68507
    +          "message": "Le référentiel sélectionné «LKY - Lepidochelys kempii - Tortue de Kemp» (à la position 120) est désactivé."
    
    68508 68508
             },
    
    68509 68509
             {
    
    68510 68510
               "fieldName": "species",
    
    ... ... @@ -68514,12 +68514,12 @@
    68514 68514
             {
    
    68515 68515
               "fieldName": "species",
    
    68516 68516
               "scope": "ERROR",
    
    68517
    -          "message": "Le référentiel sélectionné «LKY - Lepidochelys kempii - Tortue de Kemp» (à la position 120) est désactivé."
    
    68517
    +          "message": "Le référentiel sélectionné «1BUM - Makaira mazara - Makaire bleu indo-pacifique» (à la position 208) est désactivé."
    
    68518 68518
             },
    
    68519 68519
             {
    
    68520 68520
               "fieldName": "species",
    
    68521 68521
               "scope": "ERROR",
    
    68522
    -          "message": "Le référentiel sélectionné «1BUM - Makaira mazara - Makaire bleu indo-pacifique » (à la position 208) est désactivé."
    
    68522
    +          "message": "Le référentiel sélectionné «SPY - Sphyrnidae - Famille Sphyrnidae» (à la position 24) est désactivé."
    
    68523 68523
             },
    
    68524 68524
             {
    
    68525 68525
               "fieldName": "uri",
    
    ... ... @@ -112051,7 +112051,7 @@
    112051 112051
               },
    
    112052 112052
               "vesselSizeCategory": {
    
    112053 112053
                 "code": "8",
    
    112054
    -            "gaugeLabel": " + 2300 TX",
    
    112054
    +            "gaugeLabel": "+ 2300 TX",
    
    112055 112055
                 "capacityLabel": "\u003e 1200 tonnes",
    
    112056 112056
                 "needComment": false,
    
    112057 112057
                 "enabled": true,
    
    ... ... @@ -117500,7 +117500,7 @@
    117500 117500
             "type": "fr.ird.observe.dto.referential.common.VesselReference",
    
    117501 117501
             "content": {
    
    117502 117502
               "code": "550",
    
    117503
    -          "label": "ALACRAN ",
    
    117503
    +          "label": "ALACRAN",
    
    117504 117504
               "wellRegex": "^(1A|([1-9]{1}[B;T]{1}|(1{1}[0-9]{1}[B;T]{1}))){1}$",
    
    117505 117505
               "vesselType": {
    
    117506 117506
                 "code": "6",
    
    ... ... @@ -118326,7 +118326,7 @@
    118326 118326
               },
    
    118327 118327
               "vesselSizeCategory": {
    
    118328 118328
                 "code": "8",
    
    118329
    -            "gaugeLabel": " + 2300 TX",
    
    118329
    +            "gaugeLabel": "+ 2300 TX",
    
    118330 118330
                 "capacityLabel": "\u003e 1200 tonnes",
    
    118331 118331
                 "needComment": false,
    
    118332 118332
                 "enabled": true,
    
    ... ... @@ -118419,7 +118419,7 @@
    118419 118419
               },
    
    118420 118420
               "vesselSizeCategory": {
    
    118421 118421
                 "code": "8",
    
    118422
    -            "gaugeLabel": " + 2300 TX",
    
    118422
    +            "gaugeLabel": "+ 2300 TX",
    
    118423 118423
                 "capacityLabel": "\u003e 1200 tonnes",
    
    118424 118424
                 "needComment": false,
    
    118425 118425
                 "enabled": true,
    
    ... ... @@ -119239,7 +119239,7 @@
    119239 119239
               },
    
    119240 119240
               "vesselSizeCategory": {
    
    119241 119241
                 "code": "8",
    
    119242
    -            "gaugeLabel": " + 2300 TX",
    
    119242
    +            "gaugeLabel": "+ 2300 TX",
    
    119243 119243
                 "capacityLabel": "\u003e 1200 tonnes",
    
    119244 119244
                 "needComment": false,
    
    119245 119245
                 "enabled": true,
    
    ... ... @@ -119322,7 +119322,7 @@
    119322 119322
               },
    
    119323 119323
               "vesselSizeCategory": {
    
    119324 119324
                 "code": "8",
    
    119325
    -            "gaugeLabel": " + 2300 TX",
    
    119325
    +            "gaugeLabel": "+ 2300 TX",
    
    119326 119326
                 "capacityLabel": "\u003e 1200 tonnes",
    
    119327 119327
                 "needComment": false,
    
    119328 119328
                 "enabled": true,
    
    ... ... @@ -119405,7 +119405,7 @@
    119405 119405
               },
    
    119406 119406
               "vesselSizeCategory": {
    
    119407 119407
                 "code": "8",
    
    119408
    -            "gaugeLabel": " + 2300 TX",
    
    119408
    +            "gaugeLabel": "+ 2300 TX",
    
    119409 119409
                 "capacityLabel": "\u003e 1200 tonnes",
    
    119410 119410
                 "needComment": false,
    
    119411 119411
                 "enabled": true,
    
    ... ... @@ -120093,7 +120093,7 @@
    120093 120093
               },
    
    120094 120094
               "vesselSizeCategory": {
    
    120095 120095
                 "code": "8",
    
    120096
    -            "gaugeLabel": " + 2300 TX",
    
    120096
    +            "gaugeLabel": "+ 2300 TX",
    
    120097 120097
                 "capacityLabel": "\u003e 1200 tonnes",
    
    120098 120098
                 "needComment": false,
    
    120099 120099
                 "enabled": true,
    
    ... ... @@ -120797,7 +120797,7 @@
    120797 120797
               },
    
    120798 120798
               "vesselSizeCategory": {
    
    120799 120799
                 "code": "8",
    
    120800
    -            "gaugeLabel": " + 2300 TX",
    
    120800
    +            "gaugeLabel": "+ 2300 TX",
    
    120801 120801
                 "capacityLabel": "\u003e 1200 tonnes",
    
    120802 120802
                 "needComment": false,
    
    120803 120803
                 "enabled": true,
    
    ... ... @@ -121069,7 +121069,7 @@
    121069 121069
               },
    
    121070 121070
               "vesselSizeCategory": {
    
    121071 121071
                 "code": "8",
    
    121072
    -            "gaugeLabel": " + 2300 TX",
    
    121072
    +            "gaugeLabel": "+ 2300 TX",
    
    121073 121073
                 "capacityLabel": "\u003e 1200 tonnes",
    
    121074 121074
                 "needComment": false,
    
    121075 121075
                 "enabled": true,
    
    ... ... @@ -123297,7 +123297,7 @@
    123297 123297
               },
    
    123298 123298
               "vesselSizeCategory": {
    
    123299 123299
                 "code": "8",
    
    123300
    -            "gaugeLabel": " + 2300 TX",
    
    123300
    +            "gaugeLabel": "+ 2300 TX",
    
    123301 123301
                 "capacityLabel": "\u003e 1200 tonnes",
    
    123302 123302
                 "needComment": false,
    
    123303 123303
                 "enabled": true,
    
    ... ... @@ -123857,7 +123857,7 @@
    123857 123857
               },
    
    123858 123858
               "vesselSizeCategory": {
    
    123859 123859
                 "code": "8",
    
    123860
    -            "gaugeLabel": " + 2300 TX",
    
    123860
    +            "gaugeLabel": "+ 2300 TX",
    
    123861 123861
                 "capacityLabel": "\u003e 1200 tonnes",
    
    123862 123862
                 "needComment": false,
    
    123863 123863
                 "enabled": true,
    
    ... ... @@ -124596,7 +124596,7 @@
    124596 124596
               },
    
    124597 124597
               "vesselSizeCategory": {
    
    124598 124598
                 "code": "8",
    
    124599
    -            "gaugeLabel": " + 2300 TX",
    
    124599
    +            "gaugeLabel": "+ 2300 TX",
    
    124600 124600
                 "capacityLabel": "\u003e 1200 tonnes",
    
    124601 124601
                 "needComment": false,
    
    124602 124602
                 "enabled": true,
    
    ... ... @@ -124938,7 +124938,7 @@
    124938 124938
               },
    
    124939 124939
               "vesselSizeCategory": {
    
    124940 124940
                 "code": "8",
    
    124941
    -            "gaugeLabel": " + 2300 TX",
    
    124941
    +            "gaugeLabel": "+ 2300 TX",
    
    124942 124942
                 "capacityLabel": "\u003e 1200 tonnes",
    
    124943 124943
                 "needComment": false,
    
    124944 124944
                 "enabled": true,
    
    ... ... @@ -128722,7 +128722,7 @@
    128722 128722
               },
    
    128723 128723
               "vesselSizeCategory": {
    
    128724 128724
                 "code": "8",
    
    128725
    -            "gaugeLabel": " + 2300 TX",
    
    128725
    +            "gaugeLabel": "+ 2300 TX",
    
    128726 128726
                 "capacityLabel": "\u003e 1200 tonnes",
    
    128727 128727
                 "needComment": false,
    
    128728 128728
                 "enabled": true,
    
    ... ... @@ -129240,7 +129240,7 @@
    129240 129240
               },
    
    129241 129241
               "vesselSizeCategory": {
    
    129242 129242
                 "code": "8",
    
    129243
    -            "gaugeLabel": " + 2300 TX",
    
    129243
    +            "gaugeLabel": "+ 2300 TX",
    
    129244 129244
                 "capacityLabel": "\u003e 1200 tonnes",
    
    129245 129245
                 "needComment": false,
    
    129246 129246
                 "enabled": true,
    
    ... ... @@ -129664,7 +129664,7 @@
    129664 129664
               },
    
    129665 129665
               "vesselSizeCategory": {
    
    129666 129666
                 "code": "8",
    
    129667
    -            "gaugeLabel": " + 2300 TX",
    
    129667
    +            "gaugeLabel": "+ 2300 TX",
    
    129668 129668
                 "capacityLabel": "\u003e 1200 tonnes",
    
    129669 129669
                 "needComment": false,
    
    129670 129670
                 "enabled": true,
    
    ... ... @@ -132014,7 +132014,7 @@
    132014 132014
             "type": "fr.ird.observe.dto.referential.common.VesselReference",
    
    132015 132015
             "content": {
    
    132016 132016
               "code": "713",
    
    132017
    -          "label": "ALACRAN ",
    
    132017
    +          "label": "ALACRAN",
    
    132018 132018
               "wellRegex": "^(1A|([1-9]{1}[B;T]{1}|(1{1}[0-9]{1}[B;T]{1}))){1}$",
    
    132019 132019
               "vesselType": {
    
    132020 132020
                 "code": "6",
    
    ... ... @@ -132889,7 +132889,7 @@
    132889 132889
               },
    
    132890 132890
               "vesselSizeCategory": {
    
    132891 132891
                 "code": "8",
    
    132892
    -            "gaugeLabel": " + 2300 TX",
    
    132892
    +            "gaugeLabel": "+ 2300 TX",
    
    132893 132893
                 "capacityLabel": "\u003e 1200 tonnes",
    
    132894 132894
                 "needComment": false,
    
    132895 132895
                 "enabled": true,
    
    ... ... @@ -134232,7 +134232,7 @@
    134232 134232
               },
    
    134233 134233
               "vesselSizeCategory": {
    
    134234 134234
                 "code": "8",
    
    134235
    -            "gaugeLabel": " + 2300 TX",
    
    134235
    +            "gaugeLabel": "+ 2300 TX",
    
    134236 134236
                 "capacityLabel": "\u003e 1200 tonnes",
    
    134237 134237
                 "needComment": false,
    
    134238 134238
                 "enabled": true,
    
    ... ... @@ -134480,7 +134480,7 @@
    134480 134480
               },
    
    134481 134481
               "vesselSizeCategory": {
    
    134482 134482
                 "code": "8",
    
    134483
    -            "gaugeLabel": " + 2300 TX",
    
    134483
    +            "gaugeLabel": "+ 2300 TX",
    
    134484 134484
                 "capacityLabel": "\u003e 1200 tonnes",
    
    134485 134485
                 "needComment": false,
    
    134486 134486
                 "enabled": true,
    
    ... ... @@ -134563,7 +134563,7 @@
    134563 134563
               },
    
    134564 134564
               "vesselSizeCategory": {
    
    134565 134565
                 "code": "8",
    
    134566
    -            "gaugeLabel": " + 2300 TX",
    
    134566
    +            "gaugeLabel": "+ 2300 TX",
    
    134567 134567
                 "capacityLabel": "\u003e 1200 tonnes",
    
    134568 134568
                 "needComment": false,
    
    134569 134569
                 "enabled": true,
    
    ... ... @@ -134738,7 +134738,7 @@
    134738 134738
               },
    
    134739 134739
               "vesselSizeCategory": {
    
    134740 134740
                 "code": "8",
    
    134741
    -            "gaugeLabel": " + 2300 TX",
    
    134741
    +            "gaugeLabel": "+ 2300 TX",
    
    134742 134742
                 "capacityLabel": "\u003e 1200 tonnes",
    
    134743 134743
                 "needComment": false,
    
    134744 134744
                 "enabled": true,
    
    ... ... @@ -134987,7 +134987,7 @@
    134987 134987
               },
    
    134988 134988
               "vesselSizeCategory": {
    
    134989 134989
                 "code": "8",
    
    134990
    -            "gaugeLabel": " + 2300 TX",
    
    134990
    +            "gaugeLabel": "+ 2300 TX",
    
    134991 134991
                 "capacityLabel": "\u003e 1200 tonnes",
    
    134992 134992
                 "needComment": false,
    
    134993 134993
                 "enabled": true,
    
    ... ... @@ -135162,7 +135162,7 @@
    135162 135162
               },
    
    135163 135163
               "vesselSizeCategory": {
    
    135164 135164
                 "code": "8",
    
    135165
    -            "gaugeLabel": " + 2300 TX",
    
    135165
    +            "gaugeLabel": "+ 2300 TX",
    
    135166 135166
                 "capacityLabel": "\u003e 1200 tonnes",
    
    135167 135167
                 "needComment": false,
    
    135168 135168
                 "enabled": true,
    
    ... ... @@ -136060,7 +136060,7 @@
    136060 136060
               },
    
    136061 136061
               "vesselSizeCategory": {
    
    136062 136062
                 "code": "8",
    
    136063
    -            "gaugeLabel": " + 2300 TX",
    
    136063
    +            "gaugeLabel": "+ 2300 TX",
    
    136064 136064
                 "capacityLabel": "\u003e 1200 tonnes",
    
    136065 136065
                 "needComment": false,
    
    136066 136066
                 "enabled": true,
    
    ... ... @@ -136226,7 +136226,7 @@
    136226 136226
               },
    
    136227 136227
               "vesselSizeCategory": {
    
    136228 136228
                 "code": "8",
    
    136229
    -            "gaugeLabel": " + 2300 TX",
    
    136229
    +            "gaugeLabel": "+ 2300 TX",
    
    136230 136230
                 "capacityLabel": "\u003e 1200 tonnes",
    
    136231 136231
                 "needComment": false,
    
    136232 136232
                 "enabled": true,
    
    ... ... @@ -137184,7 +137184,7 @@
    137184 137184
               },
    
    137185 137185
               "vesselSizeCategory": {
    
    137186 137186
                 "code": "8",
    
    137187
    -            "gaugeLabel": " + 2300 TX",
    
    137187
    +            "gaugeLabel": "+ 2300 TX",
    
    137188 137188
                 "capacityLabel": "\u003e 1200 tonnes",
    
    137189 137189
                 "needComment": false,
    
    137190 137190
                 "enabled": true,
    
    ... ... @@ -137857,7 +137857,7 @@
    137857 137857
               },
    
    137858 137858
               "vesselSizeCategory": {
    
    137859 137859
                 "code": "8",
    
    137860
    -            "gaugeLabel": " + 2300 TX",
    
    137860
    +            "gaugeLabel": "+ 2300 TX",
    
    137861 137861
                 "capacityLabel": "\u003e 1200 tonnes",
    
    137862 137862
                 "needComment": false,
    
    137863 137863
                 "enabled": true,
    
    ... ... @@ -137945,7 +137945,7 @@
    137945 137945
               },
    
    137946 137946
               "vesselSizeCategory": {
    
    137947 137947
                 "code": "8",
    
    137948
    -            "gaugeLabel": " + 2300 TX",
    
    137948
    +            "gaugeLabel": "+ 2300 TX",
    
    137949 137949
                 "capacityLabel": "\u003e 1200 tonnes",
    
    137950 137950
                 "needComment": false,
    
    137951 137951
                 "enabled": true,
    
    ... ... @@ -143082,7 +143082,7 @@
    143082 143082
             "type": "fr.ird.observe.dto.referential.common.VesselReference",
    
    143083 143083
             "content": {
    
    143084 143084
               "code": "842",
    
    143085
    -          "label": "PANOFI PATHFINDER ",
    
    143085
    +          "label": "PANOFI PATHFINDER",
    
    143086 143086
               "wellRegex": "^(1A|([1-9]{1}[B;T]{1}|(1{1}[0-9]{1}[B;T]{1}))){1}$",
    
    143087 143087
               "vesselType": {
    
    143088 143088
                 "code": "6",
    
    ... ... @@ -145713,7 +145713,7 @@
    145713 145713
               },
    
    145714 145714
               "vesselSizeCategory": {
    
    145715 145715
                 "code": "8",
    
    145716
    -            "gaugeLabel": " + 2300 TX",
    
    145716
    +            "gaugeLabel": "+ 2300 TX",
    
    145717 145717
                 "capacityLabel": "\u003e 1200 tonnes",
    
    145718 145718
                 "needComment": false,
    
    145719 145719
                 "enabled": true,
    
    ... ... @@ -148123,7 +148123,7 @@
    148123 148123
               },
    
    148124 148124
               "vesselSizeCategory": {
    
    148125 148125
                 "code": "8",
    
    148126
    -            "gaugeLabel": " + 2300 TX",
    
    148126
    +            "gaugeLabel": "+ 2300 TX",
    
    148127 148127
                 "capacityLabel": "\u003e 1200 tonnes",
    
    148128 148128
                 "needComment": false,
    
    148129 148129
                 "enabled": true,
    
    ... ... @@ -150347,7 +150347,7 @@
    150347 150347
               },
    
    150348 150348
               "vesselSizeCategory": {
    
    150349 150349
                 "code": "8",
    
    150350
    -            "gaugeLabel": " + 2300 TX",
    
    150350
    +            "gaugeLabel": "+ 2300 TX",
    
    150351 150351
                 "capacityLabel": "\u003e 1200 tonnes",
    
    150352 150352
                 "needComment": false,
    
    150353 150353
                 "enabled": true,
    
    ... ... @@ -153236,7 +153236,7 @@
    153236 153236
             "type": "fr.ird.observe.dto.referential.common.VesselReference",
    
    153237 153237
             "content": {
    
    153238 153238
               "code": "1014",
    
    153239
    -          "label": "LE CHINOIS 2 ",
    
    153239
    +          "label": "LE CHINOIS 2",
    
    153240 153240
               "vesselType": {
    
    153241 153241
                 "code": "7",
    
    153242 153242
                 "label": "Palangrier",
    
    ... ... @@ -156190,7 +156190,7 @@
    156190 156190
               },
    
    156191 156191
               "vesselSizeCategory": {
    
    156192 156192
                 "code": "8",
    
    156193
    -            "gaugeLabel": " + 2300 TX",
    
    156193
    +            "gaugeLabel": "+ 2300 TX",
    
    156194 156194
                 "capacityLabel": "\u003e 1200 tonnes",
    
    156195 156195
                 "needComment": false,
    
    156196 156196
                 "enabled": true,
    
    ... ... @@ -156273,7 +156273,7 @@
    156273 156273
               },
    
    156274 156274
               "vesselSizeCategory": {
    
    156275 156275
                 "code": "8",
    
    156276
    -            "gaugeLabel": " + 2300 TX",
    
    156276
    +            "gaugeLabel": "+ 2300 TX",
    
    156277 156277
                 "capacityLabel": "\u003e 1200 tonnes",
    
    156278 156278
                 "needComment": false,
    
    156279 156279
                 "enabled": true,
    
    ... ... @@ -157081,7 +157081,7 @@
    157081 157081
               },
    
    157082 157082
               "vesselSizeCategory": {
    
    157083 157083
                 "code": "8",
    
    157084
    -            "gaugeLabel": " + 2300 TX",
    
    157084
    +            "gaugeLabel": "+ 2300 TX",
    
    157085 157085
                 "capacityLabel": "\u003e 1200 tonnes",
    
    157086 157086
                 "needComment": false,
    
    157087 157087
                 "enabled": true,
    
    ... ... @@ -159379,7 +159379,7 @@
    159379 159379
               },
    
    159380 159380
               "vesselSizeCategory": {
    
    159381 159381
                 "code": "8",
    
    159382
    -            "gaugeLabel": " + 2300 TX",
    
    159382
    +            "gaugeLabel": "+ 2300 TX",
    
    159383 159383
                 "capacityLabel": "\u003e 1200 tonnes",
    
    159384 159384
                 "needComment": false,
    
    159385 159385
                 "enabled": true,
    
    ... ... @@ -161228,7 +161228,7 @@
    161228 161228
               },
    
    161229 161229
               "vesselSizeCategory": {
    
    161230 161230
                 "code": "8",
    
    161231
    -            "gaugeLabel": " + 2300 TX",
    
    161231
    +            "gaugeLabel": "+ 2300 TX",
    
    161232 161232
                 "capacityLabel": "\u003e 1200 tonnes",
    
    161233 161233
                 "needComment": false,
    
    161234 161234
                 "enabled": true,
    
    ... ... @@ -163816,7 +163816,7 @@
    163816 163816
               },
    
    163817 163817
               "vesselSizeCategory": {
    
    163818 163818
                 "code": "8",
    
    163819
    -            "gaugeLabel": " + 2300 TX",
    
    163819
    +            "gaugeLabel": "+ 2300 TX",
    
    163820 163820
                 "capacityLabel": "\u003e 1200 tonnes",
    
    163821 163821
                 "needComment": false,
    
    163822 163822
                 "enabled": true,
    
    ... ... @@ -164658,7 +164658,7 @@
    164658 164658
               },
    
    164659 164659
               "vesselSizeCategory": {
    
    164660 164660
                 "code": "8",
    
    164661
    -            "gaugeLabel": " + 2300 TX",
    
    164661
    +            "gaugeLabel": "+ 2300 TX",
    
    164662 164662
                 "capacityLabel": "\u003e 1200 tonnes",
    
    164663 164663
                 "needComment": false,
    
    164664 164664
                 "enabled": true,
    
    ... ... @@ -179501,7 +179501,7 @@
    179501 179501
             "type": "fr.ird.observe.dto.referential.common.VesselSizeCategoryReference",
    
    179502 179502
             "content": {
    
    179503 179503
               "code": "8",
    
    179504
    -          "gaugeLabel": " + 2300 TX",
    
    179504
    +          "gaugeLabel": "+ 2300 TX",
    
    179505 179505
               "capacityLabel": "\u003e 1200 tonnes",
    
    179506 179506
               "needComment": false,
    
    179507 179507
               "enabled": true,
    
    ... ... @@ -179524,7 +179524,7 @@
    179524 179524
             "type": "fr.ird.observe.dto.referential.common.VesselSizeCategoryReference",
    
    179525 179525
             "content": {
    
    179526 179526
               "code": "10",
    
    179527
    -          "gaugeLabel": " + 2300 TX",
    
    179527
    +          "gaugeLabel": "+ 2300 TX",
    
    179528 179528
               "capacityLabel": "1601 - 1800 tonnes",
    
    179529 179529
               "needComment": false,
    
    179530 179530
               "enabled": false,
    
    ... ... @@ -179575,7 +179575,7 @@
    179575 179575
             "type": "fr.ird.observe.dto.referential.common.VesselSizeCategoryReference",
    
    179576 179576
             "content": {
    
    179577 179577
               "code": "11",
    
    179578
    -          "gaugeLabel": " + 2300 TX",
    
    179578
    +          "gaugeLabel": "+ 2300 TX",
    
    179579 179579
               "capacityLabel": "1801 - 2000 tonnes",
    
    179580 179580
               "needComment": false,
    
    179581 179581
               "enabled": false,
    
    ... ... @@ -179603,7 +179603,7 @@
    179603 179603
             "type": "fr.ird.observe.dto.referential.common.VesselSizeCategoryReference",
    
    179604 179604
             "content": {
    
    179605 179605
               "code": "12",
    
    179606
    -          "gaugeLabel": " + 2300 TX",
    
    179606
    +          "gaugeLabel": "+ 2300 TX",
    
    179607 179607
               "capacityLabel": "\u003e 2000 tonnes",
    
    179608 179608
               "needComment": false,
    
    179609 179609
               "enabled": false,
    
    ... ... @@ -186793,7 +186793,7 @@
    186793 186793
           "reference": {
    
    186794 186794
             "type": "fr.ird.observe.dto.referential.ll.landing.CompanyReference",
    
    186795 186795
             "content": {
    
    186796
    -          "code": "OCEAN ",
    
    186796
    +          "code": "OCEAN",
    
    186797 186797
               "label": "[type: Unknown] OCEAN LONG LINERS LTD [id:n/a]",
    
    186798 186798
               "needComment": false,
    
    186799 186799
               "enabled": true,
    
    ... ... @@ -196042,7 +196042,7 @@
    196042 196042
             "type": "fr.ird.observe.dto.referential.ps.common.ReasonForNoFishingReference",
    
    196043 196043
             "content": {
    
    196044 196044
               "code": "14",
    
    196045
    -          "label": "Règlementation (absence de licence, moratoire, etc) ",
    
    196045
    +          "label": "Règlementation (absence de licence, moratoire, etc)",
    
    196046 196046
               "needComment": false,
    
    196047 196047
               "enabled": true,
    
    196048 196048
               "id": "fr.ird.referential.ps.common.ReasonForNoFishing#1561013070351#0.6641824426682489",
    
    ... ... @@ -196593,6 +196593,7 @@
    196593 196593
               "code": "1",
    
    196594 196594
               "label": "Echappe du filet (pour requin-baleine et cétacés)",
    
    196595 196595
               "discard": true,
    
    196596
    +          "weightRangeAllowed": false,
    
    196596 196597
               "needComment": false,
    
    196597 196598
               "enabled": true,
    
    196598 196599
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683618#0.06155887805368032",
    
    ... ... @@ -196626,6 +196627,7 @@
    196626 196627
               "code": "3",
    
    196627 196628
               "label": "Sortie mort du filet (pour requin-baleine et cétacés)",
    
    196628 196629
               "discard": true,
    
    196630
    +          "weightRangeAllowed": false,
    
    196629 196631
               "needComment": false,
    
    196630 196632
               "enabled": true,
    
    196631 196633
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.11883784875534997",
    
    ... ... @@ -196659,6 +196661,7 @@
    196659 196661
               "code": "4",
    
    196660 196662
               "label": "Rejeté vivant",
    
    196661 196663
               "discard": true,
    
    196664
    +          "weightRangeAllowed": false,
    
    196662 196665
               "needComment": false,
    
    196663 196666
               "enabled": true,
    
    196664 196667
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.5308862132841506",
    
    ... ... @@ -196682,6 +196685,7 @@
    196682 196685
               "code": "6",
    
    196683 196686
               "label": "Conservé à destination de la conserverie",
    
    196684 196687
               "discard": false,
    
    196688
    +          "weightRangeAllowed": true,
    
    196685 196689
               "needComment": false,
    
    196686 196690
               "enabled": true,
    
    196687 196691
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.5722739932065866",
    
    ... ... @@ -196710,6 +196714,7 @@
    196710 196714
               "code": "5",
    
    196711 196715
               "label": "Rejeté mort",
    
    196712 196716
               "discard": true,
    
    196717
    +          "weightRangeAllowed": true,
    
    196713 196718
               "needComment": false,
    
    196714 196719
               "enabled": true,
    
    196715 196720
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.6250731662108877",
    
    ... ... @@ -196733,6 +196738,7 @@
    196733 196738
               "code": "2",
    
    196734 196739
               "label": "Sortie vivant du filet (pour requin-baleine et cétacés)",
    
    196735 196740
               "discard": true,
    
    196741
    +          "weightRangeAllowed": false,
    
    196736 196742
               "needComment": false,
    
    196737 196743
               "enabled": true,
    
    196738 196744
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.9931091059863436",
    
    ... ... @@ -196765,6 +196771,7 @@
    196765 196771
             "content": {
    
    196766 196772
               "code": "7",
    
    196767 196773
               "label": "Partiellement conservé (ex: ailerons de requin, poisson séché)",
    
    196774
    +          "weightRangeAllowed": false,
    
    196768 196775
               "needComment": false,
    
    196769 196776
               "enabled": false,
    
    196770 196777
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683620#0.46609703818634485",
    
    ... ... @@ -196803,6 +196810,7 @@
    196803 196810
               "code": "8",
    
    196804 196811
               "label": "Utilisé en cuisine du bord",
    
    196805 196812
               "discard": false,
    
    196813
    +          "weightRangeAllowed": false,
    
    196806 196814
               "needComment": false,
    
    196807 196815
               "enabled": true,
    
    196808 196816
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.6728026426066158",
    
    ... ... @@ -196835,6 +196843,7 @@
    196835 196843
             "content": {
    
    196836 196844
               "code": "9",
    
    196837 196845
               "label": "Autres (à préciser dans les notes)",
    
    196846
    +          "weightRangeAllowed": false,
    
    196838 196847
               "needComment": true,
    
    196839 196848
               "enabled": true,
    
    196840 196849
               "id": "fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.9099804284263154",
    
    ... ... @@ -196868,6 +196877,7 @@
    196868 196877
               "code": "15",
    
    196869 196878
               "label": "Conservé pour le marché local ou poisson séché/salé à bord",
    
    196870 196879
               "discard": false,
    
    196880
    +          "weightRangeAllowed": false,
    
    196871 196881
               "needComment": false,
    
    196872 196882
               "enabled": true,
    
    196873 196883
               "id": "fr.ird.referential.ps.common.SpeciesFate#1464000000000#15",
    
    ... ... @@ -196895,6 +196905,7 @@
    196895 196905
             "content": {
    
    196896 196906
               "code": "10",
    
    196897 196907
               "label": "Ailerons seulements",
    
    196908
    +          "weightRangeAllowed": false,
    
    196898 196909
               "needComment": false,
    
    196899 196910
               "enabled": true,
    
    196900 196911
               "id": "fr.ird.referential.ps.common.SpeciesFate#1467372855729#0.568287924081734",
    
    ... ... @@ -196918,6 +196929,7 @@
    196918 196929
               "code": "11",
    
    196919 196930
               "label": "Rejeté, statut non observé",
    
    196920 196931
               "discard": true,
    
    196932
    +          "weightRangeAllowed": false,
    
    196921 196933
               "needComment": false,
    
    196922 196934
               "enabled": true,
    
    196923 196935
               "id": "fr.ird.referential.ps.common.SpeciesFate#1501492537510#0.9210847837998154",
    
    ... ... @@ -196941,6 +196953,7 @@
    196941 196953
               "code": "12",
    
    196942 196954
               "label": "Conservé pour raisons scientifiques",
    
    196943 196955
               "discard": false,
    
    196956
    +          "weightRangeAllowed": false,
    
    196944 196957
               "needComment": false,
    
    196945 196958
               "enabled": true,
    
    196946 196959
               "id": "fr.ird.referential.ps.common.SpeciesFate#1501492831539#0.9377232562184147",
    
    ... ... @@ -196964,6 +196977,7 @@
    196964 196977
               "code": "13",
    
    196965 196978
               "label": "Rejeté suffocant",
    
    196966 196979
               "discard": true,
    
    196980
    +          "weightRangeAllowed": false,
    
    196967 196981
               "needComment": false,
    
    196968 196982
               "enabled": true,
    
    196969 196983
               "id": "fr.ird.referential.ps.common.SpeciesFate#1544448835551#0.620629930572886",
    
    ... ... @@ -196987,6 +197001,7 @@
    196987 197001
               "code": "14",
    
    196988 197002
               "label": "Rejeté suffocant blessé",
    
    196989 197003
               "discard": true,
    
    197004
    +          "weightRangeAllowed": false,
    
    196990 197005
               "needComment": false,
    
    196991 197006
               "enabled": true,
    
    196992 197007
               "id": "fr.ird.referential.ps.common.SpeciesFate#1544448977865#0.24265421995390768",
    
    ... ... @@ -197605,7 +197620,7 @@
    197605 197620
             "type": "fr.ird.observe.dto.referential.ps.common.TransmittingBuoyTypeReference",
    
    197606 197621
             "content": {
    
    197607 197622
               "code": "98",
    
    197608
    -          "label": "Balise inconnue ou indéterminée ",
    
    197623
    +          "label": "Balise inconnue ou indéterminée",
    
    197609 197624
               "needComment": false,
    
    197610 197625
               "enabled": true,
    
    197611 197626
               "id": "fr.ird.referential.ps.common.TransmittingBuoyType#1339685555050#0.2640694245556756",
    
    ... ... @@ -203767,7 +203782,7 @@
    203767 203782
             "type": "fr.ird.observe.dto.referential.ps.common.WeightCategoryReference",
    
    203768 203783
             "content": {
    
    203769 203784
               "code": "C-YFT-12",
    
    203770
    -          "label": "YFT de 10 à 30 kg ",
    
    203785
    +          "label": "YFT de 10 à 30 kg",
    
    203771 203786
               "species": {
    
    203772 203787
                 "code": "1",
    
    203773 203788
                 "label": "Albacore, thon à nageoires jaunes",
    
    ... ... @@ -204950,7 +204965,7 @@
    204950 204965
             "type": "fr.ird.observe.dto.referential.ps.common.WeightCategoryReference",
    
    204951 204966
             "content": {
    
    204952 204967
               "code": "C-BET-12",
    
    204953
    -          "label": "BET de 10 à 30 kg ",
    
    204968
    +          "label": "BET de 10 à 30 kg",
    
    204954 204969
               "species": {
    
    204955 204970
                 "code": "3",
    
    204956 204971
                 "label": "Patudo, thon obèse, thon gros yeux",
    
    ... ... @@ -205660,7 +205675,7 @@
    205660 205675
             "type": "fr.ird.observe.dto.referential.ps.common.WeightCategoryReference",
    
    205661 205676
             "content": {
    
    205662 205677
               "code": "C-ALB-12",
    
    205663
    -          "label": "ALB de 10 à 30 kg ",
    
    205678
    +          "label": "ALB de 10 à 30 kg",
    
    205664 205679
               "species": {
    
    205665 205680
                 "code": "4",
    
    205666 205681
                 "label": "Germon",
    
    ... ... @@ -207542,7 +207557,7 @@
    207542 207557
             "type": "fr.ird.observe.dto.referential.ps.common.WeightCategoryReference",
    
    207543 207558
             "content": {
    
    207544 207559
               "code": "C-LOT-12",
    
    207545
    -          "label": "LOT de 10 à 30 kg ",
    
    207560
    +          "label": "LOT de 10 à 30 kg",
    
    207546 207561
               "species": {
    
    207547 207562
                 "code": "12",
    
    207548 207563
                 "label": "Thon mignon",
    
    ... ... @@ -214167,7 +214182,7 @@
    214167 214182
             "type": "fr.ird.observe.dto.referential.ps.observation.NonTargetCatchReleasingTimeReference",
    
    214168 214183
             "content": {
    
    214169 214184
               "code": "I",
    
    214170
    -          "label": " Relache immédiate",
    
    214185
    +          "label": "Relache immédiate",
    
    214171 214186
               "needComment": false,
    
    214172 214187
               "enabled": true,
    
    214173 214188
               "id": "fr.ird.referential.ps.observation.NonTargetCatchReleasingTime#0#1",
    
    ... ... @@ -214189,7 +214204,7 @@
    214189 214204
             "type": "fr.ird.observe.dto.referential.ps.observation.NonTargetCatchReleasingTimeReference",
    
    214190 214205
             "content": {
    
    214191 214206
               "code": "B",
    
    214192
    -          "label": " Avant la salabarde suivante",
    
    214207
    +          "label": "Avant la salabarde suivante",
    
    214193 214208
               "needComment": false,
    
    214194 214209
               "enabled": true,
    
    214195 214210
               "id": "fr.ird.referential.ps.observation.NonTargetCatchReleasingTime#0#2",
    
    ... ... @@ -214211,7 +214226,7 @@
    214211 214226
             "type": "fr.ird.observe.dto.referential.ps.observation.NonTargetCatchReleasingTimeReference",
    
    214212 214227
             "content": {
    
    214213 214228
               "code": "D",
    
    214214
    -          "label": " Pendant la calée",
    
    214229
    +          "label": "Pendant la calée",
    
    214215 214230
               "needComment": false,
    
    214216 214231
               "enabled": true,
    
    214217 214232
               "id": "fr.ird.referential.ps.observation.NonTargetCatchReleasingTime#0#3",
    
    ... ... @@ -214233,7 +214248,7 @@
    214233 214248
             "type": "fr.ird.observe.dto.referential.ps.observation.NonTargetCatchReleasingTimeReference",
    
    214234 214249
             "content": {
    
    214235 214250
               "code": "A",
    
    214236
    -          "label": " À la fin de la calée",
    
    214251
    +          "label": "À la fin de la calée",
    
    214237 214252
               "needComment": false,
    
    214238 214253
               "enabled": true,
    
    214239 214254
               "id": "fr.ird.referential.ps.observation.NonTargetCatchReleasingTime#0#4",
    

  • model/src/main/models/Observe/dto/class/i18nLabels.properties
    ... ... @@ -82,7 +82,7 @@ data.ps.logbook.SampleSpeciesMeasure=count,sizeClass
    82 82
     data.ps.logbook.TransmittingBuoy=comment,code,transmittingBuoyOwnership,transmittingBuoyType,transmittingBuoyOperation,country,vessel,latitude,longitude,quadrant
    
    83 83
     data.ps.logbook.WellPlan=activity,species,weight,weightCategory,well,wellSamplingConformity,wellSamplingStatus
    
    84 84
     data.ps.observation.Activity=date,coordinate,observedSystem.available,observedSystem.selected,comment,comment2,currentFpaZone,dataQuality,detectionMode,ersId,floatingObjectEmpty,latitude,longitude,nextFpaZone,nonTargetCatchSpecies,observedSystem,observedSystemDistance,previousFpaZone,quadrant,reasonForNoFishing,seaSurfaceTemperature,surroundingActivity,time,vesselActivity,vesselSpeed,wind,generalTab,error.no.activity.6,measurementsTab,observedSystemTab
    
    85
    -data.ps.observation.Catch=catchWeight,comment,informationSource,lengthMeasureMethod,meanLength,minWeight,maxWeight,meanWeight,reasonForDiscard,species,speciesFate,totalCount,weightMeasureMethod,well,catchWeightComputed.computed.tip,catchWeightComputed.observed.tip,meanLengthComputed.computed.tip,meanLengthComputed.observed.tip,meanWeightComputed.computed.tip,meanWeightComputed.observed.tip,totalCountComputed.computed.tip,totalCountComputed.observed.tip
    
    85
    +data.ps.observation.Catch=catchWeight,comment,informationSource,lengthMeasureMethod,meanLength,minWeight,maxWeight,meanWeight,minMaxWeight,reasonForDiscard,species,speciesFate,totalCount,weightMeasureMethod,well,catchWeightComputed.computed.tip,catchWeightComputed.observed.tip,meanLengthComputed.computed.tip,meanLengthComputed.observed.tip,meanWeightComputed.computed.tip,meanWeightComputed.observed.tip,totalCountComputed.computed.tip,totalCountComputed.observed.tip
    
    86 86
     data.ps.observation.FloatingObject=materialsValid,objectOperation,supportVesselName,country,vessel,computedBiodegradable,computedNonEntangling,computedSimplifiedObjectType,computedValues,generalTab,buoysTab,materialsTab,notComputed,type.short
    
    87 87
     data.ps.observation.NonTargetCatchRelease=comment,conformity,count,length,lengthMeasureMethod,releasingTime,sex,status,species,speciesGroupReleaseMode,message.cantAdd
    
    88 88
     data.ps.observation.ObjectObservedSpecies=count,species,speciesStatus
    

  • model/src/main/models/Observe/dto/class/i18nOverrideLabels.properties
    ... ... @@ -23,7 +23,7 @@ data.ll.common.Trip=species
    23 23
     data.ll.landing.Landing=vessel
    
    24 24
     data.ps.localmarket.Sample=well
    
    25 25
     data.ps.logbook.Catch=weightMeasureMethod.validation.required
    
    26
    -data.ps.observation.Catch=minWeight,maxWeight,weightMeasureMethod
    
    26
    +data.ps.observation.Catch=minWeight,maxWeight,minMaxWeight,weightMeasureMethod
    
    27 27
     data.ps.observation.SchoolEstimate=species
    
    28 28
     data.ps.observation.Set=startTime,haulingStartTimeStamp,haulingEndTimeStamp,endTimeStamp
    
    29 29
     referential.common.Species=codeAndHomeId

  • toolkit/api/src/main/java/fr/ird/observe/dto/StringCleaner.java
    1
    +package fr.ird.observe.dto;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Toolkit :: API
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2022 IRD, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import java.util.function.Function;
    
    26
    +
    
    27
    +/**
    
    28
    + * Object to clean a string related to a database field.
    
    29
    + * <p>
    
    30
    + * Created on 12/11/2022.
    
    31
    + *
    
    32
    + * @author Tony Chemit - dev@tchemit.fr
    
    33
    + * @since 9.017
    
    34
    + */
    
    35
    +public class StringCleaner implements Function<String, String> {
    
    36
    +
    
    37
    +    public static final StringCleaner ALL = new StringCleaner(true, true, true);
    
    38
    +    public static final StringCleaner REMOVE_SINGLE_QUOTE_AND_TRIM = new StringCleaner(true, true, false);
    
    39
    +    public static final StringCleaner TRIM_AND_REPLACE_EMPTY_BY_NULL = new StringCleaner(false, true, true);
    
    40
    +    public static final StringCleaner TRIM = new StringCleaner(false, true, false);
    
    41
    +
    
    42
    +    /**
    
    43
    +     * To remove any single quote in given string.
    
    44
    +     */
    
    45
    +    private final boolean removeSingleQuote;
    
    46
    +    /**
    
    47
    +     * To perform a trim on given string.
    
    48
    +     */
    
    49
    +    private final boolean trim;
    
    50
    +    /**
    
    51
    +     * To replace the given string value by null if it is empty.
    
    52
    +     */
    
    53
    +    private final boolean replaceEmptyByNull;
    
    54
    +
    
    55
    +    public StringCleaner(boolean removeSingleQuote, boolean trim, boolean replaceEmptyByNull) {
    
    56
    +        this.removeSingleQuote = removeSingleQuote;
    
    57
    +        this.trim = trim;
    
    58
    +        this.replaceEmptyByNull = replaceEmptyByNull;
    
    59
    +    }
    
    60
    +
    
    61
    +    public static String removeSingleQuote(String string) {
    
    62
    +        return string.replaceAll("'", "");
    
    63
    +    }
    
    64
    +
    
    65
    +    @Override
    
    66
    +    public String apply(String string) {
    
    67
    +        if (string == null) {
    
    68
    +            return null;
    
    69
    +        }
    
    70
    +        String result = string;
    
    71
    +        if (removeSingleQuote) {
    
    72
    +            result = removeSingleQuote(result);
    
    73
    +        }
    
    74
    +        if (trim) {
    
    75
    +            result = result.trim();
    
    76
    +        }
    
    77
    +        if (replaceEmptyByNull && result.isEmpty()) {
    
    78
    +            result = null;
    
    79
    +        }
    
    80
    +        return result;
    
    81
    +    }
    
    82
    +}

  • toolkit/api/src/main/java/fr/ird/observe/persistence/SqlHelper.java
    ... ... @@ -64,7 +64,21 @@ public class SqlHelper {
    64 64
             if (trim.length() > maxLength) {
    
    65 65
                 trim = trim.substring(0, maxLength - 1);
    
    66 66
             }
    
    67
    -        return "'" + trim.replaceAll("'", "''") + "'";
    
    67
    +        return "'" + escapeSingleQuote(trim) + "'";
    
    68 68
         }
    
    69 69
     
    
    70
    +    public static String escapeSingleQuote(String string) {
    
    71
    +        return string.replaceAll("'", "''");
    
    72
    +    }
    
    73
    +
    
    74
    +    public static String escapeString(String string) {
    
    75
    +        if (string == null) {
    
    76
    +            return "NULL";
    
    77
    +        }
    
    78
    +        String trim = string.trim();
    
    79
    +        if (trim.isEmpty()) {
    
    80
    +            return "NULL";
    
    81
    +        }
    
    82
    +        return "'" + escapeSingleQuote(trim) + "'";
    
    83
    +    }
    
    70 84
     }

  • toolkit/persistence/src/main/java/fr/ird/observe/spi/context/DataDtoEntityContext.java
    ... ... @@ -35,6 +35,7 @@ import fr.ird.observe.dto.referential.ReferentialLocale;
    35 35
     import fr.ird.observe.entities.Entity;
    
    36 36
     import fr.ird.observe.entities.data.DataEntity;
    
    37 37
     import fr.ird.observe.entities.data.DataFileAware;
    
    38
    +import fr.ird.observe.persistence.SqlHelper;
    
    38 39
     import fr.ird.observe.persistence.request.DeleteRequest;
    
    39 40
     import fr.ird.observe.spi.service.ServiceContext;
    
    40 41
     import fr.ird.observe.spi.usage.UsageHelper;
    
    ... ... @@ -78,14 +79,7 @@ public abstract class DataDtoEntityContext<
    78 79
         }
    
    79 80
     
    
    80 81
         public static String toId(Entity entity) {
    
    81
    -        return entity == null ? "NULL" : escapeString(entity.getTopiaId());
    
    82
    -    }
    
    83
    -
    
    84
    -    public static String escapeString(String string) {
    
    85
    -        if (string == null) {
    
    86
    -            return "NULL";
    
    87
    -        }
    
    88
    -        return "'" + string.trim() + "'";
    
    82
    +        return entity == null ? "NULL" : SqlHelper.escapeString(entity.getTopiaId());
    
    89 83
         }
    
    90 84
     
    
    91 85
         public static Blob byteArrayToBlob(byte[] bytes) {