Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Les données de captures dans les préavis manuels BFT sont incohérentes #3889

Open
VincentAntoine opened this issue Nov 22, 2024 · 7 comments · May be fixed by #4053
Open

Les données de captures dans les préavis manuels BFT sont incohérentes #3889

VincentAntoine opened this issue Nov 22, 2024 · 7 comments · May be fixed by #4053
Assignees
Labels
bug Something isn't working data dev

Comments

@VincentAntoine
Copy link
Collaborator

VincentAntoine commented Nov 22, 2024

Dans les préavis avec BFT, les données sont enregistrées en doublon :

  • Une fois avec les infos par calibre telles que renseignées dans le formulaire, avec les codes BF1, BF2, BF3
  • Une fois avec le code BFT à partir des données par calibre du formulaire

Image

C'est source d'erreurs pour plusieurs raisons :

  • les données semblent indiquer qu'il y a 220kg de BF1 + 100 kg de BF2 + 320kg de BFT
  • les poids sont sommés mais pas les nombres de pièces

De plus, les préavis datant d'avant la modification qui a rendu automatique le calcul du BFT à partir des données BF1 BF2 et BF3 ne suivent pas la même logique :

Image

ou encore :

Image

Enfin, ces données se retrouvent dans les documents envoyés aux unités et donnent à nouveau une info redondante :

Image

Je vois deux options :

  • soit on garde la logique de sauver dans les données le BFT en plus des calibres, et dans ce cas il faut traiter les incohérences, c'est-à-dire qu'il faut recalculer les sommes de poids de BFT à partir des poids de BF1 BF2 BF3 et ajouter le nombre de pièces pour le rendre également cohérent avec les nombres de pièces de BF1 BF2 BF3
  • soit on supprime totalement le BFT des données, et c'est uniquement un calcul dans le front qui affiche le poids dans le formulaire comme étant la somme des poids par calibre.

La seconde option paraît plus clean car elle évite la redondance de données, mais elle a des effets de bord, notamment sur l'attribution de segments et de typage de préavis (il faut penser à ajouter BF1, BF2 et BF3 comme critère d'attribution en plus de BFT), ce qui d'autant moins cool que BF1 BF2 et BF3 en sont pas des codes espèces à proprement parler mais plus des hacks permettant de stocker l'info par calibre sans avoir une structure de donnée dédiée à cette notion de calibre qui n'existe nulle par ailleurs.

De plus, il n'y a pas de BF1 BF2 BF3 dans les autres données (déclarations de captures, de débarquement, de vente...) donc pour croiser les données il faut un code BFT et non BF1 BF2 BF3.

Je serais donc plus pour l'option 1.

Avec éventuellement une règle à ajouter dans l'édition de pdf de préavis pour supprimer la ligne BFT pour éviter le doublonnage @AdelineCelier ?

@louptheron @ivangabriele

@VincentAntoine VincentAntoine converted this from a draft issue Nov 22, 2024
@VincentAntoine VincentAntoine added bug Something isn't working dev labels Nov 22, 2024
@VincentAntoine VincentAntoine changed the title Les données de captures dans les préavis manuels BFT sont redondantes Les données de captures dans les préavis manuels BFT sont redondantes et sources d'erreurs Nov 22, 2024
@VincentAntoine VincentAntoine changed the title Les données de captures dans les préavis manuels BFT sont redondantes et sources d'erreurs Les données de captures dans les préavis manuels BFT sont incohérentes Nov 22, 2024
@louptheron
Copy link
Collaborator

@VincentAntoine Merci pour l'analyse !

+1 pour l'option 1 (recalcul des sommes/nombre de pièces pour le colonne BFT).

@VincentAntoine VincentAntoine self-assigned this Nov 26, 2024
@VincentAntoine
Copy link
Collaborator Author

A passer en prod après correction du front

WITH bft_reports AS (
    SELECT DISTINCT report_id
    FROM manual_prior_notifications, jsonb_array_elements(value->'catchOnboard') catch
    WHERE catch->>'species' IN ('BF1', 'BF2', 'BF3')
),

summed_bft_data AS (
    SELECT
        report_id,
        SUM(CASE WHEN catch->>'species' IN ('BF1', 'BF2', 'BF3') THEN (catch->>'nbFish')::DOUBLE PRECISION ELSE 0 END) OVER report AS nb_bft,
        SUM(CASE WHEN catch->>'species' IN ('BF1', 'BF2', 'BF3') THEN (catch->>'weight')::DOUBLE PRECISION ELSE 0 END) OVER report AS weight_bft,
        catch
    FROM manual_prior_notifications, jsonb_array_elements(value->'catchOnboard') catch
    WHERE
        report_id IN (SELECT report_id FROM bft_reports)
    WINDOW report AS (PARTITION BY report_id)
),

corrected_catches AS (
    SELECT
        report_id,
        CASE
            WHEN catch->>'species' = 'BFT' THEN jsonb_set(
                jsonb_set(
                    catch,
                    '{nbFish}',
                    nb_bft::text::jsonb
                ),
                '{weight}',
                weight_bft::text::jsonb
            )
            ELSE catch
        END AS catch
    FROM summed_bft_data
),

corrected_catches_array AS (
    SELECT
        report_id,
        jsonb_agg(catch) AS catches
    FROM corrected_catches
    GROUP BY report_id
),

