from .base import PaymentMethod, ZoopObject
from ..exceptions import FieldError, ValidationError
[documentos]class BaseModeObject(ZoopObject):
"""
Um objeto base que possui modos de quantia e porcentagem
"""
MODES = set()
[documentos] def init_custom_fields(self, mode=None, **kwargs):
"""
É necessário configurar o :attr:`mode` antes pois
ele influência no :meth:`get_validation_fields`
"""
if mode not in self.MODES:
raise ValidationError(
self,
FieldError(
"mode",
f"o valor {mode} é inválido! Possíveis modos são {self.MODES}",
),
)
setattr(self, "mode", mode)
[documentos] def get_mode_required_fields_mapping(self):
raise NotImplementedError("Implemente o mapeamento!")
[documentos] def get_validation_fields(self):
modes_required_fields_mapping = self.get_mode_required_fields_mapping()
required_method = modes_required_fields_mapping.get(self.mode)
return required_method()
[documentos] @classmethod
def get_required_fields(cls):
return {"mode"}
[documentos] @classmethod
def get_percentage_required_fields(cls):
fields = cls.get_required_fields()
return fields.union({"percentage"})
[documentos] @classmethod
def get_fixed_required_fields(cls):
fields = cls.get_required_fields()
return fields.union({"amount"})
[documentos]class Fine(BaseModeObject):
"""
Representa a multa!
https://docs.zoop.co/docs/multa-juros-e-descontos#multa
"""
FIXED = "FIXED"
PERCENTAGE = "PERCENTAGE"
MODES = {FIXED, PERCENTAGE}
[documentos] def get_mode_required_fields_mapping(self):
return {
self.FIXED: self.get_fixed_required_fields,
self.PERCENTAGE: self.get_percentage_required_fields,
}
[documentos] @classmethod
def get_non_required_fields(cls):
return {"start_date"}
[documentos]class Interest(BaseModeObject):
"""
Representa um juros!
https://docs.zoop.co/docs/multa-juros-e-descontos#juros
"""
DAILY_AMOUNT = "DAILY_AMOUNT"
DAILY_PERCENTAGE = "DAILY_PERCENTAGE"
MONTHLY_PERCENTAGE = "MONTHLY_PERCENTAGE"
MODES = {DAILY_AMOUNT, DAILY_PERCENTAGE, MONTHLY_PERCENTAGE}
[documentos] def get_mode_required_fields_mapping(self):
return {
self.DAILY_AMOUNT: self.get_fixed_required_fields,
self.DAILY_PERCENTAGE: self.get_percentage_required_fields,
self.MONTHLY_PERCENTAGE: self.get_percentage_required_fields,
}
[documentos] @classmethod
def get_non_required_fields(cls):
return {"start_date"}
[documentos]class Discount(BaseModeObject):
"""
Representa um desconto!
https://docs.zoop.co/docs/multa-juros-e-descontos#descontos
"""
FIXED = "FIXED"
PERCENTAGE = "PERCENTAGE"
MODES = {FIXED, PERCENTAGE}
[documentos] def get_mode_required_fields_mapping(self):
return {
self.FIXED: self.get_fixed_required_fields,
self.PERCENTAGE: self.get_percentage_required_fields,
}
[documentos] @classmethod
def get_required_fields(cls):
fields = super().get_required_fields()
return fields.union({"limit_date"})
[documentos]class BillingInstructions(ZoopObject):
"""
Represents billing instructions (fine, interest and discount)
Attributes:
discount (list of :class:`.BillingConfiguration`): list of optional discount rules # noqa
interest (:class:`.BillingConfiguration`): optional interest rules
late_fee (:class:`.BillingConfiguration`): optional fine rules
"""
[documentos] def init_custom_fields(self, late_fee=None, interest=None, discount=None, **kwargs):
"""
Inicializa late_fee, interest e discount.
Args:
discount: dict or instance of BillingConfiguration model
interest: dict or instance of BillingConfiguration model
late_fee: dict or instance of BillingConfiguration model
**kwargs: kwargs
"""
if late_fee:
setattr(
self,
"late_fee",
Fine.from_dict_or_instance(late_fee),
)
if interest:
setattr(
self,
"interest",
Interest.from_dict_or_instance(interest),
)
if discount:
if not isinstance(discount, list):
discount = [discount]
setattr(
self,
"discount",
[Discount.from_dict_or_instance(item) for item in discount],
)
[documentos] @classmethod
def get_non_required_fields(cls):
"""
Conjunto de campos não obrigatórios
Returns:
``set`` de campos
"""
fields = super().get_non_required_fields()
return fields.union({"late_fee", "interest", "discount"})
[documentos]class Invoice(PaymentMethod):
"""
Represents a invoice ('boleto' in BR).
https://docs.zoop.co/reference#boleto
Attributes:
billing_instructions (:class:`.BillingInstructions`): optional billing instructions # noqa
security_code_check (bool): verification of security code
"""
RESOURCE = "boleto"
[documentos] def init_custom_fields(self, billing_instructions=None, **kwargs):
"""
initialize :attr:`billing_instructions` with :class:`.BillingInstructions`
Args:
billing_instructions (dict or :class:`.BillingInstructions`): data
**kwargs:
"""
super().init_custom_fields(**kwargs)
if billing_instructions:
setattr(
self,
"billing_instructions",
BillingInstructions.from_dict_or_instance(billing_instructions),
)
[documentos] @classmethod
def get_required_fields(cls):
fields = super().get_required_fields()
return fields.union({"expiration_date", "payment_limit_date"})
[documentos] @classmethod
def get_non_required_fields(cls):
fields = super().get_non_required_fields()
return fields.union(
{
"accepted",
"bank_code",
"barcode",
"billing_instructions",
"body_instructions",
"document_number",
"downloaded",
"fingerprint",
"paid_at",
"printed",
"recipient",
"reference_number",
"sequence",
"status",
"url",
"zoop_boleto_id",
}
)