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