-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflexorder.py
More file actions
139 lines (96 loc) · 3.74 KB
/
Copy pathflexorder.py
File metadata and controls
139 lines (96 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
from abc import ABC, abstractmethod
class ResultadoPagamento(ABC):
@abstractmethod
def mensagem(self):
pass
class PagamentoSucesso(ResultadoPagamento):
def mensagem(self):
return "SUCESSO: Pedido finalizado e nota fiscal emitida."
class PagamentoFalha(ResultadoPagamento):
def __init__(self, motivo):
self.motivo = motivo
def mensagem(self):
return f"FALHA: {self.motivo}"
class EstrategiaPagamento(ABC):
@abstractmethod
def processar(self, valor_total):
pass
class PagamentoPix(EstrategiaPagamento):
def processar(self, valor_total):
print(f"Processando pagamento PIX de R${valor_total:.2f}")
return PagamentoSucesso()
class PagamentoCredito(EstrategiaPagamento):
def processar(self, valor_total):
print(f"Processando pagamento via Crédito de R${valor_total:.2f}")
if valor_total < 1000:
return PagamentoSucesso()
return PagamentoFalha("Pagamento rejeitado (limite excedido).")
class EstrategiaFrete(ABC):
@abstractmethod
def calcular(self, valor_base):
pass
class FreteNormal(EstrategiaFrete):
def calcular(self, valor_base):
custo = valor_base * 0.05
print(f"Frete Normal: R${custo:.2f}")
return custo
class FreteExpresso(EstrategiaFrete):
def calcular(self, valor_base):
custo = valor_base * 0.10 + 15.00
print(f"Frete Expresso (com taxa): R${custo:.2f}")
return custo
class Pedido(ABC):
@abstractmethod
def calcular_valor(self):
pass
class PedidoBase(Pedido):
def __init__(self, itens):
self.itens = itens
def calcular_valor(self):
valor = sum(item["valor"] for item in self.itens)
print(f"Valor base dos itens: R${valor:.2f}")
return valor
class PedidoDecorator(Pedido):
def __init__(self, pedido):
self._pedido = pedido
def calcular_valor(self):
return self._pedido.calcular_valor()
class DescontoPix(PedidoDecorator):
def calcular_valor(self):
valor = self._pedido.calcular_valor()
desconto = valor * 0.05
print(f"Aplicando desconto PIX: -R${desconto:.2f}")
return valor - desconto
class EmbalagemPresente(PedidoDecorator):
def calcular_valor(self):
valor = self._pedido.calcular_valor()
taxa = 5.00
print(f"Adicionando taxa de embalagem: +R${taxa:.2f}")
return valor + taxa
class CheckoutFacade:
def __init__(self, pedido, pagamento, frete):
self.pedido = pedido
self.pagamento = pagamento
self.frete = frete
def concluir(self):
print("\n=========================================")
print("INICIANDO CHECKOUT REESTRUTURADO...")
valor_base = self.pedido.calcular_valor()
custo_frete = self.frete.calcular(valor_base)
valor_total = valor_base + custo_frete
print(f"Valor Final: R${valor_total:.2f}")
resultado = self.pagamento.processar(valor_total)
print(resultado.mensagem())
class CheckoutApp:
def executar(self):
itens1 = [{"nome": "Capa do Batman", "valor": 150},
{"nome": "Poção mágica", "valor": 80}]
pedido1 = DescontoPix(PedidoBase(itens1))
checkout1 = CheckoutFacade(pedido1, PagamentoPix(), FreteNormal())
checkout1.concluir()
print("\n--- Próximo Pedido ---")
itens2 = [{"nome": "Cinto tático", "valor": 600}]
pedido2 = EmbalagemPresente(PedidoBase(itens2))
checkout2 = CheckoutFacade(pedido2, PagamentoCredito(), FreteExpresso())
checkout2.concluir()
CheckoutApp().executar()