SaleSort::bySaleClass()   A
last analyzed

Complexity

Conditions 3
Paths 1

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 0
cts 16
cp 0
rs 9.6333
c 0
b 0
f 0
cc 3
nc 1
nop 0
crap 12
1
<?php
2
/**
3
 * Finance module for HiPanel
4
 *
5
 * @link      https://github.com/hiqdev/hipanel-module-finance
6
 * @package   hipanel-module-finance
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2015-2019, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hipanel\modules\finance\helpers;
12
13
use hipanel\modules\finance\models\FakeGroupingSale;
14
use hipanel\modules\finance\models\FakeSale;
15
use hipanel\modules\finance\models\FakeSharedSale;
16
use hipanel\modules\finance\models\Sale;
17
use Tuck\Sort\Sort;
18
use Tuck\Sort\SortChain;
19
20
/**
21
 * Class SaleSort.
22
 *
23
 * @author Dmytro Naumenko <[email protected]>
24
 */
25
class SaleSort
26
{
27
    public static function toDisplayInPlan(): SortChain
28
    {
29
        return Sort::chain()
30
            ->asc(self::bySaleClass())
31
            ->compare(self::byTargetObjectName());
32
    }
33
34
    private static function bySaleClass(): \Closure
35
    {
36
        $map = [
37
            FakeSharedSale::class => 1,
38
            FakeGroupingSale::class => 2,
39
            FakeSale::class => 4,
40
            Sale::class => 3,
41
        ];
42
43
        return function (Sale $sale) use ($map) {
44
            foreach ($map as $class => $order) {
45
                if ($sale instanceof $class) {
46
                    return $order;
47
                }
48
            }
49
50
            return INF;
51
        };
52
    }
53
54
    private static function byTargetObjectName(): \Closure
55
    {
56
        return function (Sale $a, Sale $b) {
57
            return strnatcasecmp($a->object, $b->object);
58
        };
59
    }
60
}
61