-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathmain.py
149 lines (100 loc) · 3.62 KB
/
main.py
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
140
141
142
143
144
145
146
147
148
149
from abc import ABCMeta, abstractmethod
class EstadoOrcamento(metaclass=ABCMeta):
@abstractmethod
def aplica_desconto_extra(self, orcamento):
pass
@abstractmethod
def aprova(self, orcamento):
pass
@abstractmethod
def reprova(self, orcamento):
pass
@abstractmethod
def finaliza(self, orcamento):
pass
class EmAprovacao(EstadoOrcamento):
def aplica_desconto_extra(self, orcamento):
orcamento.adiciona_desconto_extra(orcamento.valor * 0.02)
def aprova(self, orcamento):
orcamento.estado_atual = Aprovado()
def reprova(self, orcamento):
orcamento.estado_atual = Reprovado()
def finaliza(self, orcamento):
raise Exception('Orcamentos em aprovacao nao pode ser finalizado')
class Aprovado(EstadoOrcamento):
def aplica_desconto_extra(self, orcamento):
orcamento.adiciona_desconto_extra(orcamento.valor * 0.05)
def aprova(self, orcamento):
raise Exception('Orcamentos aprovado nao pode ser aprovado novamente')
def reprova(self, orcamento):
raise Exception('Orcamentos aprovado nao pode ser reprovado')
def finaliza(self, orcamento):
orcamento.estado_atual = Finalizado()
class Reprovado(EstadoOrcamento):
def aplica_desconto_extra(self, orcamento):
raise Exception('Orcamentos reprovados nao recebem desconto extra')
def aprova(self, orcamento):
raise Exception('Orcamentos aprovado nao pode ser aprovado')
def reprova(self, orcamento):
raise Exception('Orcamentos aprovado nao pode ser reprovado novamente')
def finaliza(self, orcamento):
orcamento.estado_atual = Finalizado()
class Finalizado(EstadoOrcamento):
def aplica_desconto_extra(self, orcamento):
raise Exception('Orcamentos finalizados nao recebem desconto extra')
def aprova(self, orcamento):
raise Exception('Orcamentos finalizado nao pode ser aprovado')
def reprova(self, orcamento):
raise Exception('Orcamentos finalizado nao pode ser reprovado')
def finaliza(self, orcamento):
raise Exception(
'Orcamentos finalizado nao pode ser finalizado novamente'
)
class Orcamento:
def __init__(self):
self.__itens = list()
self.estado_atual = EmAprovacao()
self.__desconto_extra = 0
def aprova(self):
self.estado_atual.aprova(self)
def reprova(self):
self.estado_atual.reprova(self)
def finaliza(self):
self.estado_atual.finaliza(self)
def adiciona_desconto_extra(self, desconto):
self.__desconto_extra += desconto
def aplica_desconto_extra(self):
self.estado_atual.aplica_desconto_extra(self)
@property
def valor(self):
total = 0.0
for item in self.__itens:
total += item.valor
return total - self.__desconto_extra
def obter_itens(self):
return tuple(self.__itens)
@property
def total_itens(self):
return len(self.__itens)
def adiciona_item(self, item):
self.__itens.append(item)
class Item:
def __init__(self, nome, valor):
self.__nome = nome
self.__valor = valor
@property
def valor(self):
return self.__valor
@property
def nome(self):
return self.__nome
if __name__ == '__main__':
orcamento = Orcamento()
orcamento.adiciona_item(Item('item 0', 100.0))
orcamento.adiciona_item(Item('item 1', 50.0))
orcamento.adiciona_item(Item('item 2', 400.0))
print(orcamento.valor)
orcamento.aprova()
orcamento.aplica_desconto_extra()
print(orcamento.valor)
orcamento.finaliza()