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

ETQ Usager, je veux qu'on supprime mon brouillon après 3 mois d'inactivité (correction) #11145

Open
wants to merge 19 commits into
base: main
Choose a base branch
from

Conversation

mmagn
Copy link
Contributor

@mmagn mmagn commented Dec 17, 2024

fix #10951

Un mécanisme de suppression de brouillon existait déjà, j'ai donc retiré le code ajouté en doublon récemment et modifié le comportement déjà en place pour prendre en compte les nouvelles exigences (suppression 3 mois à partir de la dernière MAJ)

  • corrige le calcul de la date d'expiration d'un dossier en brouillon qui se basait sur la date de création et non pas la date de dernière modification
  • modifie le comportement d'expiration des brouillons actuels en ne les conservant au maximum que 3 mois après leur dernière modification
  • suppression du code obsolète / doublon

Copy link

codecov bot commented Dec 17, 2024

Codecov Report

Attention: Patch coverage is 50.00000% with 19 lines in your changes missing coverage. Please review.

Project coverage is 55.93%. Comparing base (7462bc4) to head (a730b2b).

Files with missing lines Patch % Lines
app/services/expired/dossiers_deletion_service.rb 0.00% 13 Missing ⚠️
app/controllers/champs/carte_controller.rb 0.00% 2 Missing ⚠️
app/controllers/champs/champ_controller.rb 33.33% 2 Missing ⚠️
app/controllers/champs/rna_controller.rb 0.00% 1 Missing ⚠️
app/models/dossier.rb 90.00% 1 Missing ⚠️

❗ There is a different number of reports uploaded between BASE (7462bc4) and HEAD (a730b2b). Click for more details.

HEAD has 7 uploads less than BASE
Flag BASE (7462bc4) HEAD (a730b2b)
10 3
Additional details and impacted files
@@             Coverage Diff             @@
##             main   #11145       +/-   ##
===========================================
- Coverage   84.41%   55.93%   -28.49%     
===========================================
  Files        1200     1198        -2     
  Lines       26380    29657     +3277     
  Branches     4965     4350      -615     
===========================================
- Hits        22269    16588     -5681     
- Misses       4111    13069     +8958     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@mmagn mmagn force-pushed the fix-10951-2 branch 2 times, most recently from ee58fa4 to 7546723 Compare December 17, 2024 17:11
@mmagn mmagn force-pushed the fix-10951-2 branch 2 times, most recently from b5ed9f6 to c40dd53 Compare January 9, 2025 09:13
@mmagn mmagn marked this pull request as ready for review January 9, 2025 09:26
Copy link
Member

@LeSim LeSim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

classe et pas si compliqué finalement !

Copy link
Contributor

@mfo mfo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le code me semble bon, par sécurité j'ai tenté de jouer la requete en prod :

avant:

Dossier.brouillon_close_to_expiration.count
=> 36075

apres:

class Dossier < ApplicationRecord
   scope :interval_brouillon_close_to_expiration, -> do
    max_months = 3
    state_brouillon
      .visible_by_user
     .where("dossiers.updated_at + dossiers.conservation_extension + (LEAST(procedures.duree_conservation_dossiers_dans_ds, #{max_months}) * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION })
   end
Dossier.brouillon_close_to_expiration.count
=> 1464588

Que penses-tu de lisser ça dans le temps en capant avec un max par jour ex: avec un max à 50k, ça permet de lisser ca sur 28 jours (sinon on va tuer nos quota).

J'imagine que ca peut se passer dans app/services/expired/dossiers_deletion_service.rb, p-e en ajoutant un limit(ENV['TO_BE_DEFINED']) si la mm var d'env est presenté ?

login_as(user, scope: :user)
visit brouillon_dossier_path(user_old_dossier)

expect(page).to have_css('.fr-callout__title', text: 'Votre dossier a expiré', visible: true)
find('#test-user-repousser-expiration').click
expect(page).to have_no_selector('#test-user-repousser-expiration')

Timecop.freeze(simple_procedure.duree_conservation_dossiers_dans_ds.month.from_now) do
travel_to((9.months + 1.day).from_now) do
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

il est étrange ce 9.months + 1.day, ça aurait été un peu plus comprehensible ac : simple_procedure.duree_conservation_dossiers_dans_ds.month.from_now ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ouais c'est difficilement compréhensible, en fait c'est 3 (expiration initiale) + 6 (expiration prolongée) mois. je vais rendre ça plus explicite.

state_brouillon
.visible_by_user
.where("dossiers.updated_at + dossiers.conservation_extension + (LEAST(procedures.duree_conservation_dossiers_dans_ds, 3) * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION })
.where("dossiers.updated_at + dossiers.conservation_extension + (LEAST(procedures.duree_conservation_dossiers_dans_ds, #{max_months}) * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION })
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ce max_months ne serait t'il pas le même que Expired::MONTHS_BEFORE_BROUILLON_EXPIRATION ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bien vu !

@mmagn
Copy link
Contributor Author

mmagn commented Jan 16, 2025

@mfo

Que penses-tu de lisser ça dans le temps en capant avec un max par jour ex: avec un max à 50k, ça permet de lisser ca sur 28 jours (sinon on va tuer nos quota).

Oui après discussion avec Bouchra on peut même descendre à 10K dans un premier temps pour s'assurer que le support ne se fait pas déborder

user_notifications = group_by_user_email(dossiers_close_to_expiration)

dossiers_close_to_expiration.in_batches.update_all(brouillon_close_to_expiration_notice_sent_at: Time.zone.now)
user_notifications = group_by_user_email(dossiers_close_to_expiration).take(MAX_BROUILLON_DELETION_EMAILS_TO_PROCESS_PER_DAY)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'avais un doute le .take qui implique de charger/traiter les 1.4M de records, j'ai testé sur la prod : pas de timeout, par contre mon process c'est fait Killed, j'imagine on se prend un OOM.

Un petit limit haut dessus et je pense qu'on est bon.

@mmagn mmagn force-pushed the fix-10951-2 branch 2 times, most recently from 1586d81 to 9c19adf Compare January 17, 2025 14:01
@mmagn mmagn enabled auto-merge January 17, 2025 14:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ETQ Usager, je veux qu'on supprime mon brouillon après 3 mois d'inactivité
3 participants