diff --git a/docs/source/conf.py b/docs/source/conf.py index 57b253090f83217d2830f7fd7240ffe6aabb3148..38af583cffad5bb6cc39c40f8c68f91a06da1544 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -12,6 +12,7 @@ # import os import sys + import django sys.path.insert(0, os.path.abspath("../../")) @@ -20,12 +21,12 @@ django.setup() # -- Project information ----------------------------------------------------- -project = 'Sage Validation' -copyright = '2024, GÉANT' -author = 'GÉANT' +project = "Sage Validation" +copyright = "2024, GÉANT" +author = "GÉANT" # The full version, including alpha/beta/rc tags -release = '0.1' +release = "0.1" # -- General configuration --------------------------------------------------- @@ -34,13 +35,13 @@ release = '0.1' # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.napoleon', - 'sphinx_autodoc_typehints', + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx_autodoc_typehints", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -53,9 +54,9 @@ exclude_patterns = [] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] \ No newline at end of file +html_static_path = ["_static"] diff --git a/docs/source/validations.rst b/docs/source/validations.rst index 13bcc924a0d12787957fcbf346e91af60c155f65..5f2042ced17773463685c99c6ca99a4beaafc69b 100644 --- a/docs/source/validations.rst +++ b/docs/source/validations.rst @@ -60,4 +60,8 @@ The following table describes the validation rules applied when uploading a CSV * - Checks - `...TaxRate` - Validate against `[Tax code]` in `dbo.meoValidVAT`. - - Ensure valid tax rates. \ No newline at end of file + - Ensure valid tax rates. + + * - Checks + - `ChequeCurrencyName`, `ChequeToBankExchangeRate`, `ChequeValueInChequeCurrency` + - Cheque fields must be empty. \ No newline at end of file diff --git a/sage_validation/file_validator/forms.py b/sage_validation/file_validator/forms.py index 7a7bfd7c24db3aecd7ace0604d72bb91f78968a0..96ca9437dff1cc478a595fa048995dcff129c8bb 100644 --- a/sage_validation/file_validator/forms.py +++ b/sage_validation/file_validator/forms.py @@ -45,6 +45,9 @@ class CSVUploadForm(forms.Form): "TaxValue", "SYSTraderGenerationReasonType", "GoodsValueInBaseCurrency", + "ChequeCurrencyName", + "ChequeToBankExchangeRate", + "ChequeValueInChequeCurrency", ] repeating_columns: ClassVar[dict] = { @@ -83,6 +86,7 @@ class CSVUploadForm(forms.Form): error_list.extend(self._validate_source_and_trader_type(data)) error_list.extend(self._validate_nominal_analysis_account(data)) error_list.extend(self._validate_nc_cc_dep_combination_against_meo_sage_account(data)) + error_list.extend(self._cheque_fields_must_be_empty(data)) if error_list: raise forms.ValidationError(error_list) @@ -251,3 +255,22 @@ class CSVUploadForm(forms.Form): ) return errors + + @staticmethod + def _cheque_fields_must_be_empty(data: list[dict]) -> list[str]: + """Validate that cheque fields are empty. + + The cheque fields are 'ChequeCurrencyName', 'ChequeToBankExchangeRate', and 'ChequeValueInChequeCurrency'. + """ + errors = [] + for index, row in enumerate(data, start=1): + cheque_currency_name = row.get("ChequeCurrencyName") + cheque_to_bank_exchange_rate = row.get("ChequeToBankExchangeRate") + cheque_value_in_cheque_currency = row.get("ChequeValueInChequeCurrency") + + if any([cheque_currency_name, cheque_to_bank_exchange_rate, cheque_value_in_cheque_currency]): + errors.append( + f"Row {index}: Unexpected values in the Cheque columns. All cheque columns must be empty." + ) + + return errors diff --git a/test/conftest.py b/test/conftest.py index 94a62ed9ada92e49af102a8213b29e3866eb9b90..1207568f8954c9f8cff2a5dfa862ff356cd880f8 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -37,6 +37,9 @@ def sample_input_file() -> SimpleUploadedFile: "SYSTraderGenerationReasonType", "GoodsValueInBaseCurrency", "TransactionReference", + "ChequeCurrencyName", + "ChequeToBankExchangeRate", + "ChequeValueInChequeCurrency", # NominalAnalysis repeating columns (Example: /1 for first occurrence) "NominalAnalysisTransactionValue/1", @@ -79,6 +82,9 @@ def sample_input_file() -> SimpleUploadedFile: "1000", # SYSTraderGenerationReasonType "1200", # GoodsValueInBaseCurrency "BK123", # TransactionReference(Batch Number) + "", # ChequeCurrencyName + "", # ChequeToBankExchangeRate + "", # ChequeValueInChequeCurrency # NominalAnalysis repeating values (Example: /1) "500.75", # NominalAnalysisTransactionValue/1 diff --git a/test/test_file_validator/test_forms.py b/test/test_file_validator/test_forms.py index b5df1089c1430e9a898b62cd8449ef849415f422..24681bc19e067500ce5b59f16023c2868fa8fdb3 100644 --- a/test/test_file_validator/test_forms.py +++ b/test/test_file_validator/test_forms.py @@ -92,3 +92,11 @@ def test_validate_nc_cc_dep_combination_against_meo_sage_account( assert ("Row 1: 'NominalAnalysisNominalCostCentre/1' (Invalid_CC) is not a valid cost centre." in str(form.errors["file"][0])) + +def test_cheque_fields_must_be_empty(sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock) -> None: + """Test that cheque fields must be empty.""" + modified_file = create_modified_csv(sample_input_file, + {"ChequeCurrencyName": "USD", "ChequeToBankExchangeRate": "1"}) + form = CSVUploadForm(files={"file": modified_file}) + assert not form.is_valid() + assert "Row 1: Unexpected values in the Cheque columns. All cheque columns must be empty." in form.errors["file"][0]