@@ -91,6 +91,88 @@ public function it_converts_entry_date_field_in_entries_when_app_timezone_is_utc
9191 $ this ->it_converts_entry_date_field_in_entries ();
9292 }
9393
94+ #[Test]
95+ public function it_skips_localized_entries_that_inherit_date_from_origin ()
96+ {
97+ $ this ->setSites ([
98+ 'en ' => ['url ' => '/ ' , 'locale ' => 'en_US ' , 'name ' => 'English ' ],
99+ 'fr ' => ['url ' => '/fr/ ' , 'locale ' => 'fr_FR ' , 'name ' => 'French ' ],
100+ 'it ' => ['url ' => '/it/ ' , 'locale ' => 'it_IT ' , 'name ' => 'Italian ' ],
101+ ]);
102+
103+ $ collection = tap (Collection::make ('articles ' )->dated (true )->sites (['en ' , 'fr ' , 'it ' ]))->save ();
104+
105+ $ collection ->entryBlueprint ()->setContents ([
106+ 'fields ' => [
107+ ['handle ' => 'date ' , 'field ' => ['type ' => 'date ' , 'time_enabled ' => true ]],
108+ ],
109+ ])->save ();
110+
111+ $ origin = Entry::make ()->id ('origin ' )->locale ('en ' )->collection ('articles ' )->date ('2025-01-01-1200 ' );
112+ $ origin ->save ();
113+
114+ $ french = Entry::make ()->id ('fr-entry ' )->locale ('fr ' )->collection ('articles ' )->origin ($ origin );
115+ $ french ->save ();
116+
117+ $ italian = Entry::make ()->id ('it-entry ' )->locale ('it ' )->collection ('articles ' )->origin ($ origin );
118+ $ italian ->save ();
119+
120+ // All entries should have the same date before migration
121+ $ this ->assertEquals ('2025-01-01T12:00:00+00:00 ' , $ origin ->date ()->toIso8601String ());
122+ $ this ->assertEquals ('2025-01-01T12:00:00+00:00 ' , $ french ->date ()->toIso8601String ());
123+ $ this ->assertEquals ('2025-01-01T12:00:00+00:00 ' , $ italian ->date ()->toIso8601String ());
124+
125+ $ this ->migrateDatesToUtc ();
126+
127+ $ origin = Entry::find ('origin ' );
128+ $ french = Entry::find ('fr-entry ' );
129+ $ italian = Entry::find ('it-entry ' );
130+
131+ // Origin should be migrated
132+ $ this ->assertEquals ('2025-01-01T17:00:00+00:00 ' , $ origin ->date ()->toIso8601String ());
133+
134+ // Localized entries should still have the same date as origin (inherited)
135+ $ this ->assertEquals ('2025-01-01T17:00:00+00:00 ' , $ french ->date ()->toIso8601String ());
136+ $ this ->assertEquals ('2025-01-01T17:00:00+00:00 ' , $ italian ->date ()->toIso8601String ());
137+
138+ $ this ->assertFalse ($ french ->hasExplicitDate ());
139+ $ this ->assertFalse ($ italian ->hasExplicitDate ());
140+ }
141+
142+ #[Test]
143+ public function it_migrates_localized_entries_that_have_their_own_date ()
144+ {
145+ $ this ->setSites ([
146+ 'en ' => ['url ' => '/ ' , 'locale ' => 'en_US ' , 'name ' => 'English ' ],
147+ 'fr ' => ['url ' => '/fr/ ' , 'locale ' => 'fr_FR ' , 'name ' => 'French ' ],
148+ ]);
149+
150+ $ collection = tap (Collection::make ('articles ' )->dated (true )->sites (['en ' , 'fr ' ]))->save ();
151+
152+ $ collection ->entryBlueprint ()->setContents ([
153+ 'fields ' => [
154+ ['handle ' => 'date ' , 'field ' => ['type ' => 'date ' , 'time_enabled ' => true ]],
155+ ],
156+ ])->save ();
157+
158+ $ origin = Entry::make ()->id ('origin ' )->locale ('en ' )->collection ('articles ' )->date ('2025-01-01-1200 ' );
159+ $ origin ->save ();
160+
161+ $ french = Entry::make ()->id ('fr-entry ' )->locale ('fr ' )->collection ('articles ' )->origin ($ origin )->date ('2025-01-02-1400 ' );
162+ $ french ->save ();
163+
164+ $ this ->assertTrue ($ french ->hasExplicitDate ());
165+
166+ $ this ->migrateDatesToUtc ();
167+
168+ $ origin = Entry::find ('origin ' );
169+ $ french = Entry::find ('fr-entry ' );
170+
171+ // Both should be migrated
172+ $ this ->assertEquals ('2025-01-01T17:00:00+00:00 ' , $ origin ->date ()->toIso8601String ());
173+ $ this ->assertEquals ('2025-01-02T19:00:00+00:00 ' , $ french ->date ()->toIso8601String ());
174+ }
175+
94176 #[Test]
95177 #[DataProvider('dateFieldsProvider ' )]
96178 public function it_converts_date_fields_in_terms (string $ fieldHandle , array $ field , $ original , $ expected )
0 commit comments