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

LibreSign / libresign / 21500751186

30 Jan 2026 01:12AM UTC coverage: 46.652%. First build
21500751186

Pull #6641

github

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

91 of 120 new or added lines in 14 files covered. (75.83%)

7922 of 16981 relevant lines covered (46.65%)

5.11 hits per line

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

85.37
/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
                private StatusUpdatePolicy $statusUpdatePolicy,
24
        ) {
25
        }
91✔
26

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

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

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

40
        public function updateStatusIfAllowed(
41
                SignRequestEntity $signRequest,
42
                SignRequestStatus $currentStatus,
43
                SignRequestStatus $desiredStatus,
44
                bool $isNewSignRequest,
45
        ): void {
46
                $isStatusUpgrade = !$isNewSignRequest
13✔
NEW
47
                        ? $this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)
×
48
                        : false;
13✔
49
                $isOrderedNumericFlow = $this->sequentialSigningService->isOrderedNumericFlow();
13✔
50
                $hasPendingLowerOrderSigners = $isOrderedNumericFlow
13✔
NEW
51
                        ? $this->sequentialSigningService->hasPendingLowerOrderSigners(
×
NEW
52
                                $signRequest->getFileId(),
×
NEW
53
                                $signRequest->getSigningOrder()
×
NEW
54
                        )
×
55
                        : false;
13✔
56

57
                if ($this->statusUpdatePolicy->shouldUpdateStatus(
13✔
58
                        $currentStatus,
13✔
59
                        $desiredStatus,
13✔
60
                        $isNewSignRequest,
13✔
61
                        $isStatusUpgrade,
13✔
62
                        $isOrderedNumericFlow,
13✔
63
                        $hasPendingLowerOrderSigners,
13✔
64
                )) {
13✔
65
                        $signRequest->setStatusEnum($desiredStatus);
13✔
66
                }
67
        }
68

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

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

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

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

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

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

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

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

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

118
                return $signingOrder === 1 ? SignRequestStatus::ABLE_TO_SIGN : SignRequestStatus::DRAFT;
4✔
119
        }
120
}
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