@@ -54,6 +54,8 @@ public function __construct(
5454 protected SequentialSigningService $ sequentialSigningService ,
5555 protected IAppConfig $ appConfig ,
5656 protected IEventDispatcher $ eventDispatcher ,
57+ protected FileStatusService $ fileStatusService ,
58+ protected SignRequestStatusService $ signRequestStatusService ,
5759 ) {
5860 }
5961
@@ -76,7 +78,7 @@ public function save(array $data): FileEntity {
7678 public function saveFile (array $ data ): FileEntity {
7779 if (!empty ($ data ['uuid ' ])) {
7880 $ file = $ this ->fileMapper ->getByUuid ($ data ['uuid ' ]);
79- return $ this ->updateStatus ($ file , $ data ['status ' ] ?? 0 );
81+ return $ this ->fileStatusService -> updateFileStatusIfUpgrade ($ file , $ data ['status ' ] ?? 0 );
8082 }
8183 $ fileId = null ;
8284 if (isset ($ data ['file ' ]['fileNode ' ]) && $ data ['file ' ]['fileNode ' ] instanceof Node) {
@@ -87,7 +89,7 @@ public function saveFile(array $data): FileEntity {
8789 if (!is_null ($ fileId )) {
8890 try {
8991 $ file = $ this ->fileMapper ->getByFileId ($ fileId );
90- return $ this ->updateStatus ($ file , $ data ['status ' ] ?? 0 );
92+ return $ this ->fileStatusService -> updateFileStatusIfUpgrade ($ file , $ data ['status ' ] ?? 0 );
9193 } catch (\Throwable ) {
9294 }
9395 }
@@ -136,15 +138,6 @@ private function setSignatureFlowFromGlobalConfig(FileEntity $file): void {
136138 $ file ->setSignatureFlowEnum ($ globalFlow );
137139 }
138140
139- private function updateStatus (FileEntity $ file , int $ status ): FileEntity {
140- if ($ status > $ file ->getStatus ()) {
141- $ file ->setStatus ($ status );
142- /** @var FileEntity */
143- return $ this ->fileMapper ->update ($ file );
144- }
145- return $ file ;
146- }
147-
148141 private function getFileMetadata (\OCP \Files \Node $ node ): array {
149142 $ metadata = [];
150143 if ($ extension = strtolower ($ node ->getExtension ())) {
@@ -244,7 +237,7 @@ private function associateToSigners(array $data, int $fileId): array {
244237 ],
245238 displayName: $ user ['displayName ' ] ?? '' ,
246239 description: $ user ['description ' ] ?? '' ,
247- notify: empty ($ user ['notify ' ]) && $ this -> isStatusAbleToNotify ( $ fileStatus ) ,
240+ notify: empty ($ user ['notify ' ]),
248241 fileId: $ fileId ,
249242 signingOrder: $ signingOrder ,
250243 fileStatus: $ fileStatus ,
@@ -256,7 +249,7 @@ private function associateToSigners(array $data, int $fileId): array {
256249 identifyMethods: $ user ['identify ' ],
257250 displayName: $ user ['displayName ' ] ?? '' ,
258251 description: $ user ['description ' ] ?? '' ,
259- notify: empty ($ user ['notify ' ]) && $ this -> isStatusAbleToNotify ( $ fileStatus ) ,
252+ notify: empty ($ user ['notify ' ]),
260253 fileId: $ fileId ,
261254 signingOrder: $ signingOrder ,
262255 fileStatus: $ fileStatus ,
@@ -268,13 +261,6 @@ private function associateToSigners(array $data, int $fileId): array {
268261 return $ return ;
269262 }
270263
271- private function isStatusAbleToNotify (?int $ status ): bool {
272- return in_array ($ status , [
273- FileEntity::STATUS_ABLE_TO_SIGN ,
274- FileEntity::STATUS_PARTIAL_SIGNED ,
275- ]);
276- }
277-
278264 private function associateToSigner (
279265 array $ identifyMethods ,
280266 string $ displayName ,
@@ -302,13 +288,16 @@ private function associateToSigner(
302288 $ currentStatus = $ signRequest ->getStatusEnum ();
303289
304290 if ($ isNewSignRequest || $ currentStatus === \OCA \Libresign \Enum \SignRequestStatus::DRAFT ) {
305- $ desiredStatus = $ this ->determineInitialStatus ($ signingOrder , $ fileStatus , $ signerStatus , $ currentStatus , $ fileId );
306- $ this ->updateStatusIfAllowed ($ signRequest , $ currentStatus , $ desiredStatus , $ isNewSignRequest );
291+ $ desiredStatus = $ this ->signRequestStatusService -> determineInitialStatus ($ signingOrder , $ fileId , $ fileStatus , $ signerStatus , $ currentStatus );
292+ $ this ->signRequestStatusService -> updateStatusIfAllowed ($ signRequest , $ currentStatus , $ desiredStatus , $ isNewSignRequest );
307293 }
308294
309295 $ this ->saveSignRequest ($ signRequest );
310296
311- $ shouldNotify = $ notify && $ signRequest ->getStatusEnum () === \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN ;
297+ $ shouldNotify = $ notify && $ this ->signRequestStatusService ->shouldNotifySignRequest (
298+ $ signRequest ->getStatusEnum (),
299+ $ fileStatus
300+ );
312301
313302 foreach ($ identifyMethodsIncances as $ identifyMethod ) {
314303 $ identifyMethod ->getEntity ()->setSignRequestId ($ signRequest ->getId ());
@@ -318,68 +307,6 @@ private function associateToSigner(
318307 return $ signRequest ;
319308 }
320309
321- private function updateStatusIfAllowed (
322- SignRequestEntity $ signRequest ,
323- \OCA \Libresign \Enum \SignRequestStatus $ currentStatus ,
324- \OCA \Libresign \Enum \SignRequestStatus $ desiredStatus ,
325- bool $ isNewSignRequest ,
326- ): void {
327- if ($ isNewSignRequest || $ this ->sequentialSigningService ->isStatusUpgrade ($ currentStatus , $ desiredStatus )) {
328- $ signRequest ->setStatusEnum ($ desiredStatus );
329- }
330- }
331-
332- private function determineInitialStatus (
333- int $ signingOrder ,
334- ?int $ fileStatus = null ,
335- ?int $ signerStatus = null ,
336- ?\OCA \Libresign \Enum \SignRequestStatus $ currentStatus = null ,
337- ?int $ fileId = null ,
338- ): \OCA \Libresign \Enum \SignRequestStatus {
339- // If fileStatus is explicitly DRAFT (0), keep signer as DRAFT
340- // This allows adding new signers in DRAFT mode even when file is not in DRAFT status
341- if ($ fileStatus === FileEntity::STATUS_DRAFT ) {
342- return \OCA \Libresign \Enum \SignRequestStatus::DRAFT ;
343- }
344-
345- // If file status is ABLE_TO_SIGN, apply flow-based logic
346- if ($ fileStatus === FileEntity::STATUS_ABLE_TO_SIGN ) {
347- if ($ this ->sequentialSigningService ->isOrderedNumericFlow ()) {
348- // In ordered flow, only first signer (order 1) should be ABLE_TO_SIGN
349- // Others remain DRAFT until their turn
350- return $ signingOrder === 1
351- ? \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN
352- : \OCA \Libresign \Enum \SignRequestStatus::DRAFT ;
353- }
354- // In parallel flow, all can sign - ignore individual signer status if file is ABLE_TO_SIGN
355- return \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN ;
356- }
357-
358- // Handle explicit signer status when file status is not DRAFT or ABLE_TO_SIGN
359- if ($ signerStatus !== null ) {
360- $ desiredStatus = \OCA \Libresign \Enum \SignRequestStatus::from ($ signerStatus );
361- if ($ currentStatus !== null && !$ this ->sequentialSigningService ->isStatusUpgrade ($ currentStatus , $ desiredStatus )) {
362- return $ currentStatus ;
363- }
364-
365- // Validate status transition based on signing order
366- if ($ fileId !== null ) {
367- return $ this ->sequentialSigningService ->validateStatusByOrder ($ desiredStatus , $ signingOrder , $ fileId );
368- }
369-
370- return $ desiredStatus ;
371- }
372-
373- // Default fallback based on flow type
374- if (!$ this ->sequentialSigningService ->isOrderedNumericFlow ()) {
375- return \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN ;
376- }
377-
378- return $ signingOrder === 1
379- ? \OCA \Libresign \Enum \SignRequestStatus::ABLE_TO_SIGN
380- : \OCA \Libresign \Enum \SignRequestStatus::DRAFT ;
381- }
382-
383310 /**
384311 * @param IIdentifyMethod[] $identifyMethodsIncances
385312 * @param string $displayName
0 commit comments