• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LibreSign / libresign / 21498844095

29 Jan 2026 11:44PM UTC coverage: 46.59%. First build
21498844095

Pull #6641

github

web-flow
Merge e7322a308 into f39fc2360
Pull Request #6641: refactor: centralize file status management

66 of 89 new or added lines in 12 files covered. (74.16%)

7897 of 16950 relevant lines covered (46.59%)

5.11 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.22
/lib/Service/SignRequest/StatusService.php
1
<?php
2

3
declare(strict_types=1);
4
/**
5
 * SPDX-FileCopyrightText: 2025 LibreCode coop and contributors
6
 * SPDX-License-Identifier: AGPL-3.0-or-later
7
 */
8

9
namespace OCA\Libresign\Service\SignRequest;
10

11
use OCA\Libresign\Db\File as FileEntity;
12
use OCA\Libresign\Db\SignRequest as SignRequestEntity;
13
use OCA\Libresign\Enum\FileStatus;
14
use OCA\Libresign\Enum\SignRequestStatus;
15
use OCA\Libresign\Service\FileStatusService;
16
use OCA\Libresign\Service\SequentialSigningService;
17

18
class StatusService {
19
        public function __construct(
20
                private SequentialSigningService $sequentialSigningService,
21
                private FileStatusService $fileStatusService,
22
                private StatusCacheService $statusCacheService,
23
        ) {
24
        }
103✔
25

26
        public function shouldNotifySignRequest(SignRequestStatus $signRequestStatus, ?int $fileStatus): bool {
27
                return $this->fileStatusService->canNotifySigners($fileStatus)
19✔
28
                        && $this->canNotifySignRequest($signRequestStatus);
19✔
29
        }
30

31
        public function canNotifySignRequest(SignRequestStatus $status): bool {
32
                return $status === SignRequestStatus::ABLE_TO_SIGN;
19✔
33
        }
34

35
        public function cacheFileStatus(FileEntity $file): void {
NEW
36
                $this->statusCacheService->setStatus($file->getUuid(), $file->getStatus());
×
37
        }
38

39
        public function updateStatusIfAllowed(
40
                SignRequestEntity $signRequest,
41
                SignRequestStatus $currentStatus,
42
                SignRequestStatus $desiredStatus,
43
                bool $isNewSignRequest,
44
        ): void {
45
                if ($isNewSignRequest) {
25✔
46
                        $signRequest->setStatusEnum($desiredStatus);
16✔
47
                        return;
16✔
48
                }
49

50
                if ($this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)) {
9✔
51
                        $signRequest->setStatusEnum($desiredStatus);
3✔
52
                        return;
3✔
53
                }
54

55
                if (
56
                        $desiredStatus === SignRequestStatus::DRAFT
6✔
57
                        && $currentStatus === SignRequestStatus::ABLE_TO_SIGN
6✔
58
                        && $this->sequentialSigningService->isOrderedNumericFlow()
6✔
59
                        && $this->sequentialSigningService->hasPendingLowerOrderSigners(
6✔
60
                                $signRequest->getFileId(),
6✔
61
                                $signRequest->getSigningOrder()
6✔
62
                        )
6✔
63
                ) {
64
                        $signRequest->setStatusEnum($desiredStatus);
1✔
65
                }
66
        }
67

68
        public function determineInitialStatus(
69
                int $signingOrder,
70
                int $fileId,
71
                ?int $fileStatus = null,
72
                ?int $signerStatus = null,
73
                ?SignRequestStatus $currentStatus = null,
74
        ): SignRequestStatus {
75
                if ($fileStatus === FileStatus::DRAFT->value) {
48✔
76
                        return SignRequestStatus::DRAFT;
6✔
77
                }
78

79
                if ($fileStatus === FileStatus::ABLE_TO_SIGN->value) {
42✔
80
                        return $this->determineStatusForAbleToSignFile($signingOrder);
26✔
81
                }
82

83
                if ($signerStatus !== null) {
16✔
84
                        return $this->handleExplicitSignerStatus($signerStatus, $signingOrder, $fileId, $currentStatus);
9✔
85
                }
86

87
                return $this->getDefaultStatusByFlow($signingOrder);
7✔
88
        }
89

90
        private function determineStatusForAbleToSignFile(int $signingOrder): SignRequestStatus {
91
                if ($this->sequentialSigningService->isOrderedNumericFlow()) {
26✔
92
                        return $signingOrder === 1 ? SignRequestStatus::ABLE_TO_SIGN : SignRequestStatus::DRAFT;
7✔
93
                }
94
                return SignRequestStatus::ABLE_TO_SIGN;
19✔
95
        }
96

97
        private function handleExplicitSignerStatus(
98
                int $signerStatus,
99
                int $signingOrder,
100
                int $fileId,
101
                ?SignRequestStatus $currentStatus,
102
        ): SignRequestStatus {
103
                $desiredStatus = SignRequestStatus::from($signerStatus);
9✔
104

105
                if ($currentStatus !== null && !$this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)) {
9✔
106
                        return $currentStatus;
2✔
107
                }
108

109
                return $this->sequentialSigningService->validateStatusByOrder($desiredStatus, $signingOrder, $fileId);
7✔
110
        }
111

112
        private function getDefaultStatusByFlow(int $signingOrder): SignRequestStatus {
113
                if (!$this->sequentialSigningService->isOrderedNumericFlow()) {
7✔
114
                        return SignRequestStatus::ABLE_TO_SIGN;
3✔
115
                }
116

117
                return $signingOrder === 1 ? SignRequestStatus::ABLE_TO_SIGN : SignRequestStatus::DRAFT;
4✔
118
        }
119
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc