]> git.ipfire.org Git - ipfire.org.git/commitdiff
donate: Implement a basic VAT number check
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2024 20:57:44 +0000 (20:57 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2024 20:57:44 +0000 (20:57 +0000)
This check does not prevent people from submitting the form if the VAT
number is invalid, but it will give a visual indication whether it has
been validated or not.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/templates/donate/donate.html
src/web/__init__.py
src/web/donate.py

index 519d88eb1cd7ae4c3bb4a283b07d7ad79e284890..2bb2c6f1f35dc1b16cf9b4d8a14b0ecdf5e3402a 100644 (file)
        <script type="text/javascript">
                $(document).ready(function() {
                        var type      = $("input[name='type']");
+                       var vat_number= $("input[name='vat_number']");
                        var amount    = $("input[name='amount']");
                        var currency  = $("input[name='currency']");
                        var frequency = $("input[name='frequency']");
                        var submit    = $("#donate");
                        var form      = $("#donation-form");
 
+                       // A cache for VAT numbers
+                       var vat_numbers = {};
+                       var check_vat_number;
+
                        // Adjust form to default currency
                        if (currency.val() == "EUR") {
                                $(".USD").hide();
                                }
                        });
 
+                       // Check VAT numbers
+                       vat_number.on("change keyup mouseup", function() {
+                               if (check_vat_number)
+                                       clearTimeout(check_vat_number);
+
+                               var input = $(this);
+                               var value = input.val();
+
+                               console.log(vat_numbers);
+
+                               // Fetch the parent control element
+                               var control = input.closest(".control");
+
+                               // Remove all classes
+                               input.removeClass("is-success is-danger");
+
+                               // Do nothing if there is no data
+                               if (!value)
+                                       return;
+
+                               // Show that this is now processing
+                               control.addClass("is-loading");
+
+                               // Called when we have an API response
+                               var finished = function(result) {
+                                       // We are no longer processing
+                                       control.removeClass("is-loading");
+
+                                       if (result.valid) {
+                                               input.addClass("is-success");
+                                       } else {
+                                               input.addClass("is-danger");
+                                       }
+
+                                       // Cache the result if not already done do
+                                       if (!vat_numbers[value])
+                                               vat_numbers[value] = result;
+
+                                       form.trigger("change");
+                               };
+
+                               console.log(vat_numbers[value]);
+
+                               // Deliver there cached result if available
+                               if (vat_numbers[value])
+                                       return finished(vat_numbers[value]);
+
+                               // Send API request after 250ms to avoid hammering it and running into the ratelimiting
+                               setTimeout(function() {
+                                       $.get("/donate/check-vat-number", { vat_number : value }, finished);
+                               }, 250);
+                       });
+
                        // Disable all submit buttons after the form has been submitted
                        form.one("submit", function() {
                                submit.prop("disabled", true);
index ded884c1ba96f17dd800f3469b83e91dbd017c91..eb73212c682ecc96ad85217a8be915a09512301f 100644 (file)
@@ -170,6 +170,7 @@ class Application(tornado.web.Application):
                        (r"/donate", donate.DonateHandler),
                        (r"/donate/thank-you", donate.ThankYouHandler),
                        (r"/donate/error", donate.ErrorHandler),
+                       (r"/donate/check-vat-number", donate.CheckVATNumberHandler),
 
                        # Lists
                        (r"/lists", lists.IndexHandler),
index fb243708785b0efb89c84454b4d5a84148f8cd5b..a6e9d405b9a5ab982695c352448e8031b75474fb 100644 (file)
@@ -255,3 +255,16 @@ class ThankYouHandler(base.BaseHandler):
 class ErrorHandler(base.BaseHandler):
     def get(self):
         self.render("donate/error.html")
+
+
+class CheckVATNumberHandler(base.APIHandler):
+       @base.ratelimit(minutes=5, requests=25)
+       async def get(self):
+               vat_number = self.get_argument("vat_number")
+
+               # Send request
+               response = await self.backend.zeiterfassung.send_request(
+                       "/api/v1/organizations/check-vat-number", vat_number=vat_number)
+
+               # Forward the response
+               self.finish(response)