From d333a8674daa0f827cf48881ee35651a947f3c37 Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Fri, 8 Mar 2024 10:02:25 +0100
Subject: [PATCH 01/11] fix(Skills): change max skills number to 20

---
 lib/Model/Skills.php | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/lib/Model/Skills.php b/lib/Model/Skills.php
index f0d7f94..d9fa548 100644
--- a/lib/Model/Skills.php
+++ b/lib/Model/Skills.php
@@ -286,8 +286,8 @@ public function listInvalidProperties()
         if ($this->container['required'] === null) {
             $invalidProperties[] = "'required' can't be null";
         }
-        if ((count($this->container['required']) > 10)) {
-            $invalidProperties[] = "invalid value for 'required', number of items must be less than or equal to 10.";
+        if ((count($this->container['required']) > 20)) {
+            $invalidProperties[] = "invalid value for 'required', number of items must be less than or equal to 20.";
         }
 
         if ((count($this->container['required']) < 1)) {
@@ -297,8 +297,8 @@ public function listInvalidProperties()
         if ($this->container['preferred'] === null) {
             $invalidProperties[] = "'preferred' can't be null";
         }
-        if ((count($this->container['preferred']) > 10)) {
-            $invalidProperties[] = "invalid value for 'preferred', number of items must be less than or equal to 10.";
+        if ((count($this->container['preferred']) > 20)) {
+            $invalidProperties[] = "invalid value for 'preferred', number of items must be less than or equal to 20.";
         }
 
         if ((count($this->container['preferred']) < 1)) {
@@ -343,8 +343,8 @@ public function setRequired($required)
             throw new \InvalidArgumentException('non-nullable required cannot be null');
         }
 
-        if ((count($required) > 10)) {
-            throw new \InvalidArgumentException('invalid value for $required when calling Skills., number of items must be less than or equal to 10.');
+        if ((count($required) > 20)) {
+            throw new \InvalidArgumentException('invalid value for $required when calling Skills., number of items must be less than or equal to 20.');
         }
         if ((count($required) < 1)) {
             throw new \InvalidArgumentException('invalid length for $required when calling Skills., number of items must be greater than or equal to 1.');
@@ -377,8 +377,8 @@ public function setPreferred($preferred)
             throw new \InvalidArgumentException('non-nullable preferred cannot be null');
         }
 
-        if ((count($preferred) > 10)) {
-            throw new \InvalidArgumentException('invalid value for $preferred when calling Skills., number of items must be less than or equal to 10.');
+        if ((count($preferred) > 20)) {
+            throw new \InvalidArgumentException('invalid value for $preferred when calling Skills., number of items must be less than or equal to 20.');
         }
         if ((count($preferred) < 1)) {
             throw new \InvalidArgumentException('invalid length for $preferred when calling Skills., number of items must be greater than or equal to 1.');

From 77af9e38a49ab3ea5e22dd3c332ac587c4ad0cb6 Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Mon, 25 Mar 2024 10:53:53 +0100
Subject: [PATCH 02/11] fix(Filters): fix missing filters classes

---
 lib/Model/FilterField.php                  |  74 +--
 lib/Model/FilterFieldGeoDistance.php       | 442 ++++++++++++++++++
 lib/Model/FilterFieldGeoDistanceCentre.php | 442 ++++++++++++++++++
 lib/Model/FilterFieldInterface.php         |   8 +
 lib/Model/FilterFieldRange.php             | 510 +++++++++++++++++++++
 lib/Model/FilterFieldTerm.php              | 408 +++++++++++++++++
 6 files changed, 1847 insertions(+), 37 deletions(-)
 create mode 100644 lib/Model/FilterFieldGeoDistance.php
 create mode 100644 lib/Model/FilterFieldGeoDistanceCentre.php
 create mode 100644 lib/Model/FilterFieldInterface.php
 create mode 100644 lib/Model/FilterFieldRange.php
 create mode 100644 lib/Model/FilterFieldTerm.php

diff --git a/lib/Model/FilterField.php b/lib/Model/FilterField.php
index 8aaed34..c376820 100644
--- a/lib/Model/FilterField.php
+++ b/lib/Model/FilterField.php
@@ -46,30 +46,30 @@ class FilterField implements ModelInterface, ArrayAccess, \JsonSerializable
     public const DISCRIMINATOR = null;
 
     /**
-      * The original name of the model.
-      *
-      * @var string
-      */
+     * The original name of the model.
+     *
+     * @var string
+     */
     protected static $openAPIModelName = 'FilterField';
 
     /**
-      * Array of property to type mappings. Used for (de)serialization
-      *
-      * @var string[]
-      */
+     * Array of property to type mappings. Used for (de)serialization
+     *
+     * @var string[]
+     */
     protected static $openAPITypes = [
         'field' => 'string',
         'type' => 'string',
-        'value' => 'object'
+        'value' => '\OpenAPI\Client\Model\FilterFieldInterface'
     ];
 
     /**
-      * Array of property to format mappings. Used for (de)serialization
-      *
-      * @var string[]
-      * @phpstan-var array<string, string|null>
-      * @psalm-var array<string, string|null>
-      */
+     * Array of property to format mappings. Used for (de)serialization
+     *
+     * @var string[]
+     * @phpstan-var array<string, string|null>
+     * @psalm-var array<string, string|null>
+     */
     protected static $openAPIFormats = [
         'field' => null,
         'type' => null,
@@ -77,21 +77,21 @@ class FilterField implements ModelInterface, ArrayAccess, \JsonSerializable
     ];
 
     /**
-      * Array of nullable properties. Used for (de)serialization
-      *
-      * @var boolean[]
-      */
+     * Array of nullable properties. Used for (de)serialization
+     *
+     * @var boolean[]
+     */
     protected static array $openAPINullables = [
         'field' => false,
-		'type' => false,
-		'value' => false
+        'type' => false,
+        'value' => false
     ];
 
     /**
-      * If a nullable field gets set to null, insert it here
-      *
-      * @var boolean[]
-      */
+     * If a nullable field gets set to null, insert it here
+     *
+     * @var boolean[]
+     */
     protected array $openAPINullablesSetToNull = [];
 
     /**
@@ -263,14 +263,14 @@ public function __construct(array $data = null)
     }
 
     /**
-    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-    * $this->openAPINullablesSetToNull array
-    *
-    * @param string $variableName
-    * @param array  $fields
-    * @param mixed  $defaultValue
-    */
+     * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+     * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+     * $this->openAPINullablesSetToNull array
+     *
+     * @param string $variableName
+     * @param array  $fields
+     * @param mixed  $defaultValue
+     */
     private function setIfExists(string $variableName, array $fields, $defaultValue): void
     {
         if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
@@ -370,9 +370,9 @@ public function setType($type)
     /**
      * Gets value
      *
-     * @return object
+     * @return FilterFieldInterface
      */
-    public function getValue()
+    public function getValue(): FilterFieldInterface
     {
         return $this->container['value'];
     }
@@ -380,7 +380,7 @@ public function getValue()
     /**
      * Sets value
      *
-     * @param object $value value
+     * @param FilterFieldInterface $value value
      *
      * @return self
      */
@@ -457,7 +457,7 @@ public function offsetUnset($offset): void
     #[\ReturnTypeWillChange]
     public function jsonSerialize()
     {
-       return ObjectSerializer::sanitizeForSerialization($this);
+        return ObjectSerializer::sanitizeForSerialization($this);
     }
 
     /**
diff --git a/lib/Model/FilterFieldGeoDistance.php b/lib/Model/FilterFieldGeoDistance.php
new file mode 100644
index 0000000..8ab8a8f
--- /dev/null
+++ b/lib/Model/FilterFieldGeoDistance.php
@@ -0,0 +1,442 @@
+<?php
+/**
+ * FilterFieldGeoDistance
+ *
+ * PHP version 7.4
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ */
+
+/**
+ * INDA HR - INtelligent Data Analysis for HR
+ *
+ * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
+ *
+ * The version of the OpenAPI document: 2.2.0
+ * Contact: info@intervieweb.it
+ * Generated by: https://openapi-generator.tech
+ * OpenAPI Generator version: 6.3.0-SNAPSHOT
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace OpenAPI\Client\Model;
+
+use \ArrayAccess;
+use \OpenAPI\Client\ObjectSerializer;
+
+/**
+ * FilterFieldGeoDistance Class Doc Comment
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ * @implements \ArrayAccess<string, mixed>
+ */
+class FilterFieldGeoDistance implements FilterFieldInterface, ModelInterface, ArrayAccess, \JsonSerializable
+{
+    public const DISCRIMINATOR = null;
+
+    /**
+      * The original name of the model.
+      *
+      * @var string
+      */
+    protected static $openAPIModelName = 'FilterFieldGeoDistance';
+
+    /**
+      * Array of property to type mappings. Used for (de)serialization
+      *
+      * @var string[]
+      */
+    protected static $openAPITypes = [
+        'distance' => 'string',
+        'centre' => '\OpenAPI\Client\Model\FilterFieldGeoDistanceCentre',
+    ];
+
+    /**
+      * Array of property to format mappings. Used for (de)serialization
+      *
+      * @var string[]
+      * @phpstan-var array<string, string|null>
+      * @psalm-var array<string, string|null>
+      */
+    protected static $openAPIFormats = [
+        'distance' => null,
+        'centre' => null,
+    ];
+
+    /**
+      * Array of nullable properties. Used for (de)serialization
+      *
+      * @var boolean[]
+      */
+    protected static array $openAPINullables = [
+        'distance' => false,
+        'centre' => false,
+    ];
+
+    /**
+      * If a nullable field gets set to null, insert it here
+      *
+      * @var boolean[]
+      */
+    protected array $openAPINullablesSetToNull = [];
+
+    /**
+     * Array of property to type mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPITypes()
+    {
+        return self::$openAPITypes;
+    }
+
+    /**
+     * Array of property to format mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPIFormats()
+    {
+        return self::$openAPIFormats;
+    }
+
+    /**
+     * Array of nullable properties
+     *
+     * @return array
+     */
+    protected static function openAPINullables(): array
+    {
+        return self::$openAPINullables;
+    }
+
+    /**
+     * Array of nullable field names deliberately set to null
+     *
+     * @return boolean[]
+     */
+    private function getOpenAPINullablesSetToNull(): array
+    {
+        return $this->openAPINullablesSetToNull;
+    }
+
+    /**
+     * Setter - Array of nullable field names deliberately set to null
+     *
+     * @param boolean[] $openAPINullablesSetToNull
+     */
+    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+    {
+        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+    }
+
+    /**
+     * Checks if a property is nullable
+     *
+     * @param string $property
+     * @return bool
+     */
+    public static function isNullable(string $property): bool
+    {
+        return self::openAPINullables()[$property] ?? false;
+    }
+
+    /**
+     * Checks if a nullable property is set to null.
+     *
+     * @param string $property
+     * @return bool
+     */
+    public function isNullableSetToNull(string $property): bool
+    {
+        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+    }
+
+    /**
+     * Array of attributes where the term is the local name,
+     * and the value is the original name
+     *
+     * @var string[]
+     */
+    protected static $attributeMap = [
+        'distance' => 'Distance',
+        'centre' => 'Centre',
+    ];
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @var string[]
+     */
+    protected static $setters = [
+        'distance' => 'setDistance',
+        'centre' => 'setCentre',
+    ];
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @var string[]
+     */
+    protected static $getters = [
+        'distance' => 'getDistance',
+        'centre' => 'getCentre',
+    ];
+
+    /**
+     * Array of attributes where the term is the local name,
+     * and the value is the original name
+     *
+     * @return array
+     */
+    public static function attributeMap()
+    {
+        return self::$attributeMap;
+    }
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @return array
+     */
+    public static function setters()
+    {
+        return self::$setters;
+    }
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @return array
+     */
+    public static function getters()
+    {
+        return self::$getters;
+    }
+
+    /**
+     * The original name of the model.
+     *
+     * @return string
+     */
+    public function getModelName()
+    {
+        return self::$openAPIModelName;
+    }
+
+
+    /**
+     * Associative array for storing property values
+     *
+     * @var mixed[]
+     */
+    protected $container = [];
+
+    /**
+     * Constructor
+     *
+     * @param mixed[] $data Associated array of property values
+     *                      initializing the model
+     */
+    public function __construct(array $data = null)
+    {
+        $this->setIfExists('distance', $data ?? [], null);
+        $this->setIfExists('centre', $data ?? [], null);
+    }
+
+    /**
+    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+    * $this->openAPINullablesSetToNull array
+    *
+    * @param string $variableName
+    * @param array  $fields
+    * @param mixed  $defaultValue
+    */
+    private function setIfExists(string $variableName, array $fields, $defaultValue): void
+    {
+        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
+            $this->openAPINullablesSetToNull[] = $variableName;
+        }
+
+        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+    }
+
+    /**
+     * Show all the invalid properties with reasons.
+     *
+     * @return array invalid properties with reasons
+     */
+    public function listInvalidProperties()
+    {
+        $invalidProperties = [];
+
+        return $invalidProperties;
+    }
+
+    /**
+     * Validate all the properties in the model
+     * return true if all passed
+     *
+     * @return bool True if all properties are valid
+     */
+    public function valid()
+    {
+        return count($this->listInvalidProperties()) === 0;
+    }
+
+    /**
+     * Gets distance
+     *
+     * @return string|null
+     */
+    public function getDistance()
+    {
+        return $this->container['Distance'];
+    }
+
+    /**
+     * Sets distance
+     *
+     * @param string|null $distance distance
+     *
+     * @return self
+     */
+    public function setDistance($distance)
+    {
+        if (is_null($distance)) {
+            throw new \InvalidArgumentException('non-nullable Distance cannot be null');
+        }
+        $this->container['Distance'] = $distance;
+
+        return $this;
+    }
+
+    /**
+     * Gets centre
+     *
+     * @return FilterFieldGeoDistanceCentre|null
+     */
+    public function getCentre()
+    {
+        return $this->container['Centre'];
+    }
+
+    /**
+     * Sets centre
+     *
+     * @param FilterFieldGeoDistanceCentre|null $centre centre
+     *
+     * @return self
+     */
+    public function setCentre($centre)
+    {
+        if (is_null($centre)) {
+            throw new \InvalidArgumentException('non-nullable Centre cannot be null');
+        }
+        $this->container['Centre'] = $centre;
+
+        return $this;
+    }
+
+    /**
+     * Returns true if offset exists. False otherwise.
+     *
+     * @param integer $offset Offset
+     *
+     * @return boolean
+     */
+    public function offsetExists($offset): bool
+    {
+        return isset($this->container[$offset]);
+    }
+
+    /**
+     * Gets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return mixed|null
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetGet($offset)
+    {
+        return $this->container[$offset] ?? null;
+    }
+
+    /**
+     * Sets value based on offset.
+     *
+     * @param string|null $offset Offset
+     * @param mixed    $value  Value to be set
+     *
+     * @return void
+     */
+    public function offsetSet($offset, $value): void
+    {
+        if (is_null($offset)) {
+            $this->container[] = $value;
+        } else {
+            $this->container[$offset] = $value;
+        }
+    }
+
+    /**
+     * Unsets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return void
+     */
+    public function offsetUnset($offset): void
+    {
+        unset($this->container[$offset]);
+    }
+
+    /**
+     * Serializes the object to a value that can be serialized natively by json_encode().
+     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+     *
+     * @return mixed Returns data which can be serialized by json_encode(), which is a value
+     * of any type other than a resource.
+     */
+    #[\ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+       return ObjectSerializer::sanitizeForSerialization($this);
+    }
+
+    /**
+     * Gets the string presentation of the object
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return json_encode(
+            ObjectSerializer::sanitizeForSerialization($this),
+            JSON_PRETTY_PRINT
+        );
+    }
+
+    /**
+     * Gets a header-safe presentation of the object
+     *
+     * @return string
+     */
+    public function toHeaderValue()
+    {
+        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+    }
+}
diff --git a/lib/Model/FilterFieldGeoDistanceCentre.php b/lib/Model/FilterFieldGeoDistanceCentre.php
new file mode 100644
index 0000000..62ecced
--- /dev/null
+++ b/lib/Model/FilterFieldGeoDistanceCentre.php
@@ -0,0 +1,442 @@
+<?php
+/**
+ * FilterFieldCentre
+ *
+ * PHP version 7.4
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ */
+
+/**
+ * INDA HR - INtelligent Data Analysis for HR
+ *
+ * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
+ *
+ * The version of the OpenAPI document: 2.2.0
+ * Contact: info@intervieweb.it
+ * Generated by: https://openapi-generator.tech
+ * OpenAPI Generator version: 6.3.0-SNAPSHOT
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace OpenAPI\Client\Model;
+
+use \ArrayAccess;
+use \OpenAPI\Client\ObjectSerializer;
+
+/**
+ * FilterFieldCentre Class Doc Comment
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ * @implements \ArrayAccess<string, mixed>
+ */
+class FilterFieldGeoDistanceCentre implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+    public const DISCRIMINATOR = null;
+
+    /**
+      * The original name of the model.
+      *
+      * @var string
+      */
+    protected static $openAPIModelName = 'FilterFieldCentre';
+
+    /**
+      * Array of property to type mappings. Used for (de)serialization
+      *
+      * @var float[]
+      */
+    protected static $openAPITypes = [
+        'lat' => 'float',
+        'lon' => 'float',
+    ];
+
+    /**
+      * Array of property to format mappings. Used for (de)serialization
+      *
+      * @var float[]
+      * @phpstan-var array<string, float|null>
+      * @psalm-var array<string, float|null>
+      */
+    protected static $openAPIFormats = [
+        'lat' => null,
+        'lon' => null,
+    ];
+
+    /**
+      * Array of nullable properties. Used for (de)serialization
+      *
+      * @var boolean[]
+      */
+    protected static array $openAPINullables = [
+        'lat' => false,
+        'lon' => false,
+    ];
+
+    /**
+      * If a nullable field gets set to null, insert it here
+      *
+      * @var boolean[]
+      */
+    protected array $openAPINullablesSetToNull = [];
+
+    /**
+     * Array of property to type mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPITypes()
+    {
+        return self::$openAPITypes;
+    }
+
+    /**
+     * Array of property to format mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPIFormats()
+    {
+        return self::$openAPIFormats;
+    }
+
+    /**
+     * Array of nullable properties
+     *
+     * @return array
+     */
+    protected static function openAPINullables(): array
+    {
+        return self::$openAPINullables;
+    }
+
+    /**
+     * Array of nullable field names deliberately set to null
+     *
+     * @return boolean[]
+     */
+    private function getOpenAPINullablesSetToNull(): array
+    {
+        return $this->openAPINullablesSetToNull;
+    }
+
+    /**
+     * Setter - Array of nullable field names deliberately set to null
+     *
+     * @param boolean[] $openAPINullablesSetToNull
+     */
+    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+    {
+        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+    }
+
+    /**
+     * Checks if a property is nullable
+     *
+     * @param string $property
+     * @return bool
+     */
+    public static function isNullable(string $property): bool
+    {
+        return self::openAPINullables()[$property] ?? false;
+    }
+
+    /**
+     * Checks if a nullable property is set to null.
+     *
+     * @param string $property
+     * @return bool
+     */
+    public function isNullableSetToNull(string $property): bool
+    {
+        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+    }
+
+    /**
+     * Array of attributes where the term is the local name,
+     * and the value is the original name
+     *
+     * @var string[]
+     */
+    protected static $attributeMap = [
+        'lat' => 'Lat',
+        'lon' => 'Lon',
+    ];
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @var string[]
+     */
+    protected static $setters = [
+        'lat' => 'setLat',
+        'lon' => 'setLon',
+    ];
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @var string[]
+     */
+    protected static $getters = [
+        'lat' => 'getLat',
+        'lon' => 'getLon',
+    ];
+
+    /**
+     * Array of attributes where the term is the local name,
+     * and the value is the original name
+     *
+     * @return array
+     */
+    public static function attributeMap()
+    {
+        return self::$attributeMap;
+    }
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @return array
+     */
+    public static function setters()
+    {
+        return self::$setters;
+    }
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @return array
+     */
+    public static function getters()
+    {
+        return self::$getters;
+    }
+
+    /**
+     * The original name of the model.
+     *
+     * @return string
+     */
+    public function getModelName()
+    {
+        return self::$openAPIModelName;
+    }
+
+
+    /**
+     * Associative array for storing property values
+     *
+     * @var mixed[]
+     */
+    protected $container = [];
+
+    /**
+     * Constructor
+     *
+     * @param mixed[] $data Associated array of property values
+     *                      initializing the model
+     */
+    public function __construct(array $data = null)
+    {
+        $this->setIfExists('lat', $data ?? [], null);
+        $this->setIfExists('lon', $data ?? [], null);
+    }
+
+    /**
+    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+    * $this->openAPINullablesSetToNull array
+    *
+    * @param string $variableName
+    * @param array  $fields
+    * @param mixed  $defaultValue
+    */
+    private function setIfExists(string $variableName, array $fields, $defaultValue): void
+    {
+        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
+            $this->openAPINullablesSetToNull[] = $variableName;
+        }
+
+        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+    }
+
+    /**
+     * Show all the invalid properties with reasons.
+     *
+     * @return array invalid properties with reasons
+     */
+    public function listInvalidProperties()
+    {
+        $invalidProperties = [];
+
+        return $invalidProperties;
+    }
+
+    /**
+     * Validate all the properties in the model
+     * return true if all passed
+     *
+     * @return bool True if all properties are valid
+     */
+    public function valid()
+    {
+        return count($this->listInvalidProperties()) === 0;
+    }
+
+    /**
+     * Gets lat
+     *
+     * @return float|null
+     */
+    public function getLat()
+    {
+        return $this->container['lat'];
+    }
+
+    /**
+     * Sets lat
+     *
+     * @param float|null $lat lat
+     *
+     * @return self
+     */
+    public function setLat($lat)
+    {
+        if (is_null($lat)) {
+            throw new \InvalidArgumentException('non-nullable Lat cannot be null');
+        }
+        $this->container['lat'] = $lat;
+
+        return $this;
+    }
+
+    /**
+     * Gets lon
+     *
+     * @return float|null
+     */
+    public function getLon()
+    {
+        return $this->container['lon'];
+    }
+
+    /**
+     * Sets lon
+     *
+     * @param float|null $lon lon
+     *
+     * @return self
+     */
+    public function setLon($lon)
+    {
+        if (is_null($lon)) {
+            throw new \InvalidArgumentException('non-nullable Lon cannot be null');
+        }
+        $this->container['lon'] = $lon;
+
+        return $this;
+    }
+
+    /**
+     * Returns true if offset exists. False otherwise.
+     *
+     * @param integer $offset Offset
+     *
+     * @return boolean
+     */
+    public function offsetExists($offset): bool
+    {
+        return isset($this->container[$offset]);
+    }
+
+    /**
+     * Gets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return mixed|null
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetGet($offset)
+    {
+        return $this->container[$offset] ?? null;
+    }
+
+    /**
+     * Sets value based on offset.
+     *
+     * @param string|null $offset Offset
+     * @param mixed    $value  Value to be set
+     *
+     * @return void
+     */
+    public function offsetSet($offset, $value): void
+    {
+        if (is_null($offset)) {
+            $this->container[] = $value;
+        } else {
+            $this->container[$offset] = $value;
+        }
+    }
+
+    /**
+     * Unsets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return void
+     */
+    public function offsetUnset($offset): void
+    {
+        unset($this->container[$offset]);
+    }
+
+    /**
+     * Serializes the object to a value that can be serialized natively by json_encode().
+     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+     *
+     * @return mixed Returns data which can be serialized by json_encode(), which is a value
+     * of any type other than a resource.
+     */
+    #[\ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+       return ObjectSerializer::sanitizeForSerialization($this);
+    }
+
+    /**
+     * Gets the string presentation of the object
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return json_encode(
+            ObjectSerializer::sanitizeForSerialization($this),
+            JSON_PRETTY_PRINT
+        );
+    }
+
+    /**
+     * Gets a header-safe presentation of the object
+     *
+     * @return string
+     */
+    public function toHeaderValue()
+    {
+        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+    }
+}
diff --git a/lib/Model/FilterFieldInterface.php b/lib/Model/FilterFieldInterface.php
new file mode 100644
index 0000000..a067729
--- /dev/null
+++ b/lib/Model/FilterFieldInterface.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace OpenAPI\Client\Model;
+
+interface FilterFieldInterface
+{
+
+}
\ No newline at end of file
diff --git a/lib/Model/FilterFieldRange.php b/lib/Model/FilterFieldRange.php
new file mode 100644
index 0000000..8ff42f9
--- /dev/null
+++ b/lib/Model/FilterFieldRange.php
@@ -0,0 +1,510 @@
+<?php
+/**
+ * FilterFieldRange
+ *
+ * PHP version 7.4
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ */
+
+/**
+ * INDA HR - INtelligent Data Analysis for HR
+ *
+ * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
+ *
+ * The version of the OpenAPI document: 2.2.0
+ * Contact: info@intervieweb.it
+ * Generated by: https://openapi-generator.tech
+ * OpenAPI Generator version: 6.3.0-SNAPSHOT
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace OpenAPI\Client\Model;
+
+use \ArrayAccess;
+use \OpenAPI\Client\ObjectSerializer;
+
+/**
+ * FilterFieldRange Class Doc Comment
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ * @implements \ArrayAccess<string, mixed>
+ */
+class FilterFieldRange implements FilterFieldInterface, ModelInterface, ArrayAccess, \JsonSerializable
+{
+    public const DISCRIMINATOR = null;
+
+    /**
+      * The original name of the model.
+      *
+      * @var string
+      */
+    protected static $openAPIModelName = 'FilterFieldRange';
+
+    /**
+      * Array of property to type mappings. Used for (de)serialization
+      *
+      * @var string[]
+      */
+    protected static $openAPITypes = [
+        'gt' => 'string',
+        'gte' => 'string',
+        'lt' => 'string',
+        'lte' => 'string',
+    ];
+
+    /**
+      * Array of property to format mappings. Used for (de)serialization
+      *
+      * @var string[]
+      * @phpstan-var array<string, string|null>
+      * @psalm-var array<string, string|null>
+      */
+    protected static $openAPIFormats = [
+        'gt' => null,
+        'gte' => null,
+        'lt' => null,
+        'lte' => null,
+    ];
+
+    /**
+      * Array of nullable properties. Used for (de)serialization
+      *
+      * @var boolean[]
+      */
+    protected static array $openAPINullables = [
+        'gt' => false,
+        'gte' => false,
+        'lt' => false,
+        'lte' => false,
+    ];
+
+    /**
+      * If a nullable field gets set to null, insert it here
+      *
+      * @var boolean[]
+      */
+    protected array $openAPINullablesSetToNull = [];
+
+    /**
+     * Array of property to type mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPITypes()
+    {
+        return self::$openAPITypes;
+    }
+
+    /**
+     * Array of property to format mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPIFormats()
+    {
+        return self::$openAPIFormats;
+    }
+
+    /**
+     * Array of nullable properties
+     *
+     * @return array
+     */
+    protected static function openAPINullables(): array
+    {
+        return self::$openAPINullables;
+    }
+
+    /**
+     * Array of nullable field names deliberately set to null
+     *
+     * @return boolean[]
+     */
+    private function getOpenAPINullablesSetToNull(): array
+    {
+        return $this->openAPINullablesSetToNull;
+    }
+
+    /**
+     * Setter - Array of nullable field names deliberately set to null
+     *
+     * @param boolean[] $openAPINullablesSetToNull
+     */
+    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+    {
+        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+    }
+
+    /**
+     * Checks if a property is nullable
+     *
+     * @param string $property
+     * @return bool
+     */
+    public static function isNullable(string $property): bool
+    {
+        return self::openAPINullables()[$property] ?? false;
+    }
+
+    /**
+     * Checks if a nullable property is set to null.
+     *
+     * @param string $property
+     * @return bool
+     */
+    public function isNullableSetToNull(string $property): bool
+    {
+        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+    }
+
+    /**
+     * Array of attributes where the key is the local name,
+     * and the value is the original name
+     *
+     * @var string[]
+     */
+    protected static $attributeMap = [
+        'gt' => 'GT',
+        'gte' => 'GTE',
+        'lt' => 'LT',
+        'lte' => 'LTE',
+    ];
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @var string[]
+     */
+    protected static $setters = [
+        'gt' => 'setGt',
+        'gte' => 'setGte',
+        'lt' => 'setLt',
+        'lte' => 'setLte',
+    ];
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @var string[]
+     */
+    protected static $getters = [
+        'gt' => 'getGt',
+        'gte' => 'getGte',
+        'lt' => 'getLt',
+        'lte' => 'getLte'
+    ];
+
+    /**
+     * Array of attributes where the key is the local name,
+     * and the value is the original name
+     *
+     * @return array
+     */
+    public static function attributeMap()
+    {
+        return self::$attributeMap;
+    }
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @return array
+     */
+    public static function setters()
+    {
+        return self::$setters;
+    }
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @return array
+     */
+    public static function getters()
+    {
+        return self::$getters;
+    }
+
+    /**
+     * The original name of the model.
+     *
+     * @return string
+     */
+    public function getModelName()
+    {
+        return self::$openAPIModelName;
+    }
+
+
+    /**
+     * Associative array for storing property values
+     *
+     * @var mixed[]
+     */
+    protected $container = [];
+
+    /**
+     * Constructor
+     *
+     * @param mixed[] $data Associated array of property values
+     *                      initializing the model
+     */
+    public function __construct(array $data = null)
+    {
+        $this->setIfExists('gt', $data ?? [], null);
+        $this->setIfExists('gte', $data ?? [], null);
+        $this->setIfExists('lt', $data ?? [], null);
+        $this->setIfExists('lte', $data ?? [], null);
+    }
+
+    /**
+    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+    * $this->openAPINullablesSetToNull array
+    *
+    * @param string $variableName
+    * @param array  $fields
+    * @param mixed  $defaultValue
+    */
+    private function setIfExists(string $variableName, array $fields, $defaultValue): void
+    {
+        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
+            $this->openAPINullablesSetToNull[] = $variableName;
+        }
+
+        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+    }
+
+    /**
+     * Show all the invalid properties with reasons.
+     *
+     * @return array invalid properties with reasons
+     */
+    public function listInvalidProperties()
+    {
+        $invalidProperties = [];
+
+        return $invalidProperties;
+    }
+
+    /**
+     * Validate all the properties in the model
+     * return true if all passed
+     *
+     * @return bool True if all properties are valid
+     */
+    public function valid()
+    {
+        return count($this->listInvalidProperties()) === 0;
+    }
+
+    /**
+     * Gets gt
+     *
+     * @return string|null
+     */
+    public function getGt()
+    {
+        return $this->container['GT'];
+    }
+
+    /**
+     * Sets gt
+     *
+     * @param string|null $gt gt
+     *
+     * @return self
+     */
+    public function setGt($gt)
+    {
+        if (is_null($gt)) {
+            throw new \InvalidArgumentException('non-nullable GT cannot be null');
+        }
+        $this->container['GT'] = $gt;
+
+        return $this;
+    }
+
+    /**
+     * Gets gte
+     *
+     * @return string|null
+     */
+    public function getGte()
+    {
+        return $this->container['GTE'];
+    }
+
+    /**
+     * Sets gte
+     *
+     * @param string|null $gte gte
+     *
+     * @return self
+     */
+    public function setGte($gte)
+    {
+        if (is_null($gte)) {
+            throw new \InvalidArgumentException('non-nullable GTE cannot be null');
+        }
+        $this->container['GTE'] = $gte;
+
+        return $this;
+    }
+
+    /**
+     * Gets lte
+     *
+     * @return string|null
+     */
+    public function getLte()
+    {
+        return $this->container['LTE'];
+    }
+
+    /**
+     * Sets lte
+     *
+     * @param string|null $lte lte
+     *
+     * @return self
+     */
+    public function setLte($lte)
+    {
+        if (is_null($lte)) {
+            throw new \InvalidArgumentException('non-nullable LTE cannot be null');
+        }
+        $this->container['LTE'] = $lte;
+
+        return $this;
+    }
+
+    /**
+     * Gets lt
+     *
+     * @return string|null
+     */
+    public function getLt()
+    {
+        return $this->container['LT'];
+    }
+
+    /**
+     * Sets lt
+     *
+     * @param string|null $lt lt
+     *
+     * @return self
+     */
+    public function setLt($lt)
+    {
+        if (is_null($lt)) {
+            throw new \InvalidArgumentException('non-nullable LT cannot be null');
+        }
+        $this->container['LT'] = $lt;
+
+        return $this;
+    }
+
+    /**
+     * Returns true if offset exists. False otherwise.
+     *
+     * @param integer $offset Offset
+     *
+     * @return boolean
+     */
+    public function offsetExists($offset): bool
+    {
+        return isset($this->container[$offset]);
+    }
+
+    /**
+     * Gets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return mixed|null
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetGet($offset)
+    {
+        return $this->container[$offset] ?? null;
+    }
+
+    /**
+     * Sets value based on offset.
+     *
+     * @param string|null $offset Offset
+     * @param mixed    $value  Value to be set
+     *
+     * @return void
+     */
+    public function offsetSet($offset, $value): void
+    {
+        if (is_null($offset)) {
+            $this->container[] = $value;
+        } else {
+            $this->container[$offset] = $value;
+        }
+    }
+
+    /**
+     * Unsets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return void
+     */
+    public function offsetUnset($offset): void
+    {
+        unset($this->container[$offset]);
+    }
+
+    /**
+     * Serializes the object to a value that can be serialized natively by json_encode().
+     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+     *
+     * @return mixed Returns data which can be serialized by json_encode(), which is a value
+     * of any type other than a resource.
+     */
+    #[\ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+       return ObjectSerializer::sanitizeForSerialization($this);
+    }
+
+    /**
+     * Gets the string presentation of the object
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return json_encode(
+            ObjectSerializer::sanitizeForSerialization($this),
+            JSON_PRETTY_PRINT
+        );
+    }
+
+    /**
+     * Gets a header-safe presentation of the object
+     *
+     * @return string
+     */
+    public function toHeaderValue()
+    {
+        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+    }
+}
diff --git a/lib/Model/FilterFieldTerm.php b/lib/Model/FilterFieldTerm.php
new file mode 100644
index 0000000..1f2db4f
--- /dev/null
+++ b/lib/Model/FilterFieldTerm.php
@@ -0,0 +1,408 @@
+<?php
+/**
+ * FilterFieldTerm
+ *
+ * PHP version 7.4
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ */
+
+/**
+ * INDA HR - INtelligent Data Analysis for HR
+ *
+ * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
+ *
+ * The version of the OpenAPI document: 2.2.0
+ * Contact: info@intervieweb.it
+ * Generated by: https://openapi-generator.tech
+ * OpenAPI Generator version: 6.3.0-SNAPSHOT
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace OpenAPI\Client\Model;
+
+use \ArrayAccess;
+use \OpenAPI\Client\ObjectSerializer;
+
+/**
+ * FilterFieldTerm Class Doc Comment
+ *
+ * @category Class
+ * @package  OpenAPI\Client
+ * @author   OpenAPI Generator team
+ * @link     https://openapi-generator.tech
+ * @implements \ArrayAccess<string, mixed>
+ */
+class FilterFieldTerm implements FilterFieldInterface, ModelInterface, ArrayAccess, \JsonSerializable
+{
+    public const DISCRIMINATOR = null;
+
+    /**
+      * The original name of the model.
+      *
+      * @var string
+      */
+    protected static $openAPIModelName = 'FilterFieldTerm';
+
+    /**
+      * Array of property to type mappings. Used for (de)serialization
+      *
+      * @var string[]
+      */
+    protected static $openAPITypes = [
+        'term' => 'string',
+    ];
+
+    /**
+      * Array of property to format mappings. Used for (de)serialization
+      *
+      * @var string[]
+      * @phpstan-var array<string, string|null>
+      * @psalm-var array<string, string|null>
+      */
+    protected static $openAPIFormats = [
+        'term' => null,
+    ];
+
+    /**
+      * Array of nullable properties. Used for (de)serialization
+      *
+      * @var boolean[]
+      */
+    protected static array $openAPINullables = [
+        'term' => false,
+    ];
+
+    /**
+      * If a nullable field gets set to null, insert it here
+      *
+      * @var boolean[]
+      */
+    protected array $openAPINullablesSetToNull = [];
+
+    /**
+     * Array of property to type mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPITypes()
+    {
+        return self::$openAPITypes;
+    }
+
+    /**
+     * Array of property to format mappings. Used for (de)serialization
+     *
+     * @return array
+     */
+    public static function openAPIFormats()
+    {
+        return self::$openAPIFormats;
+    }
+
+    /**
+     * Array of nullable properties
+     *
+     * @return array
+     */
+    protected static function openAPINullables(): array
+    {
+        return self::$openAPINullables;
+    }
+
+    /**
+     * Array of nullable field names deliberately set to null
+     *
+     * @return boolean[]
+     */
+    private function getOpenAPINullablesSetToNull(): array
+    {
+        return $this->openAPINullablesSetToNull;
+    }
+
+    /**
+     * Setter - Array of nullable field names deliberately set to null
+     *
+     * @param boolean[] $openAPINullablesSetToNull
+     */
+    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+    {
+        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+    }
+
+    /**
+     * Checks if a property is nullable
+     *
+     * @param string $property
+     * @return bool
+     */
+    public static function isNullable(string $property): bool
+    {
+        return self::openAPINullables()[$property] ?? false;
+    }
+
+    /**
+     * Checks if a nullable property is set to null.
+     *
+     * @param string $property
+     * @return bool
+     */
+    public function isNullableSetToNull(string $property): bool
+    {
+        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+    }
+
+    /**
+     * Array of attributes where the term is the local name,
+     * and the value is the original name
+     *
+     * @var string[]
+     */
+    protected static $attributeMap = [
+        'term' => 'Term',
+    ];
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @var string[]
+     */
+    protected static $setters = [
+        'term' => 'setTerm',
+    ];
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @var string[]
+     */
+    protected static $getters = [
+        'term' => 'getTerm',
+    ];
+
+    /**
+     * Array of attributes where the term is the local name,
+     * and the value is the original name
+     *
+     * @return array
+     */
+    public static function attributeMap()
+    {
+        return self::$attributeMap;
+    }
+
+    /**
+     * Array of attributes to setter functions (for deserialization of responses)
+     *
+     * @return array
+     */
+    public static function setters()
+    {
+        return self::$setters;
+    }
+
+    /**
+     * Array of attributes to getter functions (for serialization of requests)
+     *
+     * @return array
+     */
+    public static function getters()
+    {
+        return self::$getters;
+    }
+
+    /**
+     * The original name of the model.
+     *
+     * @return string
+     */
+    public function getModelName()
+    {
+        return self::$openAPIModelName;
+    }
+
+
+    /**
+     * Associative array for storing property values
+     *
+     * @var mixed[]
+     */
+    protected $container = [];
+
+    /**
+     * Constructor
+     *
+     * @param mixed[] $data Associated array of property values
+     *                      initializing the model
+     */
+    public function __construct(array $data = null)
+    {
+        $this->setIfExists('term', $data ?? [], null);
+    }
+
+    /**
+    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+    * $this->openAPINullablesSetToNull array
+    *
+    * @param string $variableName
+    * @param array  $fields
+    * @param mixed  $defaultValue
+    */
+    private function setIfExists(string $variableName, array $fields, $defaultValue): void
+    {
+        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
+            $this->openAPINullablesSetToNull[] = $variableName;
+        }
+
+        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+    }
+
+    /**
+     * Show all the invalid properties with reasons.
+     *
+     * @return array invalid properties with reasons
+     */
+    public function listInvalidProperties()
+    {
+        $invalidProperties = [];
+
+        return $invalidProperties;
+    }
+
+    /**
+     * Validate all the properties in the model
+     * return true if all passed
+     *
+     * @return bool True if all properties are valid
+     */
+    public function valid()
+    {
+        return count($this->listInvalidProperties()) === 0;
+    }
+
+    /**
+     * Gets term
+     *
+     * @return string|null
+     */
+    public function getTerm()
+    {
+        return $this->container['Term'];
+    }
+
+    /**
+     * Sets term
+     *
+     * @param string|null $term term
+     *
+     * @return self
+     */
+    public function setTerm($term)
+    {
+        if (is_null($term)) {
+            throw new \InvalidArgumentException('non-nullable Term cannot be null');
+        }
+        $this->container['Term'] = $term;
+
+        return $this;
+    }
+
+    /**
+     * Returns true if offset exists. False otherwise.
+     *
+     * @param integer $offset Offset
+     *
+     * @return boolean
+     */
+    public function offsetExists($offset): bool
+    {
+        return isset($this->container[$offset]);
+    }
+
+    /**
+     * Gets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return mixed|null
+     */
+    #[\ReturnTypeWillChange]
+    public function offsetGet($offset)
+    {
+        return $this->container[$offset] ?? null;
+    }
+
+    /**
+     * Sets value based on offset.
+     *
+     * @param string|null $offset Offset
+     * @param mixed    $value  Value to be set
+     *
+     * @return void
+     */
+    public function offsetSet($offset, $value): void
+    {
+        if (is_null($offset)) {
+            $this->container[] = $value;
+        } else {
+            $this->container[$offset] = $value;
+        }
+    }
+
+    /**
+     * Unsets offset.
+     *
+     * @param integer $offset Offset
+     *
+     * @return void
+     */
+    public function offsetUnset($offset): void
+    {
+        unset($this->container[$offset]);
+    }
+
+    /**
+     * Serializes the object to a value that can be serialized natively by json_encode().
+     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+     *
+     * @return mixed Returns data which can be serialized by json_encode(), which is a value
+     * of any type other than a resource.
+     */
+    #[\ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+       return ObjectSerializer::sanitizeForSerialization($this);
+    }
+
+    /**
+     * Gets the string presentation of the object
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return json_encode(
+            ObjectSerializer::sanitizeForSerialization($this),
+            JSON_PRETTY_PRINT
+        );
+    }
+
+    /**
+     * Gets a header-safe presentation of the object
+     *
+     * @return string
+     */
+    public function toHeaderValue()
+    {
+        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+    }
+}

