github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/migration/v2_to_v3/4migration.sql (about)

     1  -- script de transition depuis une base de données v2 vers une base de données v3
     2  -- seul changement : on abandonne la liste des enfants
     3  
     4  UPDATE
     5      old_personnes
     6  SET
     7      rang_membre_asso = ''
     8  WHERE
     9      rang_membre_asso = '0';
    10  
    11  INSERT INTO personnes (id, nom, prenom, sexe, mail, adresse, code_postal, ville, tels, version_papier, pub_hiver, pub_ete, echo_rocher, rang_membre_asso, quotient_familial, pays, ville_naissance, departement_naissance, nom_jeune_fille, date_naissance, profession, etudiant, fonctionnaire, securite_sociale, cotisation, eonews, contact_groupe, fiche_sanitaire, is_temporaire)
    12  SELECT
    13      id,
    14      coalesce(nom, ''),
    15      coalesce(prenom, ''),
    16      coalesce(sexe, ''),
    17      coalesce(mail, ''),
    18      coalesce(adresse, ''),
    19      coalesce(code_postal, ''),
    20      coalesce(ville, ''),
    21      coalesce(tels, '{}'),
    22      coalesce(version_papier, FALSE),
    23      coalesce(pub_hiver, FALSE),
    24      coalesce(pub_ete, FALSE),
    25      coalesce(echo_rocher, FALSE),
    26      coalesce(rang_membre_asso, ''),
    27      coalesce(quotient_familial, 0),
    28      coalesce(pays, ''),
    29      coalesce(ville_naissance, ''),
    30      coalesce(departement_naissance, ''),
    31      coalesce(nom_jeune_fille, ''),
    32      coalesce(date_naissance, '0001-01-01'),
    33      coalesce(profession, ''),
    34      coalesce(etudiant, FALSE),
    35      coalesce(fonctionnaire, FALSE),
    36      coalesce(securite_sociale, ''),
    37      coalesce(cotisation, '{}'),
    38      coalesce(eonews, FALSE),
    39      coalesce(contact_groupe, '{}'),
    40      coalesce(fiche_sanitaire, '{}'),
    41      coalesce(is_temporaire, FALSE)
    42  FROM
    43      old_personnes;
    44  
    45  -- on supprime les factures sans participants
    46  DELETE FROM old_paiements
    47  WHERE id_facture IN (
    48          SELECT
    49              old_factures.id
    50          FROM
    51              old_factures
    52          WHERE (
    53              SELECT
    54                  count(*)
    55              FROM
    56                  old_participants
    57              WHERE
    58                  old_factures.id = old_participants.id_facture) = 0);
    59  
    60  DELETE FROM old_factures
    61  WHERE (
    62          SELECT
    63              count(*)
    64          FROM
    65              old_participants
    66          WHERE
    67              old_factures.id = old_participants.id_facture) = 0;
    68  
    69  -- on enregistre une connection fictive
    70  -- pour "marquer" comme vu
    71  
    72  INSERT INTO factures (id, id_personne, destinataires_optionnels, KEY, copies_mails, last_connection, is_confirmed, is_validated)
    73  SELECT
    74      id,
    75      id_responsable,
    76      CASE WHEN alt_dest ->> 'nom_prenom' <> '' THEN
    77          jsonb_build_array(alt_dest - '__actif__' - 'mail')
    78      ELSE
    79          '[]'
    80      END,
    81      KEY,
    82      coalesce(copies_mails, '{}'),
    83      now(),
    84      TRUE,
    85      TRUE
    86  FROM
    87      old_factures;
    88  
    89  ALTER TABLE old_camps RENAME COLUMN id_js TO numero_js;
    90  
    91  -- cleanup des groupes liés aux séjours simples
    92  UPDATE
    93      old_camps
    94  SET
    95      groupes = NULL
    96  WHERE
    97      old_camps.inscription_simple = TRUE;
    98  
    99  UPDATE
   100      old_camps
   101  SET
   102      schema_paiement = 'total'
   103  WHERE
   104      schema_paiement = ''
   105      OR schema_paiement IS NULL;
   106  
   107  INSERT INTO camps (id, lieu, nom, prix, nb_places, PASSWORD, ouvert, nb_places_reservees, numero_js, need_equilibre_gf, age_min, age_max, options, date_debut, date_fin, liste_vetements, schema_paiement, joomeo_album_id, envois, lien_compta, option_prix, inscription_simple)
   108  SELECT
   109      id,
   110      lieu,
   111      nom,
   112      prix,
   113      nb_places,
   114      PASSWORD,
   115      ouvert,
   116      nb_places_reservees,
   117      coalesce(numero_js, ''),
   118      need_equilibre_gf,
   119      coalesce(age_min, 0),
   120      coalesce(age_max, 0),
   121      options,
   122      date_debut,
   123      date_fin,
   124      coalesce(liste_vetements, '{}'),
   125      coalesce(schema_paiement, ''),
   126      coalesce(joomeo_album_id, ''),
   127      envois,
   128      coalesce(lien_compta, ''),
   129      option_prix,
   130      coalesce(inscription_simple, FALSE)
   131  FROM
   132      old_camps;
   133  
   134  -- on sépare le contenu html de la lettre directeur
   135  -- et on utilise toujours les coordonnées du directeur
   136  -- pour les camps importés
   137  
   138  INSERT INTO lettredirecteurs (id_camp, html, use_coord_centre, show_adresse_postale, color_coord)
   139  SELECT
   140      id,
   141      coalesce(lettre_directeur ->> 'html', ''),
   142      FALSE,
   143      FALSE,
   144      ''
   145  FROM
   146      old_camps
   147  WHERE
   148      coalesce(lettre_directeur ->> 'html', '') <> '';
   149  
   150  -- on a besoin de lier les anciens aux ids des nouveaux
   151  CREATE TABLE tmp_groupes (
   152      id serial,
   153      id_camp integer,
   154      old_id varchar,
   155      nom varchar NOT NULL,
   156      plage jsonb NOT NULL,
   157      need_aisance_aquatique boolean NOT NULL
   158  );
   159  
   160  -- on transforme les groupes en gardant la correspondances des ids
   161  INSERT INTO tmp_groupes (id_camp, old_id, nom, plage, need_aisance_aquatique)
   162  SELECT
   163      old_camps.id,
   164      grs.key,
   165      grs.value ->> 'nom',
   166      jsonb_build_object('from', grs.value -> 'date_debut', 'to', grs.value -> 'date_fin'),
   167      coalesce(grs.value ->> 'need_aisance_aquatique', 'false') = 'true'
   168  FROM
   169      old_camps
   170      JOIN LATERAL jsonb_each(old_camps.groupes) AS grs ON TRUE
   171  WHERE ((coalesce(old_camps.inscription_simple, FALSE) = FALSE)
   172      AND (old_camps.groupes IS NOT NULL)
   173      AND (jsonb_typeof(old_camps.groupes) <> 'null')
   174      AND (grs.value ->> 'nom' <> 'null'));
   175  
   176  -- On peut maintenant transférer les groupes vers la table définitive ...
   177  INSERT INTO groupes (id, id_camp, nom, plage, couleur)
   178  SELECT
   179      id,
   180      id_camp,
   181      nom,
   182      plage,
   183      ''
   184  FROM
   185      tmp_groupes;
   186  
   187  -- ... et ajouter les contraintes 'aisance_aquatique'
   188  INSERT INTO groupe_contraintes (id_groupe, id_contrainte)
   189  SELECT
   190      id,
   191      (
   192          SELECT
   193              id
   194          FROM
   195              contraintes
   196          WHERE
   197              builtin = 'test_nautique')
   198  FROM
   199      tmp_groupes
   200  WHERE
   201      need_aisance_aquatique;
   202  
   203  -- On copie les demandes de test nautique des séjours
   204  INSERT INTO camp_contraintes (id_camp, id_contrainte)
   205  SELECT
   206      id,
   207      (
   208          SELECT
   209              id
   210          FROM
   211              contraintes
   212          WHERE
   213              builtin = 'test_nautique')
   214  FROM
   215      old_camps
   216  WHERE
   217      need_aisance_aquatique;
   218  
   219  -- copie des inscriptions (sans la case autorisation_photos)
   220  INSERT INTO inscriptions (info, date_heure, copies_mails, responsable, participants)
   221  SELECT
   222      info,
   223      date_heure,
   224      copies_mails,
   225      -- on agrège les champs du responsable légal
   226      jsonb_build_object('lienid', lienid, 'nom', nom, 'prenom', prenom, 'sexe', sexe, 'mail', mail, 'adresse', adresse, 'code_postal', code_postal, 'ville', ville, 'tels', tels, 'date_naissance', to_char(date_naissance::date, 'YYYY-MM-DD'), 'pays', pays),
   227      -- on nettoie les vieux champs
   228      (
   229          SELECT
   230              jsonb_agg(value - 'date_heure' - 'info' - 'autorisation_photos')
   231          FROM jsonb_array_elements(participants))
   232  FROM
   233      old_inscriptions
   234  WHERE
   235      date_heure::date > '0001-01-01';
   236  
   237  -- copie des inscrits et attente
   238  INSERT INTO participants (id, id_camp, id_personne, id_facture, liste_attente, remises, option_prix, options, date_heure)
   239  SELECT
   240      id,
   241      id_camp,
   242      id_personne,
   243      id_facture,
   244      jsonb_build_object('statut', CASE WHEN ROLE = '_attente' THEN
   245              1
   246          WHEN ROLE = '_attente_reponse' THEN
   247              2
   248          ELSE
   249              0
   250          END, 'raison', raison_attente),
   251      coalesce(remises, '{}'),
   252      coalesce(option_prix, '{}'),
   253      coalesce(options, '{}'),
   254      date_heure
   255  FROM
   256      old_participants
   257  WHERE (old_participants.role IN ('_campeur', '_attente', '_attente_reponse'))
   258      AND (
   259          SELECT
   260              coalesce(inscription_simple, FALSE)
   261          FROM
   262              old_camps
   263          WHERE
   264              old_camps.id = old_participants.id_camp) = FALSE;
   265  
   266  -- modification de l'option JOUR
   267  CREATE OR REPLACE FUNCTION compute_jours (jours jsonb, date_debut timestamp)
   268      RETURNS integer[]
   269      AS $$
   270  DECLARE
   271      plage_from timestamp;
   272      plage_to timestamp;
   273      index_from int;
   274      index_to int;
   275  BEGIN
   276      IF jours IS NULL THEN
   277          RETURN '{}';
   278      END IF;
   279      IF coalesce(jours ->> 'from', '') = '' OR coalesce(jours ->> 'to', '') = '' THEN
   280          RETURN '{}';
   281      END IF;
   282      plage_from := to_date(jours ->> 'from', 'YYYY-MM-DD"T"HH24:MI:SS"Z"');
   283      plage_to := to_date(jours ->> 'to', 'YYYY-MM-DD"T"HH24:MI:SS"Z"');
   284      IF coalesce(plage_from, '0001-01-01T00:00:00Z') = '0001-01-01T00:00:00Z' OR coalesce(plage_to, '0001-01-01T00:00:00Z') = '0001-01-01T00:00:00Z' THEN
   285          RETURN '{}';
   286      END IF;
   287      index_from := extract(DAYS FROM plage_from - date_debut);
   288      index_to := extract(DAYS FROM plage_to - date_debut);
   289      RETURN ARRAY (
   290          SELECT
   291              a.n
   292          FROM
   293              generate_series(index_from, index_to) AS a (n));
   294  END;
   295  $$
   296  LANGUAGE plpgsql;
   297  
   298  UPDATE
   299      participants
   300  SET
   301      option_prix = jsonb_set(participants.option_prix, '{jour}', to_jsonb (compute_jours (participants.option_prix -> 'jour', camps.date_debut)))
   302  FROM
   303      camps
   304  WHERE
   305      participants.id_camp = camps.id;
   306  
   307  DROP FUNCTION compute_jours (jours jsonb, date_debut timestamp);
   308  
   309  -- copie des groupes
   310  INSERT INTO groupe_participants (id_participant, id_groupe, id_camp, manuel)
   311  SELECT
   312      id,
   313      -- on trouve le groupe, possiblement null
   314      (
   315          SELECT
   316              id FROM tmp_groupes
   317          WHERE
   318              tmp_groupes.id_camp = old_participants.id_camp
   319              AND tmp_groupes.old_id = old_participants.id_groupe) AS idG,
   320  id_camp,
   321  FALSE -- automatique par défaut
   322  FROM
   323      old_participants
   324  WHERE
   325      old_participants.id = ANY (
   326          SELECT
   327              id
   328          FROM
   329              participants)
   330      AND (
   331          SELECT
   332              id
   333          FROM
   334              tmp_groupes
   335          WHERE
   336              tmp_groupes.id_camp = old_participants.id_camp
   337              AND tmp_groupes.old_id = old_participants.id_groupe) IS NOT NULL;
   338  
   339  -- copie des participants simples :
   340  INSERT INTO participantsimples (id_personne, id_camp, date_heure, info)
   341  SELECT
   342      id_personne,
   343      id_camp,
   344      date_heure,
   345      coalesce(info, '')
   346  FROM
   347      old_participants
   348  WHERE (
   349      SELECT
   350          inscription_simple
   351      FROM
   352          camps
   353      WHERE
   354          camps.id = old_participants.id_camp) = TRUE
   355      AND old_participants.role IN ('_campeur', '_attente', '_attente_reponse');
   356  
   357  -- copie des équipiers
   358  UPDATE
   359      old_participants
   360  SET
   361      appro = ''
   362  WHERE
   363      appro = 'aucun'
   364      OR appro = 'null';
   365  
   366  UPDATE
   367      old_participants
   368  SET
   369      diplome = ''
   370  WHERE
   371      diplome = 'null';
   372  
   373  INSERT INTO equipiers (id, id_camp, id_personne, roles, diplome, appro, presence, invitation_equipier, charte)
   374  SELECT
   375      id,
   376      id_camp,
   377      id_personne,
   378      ARRAY[ROLE],
   379      coalesce(diplome, ''),
   380      coalesce(appro, ''),
   381      coalesce(presence, '{}'),
   382      coalesce(invitation_equipier, 0),
   383      0
   384  FROM
   385      old_participants
   386  WHERE
   387      NOT ROLE IN ('_campeur', '_attente', '_attente_reponse');
   388  
   389  INSERT INTO structureaides (id, nom, immatriculation, adresse, code_postal, ville, telephone, info)
   390  SELECT
   391      id,
   392      coalesce(nom, ''),
   393      coalesce(immatriculation, ''),
   394      coalesce(adresse, ''),
   395      coalesce(code_postal, ''),
   396      coalesce(ville, ''),
   397      coalesce(telephone, ''),
   398      coalesce(info, '')
   399  FROM
   400      old_structures_aides;
   401  
   402  -- on ignore les aides sur les camps simples et les équipiers
   403  INSERT INTO aides (id, id_structureaide, id_participant, valeur, valide, par_jour, nb_jours_max)
   404  SELECT
   405      old_aides.id,
   406      old_aides.id_structure,
   407      old_aides.id_participant,
   408      old_aides.valeur,
   409      coalesce(old_aides.valide, TRUE),
   410      coalesce(old_aides.par_jour, FALSE),
   411      coalesce(old_aides.nb_jours_max, 0)
   412  FROM
   413      old_aides
   414      JOIN old_participants ON old_aides.id_participant = old_participants.id
   415      JOIN old_camps ON old_participants.id_camp = old_camps.id
   416  WHERE (coalesce(old_camps.inscription_simple, FALSE) = FALSE)
   417      AND old_participants.role IN ('_campeur', '_attente', '_attente_reponse');
   418  
   419  -- on nettoie les documents sans contenu
   420  DELETE FROM old_documents
   421  WHERE content IS NULL;
   422  
   423  -- on copie les meta données ...
   424  INSERT INTO documents (id, taille, nom_client, description, date_heure_modif)
   425  SELECT
   426      id,
   427      taille,
   428      nom_client,
   429      description,
   430      date_heure_modif
   431  FROM
   432      old_documents;
   433  
   434  -- ... puis le contenu
   435  INSERT INTO contenu_documents (id_document, contenu, miniature)
   436  SELECT
   437      id,
   438      content,
   439      miniature
   440  FROM
   441      old_documents;
   442  
   443  -- on sépare suivant les targets
   444  INSERT INTO document_aides (id_document, id_aide)
   445  SELECT
   446      id,
   447      id_target
   448  FROM
   449      old_documents
   450  WHERE
   451      target = 'Ai';
   452  
   453  INSERT INTO document_camps (id_document, id_camp, is_lettre)
   454  SELECT
   455      id,
   456      id_target,
   457      target = 'Le'
   458  FROM
   459      old_documents
   460  WHERE
   461      target = 'Le'
   462      OR target = 'Pj';
   463  
   464  INSERT INTO document_personnes (id_document, id_personne, id_contrainte)
   465  SELECT
   466      id,
   467      id_target,
   468      (
   469          SELECT
   470              id
   471          FROM
   472              contraintes
   473          WHERE
   474              builtin = categorie)
   475  FROM
   476      old_documents
   477  WHERE
   478      target = 'Pe';
   479  
   480  -- on nettoie les description "undefined" qui viennent du frontend
   481  UPDATE
   482      documents
   483  SET
   484      description = ''
   485  WHERE
   486      description = 'undefined';
   487  
   488  INSERT INTO dons (id, id_personne, valeur, mode_paiement, date_reception, date_merci, personne_merci, recu_emis, infos)
   489  SELECT
   490      id,
   491      id_donateur,
   492      valeur,
   493      coalesce(mode_paiement, ''),
   494      coalesce(date_reception, '0001-01-01'),
   495      coalesce(date_merci, '0001-01-01'),
   496      coalesce(personne_merci, ''),
   497      coalesce(recu_emis, '0001-01-01'),
   498      coalesce(infos, '{}')
   499  FROM
   500      old_dons;
   501  
   502  INSERT INTO paiements (id, id_facture, is_acompte, is_remboursement, in_bordereau, label_payeur, nom_banque, mode_paiement, numero, valeur, is_invalide, date_reglement, details)
   503  SELECT
   504      id,
   505      id_facture,
   506      coalesce(is_acompte, FALSE),
   507      coalesce(is_remboursement, FALSE),
   508      coalesce(in_bordereau, '0001-01-01'),
   509      coalesce(label_payeur, ''),
   510      coalesce(nom_banque, ''),
   511      coalesce(mode_paiement, ''),
   512      coalesce(numero, ''),
   513      coalesce(valeur, 0),
   514      coalesce(is_invalide, FALSE),
   515      coalesce(date_reglement, '0001-01-01'),
   516      CASE WHEN date_encaissement > '0001-01-01' THEN
   517          'encaissement: ' || to_char(date_encaissement, 'DD/MM/YYYY')
   518      ELSE
   519          ''
   520      END
   521  FROM
   522      old_paiements;
   523  
   524  -- transformation du champ info
   525  -- (1) MResponsable
   526  -- (2) MCentre
   527  -- (3) MAccuseReception
   528  -- (4) MFacture
   529  -- (5) MDocuments
   530  -- (6) MFactureAquittee
   531  -- (7) MAttestationPresence
   532  -- (8) MSondage
   533  -- (9) MInscription
   534  -- (10) MPlaceLiberee
   535  
   536  INSERT INTO messages (id_facture, kind, created, modified, vu)
   537  SELECT
   538      id,
   539      m_responsable (),
   540      CASE WHEN ( SELECT DISTINCT
   541              (date_heure)::date
   542          FROM
   543              old_participants
   544          WHERE
   545              id_facture = old_factures.id
   546          ORDER BY
   547              date_heure
   548          LIMIT 1) > '0001-01-01' THEN
   549  ( SELECT DISTINCT
   550          date_heure
   551      FROM
   552          old_participants
   553      WHERE
   554          id_facture = old_factures.id
   555      ORDER BY
   556          date_heure
   557      LIMIT 1)
   558  ELSE
   559      (
   560          SELECT
   561              date_debut
   562          FROM
   563              old_camps
   564          WHERE
   565              old_camps.id = (
   566                  SELECT
   567                      id_camp
   568                  FROM
   569                      old_participants
   570                  WHERE
   571                      old_participants.id_facture = old_factures.id
   572                  LIMIT 1))
   573      END,
   574      NULL,
   575      TRUE
   576  FROM
   577      old_factures
   578  WHERE
   579      coalesce(info, '') <> '';
   580  
   581  -- comme il n'y qu'une info par facture, on se sert de la facture
   582  -- pour retrouver le message
   583  
   584  INSERT INTO message_messages (id_message, contenu, guard_kind)
   585  SELECT
   586      messages.id,
   587      old_factures.info,
   588      m_responsable ()
   589  FROM
   590      messages
   591      JOIN old_factures ON old_factures.id = messages.id_facture
   592  WHERE
   593      messages.kind = m_responsable ();
   594  
   595  -- champ etat.accuse reception
   596  INSERT INTO messages (id_facture, kind, created, modified, vu)
   597  SELECT
   598      id,
   599      m_accuse_reception (),
   600      (etat ->> 'accuse_reception')::timestamp WITH time zone AS ti,
   601      NULL,
   602      TRUE
   603  FROM
   604      old_factures
   605  WHERE
   606      coalesce(etat ->> 'accuse_reception', '0001-01-01T00:00:00Z') <> '0001-01-01T00:00:00Z'
   607  ORDER BY
   608      ti;
   609  
   610  -- champ etat.facture
   611  INSERT INTO messages (id_facture, kind, created, modified, vu)
   612  SELECT
   613      id,
   614      m_facture (),
   615      (etat ->> 'facture')::timestamp AS ti,
   616      NULL,
   617      TRUE
   618  FROM
   619      old_factures
   620  WHERE
   621      coalesce(etat ->> 'facture', '0001-01-01T00:00:00Z') <> '0001-01-01T00:00:00Z'
   622  ORDER BY
   623      ti;
   624  
   625  -- champ etat.facture_acquittee
   626  INSERT INTO messages (id_facture, kind, created, modified, vu)
   627  SELECT
   628      id,
   629      m_facture_acquittee (),
   630      (etat ->> 'facture_acquittee')::timestamp AS ti,
   631      NULL,
   632      TRUE
   633  FROM
   634      old_factures
   635  WHERE
   636      coalesce(etat ->> 'facture_acquittee', '0001-01-01T00:00:00Z') <> '0001-01-01T00:00:00Z'
   637  ORDER BY
   638      ti;
   639  
   640  -- champ etat.attestation_presence
   641  INSERT INTO messages (id_facture, kind, created, modified, vu)
   642  SELECT
   643      id,
   644      m_attestation_presence (),
   645      (etat ->> 'attestation_presence')::timestamp AS ti,
   646      NULL,
   647      TRUE
   648  FROM
   649      old_factures
   650  WHERE
   651      coalesce(etat ->> 'attestation_presence', '0001-01-01T00:00:00Z') <> '0001-01-01T00:00:00Z'
   652  ORDER BY
   653      ti;
   654  
   655  -- toutes les attestations ont été envoyées par mail
   656  INSERT INTO message_attestations (id_message, distribution, guard_kind)
   657  SELECT
   658      id,
   659      d_mail (),
   660      kind
   661  FROM
   662      messages
   663  WHERE
   664      kind = m_attestation_presence ()
   665      OR kind = m_facture_acquittee ();
   666  
   667  -- table temporaire
   668  CREATE TABLE tmp_messages_camps (
   669      id_message integer,
   670      -- target to fill
   671      id_facture integer,
   672      id_camp integer,
   673      created timestamp
   674  );
   675  
   676  INSERT INTO tmp_messages_camps (id_facture, id_camp, created)
   677  SELECT
   678      old_factures.id,
   679      docs.key::int,
   680      (docs.value::text)::timestamp
   681  FROM
   682      old_factures
   683      JOIN LATERAL jsonb_each(old_factures.etat -> 'documents') AS docs ON TRUE
   684  WHERE
   685      coalesce(old_factures.etat -> 'documents', 'null') <> 'null'
   686      AND coalesce(docs.value, 'null') <> 'null'
   687      AND ((docs.value)::text)::date <> '0001-01-01';
   688  
   689  -- on pré-calcule les ids messages et on les sauvegarde dans la table temporaire
   690  UPDATE
   691      tmp_messages_camps
   692  SET
   693      id_message = nextval(pg_get_serial_sequence('messages', 'id'));
   694  
   695  -- pour éviter que tous les anciens messages camps soit dans un groupe
   696  -- on ajoute une petite variation dans le temps
   697  
   698  INSERT INTO messages (id, id_facture, kind, created, modified, vu)
   699  SELECT
   700      id_message,
   701      id_facture,
   702      m_documents (),
   703      created + id_camp * interval '1 second',
   704      NULL,
   705      TRUE
   706  FROM
   707      tmp_messages_camps;
   708  
   709  INSERT INTO message_documents (id_message, id_camp, guardKind)
   710  SELECT
   711      id_message,
   712      id_camp,
   713      m_documents ()
   714  FROM
   715      tmp_messages_camps;
   716  
   717  -- cleanup
   718  DROP TABLE tmp_messages_camps;
   719  
   720  -- type 'id'
   721  INSERT INTO users (label, mdp, is_admin, modules)
   722  SELECT
   723      label,
   724      mdp,
   725      is_admin,
   726      modules
   727  FROM
   728      old_users;
   729  
   730  -- convertion des dates stockées en JSON comme des time
   731  CREATE FUNCTION time_to_date (text)
   732      RETURNS jsonb
   733      AS $$
   734      SELECT
   735          to_jsonb (to_date($1, 'YYYY-MM-DD"T"HH24:MI:SS"Z"')::date)
   736  $$
   737  LANGUAGE SQL;
   738  
   739  UPDATE
   740      camps
   741  SET
   742      option_prix = jsonb_set(option_prix, '{semaine, plage_1, from}', time_to_date (option_prix -> 'semaine' -> 'plage_1' ->> 'from'))
   743  WHERE
   744      option_prix -> 'semaine' -> 'plage_1' -> 'from' IS NOT NULL;
   745  
   746  UPDATE
   747      camps
   748  SET
   749      option_prix = jsonb_set(option_prix, '{semaine, plage_1, to}', time_to_date (option_prix -> 'semaine' -> 'plage_1' ->> 'to'))
   750  WHERE
   751      option_prix -> 'semaine' -> 'plage_1' -> 'to' IS NOT NULL;
   752  
   753  UPDATE
   754      camps
   755  SET
   756      option_prix = jsonb_set(option_prix, '{semaine, plage_2, from}', time_to_date (option_prix -> 'semaine' -> 'plage_2' ->> 'from'))
   757  WHERE
   758      option_prix -> 'semaine' -> 'plage_2' -> 'from' IS NOT NULL;
   759  
   760  UPDATE
   761      camps
   762  SET
   763      option_prix = jsonb_set(option_prix, '{semaine, plage_2, to}', time_to_date (option_prix -> 'semaine' -> 'plage_2' ->> 'to'))
   764  WHERE
   765      option_prix -> 'semaine' -> 'plage_2' -> 'to' IS NOT NULL;
   766  
   767  UPDATE
   768      equipiers
   769  SET
   770      presence = jsonb_set(presence, '{from}', time_to_date (presence ->> 'from'))
   771  WHERE
   772      presence -> 'from' IS NOT NULL;
   773  
   774  UPDATE
   775      equipiers
   776  SET
   777      presence = jsonb_set(presence, '{to}', time_to_date (presence ->> 'to'))
   778  WHERE
   779      presence -> 'to' IS NOT NULL;
   780  
   781  UPDATE
   782      groupes
   783  SET
   784      plage = jsonb_set(plage, '{from}', time_to_date (plage ->> 'from'))
   785  WHERE
   786      plage -> 'from' IS NOT NULL;
   787  
   788  UPDATE
   789      groupes
   790  SET
   791      plage = jsonb_set(plage, '{to}', time_to_date (plage ->> 'to'))
   792  WHERE
   793      plage -> 'to' IS NOT NULL;
   794  
   795  UPDATE
   796      inscriptions
   797  SET
   798      responsable = jsonb_set(responsable, '{date_naissance}', time_to_date (responsable ->> 'date_naissance'))
   799  WHERE
   800      responsable -> 'date_naissance' IS NOT NULL;
   801  
   802  UPDATE
   803      inscriptions
   804  SET
   805      participants = (
   806          SELECT
   807              jsonb_agg(jsonb_set(value, '{date_naissance}', time_to_date (value ->> 'date_naissance')))
   808          FROM
   809              jsonb_array_elements(participants));
   810  
   811  DROP FUNCTION time_to_date (text);
   812