@@ -208,6 +208,7 @@ private function associateToSigners(array $data, int $fileId): array {
208208 foreach ($ data ['users ' ] as $ user ) {
209209 $ userProvidedOrder = isset ($ user ['signingOrder ' ]) ? (int )$ user ['signingOrder ' ] : null ;
210210 $ signingOrder = $ this ->sequentialSigningService ->determineSigningOrder ($ userProvidedOrder );
211+ $ signerStatus = $ user ['status ' ] ?? null ;
211212
212213 if (isset ($ user ['identifyMethods ' ])) {
213214 foreach ($ user ['identifyMethods ' ] as $ identifyMethod ) {
@@ -221,6 +222,7 @@ private function associateToSigners(array $data, int $fileId): array {
221222 fileId: $ fileId ,
222223 signingOrder: $ signingOrder ,
223224 fileStatus: $ fileStatus ,
225+ signerStatus: $ signerStatus ,
224226 );
225227 }
226228 } else {
@@ -232,6 +234,7 @@ private function associateToSigners(array $data, int $fileId): array {
232234 fileId: $ fileId ,
233235 signingOrder: $ signingOrder ,
234236 fileStatus: $ fileStatus ,
237+ signerStatus: $ signerStatus ,
235238 );
236239 }
237240 }
@@ -254,6 +257,7 @@ private function associateToSigner(
254257 int $ fileId ,
255258 int $ signingOrder = 0 ,
256259 ?int $ fileStatus = null ,
260+ ?int $ signerStatus = null ,
257261 ): SignRequestEntity {
258262 $ identifyMethodsIncances = $ this ->identifyMethod ->getByUserData ($ identifyMethods );
259263 if (empty ($ identifyMethodsIncances )) {
@@ -272,8 +276,8 @@ private function associateToSigner(
272276 $ currentStatus = $ signRequest ->getStatusEnum ();
273277
274278 if ($ isNewSignRequest || $ currentStatus === \OCA \Libresign \Enum \SignRequestStatus::DRAFT ) {
275- $ initialStatus = $ this ->determineInitialStatus ($ signingOrder , $ fileStatus );
276- $ signRequest -> setStatusEnum ( $ initialStatus );
279+ $ desiredStatus = $ this ->determineInitialStatus ($ signingOrder , $ fileStatus, $ signerStatus , $ currentStatus , $ fileId );
280+ $ this -> updateStatusIfAllowed ( $ signRequest , $ currentStatus , $ desiredStatus , $ isNewSignRequest );
277281 }
278282
279283 $ this ->saveSignRequest ($ signRequest );
@@ -288,13 +292,56 @@ private function associateToSigner(
288292 return $ signRequest ;
289293 }
290294
291- private function determineInitialStatus (int $ signingOrder , ?int $ fileStatus = null ): \OCA \Libresign \Enum \SignRequestStatus {
295+ private function updateStatusIfAllowed (
296+ SignRequestEntity $ signRequest ,
297+ \OCA \Libresign \Enum \SignRequestStatus $ currentStatus ,
298+ \OCA \Libresign \Enum \SignRequestStatus $ desiredStatus ,
299+ bool $ isNewSignRequest ,
300+ ): void {
301+ if ($ isNewSignRequest || $ this ->sequentialSigningService ->isStatusUpgrade ($ currentStatus , $ desiredStatus )) {
302+ $ signRequest ->setStatusEnum ($ desiredStatus );
303+ }
304+ }
305+
306+ private function determineInitialStatus (
307+ int $ signingOrder ,
308+ ?int $ fileStatus = null ,
309+ ?int $ signerStatus = null ,
310+ ?\OCA \Libresign \Enum \SignRequestStatus $ currentStatus = null ,
311+ ?int $ fileId = null ,
312+ ): \OCA \Libresign \Enum \SignRequestStatus {
313+ if ($ signerStatus !== null ) {
314+ $ desiredStatus = \OCA \Libresign \Enum \SignRequestStatus::from ($ signerStatus );
315+ if ($ currentStatus !== null && !$ this ->sequentialSigningService ->isStatusUpgrade ($ currentStatus , $ desiredStatus )) {
316+ return $ currentStatus ;
317+ }
318+
319+ // Validate status transition based on signing order
320+ if ($ fileId !== null ) {
321+ return $ this ->sequentialSigningService ->validateStatusByOrder ($ desiredStatus , $ signingOrder , $ fileId );
322+ }
323+
324+ return $ desiredStatus ;
325+ }
326+
292327 // If fileStatus is explicitly DRAFT (0), keep signer as DRAFT
293328 // This allows adding new signers in DRAFT mode even when file is not in DRAFT status
294329 if ($ fileStatus === FileEntity::STATUS_DRAFT ) {
295330 return \OCA \Libresign \Enum \SignRequestStatus::DRAFT ;
296331 }
297332
333+ if ($ fileStatus === FileEntity::STATUS_ABLE_TO_SIGN ) {
334+ if ($ this ->sequentialSigningService ->isOrderedNumericFlow ()) {
335+ // In ordered flow, only first signer (order 1) should be ABLE_TO_SIGN
336+ // Others remain DRAFT until their turn
337+ return $ signingOrder === 1
338+ ? \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN
339+ : \OCA \Libresign \Enum \SignRequestStatus::DRAFT ;
340+ }
341+ // In parallel flow, all can sign
342+ return \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN ;
343+ }
344+
298345 if (!$ this ->sequentialSigningService ->isOrderedNumericFlow ()) {
299346 return \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN ;
300347 }
0 commit comments