From 5bb2f03697bd851b3e55e379255aafda95911515 Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Mon, 25 Mar 2024 10:55:20 +0100
Subject: [PATCH 03/11] fix(JobAdId): fix missing jobAdId value

---
 lib/Model/JobadId.php | 38 ++++++++++++++++++++++++++++++++------
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/lib/Model/JobadId.php b/lib/Model/JobadId.php
index 6d7eaa8..85fbd8a 100644
--- a/lib/Model/JobadId.php
+++ b/lib/Model/JobadId.php
@@ -58,7 +58,7 @@ class JobadId implements ModelInterface, ArrayAccess, \JsonSerializable
       * @var string[]
       */
     protected static $openAPITypes = [
-        
+        'value' => 'string'
     ];
 
     /**
@@ -69,7 +69,7 @@ class JobadId implements ModelInterface, ArrayAccess, \JsonSerializable
       * @psalm-var array<string, string|null>
       */
     protected static $openAPIFormats = [
-        
+        'value' => null
     ];
 
     /**
@@ -78,7 +78,7 @@ class JobadId implements ModelInterface, ArrayAccess, \JsonSerializable
       * @var boolean[]
       */
     protected static array $openAPINullables = [
-        
+        'value' => false
     ];
 
     /**
@@ -167,7 +167,7 @@ public function isNullableSetToNull(string $property): bool
      * @var string[]
      */
     protected static $attributeMap = [
-        
+        'value' => 'Value'
     ];
 
     /**
@@ -176,7 +176,7 @@ public function isNullableSetToNull(string $property): bool
      * @var string[]
      */
     protected static $setters = [
-        
+        'value' => 'setValue'
     ];
 
     /**
@@ -185,7 +185,7 @@ public function isNullableSetToNull(string $property): bool
      * @var string[]
      */
     protected static $getters = [
-        
+        'value' => 'getValue'
     ];
 
     /**
@@ -245,6 +245,7 @@ public function getModelName()
      */
     public function __construct(array $data = null)
     {
+        $this->setIfExists('value', $data ?? [], null);
     }
 
     /**
@@ -287,7 +288,32 @@ public function valid()
     {
         return count($this->listInvalidProperties()) === 0;
     }
+    /**
+     * Gets value
+     *
+     * @return string|null
+     */
+    public function getValue()
+    {
+        return $this->container['value'];
+    }
 
