Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
EnvelopeStatusDeterminer
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
10
100.00% covered (success)
100.00%
1 / 1
 determineStatus
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
10
1<?php
2
3declare(strict_types=1);
4/**
5 * SPDX-FileCopyrightText: 2026 LibreCode coop and contributors
6 * SPDX-License-Identifier: AGPL-3.0-or-later
7 */
8
9namespace OCA\Libresign\Service\Envelope;
10
11use OCA\Libresign\Db\File as FileEntity;
12use OCA\Libresign\Enum\FileStatus;
13use OCA\Libresign\Enum\SignRequestStatus;
14
15class EnvelopeStatusDeterminer {
16    /**
17     * A signer who rejected will not sign, so the envelope is over once everybody
18     * else signed: complete when at least one signature was applied, canceled when
19     * every signer rejected.
20     *
21     * @param FileEntity[] $childFiles
22     * @param array<int, array> $signRequestsMap
23     */
24    public function determineStatus(array $childFiles, array $signRequestsMap): int {
25        $totalSignRequests = 0;
26        $signedSignRequests = 0;
27        $rejectedSignRequests = 0;
28
29        foreach ($childFiles as $childFile) {
30            $signRequests = $signRequestsMap[$childFile->getId()] ?? [];
31
32            foreach ($signRequests as $signRequest) {
33                if ($signRequest->isObserver()) {
34                    continue;
35                }
36
37                $totalSignRequests++;
38
39                if ($signRequest->getSigned()) {
40                    $signedSignRequests++;
41                } elseif ($signRequest->getStatusEnum() === SignRequestStatus::REJECTED) {
42                    $rejectedSignRequests++;
43                }
44            }
45        }
46
47        if ($totalSignRequests === 0) {
48            return FileStatus::DRAFT->value;
49        }
50
51        if ($signedSignRequests + $rejectedSignRequests === $totalSignRequests) {
52            return $signedSignRequests > 0
53                ? FileStatus::SIGNED->value
54                : FileStatus::CANCELED->value;
55        }
56
57        if ($signedSignRequests === 0) {
58            return FileStatus::ABLE_TO_SIGN->value;
59        }
60
61        return FileStatus::PARTIAL_SIGNED->value;
62    }
63}