Retornou o seguinte erro:
Orçamento aprovado:
orcamento.estado_atual(OrcamentoAprovado())
TypeError: 'OrcamentoEmAprovacao' object is not callable
Segue o código do arquivo model/states/orcamentoStates.py:
#-*- coding: UTF-8 -*-
__author__ = 'douglas_bonafe'
__name__ = 'estados dos objetos'
# Necessary to create abstract classes and methods
from abc import ABCMeta, abstractmethod
class EstadosDeOrcamento(object):
__metaclass__ = ABCMeta
@abstractmethod
def aplica_desconto_extra(self, orcamento):
pass
class OrcamentoAprovado(EstadosDeOrcamento):
def __init__(self, taxa=0.02):
self.__taxa = taxa
def aplica_desconto_extra(self, orcamento):
orcamento.seta_descontos_extra(self.__taxa)
@property
def taxa(self):
return self.__taxa
class OrcamentoReprovado(EstadosDeOrcamento):
def aplica_desconto_extra(self, orcamento):
raise Exception('Orcamentos reprovados não podem receber descontos.')
class OrcamentoEmAprovacao(EstadosDeOrcamento):
def __init__(self, taxa=0.05):
self.__taxa = taxa
def aplica_desconto_extra(self, orcamento):
orcamento.seta_descontos_extra(self.__taxa)
@property
def taxa(self):
return self.__taxa
class OrcamentoFinalizado(EstadosDeOrcamento):
def aplica_desconto_extra(self, orcamento):
raise Exception('Orcamentos finalizados não podem receber descontos.')
Segue o código do arquivo model/strategy/calculador_de_impostos.py, onde contém o main executado.
# -*- coding: UTF-8 -*-
__author__ = 'douglas_bonafe'
class Calculador_de_Impostos(object):
def realiza_calculo(self, orcamento, imposto):
imposto_calculado = imposto.calcula(orcamento)
print(imposto_calculado)
if __name__ == '__main__':
from model.orcamento import Orcamento, Item
from model.strategy.calculador_de_impostos import Calculador_de_Impostos
from model.strategy.impostos import ICMS, ISS, ICPP, IKCV, IPX
orcamento = Orcamento()
# adicionando itens ao orçamento
orcamento.adiciona_item(Item('ITEM 1', 50))
orcamento.adiciona_item(Item('ITEM 2', 200))
orcamento.adiciona_item(Item('ITEM 3', 250))
print 'Orçamento esperando aprovação:'
print orcamento.valor
print 'Orçamento aprovado:'
from model.states.orcamentoStates import OrcamentoAprovado
orcamento.estado_atual(OrcamentoAprovado())
print orcamento.valor
calculador_de_impostos = Calculador_de_Impostos()
print 'ISS e ICMS'
calculador_de_impostos.realiza_calculo(orcamento, ISS())
calculador_de_impostos.realiza_calculo(orcamento, ICMS())
# cálculo dos novos impostos
print 'ICPP e IKCV'
calculador_de_impostos.realiza_calculo(orcamento, ICPP()) # imprime 25.0
calculador_de_impostos.realiza_calculo(orcamento, IKCV()) # imprime 30.0
# padrão decorator: impostos sobre impostos
print 'ICPP com IKCV'
calculador_de_impostos.realiza_calculo(orcamento, ICPP(IKCV()))
print 'ICMS com ISS'
calculador_de_impostos.realiza_calculo(orcamento, ICMS(ISS()))
# decorador do Python e Imposto X
print 'IPX := tx = 25%'
calculador_de_impostos.realiza_calculo(orcamento, IPX(0.25))