+    /**
+     * Sets value
+     *
+     * @param string|null $value value
+     *
+     * @return self
+     */
+    public function setValue($value)
+    {
+        if (is_null($value)) {
+            throw new \InvalidArgumentException('non-nullable value cannot be null');
+        }
+        $this->container['value'] = $value;
+
+        return $this;
+    }
     /**
      * Returns true if offset exists. False otherwise.
      *

From efcece45751b0da521eb39e41baf5f2d2a438882 Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Mon, 25 Mar 2024 10:55:46 +0100
Subject: [PATCH 04/11] fix(ApplicationManagement): fix missing jobAdId import

---
 lib/inda_hr/ApplicationManagementApi.php | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/lib/inda_hr/ApplicationManagementApi.php b/lib/inda_hr/ApplicationManagementApi.php
index 2f1cae9..3a99e6f 100644
--- a/lib/inda_hr/ApplicationManagementApi.php
+++ b/lib/inda_hr/ApplicationManagementApi.php
@@ -38,6 +38,7 @@
 use OpenAPI\Client\ApiException;
 use OpenAPI\Client\Configuration;
 use OpenAPI\Client\HeaderSelector;
+use OpenAPI\Client\Model\JobadId;
 use OpenAPI\Client\ObjectSerializer;
 
 /**
@@ -487,7 +488,7 @@ public function addApplicationPOSTRequest($indexname, $jobad_id, $resume_id, $ba
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -910,7 +911,7 @@ public function addApplicationStagePOSTRequest($indexname, $resume_id, $jobad_id
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -1282,7 +1283,7 @@ public function applicationStatusGETRequest($indexname, $jobad_id, $resume_id, s
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -1677,7 +1678,7 @@ public function applyPOSTRequest($indexname, $jobad_id, $apply_item_request, $re
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -2060,7 +2061,7 @@ public function deleteApplicantsDELETERequest($indexname, $jobad_id, string $con
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -2448,7 +2449,7 @@ public function deleteApplicationDELETERequest($indexname, $jobad_id, $resume_id
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -2880,7 +2881,7 @@ public function deleteApplicationStageDELETERequest($indexname, $jobad_id, $resu
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -3747,7 +3748,7 @@ public function getApplicantsGETRequest($indexname, $jobad_id, $cache = true, $c
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -4143,7 +4144,7 @@ public function getApplicationGETRequest($indexname, $resume_id, $jobad_id, stri
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }
@@ -5026,7 +5027,7 @@ public function patchApplicationPATCHRequest($indexname, $jobad_id, $resume_id,
         if ($jobad_id !== null) {
             $resourcePath = str_replace(
                 '{' . 'jobad_id' . '}',
-                ObjectSerializer::toPathValue($jobad_id),
+                $jobad_id->getValue(),
                 $resourcePath
             );
         }

From c3cf1d9ffc3532cb27aef6df876125c0bcc0ae8e Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Mon, 25 Mar 2024 10:57:17 +0100
Subject: [PATCH 05/11] fix(Jobmatching): update query to nullable

---
 lib/inda_hr/JobAdToResumesApi.php | 9 +--------
 lib/inda_hr/ResumeToJobAdsApi.php | 9 +--------
 2 files changed, 2 insertions(+), 16 deletions(-)

diff --git a/lib/inda_hr/JobAdToResumesApi.php b/lib/inda_hr/JobAdToResumesApi.php
index c78062f..2774982 100644
--- a/lib/inda_hr/JobAdToResumesApi.php
+++ b/lib/inda_hr/JobAdToResumesApi.php
@@ -892,7 +892,7 @@ public function matchResumesEvidencePOSTRequest($indexname, $resume_matching_evi
      * @throws \InvalidArgumentException
      * @return \OpenAPI\Client\Model\SearchResumeMatchResponse|\OpenAPI\Client\Model\ErrorModel|\OpenAPI\Client\Model\HTTPValidationError
      */
-    public function matchResumesFromIndexedJobadPOST($indexname, $jobad_id, $base_resume_matching_query, $size = 20, $offset = 0, $min_score = 0, $dst_lang = null, $resume_langs = null, $only_applicants = false, $exclude_applicants = false, string $contentType = self::contentTypes['matchResumesFromIndexedJobadPOST'][0])
+    public function matchResumesFromIndexedJobadPOST($indexname, $jobad_id, $base_resume_matching_query = null, $size = 20, $offset = 0, $min_score = 0, $dst_lang = null, $resume_langs = null, $only_applicants = false, $exclude_applicants = false, string $contentType = self::contentTypes['matchResumesFromIndexedJobadPOST'][0])
     {
         list($response) = $this->matchResumesFromIndexedJobadPOSTWithHttpInfo($indexname, $jobad_id, $base_resume_matching_query, $size, $offset, $min_score, $dst_lang, $resume_langs, $only_applicants, $exclude_applicants, $contentType);
         return $response;
@@ -1179,13 +1179,6 @@ public function matchResumesFromIndexedJobadPOSTRequest($indexname, $jobad_id, $
             );
         }
 
-        // verify the required parameter 'base_resume_matching_query' is set
-        if ($base_resume_matching_query === null || (is_array($base_resume_matching_query) && count($base_resume_matching_query) === 0)) {
-            throw new \InvalidArgumentException(
-                'Missing the required parameter $base_resume_matching_query when calling matchResumesFromIndexedJobadPOST'
-            );
-        }
-
         if ($size !== null && $size > 100) {
             throw new \InvalidArgumentException('invalid value for "$size" when calling JobAdToResumesApi.matchResumesFromIndexedJobadPOST, must be smaller than or equal to 100.');
         }
