Completed
Push — main ( 4754e8...850691 )
by Jochen
04:43 queued 04:43
created

OrderStateFilter.find()   B

Complexity

Conditions 8

Size

Total Lines 25
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 8

Importance

Changes 0
Metric Value
cc 8
eloc 19
nop 4
dl 0
loc 25
ccs 8
cts 8
cp 1
crap 8
rs 7.3333
c 0
b 0
f 0
1
"""
2
byceps.blueprints.admin.shop.order.models
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2014-2022 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from __future__ import annotations
10 1
from enum import Enum
11 1
from typing import Optional
12
13 1
from .....services.shop.order.transfer.order import PaymentState
14 1
from .....util import iterables
15
16
17 1
IGNORED = None
18 1
NOT_YET_PROCESSED = False
19 1
OVERDUE = True
20 1
PROCESSED = True
21
22
23 1
class OrderStateFilter(Enum):
24
25 1
    none                               = (None,                              IGNORED, IGNORED)
26 1
    payment_state_open_and_overdue     = (PaymentState.open,                 OVERDUE, IGNORED)
27 1
    payment_state_open                 = (PaymentState.open,                 IGNORED, IGNORED)
28 1
    payment_state_canceled_before_paid = (PaymentState.canceled_before_paid, IGNORED, IGNORED)
29 1
    payment_state_paid                 = (PaymentState.paid,                 IGNORED, IGNORED)
30 1
    payment_state_canceled_after_paid  = (PaymentState.canceled_after_paid,  IGNORED, IGNORED)
31 1
    waiting_for_processing             = (None,                              IGNORED, NOT_YET_PROCESSED)
32
33 1
    def __init__(
34
        self,
35
        payment_state: Optional[PaymentState],
36
        overdue: Optional[bool],
37
        processed: Optional[bool],
38
    ) -> None:
39 1
        self.payment_state = payment_state
40 1
        self.overdue = overdue
41 1
        self.processed = processed
42
43 1
    @classmethod
44
    def find(
45
        cls,
46
        only_payment_state: Optional[PaymentState],
47
        only_overdue: Optional[bool],
48
        only_processed: Optional[bool],
49
    ) -> OrderStateFilter:
50 1
        if (only_payment_state == PaymentState.open) and (
51
            only_overdue is not None
52
        ):
53 1
            return (
54
                cls.payment_state_open_and_overdue
55
                if only_overdue
56
                else cls.payment_state_open
57
            )
58 1
        elif (only_payment_state == PaymentState.paid) and (
59
            only_processed is not None
60
        ):
61 1
            return (
62
                cls.waiting_for_processing if not only_processed else cls.none
63
            )
64 1
        elif only_payment_state is not None:
65 1
            return cls.find_for_payment_state(only_payment_state) or cls.none
66
        else:
67 1
            return cls.none
68
69 1
    @classmethod
70
    def find_for_payment_state(
71
        cls, payment_state: PaymentState
72
    ) -> Optional[OrderStateFilter]:
73 1
        def match(order_state_filter):
74 1
            return (
75
                order_state_filter.payment_state == payment_state
76
                and order_state_filter.overdue is None
77
                and order_state_filter.processed is None
78
            )
79
80
        return iterables.find(cls, match)
81