Revised the account form so that the if-offset-needed option is only available for real accounts.
This commit is contained in:
		| @@ -53,6 +53,21 @@ class BaseAccountAvailable: | ||||
|                 "The base account is not available.")) | ||||
|  | ||||
|  | ||||
| class NoOffsetNominalAccount: | ||||
|     """The validator to check nominal account is not to be offset.""" | ||||
|  | ||||
|     def __call__(self, form: FlaskForm, field: BooleanField) -> None: | ||||
|         if not field.data: | ||||
|             return | ||||
|         if not isinstance(form, AccountForm): | ||||
|             return | ||||
|         if form.base_code.data is None: | ||||
|             return | ||||
|         if form.base_code.data[0] not in {"1", "2"}: | ||||
|             raise ValidationError(lazy_gettext( | ||||
|                 "A nominal account does not need offset.")) | ||||
|  | ||||
|  | ||||
| class AccountForm(FlaskForm): | ||||
|     """The form to create or edit an account.""" | ||||
|     base_code = StringField( | ||||
| @@ -66,7 +81,8 @@ class AccountForm(FlaskForm): | ||||
|         filters=[strip_text], | ||||
|         validators=[DataRequired(lazy_gettext("Please fill in the title"))]) | ||||
|     """The title.""" | ||||
|     is_offset_needed = BooleanField() | ||||
|     is_offset_needed = BooleanField( | ||||
|         validators=[NoOffsetNominalAccount()]) | ||||
|     """Whether the the entries of this account need offset.""" | ||||
|  | ||||
|     def populate_obj(self, obj: Account) -> None: | ||||
| @@ -87,7 +103,10 @@ class AccountForm(FlaskForm): | ||||
|             obj.base_code = self.base_code.data | ||||
|             obj.no = count + 1 | ||||
|         obj.title = self.title.data | ||||
|         obj.is_offset_needed = self.is_offset_needed.data | ||||
|         if self.base_code.data[0] in {"1", "2"}: | ||||
|             obj.is_offset_needed = self.is_offset_needed.data | ||||
|         else: | ||||
|             obj.is_offset_needed = False | ||||
|         if is_new: | ||||
|             current_user_pk: int = get_current_user_pk() | ||||
|             obj.created_by_id = current_user_pk | ||||
|   | ||||
| @@ -43,6 +43,8 @@ function initializeBaseAccountSelector() { | ||||
|     const base = document.getElementById("accounting-base"); | ||||
|     const baseCode = document.getElementById("accounting-base-code"); | ||||
|     const baseContent = document.getElementById("accounting-base-content"); | ||||
|     const isOffsetNeededControl = document.getElementById("accounting-is-offset-needed-control"); | ||||
|     const isOffsetNeeded = document.getElementById("accounting-is-offset-needed"); | ||||
|     const options = Array.from(document.getElementsByClassName("accounting-base-option")); | ||||
|     const btnClear = document.getElementById("accounting-btn-clear-base"); | ||||
|     selector.addEventListener("show.bs.modal", () => { | ||||
| @@ -64,6 +66,14 @@ function initializeBaseAccountSelector() { | ||||
|         option.onclick = () => { | ||||
|             baseCode.value = option.dataset.code; | ||||
|             baseContent.innerText = option.dataset.content; | ||||
|             if (["1", "2"].includes(option.dataset.content.substring(0, 1))) { | ||||
|                 isOffsetNeededControl.classList.remove("d-none"); | ||||
|                 isOffsetNeeded.disabled = false; | ||||
|             } else { | ||||
|                 isOffsetNeededControl.classList.add("d-none"); | ||||
|                 isOffsetNeeded.disabled = true; | ||||
|                 isOffsetNeeded.checked = false; | ||||
|             } | ||||
|             btnClear.classList.add("btn-danger"); | ||||
|             btnClear.classList.remove("btn-secondary") | ||||
|             btnClear.disabled = false; | ||||
|   | ||||
| @@ -62,7 +62,7 @@ First written: 2023/2/1 | ||||
|     <div id="accounting-title-error" class="invalid-feedback">{% if form.title.errors %}{{ form.title.errors[0] }}{% endif %}</div> | ||||
|   </div> | ||||
|  | ||||
|   <div class="form-check form-switch mb-3"> | ||||
|   <div id="accounting-is-offset-needed-control" class="form-check form-switch mb-3 {% if form.base_code.data[0] not in ["1", "2"] %} d-none {% endif %}"> | ||||
|     <input id="accounting-is-offset-needed" class="form-check-input" type="checkbox" name="is_offset_needed" value="1" {% if form.is_offset_needed.data %} checked="checked" {% endif %}> | ||||
|     <label class="form-check-label" for="accounting-is-offset-needed"> | ||||
|       {{ A_("The entries in the account need offset.") }} | ||||
|   | ||||
| @@ -372,6 +372,15 @@ class AccountTestCase(unittest.TestCase): | ||||
|         self.assertEqual(response.status_code, 302) | ||||
|         self.assertEqual(response.headers["Location"], create_uri) | ||||
|  | ||||
|         # A nominal account that needs offset | ||||
|         response = self.client.post(store_uri, | ||||
|                                     data={"csrf_token": self.csrf_token, | ||||
|                                           "base_code": "6172", | ||||
|                                           "title": stock.title, | ||||
|                                           "is_offset_needed": "yes"}) | ||||
|         self.assertEqual(response.status_code, 302) | ||||
|         self.assertEqual(response.headers["Location"], create_uri) | ||||
|  | ||||
|         # Success, with spaces to be stripped | ||||
|         response = self.client.post(store_uri, | ||||
|                                     data={"csrf_token": self.csrf_token, | ||||
| @@ -470,6 +479,15 @@ class AccountTestCase(unittest.TestCase): | ||||
|         self.assertEqual(response.status_code, 302) | ||||
|         self.assertEqual(response.headers["Location"], edit_uri) | ||||
|  | ||||
|         # A nominal account that needs offset | ||||
|         response = self.client.post(update_uri, | ||||
|                                     data={"csrf_token": self.csrf_token, | ||||
|                                           "base_code": "6172", | ||||
|                                           "title": stock.title, | ||||
|                                           "is_offset_needed": "yes"}) | ||||
|         self.assertEqual(response.status_code, 302) | ||||
|         self.assertEqual(response.headers["Location"], edit_uri) | ||||
|  | ||||
|         # Change the base account | ||||
|         response = self.client.post(update_uri, | ||||
|                                     data={"csrf_token": self.csrf_token, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user