From fa982c79f2fc3d5032092e1ce7687d6f495a694b Mon Sep 17 00:00:00 2001 From: Neda Moeini <neda.moeini@geant.org> Date: Mon, 24 Mar 2025 14:16:10 +0100 Subject: [PATCH 1/4] Add validation for Check columns must not be empty. --- sage_validation/file_validator/forms.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/sage_validation/file_validator/forms.py b/sage_validation/file_validator/forms.py index 7a7bfd7..96ca943 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 -- GitLab From b9e9c448b78f7858be55315546d1bd4d7acb1a1d Mon Sep 17 00:00:00 2001 From: Neda Moeini <neda.moeini@geant.org> Date: Mon, 24 Mar 2025 14:16:47 +0100 Subject: [PATCH 2/4] update docs. --- docs/source/conf.py | 21 +++++++++++---------- docs/source/validations.rst | 6 +++++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 57b2530..38af583 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 13bcc92..5f2042c 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 -- GitLab From ac6813dbe96171a2f288e04299714e2a9160d997 Mon Sep 17 00:00:00 2001 From: Neda Moeini <neda.moeini@geant.org> Date: Mon, 24 Mar 2025 14:17:14 +0100 Subject: [PATCH 3/4] Update conftest --- test/conftest.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/conftest.py b/test/conftest.py index 94a62ed..1207568 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 -- GitLab From 408ab6df8df31ba3cba9ed60c94b6fe069041134 Mon Sep 17 00:00:00 2001 From: Neda Moeini <neda.moeini@geant.org> Date: Mon, 24 Mar 2025 14:40:57 +0100 Subject: [PATCH 4/4] Add unittest for cheque fields validation. --- test/test_file_validator/test_forms.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test_file_validator/test_forms.py b/test/test_file_validator/test_forms.py index b5df108..24681bc 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] -- GitLab