corrected_values AS (
    SELECT
        pno.report_id,
        jsonb_set(
            jsonb_set(
                pno.value,
                '{catchToLand}',
                cor.catches
            ),
            '{catchOnboard}',
            cor.catches
        ) AS corrected_value
    FROM manual_prior_notifications pno
    JOIN corrected_catches_array cor
    ON pno.report_id = cor.report_id
)

UPDATE manual_prior_notifications pno
SET value = cor.corrected_value
FROM corrected_values cor
WHERE pno.report_id = cor.report_id

@AdelineCelier
Copy link
Collaborator

@VincentAntoine merci pour le récap !
L'option 1 me va, si en effet on peut retirer la ligne BFT du pdf du préavis dans le cas où il y a déjà des lignes BF1, BF2, BF3.

@VincentAntoine
Copy link
Collaborator Author

Je viens de me rendre compte qu'il est possible dans le formulaire de saisir directement BF1, BF2 ou BF3 en tant qu'espèces plutôt que de saisir BFT puis le détail par calibre à l'intérieur de BFT. Voire, si on fait vraiment n'importe quoi, de saisir BFT avec un détail par calibre ET saisir aussi BF1, BF2 BF3 en tant qu'espère séparée de BFT.
En pratique ça n'a pas l'air d'être le cas, mais le formulaire le permet.

Je crois me souvenir que l'ajout de BF1, BF2, BF3 dans le référentiel espèces a été fait pour permettre de saisir le détail par calibre dans les CR de contrôle. On n'a pas le même système dans les CR de contrôles et dans les préavis, dans les CR de contrôle on peut saisir BF1, BF2, BF3 en tant qu'espèces, ou BFT si on ne veut pas spécifier les infos par calibre (ou les deux si on fait n'importe quoi, ce qui est aussi possible).

Si on regarde les données de contrôle :

WITH bft_controls AS (
    SELECT
        id,
        is_from_poseidon,
        SUM(CASE WHEN species->>'speciesCode' = 'BF1' THEN 1 ELSE 0 END) > 0 AS has_bf1,
        SUM(CASE WHEN species->>'speciesCode' = 'BF2' THEN 1 ELSE 0 END) > 0 AS has_bf2,
        SUM(CASE WHEN species->>'speciesCode' = 'BF3' THEN 1 ELSE 0 END) > 0 AS has_bf3,
        SUM(CASE WHEN species->>'speciesCode' = 'BFT' THEN 1 ELSE 0 END) > 0 AS has_bft
    FROM mission_actions, jsonb_array_elements(species_onboard) species
    WHERE species->>'speciesCode' IN ('BF1', 'BF2', 'BF3', 'BFT')
    GROUP BY 1, 2
)

SELECT
    is_from_poseidon,
    has_bf1,
    has_bf2,
    has_bf3,
    has_bft,
    COUNT(DISTINCT id) AS nb_controls
FROM bft_controls
GROUP BY 1, 2, 3, 4, 5

image

On voit que la saisie est faite soit par calibre (BF1, BF2, BF3) soit sur BFT au global, à de rares exceptions près sur quelques contrôles issus de Poséidon où il y a à la fois BFT et BF1 / BF2 / BF3.

Mais pour que ce soit clean, l'idéal serait :

  • de mettre dans les CR de contrôle le même système que dans les préavis, c'est-à-dire que pour le code BFT la saisie se fasse par calibre puis que BFT soit automatiquement la somme des calibres (à condition que ce soit OK de rendre obligatoire la saisie par calibre pour les contrôles, à checker)
  • de supprimer BF1, BF2, BF3 du référentiel espèces, ou en tout cas ne pas les faire remonter vers les formulaires pour que la seule entrée possible pour saisir les infos thon rouge soit BFT, avec détail par calibre à l'intérieur

@AdelineCelier
Copy link
Collaborator

@VincentAntoine si je lis bien ta capture d'écran, je comprends que la plupart du temps dans MF ils saisissent en BFT et ne détaillent pas par calibre. J'ai donc peur que les obliger à saisir par calibre soit assez contraignant, je ne suis pas sûre qu'ils aient systématiquement l'info – peut-être à vérifier avec eux.
Est-ce que ce serait galère de se dire que soit ils saisissent par BFT et auquel cas les cases BF1/BF2/BF3 se grisent, soit l'inverse : ils saisissent un calibre et auquel cas ne peuvent plus rien saisir dans la case BFT ?

@VincentAntoine
Copy link
Collaborator Author

VincentAntoine commented Jan 3, 2025

Vu avec l'ops, en effet lors de contrôles de gros navires le détail par calibre n'est pas connu et il faut pouvoir saisir les données en BFT sans détail BF1 / BF2 / BF3. Donc il faut les deux modes de saisie sur les contrôles, contrairement aux préavis manuels où il s'agit forcément de petits navires sur lesquels le détail par calibre est donné.
Donc peut-être qu'on peut se contenter du fonctionnement actuel sur les contrôles et traiter uniquement le problème d'incohérence sur les préavis.

@VincentAntoine
Copy link
Collaborator Author

Donc en résumé, si OK pour vous, sur les préavis il faut :

  • Faire la modif dans le front pour que les nombres de pièces soient sommés et reportésé dans BFT à partir des infos BF1, BF2, BF3 saisies par l'utilisateur (en plus du poids pour lequel c'est déjà fait)
  • Passer la requête ci-dessus en prod pour corriger les incohérences dans les données

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working data dev
Projects
Status: In progress
3 participants