Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 18 additions & 15 deletions cl_sii/rtc/data_models_aec.py
Original file line number Diff line number Diff line change
Expand Up @@ -703,21 +703,24 @@ def validate_cesiones_seq_order(cls, v: object) -> object:
raise ValueError("items must be ordered according to their 'seq'")
return v

@pydantic.validator('cesiones')
def validate_cesiones_monto_cesion_must_not_increase(cls, v: object) -> object:
if isinstance(v, Sequence):
if len(v) >= 2:
previous_cesion: Optional[CesionAecXml] = None
for cesion in v:
if previous_cesion is not None:
if not (cesion.monto_cesion <= previous_cesion.monto_cesion):
raise ValueError(
"items must have a 'monto_cesion'"
" that does not exceed the previous item's 'monto_cesion'.",
)
previous_cesion = cesion

return v
# Note: Even though this validation seems to make perfect sense, there are some
# real cases of SII-approved AEC where this is not fulfilled.
# We will keep this validation in case we need it in the future.
# @pydantic.validator('cesiones')
# def validate_cesiones_monto_cesion_must_not_increase(cls, v: object) -> object:
# if isinstance(v, Sequence):
# if len(v) >= 2:
# previous_cesion: Optional[CesionAecXml] = None
# for cesion in v:
# if previous_cesion is not None:
# if not (cesion.monto_cesion <= previous_cesion.monto_cesion):
# raise ValueError(
# "items must have a 'monto_cesion'"
# " that does not exceed the previous item's 'monto_cesion'.",
# )
# previous_cesion = cesion

# return v

@pydantic.root_validator(skip_on_failure=True)
def validate_dte_matches_cesiones_dtes(
Expand Down
62 changes: 31 additions & 31 deletions tests/test_rtc_data_models_aec.py
Original file line number Diff line number Diff line change
Expand Up @@ -574,37 +574,37 @@ def test_validate_cesiones_seq_order(self) -> None:
for expected_validation_error in expected_validation_errors:
self.assertIn(expected_validation_error, validation_errors)

def test_validate_cesiones_monto_cesion_must_not_increase(self) -> None:
self._set_obj_1()

obj = self.obj_1

expected_validation_errors = [
{
'loc': ('cesiones',),
'msg':
"items must have a 'monto_cesion'"
" that does not exceed the previous item's 'monto_cesion'.",
'type': 'value_error',
},
]

with self.assertRaises(pydantic.ValidationError) as assert_raises_cm:
dataclasses.replace(
obj,
cesiones=[
dataclasses.replace(
obj.cesiones[0],
monto_cesion=obj.cesiones[1].monto_cesion - 1,
),
obj.cesiones[1],
],
)

validation_errors = assert_raises_cm.exception.errors()
self.assertEqual(len(validation_errors), len(expected_validation_errors))
for expected_validation_error in expected_validation_errors:
self.assertIn(expected_validation_error, validation_errors)
# def test_validate_cesiones_monto_cesion_must_not_increase(self) -> None:
# self._set_obj_1()

# obj = self.obj_1

# expected_validation_errors = [
# {
# 'loc': ('cesiones',),
# 'msg':
# "items must have a 'monto_cesion'"
# " that does not exceed the previous item's 'monto_cesion'.",
# 'type': 'value_error',
# },
# ]

# with self.assertRaises(pydantic.ValidationError) as assert_raises_cm:
# dataclasses.replace(
# obj,
# cesiones=[
# dataclasses.replace(
# obj.cesiones[0],
# monto_cesion=obj.cesiones[1].monto_cesion - 1,
# ),
# obj.cesiones[1],
# ],
# )

# validation_errors = assert_raises_cm.exception.errors()
# self.assertEqual(len(validation_errors), len(expected_validation_errors))
# for expected_validation_error in expected_validation_errors:
# self.assertIn(expected_validation_error, validation_errors)

def test_validate_dte_matches_cesiones_dtes(self) -> None:
self._set_obj_1()
Expand Down