1
|
|
|
""" |
2
|
|
|
byceps.blueprints.admin.shop.order.models |
3
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
4
|
|
|
|
5
|
|
|
:Copyright: 2014-2024 Jochen Kupperschmidt |
6
|
|
|
:License: Revised BSD (see `LICENSE` file for details) |
7
|
|
|
""" |
8
|
|
|
|
9
|
1 |
|
from __future__ import annotations |
10
|
|
|
|
11
|
1 |
|
from enum import Enum |
12
|
|
|
|
13
|
1 |
|
from byceps.services.shop.order.models.order import PaymentState |
14
|
1 |
|
from byceps.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
|
|
|
# fmt: off |
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
|
|
|
# fmt: on |
33
|
1 |
|
|
34
|
|
|
def __init__( |
35
|
|
|
self, |
36
|
|
|
payment_state: PaymentState | None, |
37
|
|
|
overdue: bool | None, |
38
|
|
|
processed: bool | None, |
39
|
1 |
|
) -> None: |
40
|
1 |
|
self.payment_state = payment_state |
41
|
1 |
|
self.overdue = overdue |
42
|
|
|
self.processed = processed |
43
|
1 |
|
|
44
|
1 |
|
@classmethod |
45
|
|
|
def find( |
46
|
|
|
cls, |
47
|
|
|
only_payment_state: PaymentState | None, |
48
|
|
|
only_overdue: bool | None, |
49
|
|
|
only_processed: bool | None, |
50
|
1 |
|
) -> OrderStateFilter: |
51
|
|
|
if (only_payment_state == PaymentState.open) and ( |
52
|
|
|
only_overdue is not None |
53
|
1 |
|
): |
54
|
|
|
return ( |
55
|
|
|
cls.payment_state_open_and_overdue |
56
|
|
|
if only_overdue |
57
|
|
|
else cls.payment_state_open |
58
|
1 |
|
) |
59
|
|
|
elif (only_payment_state == PaymentState.paid) and ( |
60
|
|
|
only_processed is not None |
61
|
1 |
|
): |
62
|
|
|
return ( |
63
|
|
|
cls.waiting_for_processing if not only_processed else cls.none |
64
|
1 |
|
) |
65
|
1 |
|
elif only_payment_state is not None: |
66
|
|
|
return cls.find_for_payment_state(only_payment_state) or cls.none |
67
|
1 |
|
else: |
68
|
|
|
return cls.none |
69
|
1 |
|
|
70
|
1 |
|
@classmethod |
71
|
|
|
def find_for_payment_state( |
72
|
|
|
cls, payment_state: PaymentState |
73
|
1 |
|
) -> OrderStateFilter | None: |
74
|
1 |
|
def match(order_state_filter): |
75
|
|
|
return ( |
76
|
|
|
order_state_filter.payment_state == payment_state |
77
|
|
|
and order_state_filter.overdue is None |
78
|
|
|
and order_state_filter.processed is None |
79
|
|
|
) |
80
|
1 |
|
|
81
|
|
|
return iterables.find(cls, match) |
82
|
|
|
|