diff --git a/lib/inda_hr/ResumeToJobAdsApi.php b/lib/inda_hr/ResumeToJobAdsApi.php
index daee7f8..0455ef2 100644
--- a/lib/inda_hr/ResumeToJobAdsApi.php
+++ b/lib/inda_hr/ResumeToJobAdsApi.php
@@ -890,7 +890,7 @@ public function matchJobadsEvidencePOSTRequest($indexname, $jobad_matching_evide
      * @throws \InvalidArgumentException
      * @return \OpenAPI\Client\Model\SearchJobAdMatchResponse|\OpenAPI\Client\Model\ErrorModel|\OpenAPI\Client\Model\HTTPValidationError
      */
-    public function matchJobadsFromIndexedResumePOST($indexname, $resume_id, $base_jobad_matching_query, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
+    public function matchJobadsFromIndexedResumePOST($indexname, $resume_id, $base_jobad_matching_query = null, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
     {
         list($response) = $this->matchJobadsFromIndexedResumePOSTWithHttpInfo($indexname, $resume_id, $base_jobad_matching_query, $size, $offset, $min_score, $dst_lang, $jobad_langs, $contentType);
         return $response;
@@ -1169,13 +1169,6 @@ public function matchJobadsFromIndexedResumePOSTRequest($indexname, $resume_id,
             );
         }
 
-        // verify the required parameter 'base_jobad_matching_query' is set
-        if ($base_jobad_matching_query === null || (is_array($base_jobad_matching_query) && count($base_jobad_matching_query) === 0)) {
-            throw new \InvalidArgumentException(
-                'Missing the required parameter $base_jobad_matching_query when calling matchJobadsFromIndexedResumePOST'
-            );
-        }
-
         if ($size !== null && $size > 50) {
             throw new \InvalidArgumentException('invalid value for "$size" when calling ResumeToJobAdsApi.matchJobadsFromIndexedResumePOST, must be smaller than or equal to 50.');
         }

From 0d96ca01cf6add3148564df52da60bb3c561678c Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Fri, 29 Mar 2024 09:10:27 +0100
Subject: [PATCH 06/11] feat(Jobmatching): add exclude applicants filter in
 resume to jobAds api

---
 lib/inda_hr/ResumeToJobAdsApi.php | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/inda_hr/ResumeToJobAdsApi.php b/lib/inda_hr/ResumeToJobAdsApi.php
index 0455ef2..419c063 100644
--- a/lib/inda_hr/ResumeToJobAdsApi.php
+++ b/lib/inda_hr/ResumeToJobAdsApi.php
@@ -890,9 +890,9 @@ public function matchJobadsEvidencePOSTRequest($indexname, $jobad_matching_evide
      * @throws \InvalidArgumentException
      * @return \OpenAPI\Client\Model\SearchJobAdMatchResponse|\OpenAPI\Client\Model\ErrorModel|\OpenAPI\Client\Model\HTTPValidationError
      */
-    public function matchJobadsFromIndexedResumePOST($indexname, $resume_id, $base_jobad_matching_query = null, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
+    public function matchJobadsFromIndexedResumePOST($indexname, $resume_id, $base_jobad_matching_query = null, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, bool $exclude_applicants = false, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
     {
-        list($response) = $this->matchJobadsFromIndexedResumePOSTWithHttpInfo($indexname, $resume_id, $base_jobad_matching_query, $size, $offset, $min_score, $dst_lang, $jobad_langs, $contentType);
+        list($response) = $this->matchJobadsFromIndexedResumePOSTWithHttpInfo($indexname, $resume_id, $base_jobad_matching_query, $size, $offset, $min_score, $dst_lang, $jobad_langs, $exclude_applicants, $contentType);
         return $response;
     }
 
@@ -915,9 +915,9 @@ public function matchJobadsFromIndexedResumePOST($indexname, $resume_id, $base_j
      * @throws \InvalidArgumentException
      * @return array of \OpenAPI\Client\Model\SearchJobAdMatchResponse|\OpenAPI\Client\Model\ErrorModel|\OpenAPI\Client\Model\HTTPValidationError, HTTP status code, HTTP response headers (array of strings)
      */
-    public function matchJobadsFromIndexedResumePOSTWithHttpInfo($indexname, $resume_id, $base_jobad_matching_query, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
+    public function matchJobadsFromIndexedResumePOSTWithHttpInfo($indexname, $resume_id, $base_jobad_matching_query, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, bool $exclude_applicants = false, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
     {
-        $request = $this->matchJobadsFromIndexedResumePOSTRequest($indexname, $resume_id, $base_jobad_matching_query, $size, $offset, $min_score, $dst_lang, $jobad_langs, $contentType);
+        $request = $this->matchJobadsFromIndexedResumePOSTRequest($indexname, $resume_id, $base_jobad_matching_query, $size, $offset, $min_score, $dst_lang, $jobad_langs, $exclude_applicants, $contentType);
 
         try {
             $options = $this->createHttpClientOption();
@@ -1152,7 +1152,7 @@ function ($exception) {
      * @throws \InvalidArgumentException
      * @return \GuzzleHttp\Psr7\Request
      */
-    public function matchJobadsFromIndexedResumePOSTRequest($indexname, $resume_id, $base_jobad_matching_query, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
+    public function matchJobadsFromIndexedResumePOSTRequest($indexname, $resume_id, $base_jobad_matching_query, $size = 5, $offset = 0, $min_score = 0, $dst_lang = null, $jobad_langs = null, bool $exclude_applicants = false, string $contentType = self::contentTypes['matchJobadsFromIndexedResumePOST'][0])
     {
 
         // verify the required parameter 'indexname' is set
@@ -1242,7 +1242,15 @@ public function matchJobadsFromIndexedResumePOSTRequest($indexname, $resume_id,
             true, // explode
             false // required
         ) ?? []);
-
+        // query params
+        $queryParams = array_merge($queryParams, ObjectSerializer::toQueryValue(
+            $exclude_applicants,
+            'exclude_applicants', // param base name
+            'boolean', // openApiType
+            'form', // style
+            true, // explode
+            false // required
+        ) ?? []);
 
         // path params
         if ($indexname !== null) {

From f692934199dd815edc3f0873a8d88e061241981d Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Fri, 5 Apr 2024 09:45:36 +0200
Subject: [PATCH 07/11] Revert "fix(Filters): fix missing filters classes"

This reverts commit 77af9e38a49ab3ea5e22dd3c332ac587c4ad0cb6.
---
 lib/Model/FilterField.php                  |  74 +--
 lib/Model/FilterFieldGeoDistance.php       | 442 ------------------
 lib/Model/FilterFieldGeoDistanceCentre.php | 442 ------------------
 lib/Model/FilterFieldInterface.php         |   8 -
 lib/Model/FilterFieldRange.php             | 510 ---------------------
 lib/Model/FilterFieldTerm.php              | 408 -----------------
 6 files changed, 37 insertions(+), 1847 deletions(-)
 delete mode 100644 lib/Model/FilterFieldGeoDistance.php
 delete mode 100644 lib/Model/FilterFieldGeoDistanceCentre.php
 delete mode 100644 lib/Model/FilterFieldInterface.php
 delete mode 100644 lib/Model/FilterFieldRange.php
 delete mode 100644 lib/Model/FilterFieldTerm.php

diff --git a/lib/Model/FilterField.php b/lib/Model/FilterField.php
index c376820..8aaed34 100644
--- a/lib/Model/FilterField.php
+++ b/lib/Model/FilterField.php
@@ -46,30 +46,30 @@ class FilterField implements ModelInterface, ArrayAccess, \JsonSerializable
     public const DISCRIMINATOR = null;
 
     /**
-     * The original name of the model.
-     *
-     * @var string
-     */
+      * The original name of the model.
+      *
+      * @var string
+      */
     protected static $openAPIModelName = 'FilterField';
 
     /**
-     * Array of property to type mappings. Used for (de)serialization
-     *
-     * @var string[]
-     */
+      * Array of property to type mappings. Used for (de)serialization
+      *
+      * @var string[]
+      */
     protected static $openAPITypes = [
         'field' => 'string',
         'type' => 'string',
-        'value' => '\OpenAPI\Client\Model\FilterFieldInterface'
+        'value' => 'object'
     ];
 
     /**
-     * Array of property to format mappings. Used for (de)serialization
-     *
-     * @var string[]
-     * @phpstan-var array<string, string|null>
-     * @psalm-var array<string, string|null>
-     */
+      * Array of property to format mappings. Used for (de)serialization
+      *
+      * @var string[]
+      * @phpstan-var array<string, string|null>
+      * @psalm-var array<string, string|null>
+      */
     protected static $openAPIFormats = [
         'field' => null,
         'type' => null,
@@ -77,21 +77,21 @@ class FilterField implements ModelInterface, ArrayAccess, \JsonSerializable
     ];
 
     /**
-     * Array of nullable properties. Used for (de)serialization
-     *
-     * @var boolean[]
-     */
+      * Array of nullable properties. Used for (de)serialization
+      *
+      * @var boolean[]
+      */
     protected static array $openAPINullables = [
         'field' => false,
-        'type' => false,
-        'value' => false
+		'type' => false,
+		'value' => false
     ];
 
     /**
-     * If a nullable field gets set to null, insert it here
-     *
-     * @var boolean[]
-     */
+      * If a nullable field gets set to null, insert it here
+      *
+      * @var boolean[]
+      */
     protected array $openAPINullablesSetToNull = [];
 
     /**
@@ -263,14 +263,14 @@ public function __construct(array $data = null)
     }
 
     /**
-     * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-     * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-     * $this->openAPINullablesSetToNull array
-     *
-     * @param string $variableName
-     * @param array  $fields
-     * @param mixed  $defaultValue
-     */
+    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+    * $this->openAPINullablesSetToNull array
+    *
+    * @param string $variableName
+    * @param array  $fields
+    * @param mixed  $defaultValue
+    */
     private function setIfExists(string $variableName, array $fields, $defaultValue): void
     {
         if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
@@ -370,9 +370,9 @@ public function setType($type)
     /**
      * Gets value
      *
-     * @return FilterFieldInterface
+     * @return object
      */
-    public function getValue(): FilterFieldInterface
+    public function getValue()
     {
         return $this->container['value'];
     }
@@ -380,7 +380,7 @@ public function getValue(): FilterFieldInterface
     /**
      * Sets value
      *
-     * @param FilterFieldInterface $value value
+     * @param object $value value
      *
      * @return self
      */
@@ -457,7 +457,7 @@ public function offsetUnset($offset): void
     #[\ReturnTypeWillChange]
     public function jsonSerialize()
     {
-        return ObjectSerializer::sanitizeForSerialization($this);
+       return ObjectSerializer::sanitizeForSerialization($this);
     }
 
     /**
diff --git a/lib/Model/FilterFieldGeoDistance.php b/lib/Model/FilterFieldGeoDistance.php
deleted file mode 100644
index 8ab8a8f..0000000
--- a/lib/Model/FilterFieldGeoDistance.php
+++ /dev/null
@@ -1,442 +0,0 @@
-<?php
-/**
- * FilterFieldGeoDistance
- *
- * PHP version 7.4
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- */
-
-/**
- * INDA HR - INtelligent Data Analysis for HR
- *
- * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
- *
- * The version of the OpenAPI document: 2.2.0
- * Contact: info@intervieweb.it
- * Generated by: https://openapi-generator.tech
- * OpenAPI Generator version: 6.3.0-SNAPSHOT
- */
-
-/**
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
-
-namespace OpenAPI\Client\Model;
-
-use \ArrayAccess;
-use \OpenAPI\Client\ObjectSerializer;
-
-/**
- * FilterFieldGeoDistance Class Doc Comment
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- * @implements \ArrayAccess<string, mixed>
- */
-class FilterFieldGeoDistance implements FilterFieldInterface, ModelInterface, ArrayAccess, \JsonSerializable
-{
-    public const DISCRIMINATOR = null;
-
-    /**
-      * The original name of the model.
-      *
-      * @var string
-      */
-    protected static $openAPIModelName = 'FilterFieldGeoDistance';
-
-    /**
-      * Array of property to type mappings. Used for (de)serialization
-      *
-      * @var string[]
-      */
-    protected static $openAPITypes = [
-        'distance' => 'string',
-        'centre' => '\OpenAPI\Client\Model\FilterFieldGeoDistanceCentre',
-    ];
-
-    /**
-      * Array of property to format mappings. Used for (de)serialization
-      *
-      * @var string[]
-      * @phpstan-var array<string, string|null>
-      * @psalm-var array<string, string|null>
-      */
-    protected static $openAPIFormats = [
-        'distance' => null,
-        'centre' => null,
-    ];
-
-    /**
-      * Array of nullable properties. Used for (de)serialization
-      *
-      * @var boolean[]
-      */
-    protected static array $openAPINullables = [
-        'distance' => false,
-        'centre' => false,
-    ];
-
-    /**
-      * If a nullable field gets set to null, insert it here
-      *
-      * @var boolean[]
-      */
-    protected array $openAPINullablesSetToNull = [];
-
-    /**
-     * Array of property to type mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPITypes()
-    {
-        return self::$openAPITypes;
-    }
-
-    /**
-     * Array of property to format mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPIFormats()
-    {
-        return self::$openAPIFormats;
-    }
-
-    /**
-     * Array of nullable properties
-     *
-     * @return array
-     */
-    protected static function openAPINullables(): array
-    {
-        return self::$openAPINullables;
-    }
-
-    /**
-     * Array of nullable field names deliberately set to null
-     *
-     * @return boolean[]
-     */
-    private function getOpenAPINullablesSetToNull(): array
-    {
-        return $this->openAPINullablesSetToNull;
-    }
-
-    /**
-     * Setter - Array of nullable field names deliberately set to null
-     *
-     * @param boolean[] $openAPINullablesSetToNull
-     */
-    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
-    {
-        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
-    }
-
-    /**
-     * Checks if a property is nullable
-     *
-     * @param string $property
-     * @return bool
-     */
-    public static function isNullable(string $property): bool
-    {
-        return self::openAPINullables()[$property] ?? false;
-    }
-
-    /**
-     * Checks if a nullable property is set to null.
-     *
-     * @param string $property
-     * @return bool
-     */
-    public function isNullableSetToNull(string $property): bool
-    {
-        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
-    }
-
-    /**
-     * Array of attributes where the term is the local name,
-     * and the value is the original name
-     *
-     * @var string[]
-     */
-    protected static $attributeMap = [
-        'distance' => 'Distance',
-        'centre' => 'Centre',
-    ];
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @var string[]
-     */
-    protected static $setters = [
-        'distance' => 'setDistance',
-        'centre' => 'setCentre',
-    ];
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @var string[]
-     */
-    protected static $getters = [
-        'distance' => 'getDistance',
-        'centre' => 'getCentre',
-    ];
-
-    /**
-     * Array of attributes where the term is the local name,
-     * and the value is the original name
-     *
-     * @return array
-     */
-    public static function attributeMap()
-    {
-        return self::$attributeMap;
-    }
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @return array
-     */
-    public static function setters()
-    {
-        return self::$setters;
-    }
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @return array
-     */
-    public static function getters()
-    {
-        return self::$getters;
-    }
-
-    /**
-     * The original name of the model.
-     *
-     * @return string
-     */
-    public function getModelName()
-    {
-        return self::$openAPIModelName;
-    }
-
-
-    /**
-     * Associative array for storing property values
-     *
-     * @var mixed[]
-     */
-    protected $container = [];
-
-    /**
-     * Constructor
-     *
-     * @param mixed[] $data Associated array of property values
-     *                      initializing the model
-     */
-    public function __construct(array $data = null)
-    {
-        $this->setIfExists('distance', $data ?? [], null);
-        $this->setIfExists('centre', $data ?? [], null);
-    }
-
-    /**
-    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-    * $this->openAPINullablesSetToNull array
-    *
-    * @param string $variableName
-    * @param array  $fields
-    * @param mixed  $defaultValue
-    */
-    private function setIfExists(string $variableName, array $fields, $defaultValue): void
-    {
-        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
-            $this->openAPINullablesSetToNull[] = $variableName;
-        }
-
-        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
-    }
-
-    /**
-     * Show all the invalid properties with reasons.
-     *
-     * @return array invalid properties with reasons
-     */
-    public function listInvalidProperties()
-    {
-        $invalidProperties = [];
-
-        return $invalidProperties;
-    }
-
-    /**
-     * Validate all the properties in the model
-     * return true if all passed
-     *
-     * @return bool True if all properties are valid
-     */
-    public function valid()
-    {
-        return count($this->listInvalidProperties()) === 0;
-    }
-
-    /**
-     * Gets distance
-     *
-     * @return string|null
-     */
-    public function getDistance()
-    {
-        return $this->container['Distance'];
-    }
-
-    /**
-     * Sets distance
-     *
-     * @param string|null $distance distance
-     *
-     * @return self
-     */
-    public function setDistance($distance)
-    {
-        if (is_null($distance)) {
-            throw new \InvalidArgumentException('non-nullable Distance cannot be null');
-        }
-        $this->container['Distance'] = $distance;
-
-        return $this;
-    }
-
-    /**
-     * Gets centre
-     *
-     * @return FilterFieldGeoDistanceCentre|null
-     */
-    public function getCentre()
-    {
-        return $this->container['Centre'];
-    }
-
-    /**
-     * Sets centre
-     *
-     * @param FilterFieldGeoDistanceCentre|null $centre centre
-     *
-     * @return self
-     */
-    public function setCentre($centre)
-    {
-        if (is_null($centre)) {
-            throw new \InvalidArgumentException('non-nullable Centre cannot be null');
-        }
-        $this->container['Centre'] = $centre;
-
-        return $this;
-    }
-
-    /**
-     * Returns true if offset exists. False otherwise.
-     *
-     * @param integer $offset Offset
-     *
-     * @return boolean
-     */
-    public function offsetExists($offset): bool
-    {
-        return isset($this->container[$offset]);
-    }
-
-    /**
-     * Gets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return mixed|null
-     */
-    #[\ReturnTypeWillChange]
-    public function offsetGet($offset)
-    {
-        return $this->container[$offset] ?? null;
-    }
-
-    /**
-     * Sets value based on offset.
-     *
-     * @param string|null $offset Offset
-     * @param mixed    $value  Value to be set
-     *
-     * @return void
-     */
-    public function offsetSet($offset, $value): void
-    {
-        if (is_null($offset)) {
-            $this->container[] = $value;
-        } else {
-            $this->container[$offset] = $value;
-        }
-    }
-
-    /**
-     * Unsets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return void
-     */
-    public function offsetUnset($offset): void
-    {
-        unset($this->container[$offset]);
-    }
-
-    /**
-     * Serializes the object to a value that can be serialized natively by json_encode().
-     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
-     *
-     * @return mixed Returns data which can be serialized by json_encode(), which is a value
-     * of any type other than a resource.
-     */
-    #[\ReturnTypeWillChange]
-    public function jsonSerialize()
-    {
-       return ObjectSerializer::sanitizeForSerialization($this);
-    }
-
-    /**
-     * Gets the string presentation of the object
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return json_encode(
-            ObjectSerializer::sanitizeForSerialization($this),
-            JSON_PRETTY_PRINT
-        );
-    }
-
-    /**
-     * Gets a header-safe presentation of the object
-     *
-     * @return string
-     */
-    public function toHeaderValue()
-    {
-        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
-    }
-}
diff --git a/lib/Model/FilterFieldGeoDistanceCentre.php b/lib/Model/FilterFieldGeoDistanceCentre.php
deleted file mode 100644
index 62ecced..0000000
--- a/lib/Model/FilterFieldGeoDistanceCentre.php
+++ /dev/null
@@ -1,442 +0,0 @@
-<?php
-/**
- * FilterFieldCentre
- *
- * PHP version 7.4
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- */
-
-/**
- * INDA HR - INtelligent Data Analysis for HR
- *
- * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
- *
- * The version of the OpenAPI document: 2.2.0
- * Contact: info@intervieweb.it
- * Generated by: https://openapi-generator.tech
- * OpenAPI Generator version: 6.3.0-SNAPSHOT
- */
-
-/**
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
-
-namespace OpenAPI\Client\Model;
-
-use \ArrayAccess;
-use \OpenAPI\Client\ObjectSerializer;
-
-/**
- * FilterFieldCentre Class Doc Comment
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- * @implements \ArrayAccess<string, mixed>
- */
-class FilterFieldGeoDistanceCentre implements ModelInterface, ArrayAccess, \JsonSerializable
-{
-    public const DISCRIMINATOR = null;
-
-    /**
-      * The original name of the model.
-      *
-      * @var string
-      */
-    protected static $openAPIModelName = 'FilterFieldCentre';
-
-    /**
-      * Array of property to type mappings. Used for (de)serialization
-      *
-      * @var float[]
-      */
-    protected static $openAPITypes = [
-        'lat' => 'float',
-        'lon' => 'float',
-    ];
-
-    /**
-      * Array of property to format mappings. Used for (de)serialization
-      *
-      * @var float[]
-      * @phpstan-var array<string, float|null>
-      * @psalm-var array<string, float|null>
-      */
-    protected static $openAPIFormats = [
-        'lat' => null,
-        'lon' => null,
-    ];
-
-    /**
-      * Array of nullable properties. Used for (de)serialization
-      *
-      * @var boolean[]
-      */
-    protected static array $openAPINullables = [
-        'lat' => false,
-        'lon' => false,
-    ];
-
-    /**
-      * If a nullable field gets set to null, insert it here
-      *
-      * @var boolean[]
-      */
-    protected array $openAPINullablesSetToNull = [];
-
-    /**
-     * Array of property to type mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPITypes()
-    {
-        return self::$openAPITypes;
-    }
-
-    /**
-     * Array of property to format mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPIFormats()
-    {
-        return self::$openAPIFormats;
-    }
-
-    /**
-     * Array of nullable properties
-     *
-     * @return array
-     */
-    protected static function openAPINullables(): array
-    {
-        return self::$openAPINullables;
-    }
-
-    /**
-     * Array of nullable field names deliberately set to null
-     *
-     * @return boolean[]
-     */
-    private function getOpenAPINullablesSetToNull(): array
-    {
-        return $this->openAPINullablesSetToNull;
-    }
-
-    /**
-     * Setter - Array of nullable field names deliberately set to null
-     *
-     * @param boolean[] $openAPINullablesSetToNull
-     */
-    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
-    {
-        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
-    }
-
-    /**
-     * Checks if a property is nullable
-     *
-     * @param string $property
-     * @return bool
-     */
-    public static function isNullable(string $property): bool
-    {
-        return self::openAPINullables()[$property] ?? false;
-    }
-
-    /**
-     * Checks if a nullable property is set to null.
-     *
-     * @param string $property
-     * @return bool
-     */
-    public function isNullableSetToNull(string $property): bool
-    {
-        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
-    }
-
-    /**
-     * Array of attributes where the term is the local name,
-     * and the value is the original name
-     *
-     * @var string[]
-     */
-    protected static $attributeMap = [
-        'lat' => 'Lat',
-        'lon' => 'Lon',
-    ];
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @var string[]
-     */
-    protected static $setters = [
-        'lat' => 'setLat',
-        'lon' => 'setLon',
-    ];
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @var string[]
-     */
-    protected static $getters = [
-        'lat' => 'getLat',
-        'lon' => 'getLon',
-    ];
-
-    /**
-     * Array of attributes where the term is the local name,
-     * and the value is the original name
-     *
-     * @return array
-     */
-    public static function attributeMap()
-    {
-        return self::$attributeMap;
-    }
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @return array
-     */
-    public static function setters()
-    {
-        return self::$setters;
-    }
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @return array
-     */
-    public static function getters()
-    {
-        return self::$getters;
-    }
-
-    /**
-     * The original name of the model.
-     *
-     * @return string
-     */
-    public function getModelName()
-    {
-        return self::$openAPIModelName;
-    }
-
-
-    /**
-     * Associative array for storing property values
-     *
-     * @var mixed[]
-     */
-    protected $container = [];
-
-    /**
-     * Constructor
-     *
-     * @param mixed[] $data Associated array of property values
-     *                      initializing the model
-     */
-    public function __construct(array $data = null)
-    {
-        $this->setIfExists('lat', $data ?? [], null);
-        $this->setIfExists('lon', $data ?? [], null);
-    }
-
-    /**
-    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-    * $this->openAPINullablesSetToNull array
-    *
-    * @param string $variableName
-    * @param array  $fields
-    * @param mixed  $defaultValue
-    */
-    private function setIfExists(string $variableName, array $fields, $defaultValue): void
-    {
-        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
-            $this->openAPINullablesSetToNull[] = $variableName;
-        }
-
-        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
-    }
-
-    /**
-     * Show all the invalid properties with reasons.
-     *
-     * @return array invalid properties with reasons
-     */
-    public function listInvalidProperties()
-    {
-        $invalidProperties = [];
-
-        return $invalidProperties;
-    }
-
-    /**
-     * Validate all the properties in the model
-     * return true if all passed
-     *
-     * @return bool True if all properties are valid
-     */
-    public function valid()
-    {
-        return count($this->listInvalidProperties()) === 0;
-    }
-
-    /**
-     * Gets lat
-     *
-     * @return float|null
-     */
-    public function getLat()
-    {
-        return $this->container['lat'];
-    }
-
-    /**
-     * Sets lat
-     *
-     * @param float|null $lat lat
-     *
-     * @return self
-     */
-    public function setLat($lat)
-    {
-        if (is_null($lat)) {
-            throw new \InvalidArgumentException('non-nullable Lat cannot be null');
-        }
-        $this->container['lat'] = $lat;
-
-        return $this;
-    }
-
-    /**
-     * Gets lon
-     *
-     * @return float|null
-     */
-    public function getLon()
-    {
-        return $this->container['lon'];
-    }
-
-    /**
-     * Sets lon
-     *
-     * @param float|null $lon lon
-     *
-     * @return self
-     */
-    public function setLon($lon)
-    {
-        if (is_null($lon)) {
-            throw new \InvalidArgumentException('non-nullable Lon cannot be null');
-        }
-        $this->container['lon'] = $lon;
-
-        return $this;
-    }
-
-    /**
-     * Returns true if offset exists. False otherwise.
-     *
-     * @param integer $offset Offset
-     *
-     * @return boolean
-     */
-    public function offsetExists($offset): bool
-    {
-        return isset($this->container[$offset]);
-    }
-
-    /**
-     * Gets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return mixed|null
-     */
-    #[\ReturnTypeWillChange]
-    public function offsetGet($offset)
-    {
-        return $this->container[$offset] ?? null;
-    }
-
-    /**
-     * Sets value based on offset.
-     *
-     * @param string|null $offset Offset
-     * @param mixed    $value  Value to be set
-     *
-     * @return void
-     */
-    public function offsetSet($offset, $value): void
-    {
-        if (is_null($offset)) {
-            $this->container[] = $value;
-        } else {
-            $this->container[$offset] = $value;
-        }
-    }
-
-    /**
-     * Unsets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return void
-     */
-    public function offsetUnset($offset): void
-    {
-        unset($this->container[$offset]);
-    }
-
-    /**
-     * Serializes the object to a value that can be serialized natively by json_encode().
-     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
-     *
-     * @return mixed Returns data which can be serialized by json_encode(), which is a value
-     * of any type other than a resource.
-     */
-    #[\ReturnTypeWillChange]
-    public function jsonSerialize()
-    {
-       return ObjectSerializer::sanitizeForSerialization($this);
-    }
-
-    /**
-     * Gets the string presentation of the object
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return json_encode(
-            ObjectSerializer::sanitizeForSerialization($this),
-            JSON_PRETTY_PRINT
-        );
-    }
-
-    /**
-     * Gets a header-safe presentation of the object
-     *
-     * @return string
-     */
-    public function toHeaderValue()
-    {
-        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
-    }
-}
diff --git a/lib/Model/FilterFieldInterface.php b/lib/Model/FilterFieldInterface.php
deleted file mode 100644
index a067729..0000000
--- a/lib/Model/FilterFieldInterface.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace OpenAPI\Client\Model;
-
-interface FilterFieldInterface
-{
-
-}
\ No newline at end of file
diff --git a/lib/Model/FilterFieldRange.php b/lib/Model/FilterFieldRange.php
deleted file mode 100644
index 8ff42f9..0000000
--- a/lib/Model/FilterFieldRange.php
+++ /dev/null
@@ -1,510 +0,0 @@
-<?php
-/**
- * FilterFieldRange
- *
- * PHP version 7.4
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- */
-
-/**
- * INDA HR - INtelligent Data Analysis for HR
- *
- * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
- *
- * The version of the OpenAPI document: 2.2.0
- * Contact: info@intervieweb.it
- * Generated by: https://openapi-generator.tech
- * OpenAPI Generator version: 6.3.0-SNAPSHOT
- */
-
-/**
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
-
-namespace OpenAPI\Client\Model;
-
-use \ArrayAccess;
-use \OpenAPI\Client\ObjectSerializer;
-
-/**
- * FilterFieldRange Class Doc Comment
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- * @implements \ArrayAccess<string, mixed>
- */
-class FilterFieldRange implements FilterFieldInterface, ModelInterface, ArrayAccess, \JsonSerializable
-{
-    public const DISCRIMINATOR = null;
-
-    /**
-      * The original name of the model.
-      *
-      * @var string
-      */
-    protected static $openAPIModelName = 'FilterFieldRange';
-
-    /**
-      * Array of property to type mappings. Used for (de)serialization
-      *
-      * @var string[]
-      */
-    protected static $openAPITypes = [
-        'gt' => 'string',
-        'gte' => 'string',
-        'lt' => 'string',
-        'lte' => 'string',
-    ];
-
-    /**
-      * Array of property to format mappings. Used for (de)serialization
-      *
-      * @var string[]
-      * @phpstan-var array<string, string|null>
-      * @psalm-var array<string, string|null>
-      */
-    protected static $openAPIFormats = [
-        'gt' => null,
-        'gte' => null,
-        'lt' => null,
-        'lte' => null,
-    ];
-
-    /**
-      * Array of nullable properties. Used for (de)serialization
-      *
-      * @var boolean[]
-      */
-    protected static array $openAPINullables = [
-        'gt' => false,
-        'gte' => false,
-        'lt' => false,
-        'lte' => false,
-    ];
-
-    /**
-      * If a nullable field gets set to null, insert it here
-      *
-      * @var boolean[]
-      */
-    protected array $openAPINullablesSetToNull = [];
-
-    /**
-     * Array of property to type mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPITypes()
-    {
-        return self::$openAPITypes;
-    }
-
-    /**
-     * Array of property to format mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPIFormats()
-    {
-        return self::$openAPIFormats;
-    }
-
-    /**
-     * Array of nullable properties
-     *
-     * @return array
-     */
-    protected static function openAPINullables(): array
-    {
-        return self::$openAPINullables;
-    }
-
-    /**
-     * Array of nullable field names deliberately set to null
-     *
-     * @return boolean[]
-     */
-    private function getOpenAPINullablesSetToNull(): array
-    {
-        return $this->openAPINullablesSetToNull;
-    }
-
-    /**
-     * Setter - Array of nullable field names deliberately set to null
-     *
-     * @param boolean[] $openAPINullablesSetToNull
-     */
-    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
-    {
-        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
-    }
-
-    /**
-     * Checks if a property is nullable
-     *
-     * @param string $property
-     * @return bool
-     */
-    public static function isNullable(string $property): bool
-    {
-        return self::openAPINullables()[$property] ?? false;
-    }
-
-    /**
-     * Checks if a nullable property is set to null.
-     *
-     * @param string $property
-     * @return bool
-     */
-    public function isNullableSetToNull(string $property): bool
-    {
-        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
-    }
-
-    /**
-     * Array of attributes where the key is the local name,
-     * and the value is the original name
-     *
-     * @var string[]
-     */
-    protected static $attributeMap = [
-        'gt' => 'GT',
-        'gte' => 'GTE',
-        'lt' => 'LT',
-        'lte' => 'LTE',
-    ];
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @var string[]
-     */
-    protected static $setters = [
-        'gt' => 'setGt',
-        'gte' => 'setGte',
-        'lt' => 'setLt',
-        'lte' => 'setLte',
-    ];
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @var string[]
-     */
-    protected static $getters = [
-        'gt' => 'getGt',
-        'gte' => 'getGte',
-        'lt' => 'getLt',
-        'lte' => 'getLte'
-    ];
-
-    /**
-     * Array of attributes where the key is the local name,
-     * and the value is the original name
-     *
-     * @return array
-     */
-    public static function attributeMap()
-    {
-        return self::$attributeMap;
-    }
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @return array
-     */
-    public static function setters()
-    {
-        return self::$setters;
-    }
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @return array
-     */
-    public static function getters()
-    {
-        return self::$getters;
-    }
-
-    /**
-     * The original name of the model.
-     *
-     * @return string
-     */
-    public function getModelName()
-    {
-        return self::$openAPIModelName;
-    }
-
-
-    /**
-     * Associative array for storing property values
-     *
-     * @var mixed[]
-     */
-    protected $container = [];
-
-    /**
-     * Constructor
-     *
-     * @param mixed[] $data Associated array of property values
-     *                      initializing the model
-     */
-    public function __construct(array $data = null)
-    {
-        $this->setIfExists('gt', $data ?? [], null);
-        $this->setIfExists('gte', $data ?? [], null);
-        $this->setIfExists('lt', $data ?? [], null);
-        $this->setIfExists('lte', $data ?? [], null);
-    }
-
-    /**
-    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-    * $this->openAPINullablesSetToNull array
-    *
-    * @param string $variableName
-    * @param array  $fields
-    * @param mixed  $defaultValue
-    */
-    private function setIfExists(string $variableName, array $fields, $defaultValue): void
-    {
-        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
-            $this->openAPINullablesSetToNull[] = $variableName;
-        }
-
-        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
-    }
-
-    /**
-     * Show all the invalid properties with reasons.
-     *
-     * @return array invalid properties with reasons
-     */
-    public function listInvalidProperties()
-    {
-        $invalidProperties = [];
-
-        return $invalidProperties;
-    }
-
-    /**
-     * Validate all the properties in the model
-     * return true if all passed
-     *
-     * @return bool True if all properties are valid
-     */
-    public function valid()
-    {
-        return count($this->listInvalidProperties()) === 0;
-    }
-
-    /**
-     * Gets gt
-     *
-     * @return string|null
-     */
-    public function getGt()
-    {
-        return $this->container['GT'];
-    }
-
-    /**
-     * Sets gt
-     *
-     * @param string|null $gt gt
-     *
-     * @return self
-     */
-    public function setGt($gt)
-    {
-        if (is_null($gt)) {
-            throw new \InvalidArgumentException('non-nullable GT cannot be null');
-        }
-        $this->container['GT'] = $gt;
-
-        return $this;
-    }
-
-    /**
-     * Gets gte
-     *
-     * @return string|null
-     */
-    public function getGte()
-    {
-        return $this->container['GTE'];
-    }
-
-    /**
-     * Sets gte
-     *
-     * @param string|null $gte gte
-     *
-     * @return self
-     */
-    public function setGte($gte)
-    {
-        if (is_null($gte)) {
-            throw new \InvalidArgumentException('non-nullable GTE cannot be null');
-        }
-        $this->container['GTE'] = $gte;
-
-        return $this;
-    }
-
-    /**
-     * Gets lte
-     *
-     * @return string|null
-     */
-    public function getLte()
-    {
-        return $this->container['LTE'];
-    }
-
-    /**
-     * Sets lte
-     *
-     * @param string|null $lte lte
-     *
-     * @return self
-     */
-    public function setLte($lte)
-    {
-        if (is_null($lte)) {
-            throw new \InvalidArgumentException('non-nullable LTE cannot be null');
-        }
-        $this->container['LTE'] = $lte;
-
-        return $this;
-    }
-
-    /**
-     * Gets lt
-     *
-     * @return string|null
-     */
-    public function getLt()
-    {
-        return $this->container['LT'];
-    }
-
-    /**
-     * Sets lt
-     *
-     * @param string|null $lt lt
-     *
-     * @return self
-     */
-    public function setLt($lt)
-    {
-        if (is_null($lt)) {
-            throw new \InvalidArgumentException('non-nullable LT cannot be null');
-        }
-        $this->container['LT'] = $lt;
-
-        return $this;
-    }
-
-    /**
-     * Returns true if offset exists. False otherwise.
-     *
-     * @param integer $offset Offset
-     *
-     * @return boolean
-     */
-    public function offsetExists($offset): bool
-    {
-        return isset($this->container[$offset]);
-    }
-
-    /**
-     * Gets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return mixed|null
-     */
-    #[\ReturnTypeWillChange]
-    public function offsetGet($offset)
-    {
-        return $this->container[$offset] ?? null;
-    }
-
-    /**
-     * Sets value based on offset.
-     *
-     * @param string|null $offset Offset
-     * @param mixed    $value  Value to be set
-     *
-     * @return void
-     */
-    public function offsetSet($offset, $value): void
-    {
-        if (is_null($offset)) {
-            $this->container[] = $value;
-        } else {
-            $this->container[$offset] = $value;
-        }
-    }
-
-    /**
-     * Unsets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return void
-     */
-    public function offsetUnset($offset): void
-    {
-        unset($this->container[$offset]);
-    }
-
-    /**
-     * Serializes the object to a value that can be serialized natively by json_encode().
-     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
-     *
-     * @return mixed Returns data which can be serialized by json_encode(), which is a value
-     * of any type other than a resource.
-     */
-    #[\ReturnTypeWillChange]
-    public function jsonSerialize()
-    {
-       return ObjectSerializer::sanitizeForSerialization($this);
-    }
-
-    /**
-     * Gets the string presentation of the object
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return json_encode(
-            ObjectSerializer::sanitizeForSerialization($this),
-            JSON_PRETTY_PRINT
-        );
-    }
-
-    /**
-     * Gets a header-safe presentation of the object
-     *
-     * @return string
-     */
-    public function toHeaderValue()
-    {
-        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
-    }
-}
diff --git a/lib/Model/FilterFieldTerm.php b/lib/Model/FilterFieldTerm.php
deleted file mode 100644
index 1f2db4f..0000000
--- a/lib/Model/FilterFieldTerm.php
+++ /dev/null
@@ -1,408 +0,0 @@
-<?php
-/**
- * FilterFieldTerm
- *
- * PHP version 7.4
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- */
-
-/**
- * INDA HR - INtelligent Data Analysis for HR
- *
- * # Introduction  **INDA (INtelligent Data Analysis)** is an [Intervieweb](https://www.intervieweb.it/hrm/)  AI solution provided as a RESTful API.  The INDA pricing model is *credits-based*, which means that a certain number of credits is associated to each API request. Hence, users have to purchase a certain amount of credits (established according to their needs) which will be reduced  at each API call. INDA accepts and processes a user's request only if their credits quota is grater than - or,  at least, equal to - the number of credits required by that request. To obtain further details on the pricing, please visit our [site](https://inda.ai) or contact us.    INDA HR embraces a wide range of functionalities to manage the main elements of a recruitment process:   + [**candidate**](https://api.inda.ai/hr/docs/v2/#tag/Resume-Management) (hereafter also referred to as **resume** or **applicant**), or rather a  person looking for a job;  + [**job advertisement**](https://api.inda.ai/hr/docs/v2/#tag/JobAd-Management) (hereafter also referred to as **job ad**), which is a document   that collects all the main information and details about a job vacancy;  + [**application**](https://api.inda.ai/hr/docs/v2/#tag/Application-Management), that binds candidates to job ads; it is generated whenever a  candidate applies for a job.  Each of them has a specific set of methods that grants users the ability to create, read, update and delete the relative  documents, plus some special features based on AI approaches (such as *document parsing* or *semantic search*). They can be explored in their respective sections.  Data about the listed document types can be enriched by connecting them to other INDA supported entities, such as  [**companies**](https://api.inda.ai/hr/docs/v2/#tag/Company-Management) and [**universities**](https://api.inda.ai/hr/docs/v2/#tag/Universities), so that recruiters may  get a better and more detailed idea on the candidates' experiences and acquired skills.  All the functionalities mentioned above are meant to help recruiters during the talent acquisition process,  by exploiting the power of AI systems. Among the advantages a recruiter has by using this kind of systems, tackling the bias problem is surely one of the  most relevant. Bias in recruitment is a serious issue that affect both recruiters and candidates, since it may cause wrong hiring  decisions. As we care a lot about this problem, we are constantly working on reduce the bias in original data so that INDA  results may be as fair as possible. As of now, in order to tackle the bias issue, INDA automatically ignores specific fields (such as name, gender, age  and nationality) during the initial processing of each candidate data.  Furthermore, we decided to let users collect data of various types, including personal or sensitive details, but we  do not allow their usage if it is different from statistical purposes; our aim is to discourage recruiters from  focusing on candidates' personal information, and to put their attention on the candidate's skills and abilities.    We want to help recruiters to prevent any kind of bias while searching for the most valuable candidates they really need.    The following documentation is addressed both to developers, in order to provide all technical details for INDA integration, and to managers, to guide them in the exploration of the implementation possibilities.  The host of the API is [https://api.inda.ai/hr/v2/](https://api.inda.ai/hr/v2/). We recommend to check the API version and build (displayed near the documentation title). You can contact us at support@intervieweb.it in case of problems, suggestions, or particular needs.  The search panel on the left can be used to navigate through the documentation and provides an overview of the API structure. On the right, you can find (*i*) the url of the method, (*ii*) an example of request body (if present), and (*iii*) an example of response for each response code. Finally, in the central section of each API method, you can find (*i*) a general description of the purpose of the method, (*ii*) details on parameters and request body schema (if present), and (*iii*) details on response schema, error models, and error codes.
- *
- * The version of the OpenAPI document: 2.2.0
- * Contact: info@intervieweb.it
- * Generated by: https://openapi-generator.tech
- * OpenAPI Generator version: 6.3.0-SNAPSHOT
- */
-
-/**
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
-
-namespace OpenAPI\Client\Model;
-
-use \ArrayAccess;
-use \OpenAPI\Client\ObjectSerializer;
-
-/**
- * FilterFieldTerm Class Doc Comment
- *
- * @category Class
- * @package  OpenAPI\Client
- * @author   OpenAPI Generator team
- * @link     https://openapi-generator.tech
- * @implements \ArrayAccess<string, mixed>
- */
-class FilterFieldTerm implements FilterFieldInterface, ModelInterface, ArrayAccess, \JsonSerializable
-{
-    public const DISCRIMINATOR = null;
-
-    /**
-      * The original name of the model.
-      *
-      * @var string
-      */
-    protected static $openAPIModelName = 'FilterFieldTerm';
-
-    /**
-      * Array of property to type mappings. Used for (de)serialization
-      *
-      * @var string[]
-      */
-    protected static $openAPITypes = [
-        'term' => 'string',
-    ];
-
-    /**
-      * Array of property to format mappings. Used for (de)serialization
-      *
-      * @var string[]
-      * @phpstan-var array<string, string|null>
-      * @psalm-var array<string, string|null>
-      */
-    protected static $openAPIFormats = [
-        'term' => null,
-    ];
-
-    /**
-      * Array of nullable properties. Used for (de)serialization
-      *
-      * @var boolean[]
-      */
-    protected static array $openAPINullables = [
-        'term' => false,
-    ];
-
-    /**
-      * If a nullable field gets set to null, insert it here
-      *
-      * @var boolean[]
-      */
-    protected array $openAPINullablesSetToNull = [];
-
-    /**
-     * Array of property to type mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPITypes()
-    {
-        return self::$openAPITypes;
-    }
-
-    /**
-     * Array of property to format mappings. Used for (de)serialization
-     *
-     * @return array
-     */
-    public static function openAPIFormats()
-    {
-        return self::$openAPIFormats;
-    }
-
-    /**
-     * Array of nullable properties
-     *
-     * @return array
-     */
-    protected static function openAPINullables(): array
-    {
-        return self::$openAPINullables;
-    }
-
-    /**
-     * Array of nullable field names deliberately set to null
-     *
-     * @return boolean[]
-     */
-    private function getOpenAPINullablesSetToNull(): array
-    {
-        return $this->openAPINullablesSetToNull;
-    }
-
-    /**
-     * Setter - Array of nullable field names deliberately set to null
-     *
-     * @param boolean[] $openAPINullablesSetToNull
-     */
-    private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
-    {
-        $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
-    }
-
-    /**
-     * Checks if a property is nullable
-     *
-     * @param string $property
-     * @return bool
-     */
-    public static function isNullable(string $property): bool
-    {
-        return self::openAPINullables()[$property] ?? false;
-    }
-
-    /**
-     * Checks if a nullable property is set to null.
-     *
-     * @param string $property
-     * @return bool
-     */
-    public function isNullableSetToNull(string $property): bool
-    {
-        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
-    }
-
-    /**
-     * Array of attributes where the term is the local name,
-     * and the value is the original name
-     *
-     * @var string[]
-     */
-    protected static $attributeMap = [
-        'term' => 'Term',
-    ];
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @var string[]
-     */
-    protected static $setters = [
-        'term' => 'setTerm',
-    ];
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @var string[]
-     */
-    protected static $getters = [
-        'term' => 'getTerm',
-    ];
-
-    /**
-     * Array of attributes where the term is the local name,
-     * and the value is the original name
-     *
-     * @return array
-     */
-    public static function attributeMap()
-    {
-        return self::$attributeMap;
-    }
-
-    /**
-     * Array of attributes to setter functions (for deserialization of responses)
-     *
-     * @return array
-     */
-    public static function setters()
-    {
-        return self::$setters;
-    }
-
-    /**
-     * Array of attributes to getter functions (for serialization of requests)
-     *
-     * @return array
-     */
-    public static function getters()
-    {
-        return self::$getters;
-    }
-
-    /**
-     * The original name of the model.
-     *
-     * @return string
-     */
-    public function getModelName()
-    {
-        return self::$openAPIModelName;
-    }
-
-
-    /**
-     * Associative array for storing property values
-     *
-     * @var mixed[]
-     */
-    protected $container = [];
-
-    /**
-     * Constructor
-     *
-     * @param mixed[] $data Associated array of property values
-     *                      initializing the model
-     */
-    public function __construct(array $data = null)
-    {
-        $this->setIfExists('term', $data ?? [], null);
-    }
-
-    /**
-    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-    * $this->openAPINullablesSetToNull array
-    *
-    * @param string $variableName
-    * @param array  $fields
-    * @param mixed  $defaultValue
-    */
-    private function setIfExists(string $variableName, array $fields, $defaultValue): void
-    {
-        if (self::isNullable($variableName) && array_term_exists($variableName, $fields) && is_null($fields[$variableName])) {
-            $this->openAPINullablesSetToNull[] = $variableName;
-        }
-
-        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
-    }
-
-    /**
-     * Show all the invalid properties with reasons.
-     *
-     * @return array invalid properties with reasons
-     */
-    public function listInvalidProperties()
-    {
-        $invalidProperties = [];
-
-        return $invalidProperties;
-    }
-
-    /**
-     * Validate all the properties in the model
-     * return true if all passed
-     *
-     * @return bool True if all properties are valid
-     */
-    public function valid()
-    {
-        return count($this->listInvalidProperties()) === 0;
-    }
-
-    /**
-     * Gets term
-     *
-     * @return string|null
-     */
-    public function getTerm()
-    {
-        return $this->container['Term'];
-    }
-
-    /**
-     * Sets term
-     *
-     * @param string|null $term term
-     *
-     * @return self
-     */
-    public function setTerm($term)
-    {
-        if (is_null($term)) {
-            throw new \InvalidArgumentException('non-nullable Term cannot be null');
-        }
-        $this->container['Term'] = $term;
-
-        return $this;
-    }
-
-    /**
-     * Returns true if offset exists. False otherwise.
-     *
-     * @param integer $offset Offset
-     *
-     * @return boolean
-     */
-    public function offsetExists($offset): bool
-    {
-        return isset($this->container[$offset]);
-    }
-
-    /**
-     * Gets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return mixed|null
-     */
-    #[\ReturnTypeWillChange]
-    public function offsetGet($offset)
-    {
-        return $this->container[$offset] ?? null;
-    }
-
-    /**
-     * Sets value based on offset.
-     *
-     * @param string|null $offset Offset
-     * @param mixed    $value  Value to be set
-     *
-     * @return void
-     */
-    public function offsetSet($offset, $value): void
-    {
-        if (is_null($offset)) {
-            $this->container[] = $value;
-        } else {
-            $this->container[$offset] = $value;
-        }
-    }
-
-    /**
-     * Unsets offset.
-     *
-     * @param integer $offset Offset
-     *
-     * @return void
-     */
-    public function offsetUnset($offset): void
-    {
-        unset($this->container[$offset]);
-    }
-
-    /**
-     * Serializes the object to a value that can be serialized natively by json_encode().
-     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
-     *
-     * @return mixed Returns data which can be serialized by json_encode(), which is a value
-     * of any type other than a resource.
-     */
-    #[\ReturnTypeWillChange]
-    public function jsonSerialize()
-    {
-       return ObjectSerializer::sanitizeForSerialization($this);
-    }
-
-    /**
-     * Gets the string presentation of the object
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return json_encode(
-            ObjectSerializer::sanitizeForSerialization($this),
-            JSON_PRETTY_PRINT
-        );
-    }
-
-    /**
-     * Gets a header-safe presentation of the object
-     *
-     * @return string
-     */
-    public function toHeaderValue()
-    {
-        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
-    }
-}

From 85bf321b3dd0f2f08e6c1818add1ea566802d9dc Mon Sep 17 00:00:00 2001
From: Anna Bellinzona <anna.bellinzona@intervieweb.it>
Date: Mon, 22 Apr 2024 09:50:12 +0200
Subject: [PATCH 08/11] feat(Customizations): add custom fields feature +
 enable customizations for job ads

---
 lib/Model/CustomizableModelAbstract.php |  27 +
 lib/Model/PatchItemRequest.php          |  71 ++-
 lib/ObjectSerializer.php                |  57 +-
 lib/inda_hr/CustomizationsApi.php       | 656 +++++++++++++++++++++++-
 4 files changed, 764 insertions(+), 47 deletions(-)
 create mode 100644 lib/Model/CustomizableModelAbstract.php

diff --git a/lib/Model/CustomizableModelAbstract.php b/lib/Model/CustomizableModelAbstract.php
new file mode 100644
index 0000000..92aaf7c
--- /dev/null
+++ b/lib/Model/CustomizableModelAbstract.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OpenAPI\Client\Model;
+
+abstract class CustomizableModelAbstract
+{
+    public function __construct(private array $customizableFields)
+    {}
+
+    /**
+     * @return mixed
+     */
+    public function getCustomizableFields(): array
+    {
+        return $this->customizableFields;
+    }
+
+    /**
+     * @param mixed $customizableFields
+     * @return CustomizableModelAbstract
+     */
+    public function setCustomizableFields(array $customizableFields)
+    {
+        $this->customizableFields = $customizableFields;
+        return $this;
+    }
+}
diff --git a/lib/Model/PatchItemRequest.php b/lib/Model/PatchItemRequest.php
index 1a33a0b..669e501 100644
--- a/lib/Model/PatchItemRequest.php
+++ b/lib/Model/PatchItemRequest.php
@@ -41,22 +41,22 @@
  * @link     https://openapi-generator.tech
  * @implements \ArrayAccess<string, mixed>
  */
-class PatchItemRequest implements ModelInterface, ArrayAccess, \JsonSerializable
+class PatchItemRequest extends CustomizableModelAbstract implements ModelInterface, ArrayAccess, \JsonSerializable
 {
     public const DISCRIMINATOR = null;
 
     /**
-      * The original name of the model.
-      *
-      * @var string
-      */
+     * The original name of the model.
+     *
+     * @var string
+     */
     protected static $openAPIModelName = 'PatchItemRequest';
 
     /**
-      * Array of property to type mappings. Used for (de)serialization
-      *
-      * @var string[]
-      */
+     * Array of property to type mappings. Used for (de)serialization
+     *
+     * @var string[]
+     */
     protected static $openAPITypes = [
         'data' => '\OpenAPI\Client\Model\ResumeCommonData',
         'metadata' => '\OpenAPI\Client\Model\Metadata',
@@ -64,12 +64,12 @@ class PatchItemRequest implements ModelInterface, ArrayAccess, \JsonSerializable
     ];
 
     /**
-      * Array of property to format mappings. Used for (de)serialization
-      *
-      * @var string[]
-      * @phpstan-var array<string, string|null>
-      * @psalm-var array<string, string|null>
-      */
+     * Array of property to format mappings. Used for (de)serialization
+     *
+     * @var string[]
+     * @phpstan-var array<string, string|null>
+     * @psalm-var array<string, string|null>
+     */
     protected static $openAPIFormats = [
         'data' => null,
         'metadata' => null,
@@ -77,21 +77,21 @@ class PatchItemRequest implements ModelInterface, ArrayAccess, \JsonSerializable
     ];
 
     /**
-      * Array of nullable properties. Used for (de)serialization
-      *
-      * @var boolean[]
-      */
+     * Array of nullable properties. Used for (de)serialization
+     *
+     * @var boolean[]
+     */
     protected static array $openAPINullables = [
         'data' => false,
-		'metadata' => false,
-		'attachments' => false
+        'metadata' => false,
+        'attachments' => false
     ];
 
     /**
-      * If a nullable field gets set to null, insert it here
-      *
-      * @var boolean[]
-      */
+     * If a nullable field gets set to null, insert it here
+     *
+     * @var boolean[]
+     */
     protected array $openAPINullablesSetToNull = [];
 
     /**
@@ -260,17 +260,18 @@ public function __construct(array $data = null)
         $this->setIfExists('data', $data ?? [], null);
         $this->setIfExists('metadata', $data ?? [], null);
         $this->setIfExists('attachments', $data ?? [], null);
+        parent::__construct([]);
     }
 
     /**
-    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
-    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
-    * $this->openAPINullablesSetToNull array
-    *
-    * @param string $variableName
-    * @param array  $fields
-    * @param mixed  $defaultValue
-    */
+     * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+     * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+     * $this->openAPINullablesSetToNull array
+     *
+     * @param string $variableName
+     * @param array  $fields
+     * @param mixed  $defaultValue
+     */
     private function setIfExists(string $variableName, array $fields, $defaultValue): void
     {
         if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
@@ -448,7 +449,7 @@ public function offsetUnset($offset): void
     #[\ReturnTypeWillChange]
     public function jsonSerialize()
     {
-       return ObjectSerializer::sanitizeForSerialization($this);
+        return ObjectSerializer::sanitizeForSerialization($this);
     }
 
     /**
@@ -474,5 +475,3 @@ public function toHeaderValue()
         return json_encode(ObjectSerializer::sanitizeForSerialization($this));
     }
 }
-
-
diff --git a/lib/ObjectSerializer.php b/lib/ObjectSerializer.php
index 228bbb1..f724763 100644
--- a/lib/ObjectSerializer.php
+++ b/lib/ObjectSerializer.php
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * ObjectSerializer
  *
@@ -30,6 +31,7 @@
 namespace OpenAPI\Client;
 
 use GuzzleHttp\Psr7\Utils;
+use OpenAPI\Client\Model\CustomizableModelAbstract;
 use OpenAPI\Client\Model\ModelInterface;
 
 /**
@@ -64,7 +66,7 @@ public static function setDateTimeFormat($format)
      *
      * @return scalar|object|array|null serialized form of $data
      */
-    public static function sanitizeForSerialization($data, $type = null, $format = null)
+    public static function sanitizeForSerialization($data, $type = null, $format = null, bool $root = true)
     {
         if (is_scalar($data) || null === $data) {
             return $data;
@@ -76,7 +78,7 @@ public static function sanitizeForSerialization($data, $type = null, $format = n
 
         if (is_array($data)) {
             foreach ($data as $property => $value) {
-                $data[$property] = self::sanitizeForSerialization($value);
+                $data[$property] = self::sanitizeForSerialization(data: $value, root: false);
             }
             return $data;
         }
@@ -100,20 +102,53 @@ public static function sanitizeForSerialization($data, $type = null, $format = n
                         }
                     }
                     if (($data::isNullable($property) && $data->isNullableSetToNull($property)) || $value !== null) {
-                        $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $openAPIType, $formats[$property]);
+                        $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization(data: $value, type: $openAPIType, format: $formats[$property], root: false);
+                    }
+                }
+                if ($root) {
+                    if (is_subclass_of($data, CustomizableModelAbstract::class)) {
+                        $customFields = $data->getCustomizableFields();
+                        if (!empty($customFields)) {
+                            $originalValues = $values;
+                            $customFields = self::dotNotationToNestedArray($customFields);
+                            $values = array_merge_recursive($originalValues, $customFields);
+                        }
                     }
                 }
             } else {
-                foreach($data as $property => $value) {
-                    $values[$property] = self::sanitizeForSerialization($value);
+                foreach ($data as $property => $value) {
+                    $values[$property] = self::sanitizeForSerialization(data: $value, root: false);
                 }
             }
+
             return (object)$values;
         } else {
             return (string)$data;
         }
     }
 
+    /**
+     *
+     * @param array $dotNotationArray
+     * @return mixed
+     */
+    private static function dotNotationToNestedArray(array $dotNotationArray)
+    {
+        $nestedArray = [];
+        foreach ($dotNotationArray as $key => $value) {
+            $parts = explode('.', $key);
+            $pointer = &$nestedArray;
+            foreach ($parts as $part) {
+                if (!isset($pointer[$part])) {
+                    $pointer[$part] = [];
+                }
+                $pointer = &$pointer[$part];
+            }
+            $pointer = $value;
+        }
+        return $nestedArray;
+    }
+
     /**
      * Sanitize filename by removing path.
      * e.g. ../../sun.gif becomes sun.gif
@@ -140,7 +175,9 @@ public static function sanitizeFilename($filename)
      */
     public static function sanitizeTimestamp($timestamp)
     {
-        if (!is_string($timestamp)) return $timestamp;
+        if (!is_string($timestamp)) {
+            return $timestamp;
+        }
 
         return preg_replace('/(:\d{2}.\d{6})\d*/', '$1', $timestamp);
     }
@@ -236,7 +273,7 @@ public static function toQueryValue(
         }
 
         # Handle DateTime objects in query
-        if($openApiType === "\\DateTime" && $value instanceof \DateTime) {
+        if ($openApiType === "\\DateTime" && $value instanceof \DateTime) {
             return ["{$paramName}" => $value->format(self::$dateTimeFormat)];
         }
 
@@ -246,7 +283,9 @@ public static function toQueryValue(
         // since \GuzzleHttp\Psr7\Query::build fails with nested arrays
         // need to flatten array first
         $flattenArray = function ($arr, $name, &$result = []) use (&$flattenArray, $style, $explode) {
-            if (!is_array($arr)) return $arr;
+            if (!is_array($arr)) {
+                return $arr;
+            }
 
             foreach ($arr as $k => $v) {
                 $prop = ($style === 'deepObject') ? $prop = "{$name}[{$k}]" : $k;
@@ -474,7 +513,7 @@ public static function deserialize($data, $class, $httpHeaders = null)
             // determine file name
             if (
                 is_array($httpHeaders)
-                && array_key_exists('Content-Disposition', $httpHeaders) 
+                && array_key_exists('Content-Disposition', $httpHeaders)
                 && preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeaders['Content-Disposition'], $match)
             ) {
                 $filename = Configuration::getDefaultConfiguration()->getTempFolderPath() . DIRECTORY_SEPARATOR . self::sanitizeFilename($match[1]);
diff --git a/lib/inda_hr/CustomizationsApi.php b/lib/inda_hr/CustomizationsApi.php
index 7150017..a3d65da 100644
--- a/lib/inda_hr/CustomizationsApi.php
+++ b/lib/inda_hr/CustomizationsApi.php
@@ -78,9 +78,15 @@ class CustomizationsApi
         'getResumeCustomizationsGET' => [
             'application/json',
         ],
+        'customizeJobAdsPOST' => [
+            'application/json',
+        ],
+        'getJobAdCustomizationsGET' => [
+            'application/json',
+        ],
     ];
 
-/**
+    /**
      * @param ClientInterface $client
      * @param Configuration   $config
      * @param HeaderSelector  $selector
@@ -90,7 +96,7 @@ public function __construct(
         ClientInterface $client = null,
         Configuration $config = null,
         HeaderSelector $selector = null,
-        $hostIndex = 0
+                        $hostIndex = 0
     ) {
         $this->client = $client ?: new Client();
         $this->config = $config ?: new Configuration();
@@ -765,6 +771,652 @@ public function getResumeCustomizationsGETRequest($indexname, string $contentTyp
         );
     }
 
+    ###########
+    # JOB-ADS #
+    ###########
+
+    /**
+     * Operation customizeResumesPOST
+     *
+     * Customize Resumes
+     *
+     * @param  string $indexname indexname (required)
+     * @param  \OpenAPI\Client\Model\CustomFields $custom_fields custom_fields (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['customizeResumesPOST'] to see the possible values for this operation
+     *
+     * @throws \OpenAPI\Client\ApiException on non-2xx response
+     * @throws \InvalidArgumentException
+     * @return \OpenAPI\Client\Model\CustomizedFields|\OpenAPI\Client\Model\HTTPValidationError
+     */
+    public function customizeJobAdsPOST($indexname, $custom_fields, string $contentType = self::contentTypes['customizeJobAdsPOST'][0])
+    {
+        list($response) = $this->customizeJobAdsPOSTWithHttpInfo($indexname, $custom_fields, $contentType);
+        return $response;
+    }
+
+    /**
+     * Operation customizeJobAdsPOSTWithHttpInfo
+     *
+     * Customize JobAds
+     *
+     * @param  string $indexname (required)
+     * @param  \OpenAPI\Client\Model\CustomFields $custom_fields (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['customizeJobAdsPOST'] to see the possible values for this operation
+     *
+     * @throws \OpenAPI\Client\ApiException on non-2xx response
+     * @throws \InvalidArgumentException
+     * @return array of \OpenAPI\Client\Model\CustomizedFields|\OpenAPI\Client\Model\HTTPValidationError, HTTP status code, HTTP response headers (array of strings)
+     */
+    public function customizeJobAdsPOSTWithHttpInfo($indexname, $custom_fields, string $contentType = self::contentTypes['customizeJobAdsPOST'][0])
+    {
+        $request = $this->customizeJobAdsPOSTRequest($indexname, $custom_fields, $contentType);
+
+        try {
+            $options = $this->createHttpClientOption();
+            try {
+                $response = $this->client->send($request, $options);
+            } catch (RequestException $e) {
+                throw new ApiException(
+                    "[{$e->getCode()}] {$e->getMessage()}",
+                    (int) $e->getCode(),
+                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
+                    $e->getResponse() ? (string) $e->getResponse()->getBody() : null
+                );
+            } catch (ConnectException $e) {
+                throw new ApiException(
+                    "[{$e->getCode()}] {$e->getMessage()}",
+                    (int) $e->getCode(),
+                    null,
+                    null
+                );
+            }
+
+            $statusCode = $response->getStatusCode();
+
+            if ($statusCode < 200 || $statusCode > 299) {
+                throw new ApiException(
+                    sprintf(
+                        '[%d] Error connecting to the API (%s)',
+                        $statusCode,
+                        (string) $request->getUri()
+                    ),
+                    $statusCode,
+                    $response->getHeaders(),
+                    (string) $response->getBody()
+                );
+            }
+
+            switch($statusCode) {
+                case 200:
+                    if ('\OpenAPI\Client\Model\CustomizedFields' === '\SplFileObject') {
+                        $content = $response->getBody(); //stream goes to serializer
+                    } else {
+                        $content = (string) $response->getBody();
+                        if ('\OpenAPI\Client\Model\CustomizedFields' !== 'string') {
+                            $content = json_decode($content);
+                        }
+                    }
+
+                    return [
+                        ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\CustomizedFields', []),
+                        $response->getStatusCode(),
+                        $response->getHeaders()
+                    ];
+                case 422:
+                    if ('\OpenAPI\Client\Model\HTTPValidationError' === '\SplFileObject') {
+                        $content = $response->getBody(); //stream goes to serializer
+                    } else {
+                        $content = (string) $response->getBody();
+                        if ('\OpenAPI\Client\Model\HTTPValidationError' !== 'string') {
+                            $content = json_decode($content);
+                        }
+                    }
+
+                    return [
+                        ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\HTTPValidationError', []),
+                        $response->getStatusCode(),
+                        $response->getHeaders()
+                    ];
+            }
+
+            $returnType = '\OpenAPI\Client\Model\CustomizedFields';
+            if ($returnType === '\SplFileObject') {
+                $content = $response->getBody(); //stream goes to serializer
+            } else {
+                $content = (string) $response->getBody();
+                if ($returnType !== 'string') {
+                    $content = json_decode($content);
+                }
+            }
+
+            return [
+                ObjectSerializer::deserialize($content, $returnType, []),
+                $response->getStatusCode(),
+                $response->getHeaders()
+            ];
+
+        } catch (ApiException $e) {
+            switch ($e->getCode()) {
+                case 200:
+                    $data = ObjectSerializer::deserialize(
+                        $e->getResponseBody(),
+                        '\OpenAPI\Client\Model\CustomizedFields',
+                        $e->getResponseHeaders()
+                    );
+                    $e->setResponseObject($data);
+                    break;
+                case 422:
+                    $data = ObjectSerializer::deserialize(
+                        $e->getResponseBody(),
+                        '\OpenAPI\Client\Model\HTTPValidationError',
+                        $e->getResponseHeaders()
+                    );
+                    $e->setResponseObject($data);
+                    break;
+            }
+            throw $e;
+        }
+    }
+
+    /**
+     * Operation customizeJobAdsPOSTAsync
+     *
+     * Customize JobAds
+     *
+     * @param  string $indexname (required)
+     * @param  \OpenAPI\Client\Model\CustomFields $custom_fields (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['customizeJobAdsPOST'] to see the possible values for this operation
+     *
+     * @throws \InvalidArgumentException
+     * @return \GuzzleHttp\Promise\PromiseInterface
+     */
+    public function customizeJobAdsPOSTAsync($indexname, $custom_fields, string $contentType = self::contentTypes['customizeJobAdsPOST'][0])
+    {
+        return $this->customizeJobAdsPOSTAsyncWithHttpInfo($indexname, $custom_fields, $contentType)
+            ->then(
+                function ($response) {
+                    return $response[0];
+                }
+            );
+    }
+
+    /**
+     * Operation customizeJobAdsPOSTAsyncWithHttpInfo
+     *
+     * Customize JobAds
+     *
+     * @param  string $indexname (required)
+     * @param  \OpenAPI\Client\Model\CustomFields $custom_fields (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['customizeJobAdsPOST'] to see the possible values for this operation
+     *
+     * @throws \InvalidArgumentException
+     * @return \GuzzleHttp\Promise\PromiseInterface
+     */
+    public function customizeJobAdsPOSTAsyncWithHttpInfo($indexname, $custom_fields, string $contentType = self::contentTypes['customizeJobAdsPOST'][0])
+    {
+        $returnType = '\OpenAPI\Client\Model\CustomizedFields';
+        $request = $this->customizeJobAdsPOSTRequest($indexname, $custom_fields, $contentType);
+
+        return $this->client
+            ->sendAsync($request, $this->createHttpClientOption())
+            ->then(
+                function ($response) use ($returnType) {
+                    if ($returnType === '\SplFileObject') {
+                        $content = $response->getBody(); //stream goes to serializer
+                    } else {
+                        $content = (string) $response->getBody();
+                        if ($returnType !== 'string') {
+                            $content = json_decode($content);
+                        }
+                    }
+
+                    return [
+                        ObjectSerializer::deserialize($content, $returnType, []),
+                        $response->getStatusCode(),
+                        $response->getHeaders()
+                    ];
+                },
+                function ($exception) {
+                    $response = $exception->getResponse();
+                    $statusCode = $response->getStatusCode();
+                    throw new ApiException(
+                        sprintf(
+                            '[%d] Error connecting to the API (%s)',
+                            $statusCode,
+                            $exception->getRequest()->getUri()
+                        ),
+                        $statusCode,
+                        $response->getHeaders(),
+                        (string) $response->getBody()
+                    );
+                }
+            );
+    }
+
+    /**
+     * Create request for operation 'customizeJobAdsPOST'
+     *
+     * @param  string $indexname (required)
+     * @param  \OpenAPI\Client\Model\CustomFields $custom_fields (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['customizeJobAdsPOST'] to see the possible values for this operation
+     *
+     * @throws \InvalidArgumentException
+     * @return \GuzzleHttp\Psr7\Request
+     */
+    public function customizeJobAdsPOSTRequest($indexname, $custom_fields, string $contentType = self::contentTypes['customizeJobAdsPOST'][0])
+    {
+
+        // verify the required parameter 'indexname' is set
+        if ($indexname === null || (is_array($indexname) && count($indexname) === 0)) {
+            throw new \InvalidArgumentException(
+                'Missing the required parameter $indexname when calling customizeJobAdsPOST'
+            );
+        }
+
+        // verify the required parameter 'custom_fields' is set
+        if ($custom_fields === null || (is_array($custom_fields) && count($custom_fields) === 0)) {
+            throw new \InvalidArgumentException(
+                'Missing the required parameter $custom_fields when calling customizeJobAdsPOST'
+            );
+        }
+
+
+        $resourcePath = '/hr/v2/index/{indexname}/jobads/customize/';
+        $formParams = [];
+        $queryParams = [];
+        $headerParams = [];
+        $httpBody = '';
+        $multipart = false;
+
+
+
+        // path params
+        if ($indexname !== null) {
+            $resourcePath = str_replace(
+                '{' . 'indexname' . '}',
+                ObjectSerializer::toPathValue($indexname),
+                $resourcePath
+            );
+        }
+
+
+        $headers = $this->headerSelector->selectHeaders(
+            ['application/json', ],
+            $contentType,
+            $multipart
+        );
+
+        // for model (json/xml)
+        if (isset($custom_fields)) {
+            if (stripos($headers['Content-Type'], 'application/json') !== false) {
+                # if Content-Type contains "application/json", json_encode the body
+                $httpBody = \GuzzleHttp\Utils::jsonEncode(ObjectSerializer::sanitizeForSerialization($custom_fields));
+            } else {
+                $httpBody = $custom_fields;
+            }
+        } elseif (count($formParams) > 0) {
+            if ($multipart) {
+                $multipartContents = [];
+                foreach ($formParams as $formParamName => $formParamValue) {
+                    $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+                    foreach ($formParamValueItems as $formParamValueItem) {
+                        $multipartContents[] = [
+                            'name' => $formParamName,
+                            'contents' => $formParamValueItem
+                        ];
+                    }
+                }
+                // for HTTP post (form)
+                $httpBody = new MultipartStream($multipartContents);
+
+            } elseif (stripos($headers['Content-Type'], 'application/json') !== false) {
+                # if Content-Type contains "application/json", json_encode the form parameters
+                $httpBody = \GuzzleHttp\Utils::jsonEncode($formParams);
+            } else {
+                // for HTTP post (form)
+                $httpBody = ObjectSerializer::buildQuery($formParams);
+            }
+        }
+
+        // this endpoint requires Bearer authentication (access token)
+        if (!empty($this->config->getAccessToken())) {
+            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+        }
+
+        $defaultHeaders = [];
+        if ($this->config->getUserAgent()) {
+            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+        }
+
+        $headers = array_merge(
+            $defaultHeaders,
+            $headerParams,
+            $headers
+        );
+
+        $operationHost = $this->config->getHost();
+        $query = ObjectSerializer::buildQuery($queryParams);
+        return new Request(
+            'POST',
+            $operationHost . $resourcePath . ($query ? "?{$query}" : ''),
+            $headers,
+            $httpBody
+        );
+    }
+
+    /**
+     * Operation getJobAdCustomizationsGET
+     *
+     * Get JobAd Customizations
+     *
+     * @param  string $indexname indexname (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['getJobAdCustomizationsGET'] to see the possible values for this operation
+     *
+     * @throws \OpenAPI\Client\ApiException on non-2xx response
+     * @throws \InvalidArgumentException
+     * @return \OpenAPI\Client\Model\MappingResponse|\OpenAPI\Client\Model\HTTPValidationError
+     */
+    public function getJobAdCustomizationsGET($indexname, string $contentType = self::contentTypes['getJobAdCustomizationsGET'][0])
+    {
+        list($response) = $this->getJobAdCustomizationsGETWithHttpInfo($indexname, $contentType);
+        return $response;
+    }
+
+    /**
+     * Operation getJobAdCustomizationsGETWithHttpInfo
+     *
+     * Get JobAd Customizations
+     *
+     * @param  string $indexname (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['getJobAdCustomizationsGET'] to see the possible values for this operation
+     *
+     * @throws \OpenAPI\Client\ApiException on non-2xx response
+     * @throws \InvalidArgumentException
+     * @return array of \OpenAPI\Client\Model\MappingResponse|\OpenAPI\Client\Model\HTTPValidationError, HTTP status code, HTTP response headers (array of strings)
+     */
+    public function getJobAdCustomizationsGETWithHttpInfo($indexname, string $contentType = self::contentTypes['getJobAdCustomizationsGET'][0])
+    {
+        $request = $this->getJobAdCustomizationsGETRequest($indexname, $contentType);
+
+        try {
+            $options = $this->createHttpClientOption();
+            try {
+                $response = $this->client->send($request, $options);
+            } catch (RequestException $e) {
+                throw new ApiException(
+                    "[{$e->getCode()}] {$e->getMessage()}",
+                    (int) $e->getCode(),
+                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
+                    $e->getResponse() ? (string) $e->getResponse()->getBody() : null
+                );
+            } catch (ConnectException $e) {
+                throw new ApiException(
+                    "[{$e->getCode()}] {$e->getMessage()}",
+                    (int) $e->getCode(),
+                    null,
+                    null
+                );
+            }
+
+            $statusCode = $response->getStatusCode();
+
+            if ($statusCode < 200 || $statusCode > 299) {
+                throw new ApiException(
+                    sprintf(
+                        '[%d] Error connecting to the API (%s)',
+                        $statusCode,
+                        (string) $request->getUri()
+                    ),
+                    $statusCode,
+                    $response->getHeaders(),
+                    (string) $response->getBody()
+                );
+            }
+
+            switch($statusCode) {
+                case 200:
+                    if ('\OpenAPI\Client\Model\MappingResponse' === '\SplFileObject') {
+                        $content = $response->getBody(); //stream goes to serializer
+                    } else {
+                        $content = (string) $response->getBody();
+                        if ('\OpenAPI\Client\Model\MappingResponse' !== 'string') {
+                            $content = json_decode($content);
+                        }
+                    }
+
+                    return [
+                        ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\MappingResponse', []),
+                        $response->getStatusCode(),
+                        $response->getHeaders()
+                    ];
+                case 422:
+                    if ('\OpenAPI\Client\Model\HTTPValidationError' === '\SplFileObject') {
+                        $content = $response->getBody(); //stream goes to serializer
+                    } else {
+                        $content = (string) $response->getBody();
+                        if ('\OpenAPI\Client\Model\HTTPValidationError' !== 'string') {
+                            $content = json_decode($content);
+                        }
+                    }
+
+                    return [
+                        ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\HTTPValidationError', []),
+                        $response->getStatusCode(),
+                        $response->getHeaders()
+                    ];
+            }
+
+            $returnType = '\OpenAPI\Client\Model\MappingResponse';
+            if ($returnType === '\SplFileObject') {
+                $content = $response->getBody(); //stream goes to serializer
+            } else {
+                $content = (string) $response->getBody();
+                if ($returnType !== 'string') {
+                    $content = json_decode($content);
+                }
+            }
+
+            return [
+                ObjectSerializer::deserialize($content, $returnType, []),
+                $response->getStatusCode(),
+                $response->getHeaders()
+            ];
+
+        } catch (ApiException $e) {
+            switch ($e->getCode()) {
+                case 200:
+                    $data = ObjectSerializer::deserialize(
+                        $e->getResponseBody(),
+                        '\OpenAPI\Client\Model\MappingResponse',
+                        $e->getResponseHeaders()
+                    );
+                    $e->setResponseObject($data);
+                    break;
+                case 422:
+                    $data = ObjectSerializer::deserialize(
+                        $e->getResponseBody(),
+                        '\OpenAPI\Client\Model\HTTPValidationError',
+                        $e->getResponseHeaders()
+                    );
+                    $e->setResponseObject($data);
+                    break;
+            }
+            throw $e;
+        }
+    }
+
+    /**
+     * Operation getJobAdCustomizationsGETAsync
+     *
+     * Get JobAd Customizations
+     *
+     * @param  string $indexname (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['getJobAdCustomizationsGET'] to see the possible values for this operation
+     *
+     * @throws \InvalidArgumentException
+     * @return \GuzzleHttp\Promise\PromiseInterface
+     */
+    public function getJobAdCustomizationsGETAsync($indexname, string $contentType = self::contentTypes['getJobAdCustomizationsGET'][0])
+    {
+        return $this->getJobAdCustomizationsGETAsyncWithHttpInfo($indexname, $contentType)
+            ->then(
+                function ($response) {
+                    return $response[0];
+                }
+            );
+    }
+
+    /**
+     * Operation getJobAdCustomizationsGETAsyncWithHttpInfo
+     *
+     * Get JobAd Customizations
+     *
+     * @param  string $indexname (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['getJobAdCustomizationsGET'] to see the possible values for this operation
+     *
+     * @throws \InvalidArgumentException
+     * @return \GuzzleHttp\Promise\PromiseInterface
+     */
+    public function getJobAdCustomizationsGETAsyncWithHttpInfo($indexname, string $contentType = self::contentTypes['getJobAdCustomizationsGET'][0])
+    {
+        $returnType = '\OpenAPI\Client\Model\MappingResponse';
+        $request = $this->getJobAdCustomizationsGETRequest($indexname, $contentType);
+
+        return $this->client
+            ->sendAsync($request, $this->createHttpClientOption())
+            ->then(
+                function ($response) use ($returnType) {
+                    if ($returnType === '\SplFileObject') {
+                        $content = $response->getBody(); //stream goes to serializer
+                    } else {
+                        $content = (string) $response->getBody();
+                        if ($returnType !== 'string') {
+                            $content = json_decode($content);
+                        }
+                    }
+
+                    return [
+                        ObjectSerializer::deserialize($content, $returnType, []),
+                        $response->getStatusCode(),
+                        $response->getHeaders()
+                    ];
+                },
+                function ($exception) {
+                    $response = $exception->getResponse();
+                    $statusCode = $response->getStatusCode();
+                    throw new ApiException(
+                        sprintf(
+                            '[%d] Error connecting to the API (%s)',
+                            $statusCode,
+                            $exception->getRequest()->getUri()
+                        ),
+                        $statusCode,
+                        $response->getHeaders(),
+                        (string) $response->getBody()
+                    );
+                }
+            );
+    }
+
+    /**
+     * Create request for operation 'getJobAdCustomizationsGET'
+     *
+     * @param  string $indexname (required)
+     * @param  string $contentType The value for the Content-Type header. Check self::contentTypes['getJobAdCustomizationsGET'] to see the possible values for this operation
+     *
+     * @throws \InvalidArgumentException
+     * @return \GuzzleHttp\Psr7\Request
+     */
+    public function getJobAdCustomizationsGETRequest($indexname, string $contentType = self::contentTypes['getJobAdCustomizationsGET'][0])
+    {
+
+        // verify the required parameter 'indexname' is set
+        if ($indexname === null || (is_array($indexname) && count($indexname) === 0)) {
+            throw new \InvalidArgumentException(
+                'Missing the required parameter $indexname when calling getJobAdCustomizationsGET'
+            );
+        }
+
+
+        $resourcePath = '/hr/v2/index/{indexname}/jobads/mapping/';
+        $formParams = [];
+        $queryParams = [];
+        $headerParams = [];
+        $httpBody = '';
+        $multipart = false;
+
+
+
+        // path params
+        if ($indexname !== null) {
+            $resourcePath = str_replace(
+                '{' . 'indexname' . '}',
+                ObjectSerializer::toPathValue($indexname),
+                $resourcePath
+            );
+        }
+
+
+        $headers = $this->headerSelector->selectHeaders(
+            ['application/json', ],
+            $contentType,
+            $multipart
+        );
+
+        // for model (json/xml)
+        if (count($formParams) > 0) {
+            if ($multipart) {
+                $multipartContents = [];
+                foreach ($formParams as $formParamName => $formParamValue) {
+                    $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+                    foreach ($formParamValueItems as $formParamValueItem) {
+                        $multipartContents[] = [
+                            'name' => $formParamName,
+                            'contents' => $formParamValueItem
+                        ];
+                    }
+                }
+                // for HTTP post (form)
+                $httpBody = new MultipartStream($multipartContents);
+
+            } elseif (stripos($headers['Content-Type'], 'application/json') !== false) {
+                # if Content-Type contains "application/json", json_encode the form parameters
+                $httpBody = \GuzzleHttp\Utils::jsonEncode($formParams);
+            } else {
+                // for HTTP post (form)
+                $httpBody = ObjectSerializer::buildQuery($formParams);
+            }
+        }
+
+        // this endpoint requires Bearer authentication (access token)
+        if (!empty($this->config->getAccessToken())) {
+            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+        }
+
+        $defaultHeaders = [];
+        if ($this->config->getUserAgent()) {
+            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+        }
+
+        $headers = array_merge(
+            $defaultHeaders,
+            $headerParams,
+            $headers
+        );
+
+        $operationHost = $this->config->getHost();
+        $query = ObjectSerializer::buildQuery($queryParams);
+        return new Request(
+            'GET',
+            $operationHost . $resourcePath . ($query ? "?{$query}" : ''),
+            $headers,
+            $httpBody
+        );
+    }
+
+    ###########################################
+
+
     /**
      * Create http client option
      *

From 9fdf604f08ab4c7192ccf457f5ac9299c9db67ae Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Wed, 24 Apr 2024 14:28:23 +0200
Subject: [PATCH 09/11] feat(Customizations): add customized fields for JobAds

---
 lib/Model/CustomizableModelAbstract.php | 16 ++++++++++++++--
 lib/Model/JobadCommonData.php           |  3 ++-
 lib/Model/JobadCommonOptionalData.php   |  3 ++-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/lib/Model/CustomizableModelAbstract.php b/lib/Model/CustomizableModelAbstract.php
index 92aaf7c..df34de1 100644
--- a/lib/Model/CustomizableModelAbstract.php
+++ b/lib/Model/CustomizableModelAbstract.php
@@ -5,7 +5,8 @@
 abstract class CustomizableModelAbstract
 {
     public function __construct(private array $customizableFields)
-    {}
+    {
+    }
 
     /**
      * @return mixed
@@ -19,9 +20,20 @@ public function getCustomizableFields(): array
      * @param mixed $customizableFields
      * @return CustomizableModelAbstract
      */
-    public function setCustomizableFields(array $customizableFields)
+    public function setCustomizableFields(array $customizableFields): self
     {
         $this->customizableFields = $customizableFields;
         return $this;
     }
+
+    /**
+     * @param array $customizableFields
+     * @return $this
+     */
+    public function addCustomizableFields(array $customizableFields): self
+    {
+        $fields = $this->customizableFields ?? [];
+        $this->customizableFields = array_merge($fields, $customizableFields);
+        return $this;
+    }
 }
diff --git a/lib/Model/JobadCommonData.php b/lib/Model/JobadCommonData.php
index 4bf143e..2229595 100644
--- a/lib/Model/JobadCommonData.php
+++ b/lib/Model/JobadCommonData.php
@@ -41,7 +41,7 @@
  * @link     https://openapi-generator.tech
  * @implements \ArrayAccess<string, mixed>
  */
-class JobadCommonData implements ModelInterface, ArrayAccess, \JsonSerializable
+class JobadCommonData extends CustomizableModelAbstract implements ModelInterface, ArrayAccess, \JsonSerializable
 {
     public const DISCRIMINATOR = null;
 
@@ -400,6 +400,7 @@ public function __construct(array $data = null)
         $this->setIfExists('benefits', $data ?? [], null);
         $this->setIfExists('expiration_date', $data ?? [], null);
         $this->setIfExists('status', $data ?? [], null);
+        parent::__construct([]);
     }
 
     /**
diff --git a/lib/Model/JobadCommonOptionalData.php b/lib/Model/JobadCommonOptionalData.php
index 2013146..1570e0e 100644
--- a/lib/Model/JobadCommonOptionalData.php
+++ b/lib/Model/JobadCommonOptionalData.php
@@ -41,7 +41,7 @@
  * @link     https://openapi-generator.tech
  * @implements \ArrayAccess<string, mixed>
  */
-class JobadCommonOptionalData implements ModelInterface, ArrayAccess, \JsonSerializable
+class JobadCommonOptionalData extends CustomizableModelAbstract implements ModelInterface, ArrayAccess, \JsonSerializable
 {
     public const DISCRIMINATOR = null;
 
@@ -400,6 +400,7 @@ public function __construct(array $data = null)
         $this->setIfExists('benefits', $data ?? [], null);
         $this->setIfExists('expiration_date', $data ?? [], null);
         $this->setIfExists('status', $data ?? [], null);
+        parent::__construct([]);
     }
 
     /**

From 66204a0777fadce8fc27b9f3ad9375949198c2a0 Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Fri, 26 Apr 2024 10:52:04 +0200
Subject: [PATCH 10/11] feat(Customizations): add customized fields for JobAds

---
 lib/Model/JobAdRequest.php      | 3 ++-
 lib/Model/PatchJobAdRequest.php | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/Model/JobAdRequest.php b/lib/Model/JobAdRequest.php
index 8ed3073..3cf6935 100644
--- a/lib/Model/JobAdRequest.php
+++ b/lib/Model/JobAdRequest.php
@@ -41,7 +41,7 @@
  * @link     https://openapi-generator.tech
  * @implements \ArrayAccess<string, mixed>
  */
-class JobAdRequest implements ModelInterface, ArrayAccess, \JsonSerializable
+class JobAdRequest extends CustomizableModelAbstract implements ModelInterface, ArrayAccess, \JsonSerializable
 {
     public const DISCRIMINATOR = null;
 
@@ -253,6 +253,7 @@ public function __construct(array $data = null)
     {
         $this->setIfExists('data', $data ?? [], null);
         $this->setIfExists('metadata', $data ?? [], null);
+        parent::__construct([]);
     }
 
     /**
diff --git a/lib/Model/PatchJobAdRequest.php b/lib/Model/PatchJobAdRequest.php
index a816b46..c9368e4 100644
--- a/lib/Model/PatchJobAdRequest.php
+++ b/lib/Model/PatchJobAdRequest.php
@@ -41,7 +41,7 @@
  * @link     https://openapi-generator.tech
  * @implements \ArrayAccess<string, mixed>
  */
-class PatchJobAdRequest implements ModelInterface, ArrayAccess, \JsonSerializable
+class PatchJobAdRequest extends CustomizableModelAbstract implements ModelInterface, ArrayAccess, \JsonSerializable
 {
     public const DISCRIMINATOR = null;
 
@@ -253,6 +253,7 @@ public function __construct(array $data = null)
     {
         $this->setIfExists('data', $data ?? [], null);
         $this->setIfExists('metadata', $data ?? [], null);
+        parent::__construct([]);
     }
 
     /**

From 5eddb874d19985cb435b6e0743cc0e69b8773ab9 Mon Sep 17 00:00:00 2001
From: "manuel.flamminio" <manuel.flamminio@intervieweb.it>
Date: Fri, 3 May 2024 12:38:46 +0200
Subject: [PATCH 11/11] feat(Customizations): add customized fields for Resume
 add

---
 lib/Model/FileItemRequest.php | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/Model/FileItemRequest.php b/lib/Model/FileItemRequest.php
index cc8b799..31adb51 100644
--- a/lib/Model/FileItemRequest.php
+++ b/lib/Model/FileItemRequest.php
@@ -41,7 +41,7 @@
  * @link     https://openapi-generator.tech
  * @implements \ArrayAccess<string, mixed>
  */
-class FileItemRequest implements ModelInterface, ArrayAccess, \JsonSerializable
+class FileItemRequest extends CustomizableModelAbstract implements ModelInterface, ArrayAccess, \JsonSerializable
 {
     public const DISCRIMINATOR = null;
 
@@ -260,6 +260,7 @@ public function __construct(array $data = null)
         $this->setIfExists('data', $data ?? [], null);
         $this->setIfExists('metadata', $data ?? [], null);
         $this->setIfExists('attachments', $data ?? [], null);
+        parent::__construct([]);
     }
 
     /**
