diff --git a/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java b/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java index 56852d84..a051eb2b 100755 --- a/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java +++ b/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java @@ -42,6 +42,7 @@ public enum MethodeNumerotation { M_42, M_49, M_53, + M_58, M_61, M_66, M_77, @@ -74,6 +75,7 @@ public enum MethodeNumerotationInterne { M_42, M_49, M_53, + M_58, M_61, M_77, M_78, @@ -133,6 +135,8 @@ public static String computeNumero(Hydrant hydrant) { return NumeroUtilRepository.computeNumero49(hydrant); case M_53: return NumeroUtilRepository.computeNumero53(hydrant); + case M_58: + return NumeroUtilRepository.computeNumero58(hydrant); case M_66: return NumeroUtilRepository.computeNumero66(hydrant); case M_77: @@ -385,6 +389,24 @@ protected static String computeNumero53(Hydrant hydrant) { return sb.toString(); } + /** + * + * numéro interne sur 3 chiffres: + * - 0 à 599 : PIBI + * - 600 à 799 : PUISARDS + * - 800 à 999 : PENA + * Exemple : 58267 805 - PEA sur commune de SAINT-SAULGE + * + * @param hydrant + * @return + */ + protected static String computeNumero58(Hydrant hydrant) { + StringBuilder sb = new StringBuilder(); + sb.append(getHydrantCommune(hydrant).getInsee()); + sb.append(" "); + return sb.append(String.format("%03d", hydrant.getNumeroInterne())).toString(); + } + /** * _(

) * Avec P à la fin pour PEI privé @@ -654,6 +676,8 @@ public static Integer computeNumeroInterne(Hydrant hydrant) { return NumeroUtilRepository.computeNumeroInterne49(hydrant); case M_53: return NumeroUtilRepository.computeNumeroInterne53(hydrant); + case M_58: + return NumeroUtilRepository.computeNumeroInterne58(hydrant); case M_77: return NumeroUtilRepository.computeNumeroInterne77(hydrant); case M_86: @@ -915,6 +939,56 @@ private static Integer computeNumeroInterne53Private(Hydrant hydrant, boolean ig return numInterne; } + /** + * numéro interne en fonction de la commune et de la nature PIBI, PUISARD ou PENA + * + * @param hydrant + * @return + */ + public static Integer computeNumeroInterne58(Hydrant hydrant) { + if (hydrant.getNumeroInterne() != null && hydrant.getId() != null) { + return hydrant.getNumeroInterne(); + } + + Integer numInterne = null; + try { + Integer startRange = null; + Integer stopRange = null; + if (hydrant.getCode().equals("PIBI")) { + startRange = 1; + stopRange = 599; + } else { + String nature = + context + .select(TYPE_HYDRANT_NATURE.CODE) + .from(TYPE_HYDRANT_NATURE) + .where(TYPE_HYDRANT_NATURE.ID.eq(hydrant.getNature())) + .fetchOneInto(String.class); + if (nature.equals("PU")) { + startRange = 600; + stopRange = 799; + } else { + startRange = 800; + stopRange = 999; + } + } + + numInterne = + context + .resultQuery( + "select remocra.nextNumeroInterne(null, {0}, {1}, {2}, {3}, {4})", + DSL.val(hydrant.getCode(), SQLDataType.VARCHAR), + DSL.val(hydrant.getNature(), SQLDataType.BIGINT), + DSL.val(hydrant.getCommune(), SQLDataType.BIGINT), + startRange, + stopRange) + .fetchOneInto(Integer.class); + } catch (Exception e) { + numInterne = 99999; + } + return numInterne; + } + /** * numéro interne en fonction de la commune ou zone spéciale * diff --git a/remocra/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java b/remocra/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java index cc1355ae..8fed2857 100755 --- a/remocra/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java +++ b/remocra/src/main/java/fr/sdis83/remocra/repository/NumeroUtilRepository.java @@ -41,6 +41,7 @@ public enum MethodeNumerotation { M_42, M_49, M_53, + M_58, M_61, M_66, M_77, @@ -75,6 +76,7 @@ public enum MethodeNumerotationInterne { M_42, M_49, M_53, + M_58, M_61, M_77, M_78, @@ -134,6 +136,8 @@ public static String computeNumero(Hydrant hydrant) { return NumeroUtilRepository.computeNumero49(hydrant); case M_53: return NumeroUtilRepository.computeNumero53(hydrant); + case M_58: + return NumeroUtilRepository.computeNumero58(hydrant); case M_66: return NumeroUtilRepository.computeNumero66(hydrant); case M_77: @@ -386,6 +390,24 @@ protected static String computeNumero53(Hydrant hydrant) { return sb.toString(); } + /** + * + * numéro interne sur 3 chiffres: + * - 0 à 599 : PIBI + * - 600 à 799 : PUISARDS + * - 800 à 999 : PENA + * Exemple : 58267 805 - PEA sur commune de SAINT-SAULGE + * + * @param hydrant + * @return + */ + protected static String computeNumero58(Hydrant hydrant) { + StringBuilder sb = new StringBuilder(); + sb.append(getHydrantCommune(hydrant).getInsee()); + sb.append(" "); + return sb.append(String.format("%03d", hydrant.getNumeroInterne())).toString(); + } + /** * _(

) * Avec P à la fin pour PEI privé @@ -654,6 +676,8 @@ public static Integer computeNumeroInterne(Hydrant hydrant) { return NumeroUtilRepository.computeNumeroInterne49(hydrant); case M_53: return NumeroUtilRepository.computeNumeroInterne53(hydrant); + case M_58: + return NumeroUtilRepository.computeNumeroInterne58(hydrant); case M_77: return NumeroUtilRepository.computeNumeroInterne77(hydrant); case M_86: @@ -915,6 +939,56 @@ private static Integer computeNumeroInterne53Private(Hydrant hydrant, boolean ig return numInterne; } + /** + * numéro interne en fonction de la commune et de la nature PIBI, PUISARD ou PENA + * + * @param hydrant + * @return + */ + public static Integer computeNumeroInterne58(Hydrant hydrant) { + if (hydrant.getNumeroInterne() != null && hydrant.getId() != null) { + return hydrant.getNumeroInterne(); + } + + Integer numInterne = null; + try { + Integer startRange = null; + Integer stopRange = null; + if (hydrant.getCode().equals("PIBI")) { + startRange = 1; + stopRange = 599; + } else { + String nature = + context + .select(TYPE_HYDRANT_NATURE.CODE) + .from(TYPE_HYDRANT_NATURE) + .where(TYPE_HYDRANT_NATURE.ID.eq(hydrant.getNature())) + .fetchOneInto(String.class); + if (nature.equals("PU")) { + startRange = 600; + stopRange = 799; + } else { + startRange = 800; + stopRange = 999; + } + } + + numInterne = + context + .resultQuery( + "select remocra.nextNumeroInterne(null, {0}, {1}, {2}, {3}, {4})", + DSL.val(hydrant.getCode(), SQLDataType.VARCHAR), + DSL.val(hydrant.getNature(), SQLDataType.BIGINT), + DSL.val(hydrant.getCommune(), SQLDataType.BIGINT), + startRange, + stopRange) + .fetchOneInto(Integer.class); + } catch (Exception e) { + numInterne = 99999; + } + return numInterne; + } + /** * numéro interne en fonction de la commune ou zone spéciale * diff --git a/server/sdis-remocra/home/postgres/remocra_db/patches/sdis/58/203_001.sql b/server/sdis-remocra/home/postgres/remocra_db/patches/sdis/58/203_001.sql new file mode 100644 index 00000000..3c33b1b1 --- /dev/null +++ b/server/sdis-remocra/home/postgres/remocra_db/patches/sdis/58/203_001.sql @@ -0,0 +1,28 @@ +CREATE OR REPLACE FUNCTION remocra.nextnumerointerne(idhydrant bigint, codehydrant character varying, naturehydrant bigint, idcommune bigint, startserie bigint, stopserie bigint) + RETURNS bigint + LANGUAGE plpgsql +AS $function$ +DECLARE returned bigint; +BEGIN + SELECT n INTO returned + FROM generate_series(COALESCE(startserie, 1), COALESCE(stopserie, 99999)) gs(n) + except + SELECT numero_interne + FROM remocra.hydrant h + WHERE + (case when idhydrant is not null then h.id != idhydrant else true end) + and (case + when codehydrant = 'PIBI' then h.code = codehydrant + when codehydrant = 'PENA' then + CASE WHEN naturehydrant = (select id from remocra.type_hydrant_nature where code = 'PU') THEN h.nature = naturehydrant + ELSE h.nature <> naturehydrant END + ELSE TRUE END) + and (case when idcommune is not null then h.commune = idcommune else true end) + order BY 1 + limit 1; + + return returned; +end; + +$function$ +; \ No newline at end of file