18
18
use APP \decision \types \Accept ;
19
19
use APP \decision \types \SkipExternalReview ;
20
20
use APP \facades \Repo ;
21
+ use APP \issue \Issue ;
22
+ use APP \publication \Publication ;
21
23
use APP \submission \Submission ;
22
24
use Illuminate \Support \Collection ;
25
+ use Illuminate \Support \Enumerable ;
23
26
use PKP \db \DAORegistry ;
24
27
use PKP \decision \DecisionType ;
25
28
use PKP \decision \types \BackFromCopyediting ;
41
44
42
45
class Schema extends \PKP \submission \maps \Schema
43
46
{
47
+ /** Issues associated with submissions. Keyed by submission ID. */
48
+ public Enumerable $ submissionsIssues ;
49
+
44
50
/**
45
51
* @copydoc \PKP\submission\maps\Schema::mapByProperties()
46
52
*/
@@ -70,6 +76,10 @@ protected function mapByProperties(array $props, Submission $submission, bool|Co
70
76
$ locales [] = $ primaryLocale ;
71
77
}
72
78
79
+ if (in_array ('issueToBePublished ' , $ props )) {
80
+ $ output ['issueToBePublished ' ] = $ this ->getPropertyIssueToBePublished ($ submission ->getData ('publications ' ));
81
+ }
82
+
73
83
$ output = $ this ->schemaService ->addMissingMultilingualValues ($ this ->schemaService ::SCHEMA_SUBMISSION , $ output , $ locales );
74
84
75
85
ksort ($ output );
@@ -81,10 +91,10 @@ protected function appSpecificProps(): array
81
91
{
82
92
return [
83
93
'scheduledIn ' ,
94
+ 'issueToBePublished '
84
95
];
85
96
}
86
97
87
-
88
98
/**
89
99
* Gets the Editorial decisions available to editors for a given stage of a submission
90
100
*
@@ -165,4 +175,66 @@ protected function getAvailableEditorialDecisions(int $stageId, Submission $subm
165
175
166
176
return $ decisionTypes ;
167
177
}
178
+
179
+ /**
180
+ * Get issues associated with submissions. Results are keyed by submission ID.
181
+ *
182
+ * @return Enumerable<int, Issue[]>
183
+ */
184
+ protected function getSubmissionsIssues (Enumerable $ submissions ): Enumerable
185
+ {
186
+ $ submissionIds = $ submissions ->map (fn (Submission $ submission ) => $ submission ->getId ())->all ();
187
+ $ publications = Repo::publication ()->getCollector ()->filterBySubmissionIds ($ submissionIds )->getMany ();
188
+ $ issueIds = $ publications ->map (fn (Publication $ publication ) => $ publication ->getData ('issueId ' ))
189
+ ->unique ()
190
+ ->all ();
191
+
192
+ $ issues = Repo::issue ()->getCollector ()
193
+ ->filterByContextIds ([$ this ->context ->getId ()])
194
+ ->filterByIssueIds ($ issueIds )
195
+ ->getMany ();
196
+
197
+ $ issueIdsGroupedBySubmission = $ publications ->groupBy (fn (Publication $ publication ) => $ publication ->getData ('submissionId ' ))
198
+ ->map (fn ($ entry ) => $ entry ->map (fn (Publication $ publication ) => $ publication ->getData ('issueId ' )));
199
+
200
+ return $ submissions ->mapWithKeys (function ($ submission ) use (&$ issues , $ publications , $ issueIdsGroupedBySubmission ) {
201
+ $ submissionIssueIds = $ issueIdsGroupedBySubmission ->get ($ submission ->getId ())->all ();
202
+ return [$ submission ->getId () => $ issues ->filter (fn ($ issue ) => in_array ($ issue ->getId (), $ submissionIssueIds ))];
203
+ });
204
+ }
205
+
206
+ /**
207
+ * Get details about the issue a submission will be published in.
208
+ */
209
+ protected function getPropertyIssueToBePublished (Enumerable $ publications ): ?array
210
+ {
211
+ /** @var Publication $latestScheduledPublication */
212
+ $ latestScheduledPublication = $ publications
213
+ ->filter (fn ($ publication ) => $ publication ->getData ('status ' ) === Submission::STATUS_SCHEDULED )
214
+ ->sortByDesc (fn (Publication $ publication ) => $ publication ->getData ('version ' ))
215
+ ->first ();
216
+
217
+ if ($ latestScheduledPublication ) {
218
+ $ submissionId = $ latestScheduledPublication ->getData ('submissionId ' );
219
+ $ issueId = $ latestScheduledPublication ->getData ('issueId ' );
220
+ $ issue = $ this ->submissionsIssues ->get ($ submissionId , collect ())->get ($ issueId );
221
+
222
+ return $ issue ? [
223
+ 'id ' => $ issueId ,
224
+ 'label ' => $ issue ->getIssueIdentification ()
225
+ ] : null ;
226
+ }
227
+
228
+ return null ;
229
+ }
230
+
231
+ /**
232
+ * Populate class properties specific to OJS.
233
+ */
234
+ protected function addAppSpecificData (Enumerable $ submissions ): void
235
+ {
236
+ if (empty ($ this ->submissionsIssues )) {
237
+ $ this ->submissionsIssues = $ this ->getSubmissionsIssues ($ submissions );
238
+ }
239
+ }
168
240
}
0 commit comments